"use client"; /** * UtilityLayerControlPanel — #1746: тумблеры слоя инженерной инфраструктуры OSM * (по образцу CpLayerControlPanel / ZouitLayerControlPanel). Collapsible, * checkbox per-kind с цветным dot + счётчиком рисуемых объектов, «показать все». * * Счётчики берём из grouped (groupUtilityByKind) — это РИСУЕМЫЕ объекты (валидная * геометрия), а не все features: фича без геометрии на карте не появится, поэтому * панель не должна обещать её пользователю. */ import { useState } from "react"; import { UTILITY_ALL_KINDS, UTILITY_KIND_STYLES, type UtilityKind, type UtilityMappable, } from "@/components/site-finder/UtilityInfrastructureLayer"; interface Props { grouped: Map; visibleKinds: Set; onToggleKind: (kind: UtilityKind) => void; onToggleAll: () => void; } export function UtilityLayerControlPanel({ grouped, visibleKinds, onToggleKind, onToggleAll, }: Props) { const [collapsed, setCollapsed] = useState(false); const totalCount = UTILITY_ALL_KINDS.reduce( (sum, kind) => sum + (grouped.get(kind)?.length ?? 0), 0, ); // «Показать все» отражает состояние только непустых (рисуемых) видов. const togglableKinds = UTILITY_ALL_KINDS.filter( (kind) => (grouped.get(kind)?.length ?? 0) > 0, ); const allVisible = togglableKinds.length > 0 && togglableKinds.every((kind) => visibleKinds.has(kind)); return (
{/* Header */}
setCollapsed((v) => !v)} > Инженерные сети (OSM) {totalCount} объ. {collapsed ? "▲" : "▼"}
{!collapsed && (
{totalCount === 0 ? (
Данные OSM по инж. сетям не получены
) : ( <> {/* Toggle-all */} {/* Per-kind */}
{UTILITY_ALL_KINDS.map((kind) => { const items = grouped.get(kind) ?? []; if (items.length === 0) return null; const style = UTILITY_KIND_STYLES[kind]; const active = visibleKinds.has(kind); return ( ); })}
)}
)}
); }