Skip to content
Prev Previous commit
Next Next commit
feat(ui): add previous runs section to sensor details page
Signed-off-by: puretension <[email protected]>
  • Loading branch information
puretension committed Sep 12, 2025
commit 9d3af8f66b1bbf9f159065ebfff3bb8f121c826c
26 changes: 25 additions & 1 deletion ui/src/sensors/sensor-details.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@ import {uiUrl} from '../shared/base';
import {ErrorNotice} from '../shared/components/error-notice';
import {Node} from '../shared/components/graph/types';
import {Loading} from '../shared/components/loading';
import {ZeroState} from '../shared/components/zero-state';
import {Context} from '../shared/context';
import {historyUrl} from '../shared/history';
import {Sensor} from '../shared/models';
import * as models from '../shared/models';
import {Sensor, Workflow} from '../shared/models';
import {services} from '../shared/services';
import {useCollectEvent} from '../shared/use-collect-event';
import {useEditableObject} from '../shared/use-editable-object';
import {useQueryParams} from '../shared/use-query-params';
import {WorkflowDetailsList} from '../workflows/components/workflow-details-list/workflow-details-list';
import {SensorEditor} from './sensor-editor';
import {SensorSidePanel} from './sensor-side-panel';

Expand All @@ -30,6 +33,8 @@ export function SensorDetails({match, location, history}: RouteComponentProps<an
const [namespace] = useState(match.params.namespace);
const [name] = useState(match.params.name);
const [tab, setTab] = useState<string>(queryParams.get('tab'));
const [workflows, setWorkflows] = useState<Workflow[]>([]);
const [columns, setColumns] = useState<models.Column[]>([]);

const {object: sensor, setObject: setSensor, resetObject: resetSensor, serialization, edited, lang, setLang} = useEditableObject<Sensor>();
const [selectedLogNode, setSelectedLogNode] = useState<Node>(queryParams.get('selectedLogNode'));
Expand Down Expand Up @@ -66,6 +71,16 @@ export function SensorDetails({match, location, history}: RouteComponentProps<an
.catch(setError);
}, [namespace, name]);

useEffect(() => {
(async () => {
const workflowList = await services.workflows.list(namespace, null, [`${models.labels.sensor}=${name}`], {limit: 50});
const workflowsInfo = await services.info.getInfo();

setWorkflows(workflowList.items);
setColumns(workflowsInfo.columns);
Comment on lines +76 to +80
Copy link

Copilot AI Nov 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing error handling for the async workflow fetching. If services.workflows.list() or services.info.getInfo() fails, the error is not caught or displayed to the user. Add .catch(setError) or wrap in try-catch to handle potential errors, similar to the sensor fetching useEffect on line 66-72.

Suggested change
const workflowList = await services.workflows.list(namespace, null, [`${models.labels.sensor}=${name}`], {limit: 50});
const workflowsInfo = await services.info.getInfo();
setWorkflows(workflowList.items);
setColumns(workflowsInfo.columns);
try {
const workflowList = await services.workflows.list(namespace, null, [`${models.labels.sensor}=${name}`], {limit: 50});
const workflowsInfo = await services.info.getInfo();
setWorkflows(workflowList.items);
setColumns(workflowsInfo.columns);
setError(null);
} catch (err) {
setError(err);
}

Copilot uses AI. Check for mistakes.
})();
}, [namespace, name]);

useCollectEvent('openedSensorDetails');

const selected = (() => {
Expand Down Expand Up @@ -142,6 +157,15 @@ export function SensorDetails({match, location, history}: RouteComponentProps<an
onTabSelected={setTab}
/>
)}
<>
{!workflows || workflows.length === 0 ? (
Copy link

Copilot AI Nov 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The condition !workflows will always be false since workflows is initialized to [] on line 36. The check should be workflows.length === 0 only, matching the pattern in cron-workflow-details.tsx which checks !workflows where workflows is initialized to undefined.

Suggested change
{!workflows || workflows.length === 0 ? (
{workflows.length === 0 ? (

Copilot uses AI. Check for mistakes.
<ZeroState title='No previous runs'>
<p>No workflows have been triggered by this sensor yet.</p>
</ZeroState>
) : (
<WorkflowDetailsList workflows={workflows} columns={columns} />
)}
</>
</>
{!!selectedLogNode && (
<SensorSidePanel
Expand Down