import { type Accessor, For, type Setter, Show, createEffect, createMemo, createSignal, } from "solid-js"; import { colorForIdx } from "./utils"; export interface LayerVisibility { id: string; visible: boolean; } export function LayersPanel(props: { layerVisibility: Accessor; setLayerVisibility: Setter; layerFeatureCounts?: Record; basemapOption?: boolean; basemap?: Accessor; setBasemap?: Setter; }) { let checkallRef: HTMLInputElement | undefined; const [expanded, setExpanded] = createSignal(true); const onChange = (id: string) => { const newLayerVisibility = props .layerVisibility() .map((l: LayerVisibility) => l.id === id ? { ...l, visible: !l.visible } : l, ); props.setLayerVisibility(newLayerVisibility); }; const allChecked = createMemo(() => { const visibleLayersCount = props .layerVisibility() .filter((l: LayerVisibility) => l.visible).length; return visibleLayersCount === props.layerVisibility().length; }); const toggleAll = () => { props.setLayerVisibility( props .layerVisibility() .map((l: LayerVisibility) => ({ ...l, visible: !allChecked() })), ); }; createEffect(() => { const visibleLayersCount = props .layerVisibility() .filter((l) => l.visible).length; const indeterminate = visibleLayersCount > 0 && visibleLayersCount !== props.layerVisibility().length; if (checkallRef) { checkallRef.indeterminate = indeterminate; } }); return (
props.setBasemap?.(!props.basemap?.())} />
{(l, i) => (
onChange(l.id)} />
)}
); }