mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2026-11-01 12:17:18 +00:00
fix layer typings
This commit is contained in:
1 parent
b3fe640575
commit
fbd8775528
4 files changed
+38
-22
No files matched your search
@@ -18,7 +18,7 @@
|
|||||||
Layers2,
|
Layers2,
|
||||||
} from '@lucide/svelte';
|
} from '@lucide/svelte';
|
||||||
import { i18n } from '$lib/i18n/i18n.svelte';
|
import { i18n } from '$lib/i18n/i18n.svelte';
|
||||||
import { defaultBasemap, type CustomLayer } from '$lib/data/layers';
|
import { defaultBasemap, layerGroup, type CustomLayer } from '$lib/data/layers';
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import { remove } from './utils';
|
import { remove } from './utils';
|
||||||
import { settings } from '$lib/state/settings';
|
import { settings } from '$lib/state/settings';
|
||||||
@@ -128,8 +128,9 @@
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
addLayer(layerId);
|
|
||||||
$customLayers[layerId] = layer;
|
$customLayers[layerId] = layer;
|
||||||
|
addLayer(layerId);
|
||||||
selectedLayerId = undefined;
|
selectedLayerId = undefined;
|
||||||
setDataFromSelectedLayer();
|
setDataFromSelectedLayer();
|
||||||
}
|
}
|
||||||
@@ -255,13 +256,12 @@
|
|||||||
onfinalize={(e) => {
|
onfinalize={(e) => {
|
||||||
customBasemapItems = e.detail.items;
|
customBasemapItems = e.detail.items;
|
||||||
$customBasemapOrder = customBasemapItems.map((item) => item.id);
|
$customBasemapOrder = customBasemapItems.map((item) => item.id);
|
||||||
$selectedBasemapTree.basemaps['custom'] = customBasemapItems.reduce(
|
selectedBasemapTree.update(($tree) => {
|
||||||
(acc, item) => {
|
layerGroup($tree.basemaps)['custom'] = Object.fromEntries(
|
||||||
acc[item.id] = true;
|
customBasemapItems.map((item) => [item.id, true])
|
||||||
return acc;
|
|
||||||
},
|
|
||||||
{}
|
|
||||||
);
|
);
|
||||||
|
return $tree;
|
||||||
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{#each customBasemapItems as item (item.id)}
|
{#each customBasemapItems as item (item.id)}
|
||||||
@@ -315,13 +315,12 @@
|
|||||||
onfinalize={(e) => {
|
onfinalize={(e) => {
|
||||||
customOverlayItems = e.detail.items;
|
customOverlayItems = e.detail.items;
|
||||||
$customOverlayOrder = customOverlayItems.map((item) => item.id);
|
$customOverlayOrder = customOverlayItems.map((item) => item.id);
|
||||||
$selectedOverlayTree.overlays['custom'] = customOverlayItems.reduce(
|
selectedOverlayTree.update(($tree) => {
|
||||||
(acc, item) => {
|
layerGroup($tree.overlays)['custom'] = Object.fromEntries(
|
||||||
acc[item.id] = true;
|
customOverlayItems.map((item) => [item.id, true])
|
||||||
return acc;
|
|
||||||
},
|
|
||||||
{}
|
|
||||||
);
|
);
|
||||||
|
return $tree;
|
||||||
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{#each customOverlayItems as item (item.id)}
|
{#each customOverlayItems as item (item.id)}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
selected?: string;
|
selected?: string;
|
||||||
onselect?: (value: string) => void;
|
onselect?: (value: string) => void;
|
||||||
multiple: boolean;
|
multiple: boolean;
|
||||||
checked: LayerTreeType;
|
checked?: LayerTreeType;
|
||||||
} = $props();
|
} = $props();
|
||||||
|
|
||||||
const { customLayers } = settings;
|
const { customLayers } = settings;
|
||||||
@@ -53,7 +53,9 @@
|
|||||||
id="{name}-{id}"
|
id="{name}-{id}"
|
||||||
{name}
|
{name}
|
||||||
value={id}
|
value={id}
|
||||||
bind:checked={checked[id]}
|
bind:checked={
|
||||||
|
() => checked[id] === true, (value) => (checked[id] = value)
|
||||||
|
}
|
||||||
class="scale-90"
|
class="scale-90"
|
||||||
aria-label={i18n._(`layers.label.${id}`)}
|
aria-label={i18n._(`layers.label.${id}`)}
|
||||||
/>
|
/>
|
||||||
@@ -90,12 +92,18 @@
|
|||||||
{#snippet content()}
|
{#snippet content()}
|
||||||
<div class="ml-2">
|
<div class="ml-2">
|
||||||
<Self
|
<Self
|
||||||
node={node[id]}
|
node={node[id] as LayerTreeType}
|
||||||
{name}
|
{name}
|
||||||
{selected}
|
{selected}
|
||||||
{onselect}
|
{onselect}
|
||||||
{multiple}
|
{multiple}
|
||||||
bind:checked={checked[id]}
|
bind:checked={
|
||||||
|
() => {
|
||||||
|
const group = checked[id];
|
||||||
|
return typeof group === 'object' ? group : undefined;
|
||||||
|
},
|
||||||
|
(value) => (checked[id] = value ?? {})
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
{/snippet}
|
{/snippet}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { settings } from '$lib/state/settings';
|
import { settings } from '$lib/state/settings';
|
||||||
import { derived, get, writable, type Writable } from 'svelte/store';
|
import { derived, get, writable, type Writable } from 'svelte/store';
|
||||||
import { isSelected, remove, removeAll } from './utils';
|
import { isSelected, remove, removeAll } from './utils';
|
||||||
import { overlays, overlayTree, type LayerTreeType } from '$lib/data/layers';
|
import { layerGroup, overlays, overlayTree, type LayerTreeType } from '$lib/data/layers';
|
||||||
import { browser } from '$app/environment';
|
import { browser } from '$app/environment';
|
||||||
import { map } from '$lib/components/map/map';
|
import { map } from '$lib/components/map/map';
|
||||||
|
|
||||||
@@ -84,11 +84,12 @@ export class ExtensionAPI {
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!Object.hasOwn(overlayTree.overlays as LayerTreeType, overlay.extensionName)) {
|
const extensions = layerGroup(overlayTree.overlays);
|
||||||
overlayTree.overlays[overlay.extensionName] = {};
|
if (!Object.hasOwn(extensions, overlay.extensionName)) {
|
||||||
|
extensions[overlay.extensionName] = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
overlayTree.overlays[overlay.extensionName][overlay.id] = true;
|
layerGroup(extensions[overlay.extensionName])[overlay.id] = true;
|
||||||
|
|
||||||
selectedOverlayTree.update((selected) => {
|
selectedOverlayTree.update((selected) => {
|
||||||
if (!Object.hasOwn(selected.overlays, overlay.extensionName)) {
|
if (!Object.hasOwn(selected.overlays, overlay.extensionName)) {
|
||||||
|
|||||||
@@ -794,6 +794,14 @@ export const defaultOpacities: { [key: string]: number } = {
|
|||||||
|
|
||||||
export type LayerTreeType = { [key: string]: LayerTreeType | boolean };
|
export type LayerTreeType = { [key: string]: LayerTreeType | boolean };
|
||||||
|
|
||||||
|
/** A node of a layer tree that is a group of layers, not a layer (which is selected or not). */
|
||||||
|
export function layerGroup(node: LayerTreeType | boolean | undefined): LayerTreeType {
|
||||||
|
if (typeof node !== 'object') {
|
||||||
|
throw new Error('Not a group of layers');
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
// Hierarchy containing all basemaps
|
// Hierarchy containing all basemaps
|
||||||
export const basemapTree: LayerTreeType = {
|
export const basemapTree: LayerTreeType = {
|
||||||
basemaps: {
|
basemaps: {
|
||||||
|
|||||||
Reference in new issue
Block a user