3 Commits

Author SHA1 Message Date
vcoppe
3dce5dc617 improve filtering to always show layers in the same order 2026-04-01 09:01:01 +02:00
vcoppe
84b90e1026 remove unused import 2026-04-01 08:36:33 +02:00
vcoppe
d507586eed fix small shift 2026-04-01 08:33:17 +02:00
3 changed files with 39 additions and 22 deletions

View File

@@ -1,5 +1,4 @@
import type { LayerTreeType } from '$lib/assets/layers';
import { writable } from 'svelte/store';
export function anySelectedLayer(node: LayerTreeType) {
return (

View File

@@ -10,8 +10,7 @@ import {
defaultOverpassQueries,
defaultOverpassTree,
defaultTerrainSource,
overlays,
overpassQueryData,
overpassTree,
type CustomLayer,
type LayerTreeType,
} from '$lib/assets/layers';
@@ -161,23 +160,42 @@ function getLayerValidator(allowed: Record<string, any>, fallback: string) {
: fallback;
}
function filterLayerTree(t: LayerTreeType, allowed: Record<string, any>): LayerTreeType {
function filterLayerTree(t: LayerTreeType, allowed: LayerTreeType | undefined): LayerTreeType {
const filtered: LayerTreeType = {};
const values = Object.values(t);
if (values.length == 0) return filtered;
if (typeof values[0] === 'boolean') {
if (allowed) {
Object.keys(allowed).forEach((key) => {
if (Object.hasOwn(t, key)) {
filtered[key] = t[key];
}
});
}
Object.entries(t).forEach(([key, value]) => {
if (typeof value === 'object') {
filtered[key] = filterLayerTree(value, allowed);
} else if (
allowed.hasOwnProperty(key) ||
key.startsWith('custom-') ||
key.startsWith('extension-')
if (
!Object.hasOwn(filtered, key) &&
(key.startsWith('custom-') || key.startsWith('extension-'))
) {
filtered[key] = value;
}
});
} else {
Object.entries(t).forEach(([key, value]) => {
if (typeof value === 'object') {
filtered[key] = filterLayerTree(
value,
typeof allowed === 'object' && typeof allowed[key] === 'object'
? allowed[key]
: undefined
);
}
});
}
return filtered;
}
function getLayerTreeValidator(allowed: Record<string, any>) {
function getLayerTreeValidator(allowed: LayerTreeType) {
return (value: LayerTreeType) => filterLayerTree(value, allowed);
}
@@ -259,32 +277,32 @@ export const settings = {
selectedBasemapTree: new Setting(
'selectedBasemapTree',
defaultBasemapTree,
getLayerTreeValidator(basemaps)
getLayerTreeValidator(defaultBasemapTree)
),
currentOverlays: new SettingInitOnFirstRead(
'currentOverlays',
defaultOverlays,
getLayerTreeValidator(overlays)
getLayerTreeValidator(defaultOverlayTree)
),
previousOverlays: new Setting(
'previousOverlays',
defaultOverlays,
getLayerTreeValidator(overlays)
getLayerTreeValidator(defaultOverlayTree)
),
selectedOverlayTree: new Setting(
'selectedOverlayTree',
defaultOverlayTree,
getLayerTreeValidator(overlays)
getLayerTreeValidator(defaultOverlayTree)
),
currentOverpassQueries: new SettingInitOnFirstRead(
'currentOverpassQueries',
defaultOverpassQueries,
getLayerTreeValidator(overpassQueryData)
getLayerTreeValidator(overpassTree)
),
selectedOverpassTree: new Setting(
'selectedOverpassTree',
defaultOverpassTree,
getLayerTreeValidator(overpassQueryData)
getLayerTreeValidator(overpassTree)
),
opacities: new Setting('opacities', defaultOpacities),
customLayers: new Setting<Record<string, CustomLayer>>('customLayers', {}),

View File

@@ -20,7 +20,7 @@
<div class="grow flex flex-col items-center p-12">
<div class="max-w-5xl flex flex-row gap-24">
<div class="hidden md:flex flex-col gap-2 w-40 sticky top-26 self-start shrink-0">
<div class="hidden md:flex flex-col gap-2 w-40 sticky top-[101px] self-start shrink-0">
<div class="mb-2">
<AlgoliaDocSearch />
</div>