feat: multi-select filters for events and channels

- New MultiSelect component with checkbox dropdown
- Event and channel filters now accept multiple selections
- Empty array = all selected (no filter applied)
- URL params store selections as comma-separated values
- District and quarter remain single-select

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
fahed
2026-03-31 14:53:23 +03:00
parent fba72692ee
commit aa9813aed4
7 changed files with 230 additions and 54 deletions
+4 -4
View File
@@ -275,8 +275,8 @@ export function filterData(data: MuseumRecord[], filters: Filters): MuseumRecord
return data.filter(row => {
if (filters.year && filters.year !== 'all' && row.year !== filters.year) return false;
if (filters.district && filters.district !== 'all' && row.district !== filters.district) return false;
if (filters.channel && filters.channel !== 'all' && row.channel !== filters.channel) return false;
if (filters.museum && filters.museum !== 'all' && row.museum_name !== filters.museum) return false;
if (filters.channel.length > 0 && !filters.channel.includes(row.channel)) return false;
if (filters.museum.length > 0 && !filters.museum.includes(row.museum_name)) return false;
if (filters.quarter && filters.quarter !== 'all' && row.quarter !== filters.quarter) return false;
return true;
});
@@ -292,8 +292,8 @@ export function filterDataByDateRange(
if (!row.date) return false;
if (row.date < startDate || row.date > endDate) return false;
if (filters.district && filters.district !== 'all' && row.district !== filters.district) return false;
if (filters.channel && filters.channel !== 'all' && row.channel !== filters.channel) return false;
if (filters.museum && filters.museum !== 'all' && row.museum_name !== filters.museum) return false;
if (filters.channel && filters.channel.length > 0 && !filters.channel.includes(row.channel)) return false;
if (filters.museum && filters.museum.length > 0 && !filters.museum.includes(row.museum_name)) return false;
return true;
});
}