diff --git a/packages/ui/src/features/inbox/components/InboxSearchFilterBar.tsx b/packages/ui/src/features/inbox/components/InboxSearchFilterBar.tsx index 5fff5f42c2..5f49cdc9f7 100644 --- a/packages/ui/src/features/inbox/components/InboxSearchFilterBar.tsx +++ b/packages/ui/src/features/inbox/components/InboxSearchFilterBar.tsx @@ -40,8 +40,14 @@ export function InboxSearchFilterBar({ const toggleSourceProduct = useInboxSignalsFilterStore( (s) => s.toggleSourceProduct, ); + const clearSourceProductFilter = useInboxSignalsFilterStore( + (s) => s.clearSourceProductFilter, + ); const priorityFilter = useInboxSignalsFilterStore((s) => s.priorityFilter); const togglePriority = useInboxSignalsFilterStore((s) => s.togglePriority); + const setPriorityFilter = useInboxSignalsFilterStore( + (s) => s.setPriorityFilter, + ); const activeSort = INBOX_SORT_OPTIONS.find( (option) => @@ -73,6 +79,10 @@ export function InboxSearchFilterBar({ active={sourceProductFilter.length > 0} > + {INBOX_SOURCE_OPTIONS.map((option) => { const isActive = sourceProductFilter.includes(option.value); return ( @@ -132,6 +142,10 @@ export function InboxSearchFilterBar({ active={priorityFilter.length > 0} > + setPriorityFilter([])} + /> {INBOX_PRIORITY_OPTIONS.map((option) => { const isActive = priorityFilter.includes(option.value); return ( @@ -160,6 +174,23 @@ export function InboxSearchFilterBar({ ); } +function InboxFilterAnyItem({ + active, + onClick, +}: { + active: boolean; + onClick: () => void; +}) { + return ( + + ); +} + function InboxFilterPopover({ label, value, diff --git a/packages/ui/src/features/inbox/stores/inboxSignalsFilterStore.test.ts b/packages/ui/src/features/inbox/stores/inboxSignalsFilterStore.test.ts index 64d14bd553..25bf6a9f82 100644 --- a/packages/ui/src/features/inbox/stores/inboxSignalsFilterStore.test.ts +++ b/packages/ui/src/features/inbox/stores/inboxSignalsFilterStore.test.ts @@ -71,6 +71,34 @@ describe("inboxSignalsFilterStore", () => { ]); }); + it("setPriorityFilter resets priorities back to Any (empty)", () => { + useInboxSignalsFilterStore.getState().setPriorityFilter(["P0", "P1"]); + + useInboxSignalsFilterStore.getState().setPriorityFilter([]); + + expect(useInboxSignalsFilterStore.getState().priorityFilter).toEqual([]); + }); + + it("clearSourceProductFilter resets sources back to Any (empty)", () => { + useInboxSignalsFilterStore.getState().toggleSourceProduct("github"); + useInboxSignalsFilterStore.getState().toggleSourceProduct("linear"); + + useInboxSignalsFilterStore.getState().clearSourceProductFilter(); + + expect(useInboxSignalsFilterStore.getState().sourceProductFilter).toEqual( + [], + ); + }); + + it("toggling off the last source is equivalent to Any (empty)", () => { + useInboxSignalsFilterStore.getState().toggleSourceProduct("github"); + useInboxSignalsFilterStore.getState().toggleSourceProduct("github"); + + expect(useInboxSignalsFilterStore.getState().sourceProductFilter).toEqual( + [], + ); + }); + it("setPriorityFilter de-duplicates priorities", () => { useInboxSignalsFilterStore.getState().setPriorityFilter(["P0", "P1", "P0"]); diff --git a/packages/ui/src/features/inbox/stores/inboxSignalsFilterStore.ts b/packages/ui/src/features/inbox/stores/inboxSignalsFilterStore.ts index 33f25ef3bb..921ab26d71 100644 --- a/packages/ui/src/features/inbox/stores/inboxSignalsFilterStore.ts +++ b/packages/ui/src/features/inbox/stores/inboxSignalsFilterStore.ts @@ -31,6 +31,8 @@ interface InboxSignalsFilterActions { toggleSourceProduct: (source: SourceProduct) => void; togglePriority: (priority: SignalReportPriority) => void; setPriorityFilter: (priorities: SignalReportPriority[]) => void; + /** Clear the source filter back to "Any" (empty = all sources). */ + clearSourceProductFilter: () => void; /** Reset all filters when a deep link arrives so the linked report isn't hidden. */ resetFilters: () => void; } @@ -74,6 +76,7 @@ export const useInboxSignalsFilterStore = create()( set({ priorityFilter: Array.from(new Set(priorities)), }), + clearSourceProductFilter: () => set({ sourceProductFilter: [] }), resetFilters: () => set({ searchQuery: "",