diff --git a/Logic/FeatureSource/Actors/RegisteringAllFromFeatureSourceActor.ts b/Logic/FeatureSource/Actors/RegisteringAllFromFeatureSourceActor.ts index 2408464700..41c2e4bbb9 100644 --- a/Logic/FeatureSource/Actors/RegisteringAllFromFeatureSourceActor.ts +++ b/Logic/FeatureSource/Actors/RegisteringAllFromFeatureSourceActor.ts @@ -1,17 +1,19 @@ import FeatureSource from "../FeatureSource"; import {UIEventSource} from "../../UIEventSource"; import State from "../../../State"; +import ElementsState from "../../State/ElementsState"; +import {ElementStorage} from "../../ElementStorage"; export default class RegisteringAllFromFeatureSourceActor { public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>; public readonly name; - constructor(source: FeatureSource) { + constructor(source: FeatureSource, allElements: ElementStorage) { this.features = source.features; this.name = "RegisteringSource of " + source.name; this.features.addCallbackAndRunD(features => { for (const feature of features) { - State.state.allElements.addOrGetElement(feature.feature) + allElements.addOrGetElement(feature.feature) } }) } diff --git a/Logic/FeatureSource/FeaturePipeline.ts b/Logic/FeatureSource/FeaturePipeline.ts index 1f49228c39..93bc53a748 100644 --- a/Logic/FeatureSource/FeaturePipeline.ts +++ b/Logic/FeatureSource/FeaturePipeline.ts @@ -23,6 +23,7 @@ import {Tiles} from "../../Models/TileRange"; import TileFreshnessCalculator from "./TileFreshnessCalculator"; import FullNodeDatabaseSource from "./TiledFeatureSource/FullNodeDatabaseSource"; import MapState from "../State/MapState"; +import {ElementStorage} from "../ElementStorage"; /** @@ -160,7 +161,7 @@ export default class FeaturePipeline { state.currentBounds, state.locationControl, (tileIndex, freshness) => self.freshnesses.get(id).addTileLoad(tileIndex, freshness), (tile) => { - new RegisteringAllFromFeatureSourceActor(tile) + new RegisteringAllFromFeatureSourceActor(tile, state.allElements) hierarchy.registerTile(tile); tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) } @@ -180,13 +181,13 @@ export default class FeaturePipeline { minZoomLevel: this.osmSourceZoomLevel, dontEnforceMinZoom: true, registerTile: (tile) => { - new RegisteringAllFromFeatureSourceActor(tile) + new RegisteringAllFromFeatureSourceActor(tile, state.allElements) perLayerHierarchy.get(id).registerTile(tile) tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) } }) } else { - new RegisteringAllFromFeatureSourceActor(src) + new RegisteringAllFromFeatureSourceActor(src, state.allElements) perLayerHierarchy.get(id).registerTile(src) src.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(src)) } @@ -194,7 +195,7 @@ export default class FeaturePipeline { new DynamicGeoJsonTileSource( filteredLayer, tile => { - new RegisteringAllFromFeatureSourceActor(tile) + new RegisteringAllFromFeatureSourceActor(tile, state.allElements) perLayerHierarchy.get(id).registerTile(tile) tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) }, @@ -208,7 +209,7 @@ export default class FeaturePipeline { isActive: useOsmApi, neededTiles: neededTilesFromOsm, handleTile: tile => { - new RegisteringAllFromFeatureSourceActor(tile) + new RegisteringAllFromFeatureSourceActor(tile, state.allElements) if (tile.layer.layerDef.maxAgeOfCache > 0) { const saver = self.localStorageSavers.get(tile.layer.layerDef.id) if(saver === undefined){ @@ -240,7 +241,7 @@ export default class FeaturePipeline { const fullNodeDb = new FullNodeDatabaseSource( state.filteredLayers.data.filter(l => l.layerDef.id === "type_node")[0], tile => { - new RegisteringAllFromFeatureSourceActor(tile) + new RegisteringAllFromFeatureSourceActor(tile, state.allElements) perLayerHierarchy.get(tile.layer.layerDef.id).registerTile(tile) tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) }) @@ -273,8 +274,8 @@ export default class FeaturePipeline { // Also load points/lines that are newly added. - const newGeometry = new NewGeometryFromChangesFeatureSource(state.changes) - new RegisteringAllFromFeatureSourceActor(newGeometry) + const newGeometry = new NewGeometryFromChangesFeatureSource(state.changes, state.osmConnection._oauth_config.url) + new RegisteringAllFromFeatureSourceActor(newGeometry, state.allElements) // A NewGeometryFromChangesFeatureSource does not split per layer, so we do this next new PerLayerFeatureSourceSplitter(state.filteredLayers, (perLayer) => { @@ -386,6 +387,7 @@ export default class FeaturePipeline { } private initOverpassUpdater(state: { + allElements: ElementStorage; layoutToUse: LayoutConfig, currentBounds: UIEventSource, locationControl: UIEventSource, @@ -434,7 +436,7 @@ export default class FeaturePipeline { // Register everything in the state' 'AllElements' - new RegisteringAllFromFeatureSourceActor(updater) + new RegisteringAllFromFeatureSourceActor(updater, state.allElements) return updater; } diff --git a/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts b/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts index 6b8611d507..b7347b8ac9 100644 --- a/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts +++ b/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts @@ -3,7 +3,6 @@ import {OsmNode, OsmRelation, OsmWay} from "../../Osm/OsmObject"; import FeatureSource from "../FeatureSource"; import {UIEventSource} from "../../UIEventSource"; import {ChangeDescription} from "../../Osm/Actions/ChangeDescription"; -import State from "../../../State"; export class NewGeometryFromChangesFeatureSource implements FeatureSource { // This class name truly puts the 'Java' into 'Javascript' @@ -14,7 +13,7 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource { public readonly features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]); public readonly name: string = "newFeatures"; - constructor(changes: Changes) { + constructor(changes: Changes, backendUrl: string) { const seenChanges = new Set(); const features = this.features.data; @@ -55,7 +54,7 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource { } tags["id"] = change.type + "/" + change.id - tags["_backend"] = State.state.osmConnection._oauth_config.url + tags["_backend"] = backendUrl switch (change.type) { case "node": diff --git a/Logic/MetaTagging.ts b/Logic/MetaTagging.ts index ac7f973e40..51b61a1b2c 100644 --- a/Logic/MetaTagging.ts +++ b/Logic/MetaTagging.ts @@ -105,7 +105,7 @@ export default class MetaTagging { } - public static createFunctionsForFeature(calculatedTags: [string, string][]): ((feature: any) => void)[] { + public static createFunctionsForFeature(layerId: string, calculatedTags: [string, string][]): ((feature: any) => void)[] { const functions: ((feature: any) => void)[] = []; for (const entry of calculatedTags) { const key = entry[0] @@ -139,7 +139,7 @@ export default class MetaTagging { return result; } catch (e) { if (MetaTagging.errorPrintCount < MetaTagging.stopErrorOutputAt) { - console.warn("Could not calculate a calculated tag defined by " + code + " due to " + e + ". This is code defined in the theme. Are you the theme creator? Doublecheck your code. Note that the metatags might not be stable on new features", e, e.stack) + console.warn("Could not calculate a calculated tag for key "+key+" defined by " + code + " (in layer"+layerId+") due to \n" + e + "\n. Are you the theme creator? Doublecheck your code. Note that the metatags might not be stable on new features", e, e.stack) MetaTagging.errorPrintCount++; if (MetaTagging.errorPrintCount == MetaTagging.stopErrorOutputAt) { console.error("Got ", MetaTagging.stopErrorOutputAt, " errors calculating this metatagging - stopping output now") @@ -173,7 +173,7 @@ export default class MetaTagging { } try { - const functions = MetaTagging.createFunctionsForFeature(calculatedTags) + const functions = MetaTagging.createFunctionsForFeature(layer.id, calculatedTags) ExtraFunctions.FullPatchFeature(params, feature);