From 60994725d2d07646c965a25f8e1460daed71b938 Mon Sep 17 00:00:00 2001 From: Dotta Date: Tue, 14 Apr 2026 12:40:06 -0500 Subject: [PATCH] feat: show routine execution issues in lists by default Routine-backed issues were filtered out of issue lists and inbox by default, requiring users to opt in. This inverts the default so routine executions are visible everywhere and users can toggle them off if desired. Adds excludeRoutineExecutions server param for explicit hiding. Co-Authored-By: Paperclip (cherry picked from commit 3c909e6e027bdaaea2a3b938228d0b5bcb78f7a1) --- server/src/routes/issues.ts | 2 ++ server/src/services/issues.ts | 4 ++-- ui/src/components/IssuesList.test.tsx | 6 +++--- ui/src/lib/inbox.test.ts | 2 +- ui/src/lib/inbox.ts | 2 +- ui/src/lib/issue-filters.ts | 4 ++-- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/server/src/routes/issues.ts b/server/src/routes/issues.ts index c5d2d40d122..1531441ed1b 100644 --- a/server/src/routes/issues.ts +++ b/server/src/routes/issues.ts @@ -656,6 +656,8 @@ export function issueRoutes( originId: req.query.originId as string | undefined, includeRoutineExecutions: req.query.includeRoutineExecutions === "true" || req.query.includeRoutineExecutions === "1", + excludeRoutineExecutions: + req.query.excludeRoutineExecutions === "true" || req.query.excludeRoutineExecutions === "1", q: req.query.q as string | undefined, limit, }); diff --git a/server/src/services/issues.ts b/server/src/services/issues.ts index db8eb39a1e6..e18cd7c359a 100644 --- a/server/src/services/issues.ts +++ b/server/src/services/issues.ts @@ -79,6 +79,7 @@ export interface IssueFilters { originKind?: string; originId?: string; includeRoutineExecutions?: boolean; + excludeRoutineExecutions?: boolean; q?: string; limit?: number; } @@ -985,7 +986,7 @@ export function issueService(db: Db) { )!, ); } - if (!filters?.includeRoutineExecutions && !filters?.originKind && !filters?.originId) { + if (filters?.excludeRoutineExecutions && !filters?.originKind && !filters?.originId) { conditions.push(ne(issues.originKind, "routine_execution")); } conditions.push(isNull(issues.hiddenAt)); @@ -1162,7 +1163,6 @@ export function issueService(db: Db) { eq(issues.companyId, companyId), isNull(issues.hiddenAt), unreadForUserCondition(companyId, userId), - ne(issues.originKind, "routine_execution"), ]; if (status) { const statuses = status.split(",").map((s) => s.trim()).filter(Boolean); diff --git a/ui/src/components/IssuesList.test.tsx b/ui/src/components/IssuesList.test.tsx index 10ad1d884f0..dce68776b11 100644 --- a/ui/src/components/IssuesList.test.tsx +++ b/ui/src/components/IssuesList.test.tsx @@ -491,7 +491,7 @@ describe("IssuesList", () => { }); }); - it("hides routine-backed issues by default and reveals them when the routine filter is enabled", async () => { + it("shows routine-backed issues by default and hides them when the routine filter is toggled off", async () => { const manualIssue = createIssue({ id: "issue-manual", identifier: "PAP-10", @@ -519,7 +519,7 @@ describe("IssuesList", () => { await waitForAssertion(() => { expect(container.textContent).toContain("Manual issue"); - expect(container.textContent).not.toContain("Routine issue"); + expect(container.textContent).toContain("Routine issue"); }); await act(async () => { @@ -546,7 +546,7 @@ describe("IssuesList", () => { }); await waitForAssertion(() => { - expect(container.textContent).toContain("Routine issue"); + expect(container.textContent).not.toContain("Routine issue"); }); act(() => { diff --git a/ui/src/lib/inbox.test.ts b/ui/src/lib/inbox.test.ts index 37f0fc0fd5e..e7d8dd438b2 100644 --- a/ui/src/lib/inbox.test.ts +++ b/ui/src/lib/inbox.test.ts @@ -849,7 +849,7 @@ describe("inbox helpers", () => { labels: [], projects: ["project-1"], workspaces: ["workspace-1"], - showRoutineExecutions: false, + showRoutineExecutions: true, }, }); }); diff --git a/ui/src/lib/inbox.ts b/ui/src/lib/inbox.ts index 9060d0a2026..a14f478d894 100644 --- a/ui/src/lib/inbox.ts +++ b/ui/src/lib/inbox.ts @@ -142,7 +142,7 @@ function normalizeIssueFilterState(value: unknown): IssueFilterState { labels: normalizeStringArray(candidate.labels), projects: normalizeStringArray(candidate.projects), workspaces: normalizeStringArray(candidate.workspaces), - showRoutineExecutions: candidate.showRoutineExecutions === true, + showRoutineExecutions: candidate.showRoutineExecutions !== false, }; } diff --git a/ui/src/lib/issue-filters.ts b/ui/src/lib/issue-filters.ts index 46a77e07273..602232fe91f 100644 --- a/ui/src/lib/issue-filters.ts +++ b/ui/src/lib/issue-filters.ts @@ -17,7 +17,7 @@ export const defaultIssueFilterState: IssueFilterState = { labels: [], projects: [], workspaces: [], - showRoutineExecutions: false, + showRoutineExecutions: true, }; export const issueStatusOrder = ["in_progress", "todo", "backlog", "in_review", "blocked", "done", "cancelled"]; @@ -99,6 +99,6 @@ export function countActiveIssueFilters( if (state.labels.length > 0) count += 1; if (state.projects.length > 0) count += 1; if (state.workspaces.length > 0) count += 1; - if (enableRoutineVisibilityFilter && state.showRoutineExecutions) count += 1; + if (enableRoutineVisibilityFilter && !state.showRoutineExecutions) count += 1; return count; }