"use client"; /** * ZouitLayerControlPanel — #255: тумблеры ЗОУИТ-слоя (по образцу * CpLayerControlPanel). Collapsible, checkbox per-severity с цветным dot + * счётчиком рисуемых полигонов. * * Счётчики берём из grouped (groupZouitBySeverity) — это РИСУЕМЫЕ объекты * (валидная полигональная геометрия), а не все overlaps: ЗОУИТ без geom_geojson * на карте не появится, поэтому панель не должна обещать его пользователю. */ import { useState } from "react"; import { ZOUIT_ALL_SEVERITIES, ZOUIT_SEVERITY_STYLES, type ZouitMappable, type ZouitSeverity, } from "@/components/site-finder/ZouitLayer"; interface Props { grouped: Map; visibleSeverities: Set; onToggleSeverity: (sev: ZouitSeverity) => void; } export function ZouitLayerControlPanel({ grouped, visibleSeverities, onToggleSeverity, }: Props) { const [collapsed, setCollapsed] = useState(false); const totalCount = ZOUIT_ALL_SEVERITIES.reduce( (sum, sev) => sum + (grouped.get(sev)?.length ?? 0), 0, ); return (
{/* Header */}
setCollapsed((v) => !v)} > Охранные зоны ЗОУИТ {totalCount} зон {collapsed ? "▲" : "▼"}
{!collapsed && (
{totalCount === 0 ? (
Нет геометрии охранных зон для отображения
) : (
{ZOUIT_ALL_SEVERITIES.map((sev) => { const items = grouped.get(sev) ?? []; if (items.length === 0) return null; const style = ZOUIT_SEVERITY_STYLES[sev]; const active = visibleSeverities.has(sev); return ( ); })}
)}
)}
); }