diff --git a/assets/themes/grb/grb.json b/assets/themes/grb/grb.json index 52dad43ab..7cbace46a 100644 --- a/assets/themes/grb/grb.json +++ b/assets/themes/grb/grb.json @@ -787,5 +787,6 @@ }, "overpassMaxZoom": 15, "osmApiTileSize": 17, - "widenFactor": 2 + "widenFactor": 2, + "enableCache": false } diff --git a/src/Logic/Actors/SelectedElementTagsUpdater.ts b/src/Logic/Actors/SelectedElementTagsUpdater.ts index 9789ba6a7..9472d29b3 100644 --- a/src/Logic/Actors/SelectedElementTagsUpdater.ts +++ b/src/Logic/Actors/SelectedElementTagsUpdater.ts @@ -112,7 +112,7 @@ export default class SelectedElementTagsUpdater { private invalidateCache(s: Feature) { const state = this.state const wasPartOfLayer = state.layout.getMatchingLayer(s.properties) - state.toCacheSavers.get(wasPartOfLayer.id).invalidateCacheAround(BBox.get(s)) + state.toCacheSavers?.get(wasPartOfLayer.id)?.invalidateCacheAround(BBox.get(s)) } private installCallback() { const state = this.state diff --git a/src/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts b/src/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts index 9bed9e842..871c86557 100644 --- a/src/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts +++ b/src/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts @@ -75,14 +75,7 @@ export default class ChangeGeometryApplicator implements FeatureSource { newFeatures.push(feature) continue } - console.log( - "Applying a geometry change onto:", - feature, - "The change is:", - change, - "which becomes:", - copy - ) + newFeatures.push(copy) } this.features.setData(newFeatures) diff --git a/src/Logic/FeatureSource/Sources/LayoutSource.ts b/src/Logic/FeatureSource/Sources/LayoutSource.ts index 601c75253..9cfa8ed85 100644 --- a/src/Logic/FeatureSource/Sources/LayoutSource.ts +++ b/src/Logic/FeatureSource/Sources/LayoutSource.ts @@ -27,6 +27,7 @@ export default class LayoutSource extends FeatureSourceMerger { private readonly supportsForceDownload: UpdatableFeatureSource[] public static readonly fromCacheZoomLevel = 15 + constructor( layers: LayerConfig[], featureSwitches: FeatureSwitchState, @@ -45,20 +46,22 @@ export default class LayoutSource extends FeatureSourceMerger { const geojsonlayers = layers.filter((layer) => layer.source.geojsonSource !== undefined) const osmLayers = layers.filter((layer) => layer.source.geojsonSource === undefined) const fromCache = new Map() - for (const layer of osmLayers) { - const src = new LocalStorageFeatureSource( - backend, - layer, - LayoutSource.fromCacheZoomLevel, - mapProperties, - { - isActive: isDisplayed(layer.id), - maxAge: layer.maxAgeOfCache, - } - ) - fromCache.set(layer.id, src) - } + if (featureSwitches.featureSwitchCache.data) { + for (const layer of osmLayers) { + const src = new LocalStorageFeatureSource( + backend, + layer, + LayoutSource.fromCacheZoomLevel, + mapProperties, + { + isActive: isDisplayed(layer.id), + maxAge: layer.maxAgeOfCache + } + ) + fromCache.set(layer.id, src) + } + } const mvtSources: UpdatableFeatureSource[] = osmLayers .filter((f) => mvtAvailableLayers.has(f.id)) .map((l) => LayoutSource.setupMvtSource(l, mapProperties, isDisplayed(l.id))) @@ -104,7 +107,6 @@ export default class LayoutSource extends FeatureSourceMerger { super(...geojsonSources, ...Array.from(fromCache.values()), ...mvtSources, ...nonMvtSources) this.isLoading = isLoading - this.fromCache = fromCache supportsForceDownload.push(...geojsonSources) supportsForceDownload.push(...mvtSources) // Non-mvt sources are handled by overpass this.supportsForceDownload = supportsForceDownload @@ -168,7 +170,7 @@ export default class LayoutSource extends FeatureSourceMerger { backend, isActive, patchRelations: true, - fullNodeDatabase, + fullNodeDatabase }) } @@ -200,11 +202,11 @@ export default class LayoutSource extends FeatureSourceMerger { widenFactor: featureSwitches.layoutToUse.widenFactor, overpassUrl: featureSwitches.overpassUrl, overpassTimeout: featureSwitches.overpassTimeout, - overpassMaxZoom: featureSwitches.overpassMaxZoom, + overpassMaxZoom: featureSwitches.overpassMaxZoom }, { padToTiles: zoom.map((zoom) => Math.min(15, zoom + 1)), - isActive, + isActive } ) } diff --git a/src/Logic/State/FeatureSwitchState.ts b/src/Logic/State/FeatureSwitchState.ts index 0487ff54b..3c2a936c2 100644 --- a/src/Logic/State/FeatureSwitchState.ts +++ b/src/Logic/State/FeatureSwitchState.ts @@ -57,6 +57,8 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches { public readonly featureSwitchBackToThemeOverview: UIEventSource public readonly featureSwitchShareScreen: UIEventSource public readonly featureSwitchGeolocation: UIEventSource + public readonly featureSwitchCache: UIEventSource + public readonly featureSwitchIsTesting: UIEventSource public readonly featureSwitchIsDebugging: UIEventSource public readonly featureSwitchShowAllQuestions: UIEventSource @@ -176,6 +178,13 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches { "Enable the export as GeoJSON and CSV button" ) + this.featureSwitchCache = FeatureSwitchUtils.initSwitch( + "fs-cache", + layoutToUse?.enableCache ?? true, + "Enable/disable caching from localStorage" + ) + + let testingDefaultValue = false if ( !Utils.runningFromConsole && diff --git a/src/Models/ThemeConfig/Json/LayoutConfigJson.ts b/src/Models/ThemeConfig/Json/LayoutConfigJson.ts index 748573fb2..107103ad4 100644 --- a/src/Models/ThemeConfig/Json/LayoutConfigJson.ts +++ b/src/Models/ThemeConfig/Json/LayoutConfigJson.ts @@ -450,4 +450,14 @@ export interface LayoutConfigJson { * iftrue: Do not write 'change_within_x_m' and do not indicate that this was done by survey */ enableMorePrivacy: boolean + /** + * question: Should this theme have the cache enabled? + * + * Should only be dissabled in highly specific cases, such as the GRB-theme + * + * ifunset: Cache is enabled + * iffalse: Do not cache data + * group: hidden + */ + enableCache?: true | boolean } diff --git a/src/Models/ThemeConfig/LayoutConfig.ts b/src/Models/ThemeConfig/LayoutConfig.ts index 936d50f17..3863938fb 100644 --- a/src/Models/ThemeConfig/LayoutConfig.ts +++ b/src/Models/ThemeConfig/LayoutConfig.ts @@ -81,6 +81,7 @@ export default class LayoutConfig implements LayoutInformation { private readonly layersDict: Map private readonly source: LayoutConfigJson + public readonly enableCache: boolean constructor( json: LayoutConfigJson, @@ -98,6 +99,7 @@ export default class LayoutConfig implements LayoutInformation { this.id = json.id this.definedAtUrl = options?.definedAtUrl this.definitionRaw = options?.definitionRaw + this.enableCache = json.enableCache ?? true if (official) { if (json.id.toLowerCase() !== json.id) { throw "The id of a theme should be lowercase: " + json.id diff --git a/src/Models/ThemeViewState.ts b/src/Models/ThemeViewState.ts index c0b6d1029..b0f63f503 100644 --- a/src/Models/ThemeViewState.ts +++ b/src/Models/ThemeViewState.ts @@ -204,7 +204,6 @@ export default class ThemeViewState implements SpecialVisualizationState { this.osmConnection.isLoggedIn ) - const self = this this.layerState = new LayerState( this.osmConnection, layout.layers, @@ -241,7 +240,7 @@ export default class ThemeViewState implements SpecialVisualizationState { this.featureSwitches, this.mapProperties, this.osmConnection.Backend(), - (id) => self.layerState.filteredLayers.get(id).isDisplayed, + (id) => this.layerState.filteredLayers.get(id).isDisplayed, mvtAvailableLayers, this.fullNodeDatabase ) @@ -316,7 +315,7 @@ export default class ThemeViewState implements SpecialVisualizationState { } const floors = new Set() for (const feature of features) { - let level = feature.properties["_level"] + const level = feature.properties["_level"] if (level) { const levels = level.split(";") for (const l of levels) { @@ -379,7 +378,7 @@ export default class ThemeViewState implements SpecialVisualizationState { this.featureSummary = this.setupSummaryLayer( new LayerConfig(summaryLayer, "summaryLayer", true) ) - this.toCacheSavers = this.initSaveToLocalStorage() + this.toCacheSavers = layout.enableCache ? this.initSaveToLocalStorage() : undefined this.initActors() this.drawSpecialLayers() this.initHotkeys()