improve filtering to always show layers in the same order

This commit is contained in:
vcoppe
2026-04-01 09:01:01 +02:00
parent 84b90e1026
commit 3dce5dc617

View File

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