mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2026-04-06 03:40:21 +00:00
improve filtering to always show layers in the same order
This commit is contained in:
@@ -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 = {};
|
||||||
|
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]) => {
|
Object.entries(t).forEach(([key, value]) => {
|
||||||
if (typeof value === 'object') {
|
if (
|
||||||
filtered[key] = filterLayerTree(value, allowed);
|
!Object.hasOwn(filtered, key) &&
|
||||||
} else if (
|
(key.startsWith('custom-') || key.startsWith('extension-'))
|
||||||
allowed.hasOwnProperty(key) ||
|
|
||||||
key.startsWith('custom-') ||
|
|
||||||
key.startsWith('extension-')
|
|
||||||
) {
|
) {
|
||||||
filtered[key] = value;
|
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', {}),
|
||||||
|
|||||||
Reference in New Issue
Block a user