From be84e61ad00a635a7ce4590c5e6a3f80f7195da7 Mon Sep 17 00:00:00 2001 From: Buddy Date: Mon, 8 Jun 2026 22:18:56 -0700 Subject: [PATCH] fix: bool-on props broken in generic setter dispatcher parseAttributeValue('') returns '' (falsy) for boolean-present attributes, making setDraggable(false), setInteractive(''), etc. not work. Now looks up the prop spec from PROPS and passes val !== null (true/false) when kind is 'bool-on'. Fixes: leaflet-marker, leaflet-tile-layer-wms, leaflet-image-overlay, leaflet-video-overlay, leaflet-svg-overlay, leaflet-geojson --- src/components/leaflet-geojson.ts | 4 +++- src/components/leaflet-image-overlay.ts | 4 +++- src/components/leaflet-marker.ts | 4 +++- src/components/leaflet-svg-overlay.ts | 4 +++- src/components/leaflet-tile-layer-wms.ts | 7 +++++-- src/components/leaflet-video-overlay.ts | 4 +++- 6 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/components/leaflet-geojson.ts b/src/components/leaflet-geojson.ts index faef253..30610c4 100644 --- a/src/components/leaflet-geojson.ts +++ b/src/components/leaflet-geojson.ts @@ -66,7 +66,9 @@ export class LeafletGeoJSON extends withProps(HTMLElement, PROPS) { } else { const propName = PROP_BY_ATTR.get(name); if (!propName) return; - this.#obj.setStyle({ [propName]: val } as PathOptions); + const spec = PROPS[propName as keyof typeof PROPS]; + const styleVal = spec.kind === 'bool-on' ? val !== null : val; + this.#obj.setStyle({ [propName]: styleVal } as PathOptions); } } } diff --git a/src/components/leaflet-image-overlay.ts b/src/components/leaflet-image-overlay.ts index 5dd72b2..5fe29f2 100644 --- a/src/components/leaflet-image-overlay.ts +++ b/src/components/leaflet-image-overlay.ts @@ -61,7 +61,9 @@ export class LeafletImageOverlay extends withProps(HTMLElement, PROPS) { const setter = `set${propName.charAt(0).toUpperCase()}${propName.slice(1)}` as keyof ImageOverlay; if (typeof this.#obj[setter] === 'function') { - (this.#obj[setter] as (v: unknown) => void)(parseAttributeValue(val)); + const spec = PROPS[propName as keyof typeof PROPS]; + const value = spec.kind === 'bool-on' ? val !== null : parseAttributeValue(val); + (this.#obj[setter] as (v: unknown) => void)(value); } } } diff --git a/src/components/leaflet-marker.ts b/src/components/leaflet-marker.ts index 4523e49..28ea97e 100644 --- a/src/components/leaflet-marker.ts +++ b/src/components/leaflet-marker.ts @@ -57,7 +57,9 @@ export class LeafletMarker extends withProps(HTMLElement, PROPS) { if (!propName) return; const setter = `set${propName.charAt(0).toUpperCase()}${propName.slice(1)}` as keyof Marker; if (typeof this.#obj[setter] === 'function') { - (this.#obj[setter] as (v: unknown) => void)(parseAttributeValue(val)); + const spec = PROPS[propName as keyof typeof PROPS]; + const value = spec.kind === 'bool-on' ? val !== null : parseAttributeValue(val); + (this.#obj[setter] as (v: unknown) => void)(value); } } } diff --git a/src/components/leaflet-svg-overlay.ts b/src/components/leaflet-svg-overlay.ts index f8dbb59..071e331 100644 --- a/src/components/leaflet-svg-overlay.ts +++ b/src/components/leaflet-svg-overlay.ts @@ -57,7 +57,9 @@ export class LeafletSVGOverlay extends withProps(HTMLElement, PROPS) { const setter = `set${propName.charAt(0).toUpperCase()}${propName.slice(1)}` as keyof SVGOverlay; if (typeof this.#obj[setter] === 'function') { - (this.#obj[setter] as (v: unknown) => void)(parseAttributeValue(val)); + const spec = PROPS[propName as keyof typeof PROPS]; + const value = spec.kind === 'bool-on' ? val !== null : parseAttributeValue(val); + (this.#obj[setter] as (v: unknown) => void)(value); } } } diff --git a/src/components/leaflet-tile-layer-wms.ts b/src/components/leaflet-tile-layer-wms.ts index a731b16..1b4504a 100644 --- a/src/components/leaflet-tile-layer-wms.ts +++ b/src/components/leaflet-tile-layer-wms.ts @@ -55,11 +55,14 @@ export class LeafletTileLayerWMS extends withProps(HTMLElement, PROPS) { if (!propName) return; const setter = `set${propName.charAt(0).toUpperCase()}${propName.slice(1)}` as keyof TileLayer.WMS; + const spec = PROPS[propName as keyof typeof PROPS]; if (typeof this.#obj[setter] === 'function') { - (this.#obj[setter] as (v: unknown) => void)(parseAttributeValue(val)); + const value = spec.kind === 'bool-on' ? val !== null : parseAttributeValue(val); + (this.#obj[setter] as (v: unknown) => void)(value); } else { + const value = spec.kind === 'bool-on' ? val !== null : parseAttributeValue(val); (this.#obj.setParams as unknown as (params: Record) => void)({ - [propName]: parseAttributeValue(val), + [propName]: value, }); } } diff --git a/src/components/leaflet-video-overlay.ts b/src/components/leaflet-video-overlay.ts index 0102328..a2ac012 100644 --- a/src/components/leaflet-video-overlay.ts +++ b/src/components/leaflet-video-overlay.ts @@ -62,7 +62,9 @@ export class LeafletVideoOverlay extends withProps(HTMLElement, PROPS) { const setter = `set${propName.charAt(0).toUpperCase()}${propName.slice(1)}` as keyof VideoOverlay; if (typeof this.#obj[setter] === 'function') { - (this.#obj[setter] as (v: unknown) => void)(parseAttributeValue(val)); + const spec = PROPS[propName as keyof typeof PROPS]; + const value = spec.kind === 'bool-on' ? val !== null : parseAttributeValue(val); + (this.#obj[setter] as (v: unknown) => void)(value); } } }