import { useEffect, useRef } from "react"; import { useDashboardStore, ALL_NODE_TYPES, ALL_COMPLEXITIES, ALL_EDGE_CATEGORIES } from "../store"; import type { NodeType, Complexity, EdgeCategory } from "../store"; import { useI18n } from "../contexts/I18nContext"; export default function FilterPanel() { const graph = useDashboardStore((s) => s.graph); const filters = useDashboardStore((s) => s.filters); const setFilters = useDashboardStore((s) => s.setFilters); const resetFilters = useDashboardStore((s) => s.resetFilters); const hasActiveFilters = useDashboardStore((s) => s.hasActiveFilters); const filterPanelOpen = useDashboardStore((s) => s.filterPanelOpen); const toggleFilterPanel = useDashboardStore((s) => s.toggleFilterPanel); const { t } = useI18n(); const containerRef = useRef(null); const allNodeTypes = ALL_NODE_TYPES; const allComplexities = ALL_COMPLEXITIES; const allEdgeCategories = ALL_EDGE_CATEGORIES; const layers = graph?.layers ?? []; // Close dropdown on outside click useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (containerRef.current && !containerRef.current.contains(e.target as Node)) { if (filterPanelOpen) { toggleFilterPanel(); } } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, [filterPanelOpen, toggleFilterPanel]); const toggleNodeType = (type: NodeType) => { const newTypes = new Set(filters.nodeTypes); if (newTypes.has(type)) { newTypes.delete(type); } else { newTypes.add(type); } setFilters({ nodeTypes: newTypes }); }; const toggleComplexity = (complexity: Complexity) => { const newComplexities = new Set(filters.complexities); if (newComplexities.has(complexity)) { newComplexities.delete(complexity); } else { newComplexities.add(complexity); } setFilters({ complexities: newComplexities }); }; const toggleLayer = (layerId: string) => { const newLayers = new Set(filters.layerIds); if (newLayers.has(layerId)) { newLayers.delete(layerId); } else { newLayers.add(layerId); } setFilters({ layerIds: newLayers }); }; const toggleEdgeCategory = (category: EdgeCategory) => { const newCategories = new Set(filters.edgeCategories); if (newCategories.has(category)) { newCategories.delete(category); } else { newCategories.add(category); } setFilters({ edgeCategories: newCategories }); }; const isActive = hasActiveFilters(); return (
{filterPanelOpen && (
{/* Node Types */}

{t.filterPanel.nodeTypes}

{allNodeTypes.map((type) => ( ))}
{/* Complexity */}

{t.filterPanel.complexity}

{allComplexities.map((complexity) => ( ))}
{/* Layers */} {layers.length > 0 && (

{t.filterPanel.layers}

{layers.map((layer) => (
)} {/* Edge Categories */}

{t.filterPanel.edgeCategories}

{allEdgeCategories.map((category) => ( ))}
{/* Reset Button */} {isActive && ( )}
)}
); }