From 32923072081961b5ef9b899267be99b354265d59 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Mon, 25 Nov 2024 02:06:28 +0100 Subject: [PATCH] Fix: don't show all items if favourites is shown --- .../Sources/FilteringFeatureSource.ts | 42 ++++++++++++------- src/Models/FilteredLayer.ts | 13 ++++-- src/Models/ThemeConfig/LayerConfig.ts | 2 +- src/Models/ThemeViewState.ts | 5 ++- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/Logic/FeatureSource/Sources/FilteringFeatureSource.ts b/src/Logic/FeatureSource/Sources/FilteringFeatureSource.ts index e38c811d49..843513a38c 100644 --- a/src/Logic/FeatureSource/Sources/FilteringFeatureSource.ts +++ b/src/Logic/FeatureSource/Sources/FilteringFeatureSource.ts @@ -13,60 +13,74 @@ export default class FilteringFeatureSource implements FeatureSource { private readonly _is_dirty = new UIEventSource(false) private readonly _layer: FilteredLayer private previousFeatureSet: Set = undefined + private readonly _zoomlevel: Store + private readonly _selectedElement: Store constructor( layer: FilteredLayer, upstream: FeatureSource, fetchStore?: (id: string) => Store>, globalFilters?: Store, - metataggingUpdated?: Store + metataggingUpdated?: Store, + zoomlevel?: Store, + selectedElement?: Store ) { this.upstream = upstream this._fetchStore = fetchStore this._layer = layer this._globalFilters = globalFilters + this._zoomlevel = zoomlevel + this._selectedElement = selectedElement - const self = this upstream.features.addCallback(() => { - self.update() + this.update() }) layer.isDisplayed.addCallback(() => { - self.update() + this.update() }) layer.appliedFilters.forEach((value) => value.addCallback((_) => { - self.update() + this.update() }) ) this._is_dirty.stabilized(1000).addCallbackAndRunD((dirty) => { if (dirty) { - self.update() + this.update() } }) - metataggingUpdated?.addCallback((_) => { - self._is_dirty.setData(true) + metataggingUpdated?.addCallback(() => { + this._is_dirty.setData(true) }) - globalFilters?.addCallback((_) => { - self.update() + globalFilters?.addCallback(() => { + this.update() }) + selectedElement?.addCallback(() => this.update()) + + zoomlevel?.mapD(z => Math.floor(z)).addCallback(() => this.update()) + this.update() } private update() { - const self = this const layer = this._layer const features: Feature[] = this.upstream.features.data ?? [] const includedFeatureIds = new Set() - const globalFilters = self._globalFilters?.data?.map((f) => f) + const globalFilters = this._globalFilters?.data?.map((f) => f) + const zoomlevel = this._zoomlevel?.data + const selectedElement = this._selectedElement?.data?.properties?.id const newFeatures = (features ?? []).filter((f) => { - self.registerCallback(f.properties.id) + this.registerCallback(f.properties.id) - if (!layer.isShown(f.properties, globalFilters)) { + if(selectedElement === f.properties.id){ + return true + } + + if (!layer.isShown(f.properties, globalFilters, zoomlevel)) { return false } diff --git a/src/Models/FilteredLayer.ts b/src/Models/FilteredLayer.ts index a3d5364ec2..724e441213 100644 --- a/src/Models/FilteredLayer.ts +++ b/src/Models/FilteredLayer.ts @@ -210,7 +210,7 @@ export default class FilteredLayer { * - the specified 'global filters' * - the 'isShown'-filter set by the layer */ - public isShown(properties: Record, globalFilters?: GlobalFilter[]): boolean { + public isShown(properties: Record, globalFilters?: GlobalFilter[], zoomlevel?: number): boolean { if (properties._deleted === "yes") { return false } @@ -219,9 +219,10 @@ export default class FilteredLayer { if (neededTags !== undefined) { const doesMatch = neededTags.matchesProperties(properties) if (globalFilter.forceShowOnMatch) { - return doesMatch || this.isDisplayed.data - } - if (!doesMatch) { + if(doesMatch){ + return true + } + } else if (!doesMatch) { return false } } @@ -240,6 +241,10 @@ export default class FilteredLayer { } } + if(zoomlevel !== undefined && (this.layerDef.minzoom > zoomlevel || this.layerDef.minzoomVisible < zoomlevel)){ + return false + } + return true } diff --git a/src/Models/ThemeConfig/LayerConfig.ts b/src/Models/ThemeConfig/LayerConfig.ts index 2f7824cb20..60652478f2 100644 --- a/src/Models/ThemeConfig/LayerConfig.ts +++ b/src/Models/ThemeConfig/LayerConfig.ts @@ -159,7 +159,7 @@ export default class LayerConfig extends WithContextLoader { if (json["minZoom"] !== undefined) { throw "At " + context + ": minzoom is written all lowercase" } - this.minzoomVisible = json.minzoomVisible ?? this.minzoom + this.minzoomVisible = json.minzoomVisible ?? 100 this.shownByDefault = json.shownByDefault ?? true this.doCount = json.isCounted ?? this.shownByDefault ?? true this.forceLoad = json.forceLoad ?? false diff --git a/src/Models/ThemeViewState.ts b/src/Models/ThemeViewState.ts index ce21d1308f..05cf26a7cd 100644 --- a/src/Models/ThemeViewState.ts +++ b/src/Models/ThemeViewState.ts @@ -473,7 +473,10 @@ export default class ThemeViewState implements SpecialVisualizationState { fs.layer, fs, (id) => this.featureProperties.getStore(id), - this.layerState.globalFilters + this.layerState.globalFilters, + undefined, + this.mapProperties.zoom, + this.selectedElement ) filteringFeatureSource.set(layerName, filtered)