diff --git a/frontend/src/app/pages/Workflows/app/LeftRail.tsx b/frontend/src/app/pages/Workflows/app/LeftRail.tsx index db1a07c5..d78f0536 100644 --- a/frontend/src/app/pages/Workflows/app/LeftRail.tsx +++ b/frontend/src/app/pages/Workflows/app/LeftRail.tsx @@ -31,8 +31,6 @@ const LeftRail: React.FC<{ nav: AppNav }> = ({ nav }) => { return workflows.filter((w) => w.title.toLowerCase().includes(q)); }, [workflows, query]); - const activeCount = workflows.filter((w) => isScheduleActive(w.schedule)).length; - const onDelete = (id: string) => { // Soft-delete: moves to Trash (recoverable), so no scary confirm. dispatch(deleteWorkflow(id)); @@ -84,7 +82,8 @@ const LeftRail: React.FC<{ nav: AppNav }> = ({ nav }) => {
Workflows - {activeCount} + {/* Counts what the list below is actually showing. It used to count only the scheduled ones, so a real workflow sat under a header that said 0. */} + {filtered.length}
diff --git a/frontend/src/app/pages/Workflows/app/RunMonitor.tsx b/frontend/src/app/pages/Workflows/app/RunMonitor.tsx index 1e4dd702..3eb79ae7 100644 --- a/frontend/src/app/pages/Workflows/app/RunMonitor.tsx +++ b/frontend/src/app/pages/Workflows/app/RunMonitor.tsx @@ -11,6 +11,7 @@ import { } from '@/shared/state/dashboardLayoutSlice'; import type { CardType } from '@/shared/state/dashboardLayoutSlice'; import WorkflowTitle from './WorkflowTitle'; +import { isScheduleActive } from '@/app/pages/Workflows/scheduleUtils'; const DRAG_THRESHOLD = 3; @@ -231,7 +232,10 @@ const RunMonitor: React.FC = ({ workflow, cardX, cardY, cardWidth, cardHe
Schedule
-
{formatSchedule(workflow.schedule)}
+ {/* A paused workflow fell through formatSchedule to "Scheduled for 9:00 AM", so this card announced a schedule while the panel beside it said Not scheduled. */} +
+ {isScheduleActive(workflow.schedule) ? formatSchedule(workflow.schedule) : 'Not scheduled'} +
{workflow.next_run_at && (
Next run {new Date(workflow.next_run_at).toLocaleString([], { weekday: 'short', month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' })} diff --git a/frontend/src/shared/state/workflowsSlice.ts b/frontend/src/shared/state/workflowsSlice.ts index 445e0250..fd84212c 100644 --- a/frontend/src/shared/state/workflowsSlice.ts +++ b/frontend/src/shared/state/workflowsSlice.ts @@ -414,9 +414,12 @@ export const fetchDeletedWorkflows = createAsyncThunk('workflows/fetchDeleted', return data.workflows as Workflow[]; }); -export const restoreWorkflow = createAsyncThunk('workflows/restore', async (id: string) => { +export const restoreWorkflow = createAsyncThunk('workflows/restore', async (id: string, { dispatch }) => { const res = await fetch(`${API}/${id}/restore`, { method: 'POST' }); if (!res.ok) throw new Error(`restore failed ${res.status}`); + // Trashing drops the run rows from the store; the server kept them, so pull them back or a restored workflow claims "No runs yet" over a real history. + void dispatch(fetchRuns(id)); + void dispatch(fetchAllRuns(200)); return (await res.json()) as Workflow; });