From 467cb2e58983b155a71a197a3e5fb17a8cd404f7 Mon Sep 17 00:00:00 2001 From: vcoppe Date: Tue, 25 Nov 2025 19:18:54 +0100 Subject: [PATCH] update extension api --- .../map/layer-control/LayerTreeNode.svelte | 2 +- .../map/layer-control/extension-api.ts | 52 +++++++++++++++++-- website/src/lib/i18n.svelte.ts | 4 +- 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/website/src/lib/components/map/layer-control/LayerTreeNode.svelte b/website/src/lib/components/map/layer-control/LayerTreeNode.svelte index d31cf6393..422e8f1bd 100644 --- a/website/src/lib/components/map/layer-control/LayerTreeNode.svelte +++ b/website/src/lib/components/map/layer-control/LayerTreeNode.svelte @@ -85,7 +85,7 @@ {:else if anySelectedLayer(node[id])} {#snippet trigger()} - {i18n._(`layers.label.${id}`)} + {i18n._(`layers.label.${id}`, id)} {/snippet} {#snippet content()}
diff --git a/website/src/lib/components/map/layer-control/extension-api.ts b/website/src/lib/components/map/layer-control/extension-api.ts index 6dbdb5b27..a501a470a 100644 --- a/website/src/lib/components/map/layer-control/extension-api.ts +++ b/website/src/lib/components/map/layer-control/extension-api.ts @@ -8,6 +8,7 @@ import { map } from '$lib/components/map/map'; const { currentOverlays, previousOverlays, selectedOverlayTree } = settings; export type CustomOverlay = { + extensionName: string; id: string; name: string; tileUrls: string[]; @@ -46,8 +47,16 @@ export class ExtensionAPI { } addOrUpdateOverlay(overlay: CustomOverlay) { - if (!overlay.id || !overlay.name || !overlay.tileUrls || overlay.tileUrls.length === 0) { - throw new Error('Overlay must have an id, name, and at least one tile URL.'); + if ( + !overlay.extensionName || + !overlay.id || + !overlay.name || + !overlay.tileUrls || + overlay.tileUrls.length === 0 + ) { + throw new Error( + 'Overlay must have an extensionName, id, name, and at least one tile URL.' + ); } overlay.id = this.getOverlayId(overlay.id); @@ -75,10 +84,17 @@ export class ExtensionAPI { ], }; - overlayTree.overlays.world[overlay.id] = true; + if (!overlayTree.overlays.hasOwnProperty(overlay.extensionName)) { + overlayTree.overlays[overlay.extensionName] = {}; + } + + overlayTree.overlays[overlay.extensionName][overlay.id] = true; selectedOverlayTree.update((selected) => { - selected.overlays.world[overlay.id] = true; + if (!selected.overlays.hasOwnProperty(overlay.extensionName)) { + selected.overlays[overlay.extensionName] = {}; + } + selected.overlays[overlay.extensionName][overlay.id] = true; return selected; }); @@ -94,7 +110,10 @@ export class ExtensionAPI { } currentOverlays.update((current) => { - current.overlays.world[overlay.id] = show; + if (!current.overlays.hasOwnProperty(overlay.extensionName)) { + current.overlays[overlay.extensionName] = {}; + } + current.overlays[overlay.extensionName][overlay.id] = show; return current; }); } @@ -133,6 +152,29 @@ export class ExtensionAPI { }); } + updateOverlaysOrder(ids: string[]) { + ids = ids.map((id) => this.getOverlayId(id)); + selectedOverlayTree.update((selected) => { + let isSelected: Record = {}; + ids.forEach((id) => { + const overlay = get(this._overlays).get(id); + if ( + overlay && + selected.overlays.hasOwnProperty(overlay.extensionName) && + selected.overlays[overlay.extensionName].hasOwnProperty(id) + ) { + isSelected[id] = selected.overlays[overlay.extensionName][id]; + delete selected.overlays[overlay.extensionName][id]; + } + }); + Object.entries(isSelected).forEach(([id, value]) => { + const overlay = get(this._overlays).get(id)!; + selected.overlays[overlay.extensionName][id] = value; + }); + return selected; + }); + } + isLayerFromExtension = derived(this._overlays, ($overlays) => { return (id: string) => $overlays.has(id); }); diff --git a/website/src/lib/i18n.svelte.ts b/website/src/lib/i18n.svelte.ts index d1f2c58d6..433df3c19 100644 --- a/website/src/lib/i18n.svelte.ts +++ b/website/src/lib/i18n.svelte.ts @@ -14,7 +14,7 @@ class Locale { private _isLoadingInitial = $state(true); private _isLoading = $state(true); private dictionary: Dictionary = $state({}); - private _t = $derived((key: string) => { + private _t = $derived((key: string, fallback?: string) => { const keys = key.split('.'); let value: string | Dictionary = this.dictionary; @@ -22,7 +22,7 @@ class Locale { if (value && typeof value === 'object' && k in value) { value = value[k]; } else { - return key; + return fallback || key; } }