From f69c8a04ebe4da37fc98ae38097724c9d3423da8 Mon Sep 17 00:00:00 2001 From: Alexandre Brandizzi Date: Thu, 24 Sep 2026 21:10:40 -0300 Subject: [PATCH] fix(workorders): match a range on the board the same way the search does (SH-391) A week-only row that still carries a scheduled date outside the range passed the board search (its target week overlaps) but failed the on-page filter, which judged it by the date alone. Both now accept a row dated in the range or a week-only row whose target week overlaps it. --- .../utils/advanced-filter-predicates.ts | 7 ++-- .../utils/table-filter-utils.test.ts | 36 +++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/domain/work-orders/utils/advanced-filter-predicates.ts b/src/domain/work-orders/utils/advanced-filter-predicates.ts index 75a6a40f..9fa0b3b4 100644 --- a/src/domain/work-orders/utils/advanced-filter-predicates.ts +++ b/src/domain/work-orders/utils/advanced-filter-predicates.ts @@ -16,10 +16,9 @@ const matchesDateRange: AdvancedFilterPredicate = (row, filters) => { const range = dateRangeFor(filters); if (!range) return true; const [from, to] = range; - if (row.scheduledOn) { - return row.scheduledOn >= from && row.scheduledOn <= to; - } - // Week-only rows match when their target week overlaps the range (SH-391). + if (row.scheduledOn && row.scheduledOn >= from && row.scheduledOn <= to) return true; + // Week-only rows also match when their target week overlaps the range, the + // same rule as the board search (SH-391). return ( row.scheduleWeekOnly && Boolean(row.targetWeek) && diff --git a/src/test/domain/work-orders/utils/table-filter-utils.test.ts b/src/test/domain/work-orders/utils/table-filter-utils.test.ts index 022d36fe..8471849b 100644 --- a/src/test/domain/work-orders/utils/table-filter-utils.test.ts +++ b/src/test/domain/work-orders/utils/table-filter-utils.test.ts @@ -454,6 +454,42 @@ describe("matchesAdvancedFilters", () => { expect(matchesAdvancedFilters(weekOnly, filters)).toBe(true); expect(matchesAdvancedFilters(undatedAssigned, filters)).toBe(true); }); + + it("matches a range the same way the board search does (SH-391)", () => { + const filters = { + ...EMPTY_ADVANCED_FILTERS, + dateRange: "custom" as const, + customFrom: "2026-09-23", + customTo: "2026-09-25", + }; + + // Week-only: a target week overlapping the range matches, whatever date the + // row still carries. + const weekOnlyStaleDate = makeRow({ + scheduledOn: "2026-10-02", + targetWeek: "2026-09-21", + scheduleWeekOnly: true, + }); + const weekOnlyPreviousWeek = makeRow({ + scheduledOn: "", + targetWeek: "2026-09-14", + scheduleWeekOnly: true, + }); + const weekOnlyOutside = makeRow({ + scheduledOn: "", + targetWeek: "2026-09-28", + scheduleWeekOnly: true, + }); + const datedOutsideWithWeek = makeRow({ scheduledOn: "2026-10-02", targetWeek: "2026-09-21" }); + const undated = makeRow({ scheduledOn: "", targetWeek: "" }); + + expect(matchesAdvancedFilters(weekOnlyStaleDate, filters)).toBe(true); + expect(matchesAdvancedFilters(weekOnlyPreviousWeek, filters)).toBe(false); + expect(matchesAdvancedFilters(weekOnlyOutside, filters)).toBe(false); + expect(matchesAdvancedFilters(datedOutsideWithWeek, filters)).toBe(false); + expect(matchesAdvancedFilters(undated, filters)).toBe(false); + expect(matchesAdvancedFilters(undated, { ...filters, dateRange: null })).toBe(true); + }); }); describe("computeIsPastDue", () => {