diff --git a/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx b/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx index 4093bce4..9d09306c 100644 --- a/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx +++ b/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx @@ -195,13 +195,19 @@ export function CatalogItemsTable({ // ── Search / Filter ───────────────────────────────────────────── const [searchQuery, setSearchQuery] = useState(initialSearch); - const [offerFilter, setOfferFilter] = useState("all"); + const [filters, setFilters] = useState>({ + offerFilter: "all", + clubOnlyFilter: "all", + haveOfferFilter: "all", + }); + const { items: filteredItems, counts: filterCounts } = useMemo( - () => discoverOffers(items, searchQuery, offerFilter), - [items, searchQuery, offerFilter], + () => discoverOffers(items, searchQuery, filters), + [items, searchQuery, filters], ); const hasDiscoveryFilter = - Boolean(searchQuery.trim()) || offerFilter !== "all"; + Boolean(searchQuery.trim()) || + Object.values(filters).some((f) => f !== "all"); // ── Move items dialog ─────────────────────────────────────────── const [moveOpen, setMoveOpen] = useState(false); @@ -225,12 +231,13 @@ export function CatalogItemsTable({ ); const orderedFilteredItems = useMemo(() => { - if (searchQuery.trim()) return filteredItems; + if (searchQuery.trim() || Object.values(filters).some((f) => f !== "all")) + return filteredItems; const orderMap = new Map(itemOrder.map((id, idx) => [id, idx])); - return [...filteredItems].sort( - (a, b) => (orderMap.get(a.id) ?? 0) - (orderMap.get(b.id) ?? 0), - ); - }, [filteredItems, itemOrder, searchQuery]); + return filteredItems + .slice() + .sort((a, b) => (orderMap.get(a.id) ?? 0) - (orderMap.get(b.id) ?? 0)); + }, [filteredItems, itemOrder, searchQuery, filters]); // ── Selection ──────────────────────────────────────────────────── const [selected, setSelected] = useState>(new Set()); @@ -265,13 +272,17 @@ export function CatalogItemsTable({ setSearchQuery(query); setSelected(new Set()); } - function updateOfferFilter(value: string) { - setOfferFilter(value as OfferFilter); + function updateFilter(key: string, value: string) { + setFilters((prev) => ({ ...prev, [key]: value })); setSelected(new Set()); } function resetDiscovery() { setSearchQuery(""); - setOfferFilter("all"); + setFilters({ + offerFilter: "all", + clubOnlyFilter: "all", + haveOfferFilter: "all", + }); setSelected(new Set()); } @@ -1187,18 +1198,21 @@ export function CatalogItemsTable({ onClear={() => updateSearch("")} /> - updateFilter("offerFilter", v)} + > - {discovery(`filters.${offerFilter}`)} ( - {filterCounts[offerFilter]}) + {discovery(`filters.${filters.offerFilter}`)} ( + {filterCounts[filters.offerFilter as OfferFilter]}) - {OFFER_FILTERS.map((filter) => ( + {OFFER_FILTERS.slice(0, 5).map((filter) => ( {discovery(`filters.${filter}`)} ({filterCounts[filter]} ) @@ -1206,6 +1220,59 @@ export function CatalogItemsTable({ ))} + + + + + {hasDiscoveryFilter && (