From 34f156e7e708f77fe6e32732a5e369a0fc6ae2ab Mon Sep 17 00:00:00 2001 From: Floke Date: Wed, 4 Feb 2026 12:38:10 +0000 Subject: [PATCH] feat([2fd88f42]): redesign filter panel with modern checkbox UI --- .../frontend/src/components/FilterPanel.tsx | 93 +++++++++++-------- 1 file changed, 56 insertions(+), 37 deletions(-) diff --git a/heatmap-tool/frontend/src/components/FilterPanel.tsx b/heatmap-tool/frontend/src/components/FilterPanel.tsx index 91f7ff20..9198ae2b 100644 --- a/heatmap-tool/frontend/src/components/FilterPanel.tsx +++ b/heatmap-tool/frontend/src/components/FilterPanel.tsx @@ -14,61 +14,80 @@ interface FilterPanelProps { const FilterPanel: React.FC = ({ filters, onFilterChange, isLoading }) => { const [selectedFilters, setSelectedFilters] = useState({}); - // Reset selected filters when a new file is uploaded (filters prop changes) useEffect(() => { setSelectedFilters({}); }, [filters]); - const handleSelectionChange = (category: string, values: string[]) => { - setSelectedFilters(prev => ({ - ...prev, - [category]: values, - })); + const handleCheckboxChange = (category: string, value: string) => { + setSelectedFilters(prev => { + const currentSelection = prev[category] || []; + const newSelection = currentSelection.includes(value) + ? currentSelection.filter(item => item !== value) + // Ensure "N/A" is not sorted to the top if that's not desired + : [...currentSelection, value].sort((a, b) => a === 'N/A' ? 1 : b === 'N/A' ? -1 : a.localeCompare(b)); + return { ...prev, [category]: newSelection }; + }); }; - + const handleApplyClick = () => { - onFilterChange(selectedFilters); - } + onFilterChange(selectedFilters); + }; const handleResetClick = () => { setSelectedFilters({}); onFilterChange({}); - } + }; if (Object.keys(filters).length === 0) { return
Upload a file to see filter options.
; } return ( -
-

Filters

- {Object.entries(filters).map(([category, options]) => ( -
- - + <> + +
+

Filters

+ {Object.entries(filters).map(([category, options]) => ( +
+ {category} +
+ {options.map(option => ( +
+ handleCheckboxChange(category, option)} + /> + +
+ ))} +
+
+ ))} +
+ +
- ))} -
- -
-
+ ); };