Hide archived routines from routines page

This commit is contained in:
Dotta
2026-06-04 01:22:41 +00:00
parent 5f481d50f1
commit fb13e1f6a9
2 changed files with 48 additions and 5 deletions
+39
View File
@@ -501,6 +501,45 @@ describe("Routines page", () => {
});
});
it("hides archived routines from the routines list", async () => {
routinesListMock.mockResolvedValue([
createRoutine({ id: "routine-1", title: "Morning sync", status: "active" }),
createRoutine({ id: "routine-2", title: "Archived cleanup", status: "archived" }),
]);
issuesListMock.mockResolvedValue([]);
const root = createRoot(container);
const queryClient = new QueryClient({
defaultOptions: {
queries: { retry: false },
},
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Routines />
</QueryClientProvider>,
);
await flush();
});
for (let attempts = 0; attempts < 5 && !container.textContent?.includes("Morning sync"); attempts += 1) {
await act(async () => {
await flush();
});
}
const text = container.textContent ?? "";
expect(text).toContain("1 routine");
expect(text).toContain("Morning sync");
expect(text).not.toContain("Archived cleanup");
await act(async () => {
root.unmount();
});
});
it("shows an outlined row-level run now button on the routines table", async () => {
routinesListMock.mockResolvedValue([createRoutine({ id: "routine-1", title: "Morning sync" })]);
issuesListMock.mockResolvedValue([]);
+9 -5
View File
@@ -417,9 +417,13 @@ export function Routines() {
[projects],
);
const liveIssueIds = useMemo(() => collectLiveIssueIds(liveRuns), [liveRuns]);
const visibleRoutines = useMemo(
() => (routines ?? []).filter((routine) => routine.status !== "archived"),
[routines],
);
const sortedRoutines = useMemo(
() => sortRoutines(routines ?? [], routineViewState.sortField, routineViewState.sortDir),
[routineViewState.sortDir, routineViewState.sortField, routines],
() => sortRoutines(visibleRoutines, routineViewState.sortField, routineViewState.sortDir),
[routineViewState.sortDir, routineViewState.sortField, visibleRoutines],
);
const routineGroups = useMemo(
() => buildRoutineGroups(sortedRoutines, routineViewState.groupBy, projectById, agentById),
@@ -516,7 +520,7 @@ export function Routines() {
<TabsContent value="routines" className="space-y-4">
<div className="flex items-center justify-between gap-3">
<p className="text-sm text-muted-foreground">
{(routines ?? []).length} routine{(routines ?? []).length === 1 ? "" : "s"}
{visibleRoutines.length} routine{visibleRoutines.length === 1 ? "" : "s"}
</p>
<div className="flex items-center gap-1">
<Popover>
@@ -873,11 +877,11 @@ export function Routines() {
{activeTab === "routines" ? (
<div>
{(routines ?? []).length === 0 ? (
{visibleRoutines.length === 0 ? (
<div className="py-12">
<EmptyState
icon={Repeat}
message="No routines yet. Use Create routine to define the first recurring workflow."
message="No active routines. Use Create routine to define the first recurring workflow."
/>
</div>
) : (