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 <noreply@paperclip.ing>
(cherry picked from commit 3c909e6e027bdaaea2a3b938228d0b5bcb78f7a1)
This commit is contained in:
Dotta committed 2026-04-15 09:12:41 -05:00
1 parent 32a9165ddf
commit 60994725d2
6 files changed
+11 -9

No files matched your search

+2
View File
@@ -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,
});
+2 -2
View File
@@ -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);
+3 -3
View File
@@ -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(() => {
+1 -1
View File
@@ -849,7 +849,7 @@ describe("inbox helpers", () => {
labels: [],
projects: ["project-1"],
workspaces: ["workspace-1"],
showRoutineExecutions: false,
showRoutineExecutions: true,
},
});
});
+1 -1
View File
@@ -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,
};
}
+2 -2
View File
@@ -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;
}