diff --git a/Logic/Actors/SelectedElementTagsUpdater.ts b/Logic/Actors/SelectedElementTagsUpdater.ts index 765c9ee19d..1a47b6af5f 100644 --- a/Logic/Actors/SelectedElementTagsUpdater.ts +++ b/Logic/Actors/SelectedElementTagsUpdater.ts @@ -6,6 +6,8 @@ import {ElementStorage} from "../ElementStorage"; import {Changes} from "../Osm/Changes"; import {OsmObject} from "../Osm/OsmObject"; import {OsmConnection} from "../Osm/OsmConnection"; +import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; +import SimpleMetaTagger from "../SimpleMetaTagger"; export default class SelectedElementTagsUpdater { @@ -14,13 +16,14 @@ export default class SelectedElementTagsUpdater { "changeset", "user", "uid", - "id"] ) + "id"]) constructor(state: { selectedElement: UIEventSource, allElements: ElementStorage, changes: Changes, - osmConnection: OsmConnection + osmConnection: OsmConnection, + layoutToUse: LayoutConfig }) { @@ -37,7 +40,8 @@ export default class SelectedElementTagsUpdater { selectedElement: UIEventSource, allElements: ElementStorage, changes: Changes, - osmConnection: OsmConnection + osmConnection: OsmConnection, + layoutToUse: LayoutConfig }) { @@ -70,11 +74,18 @@ export default class SelectedElementTagsUpdater { selectedElement: UIEventSource, allElements: ElementStorage, changes: Changes, - osmConnection: OsmConnection + osmConnection: OsmConnection, + layoutToUse: LayoutConfig }, latestTags: any, id: string ) { try { + const leftRightSensitive = state.layoutToUse.layers.some(layer => layer.lineRendering.some(lr => lr.leftRightSensitive)) + + if (leftRightSensitive) { + SimpleMetaTagger.removeBothTagging(latestTags) + } + const pendingChanges = state.changes.pendingChanges.data .filter(change => change.type + "/" + change.id === id) .filter(change => change.tags !== undefined); @@ -92,6 +103,7 @@ export default class SelectedElementTagsUpdater { } } + // With the changes applied, we merge them onto the upstream object let somethingChanged = false; const currentTagsSource = state.allElements.getEventSourceById(id); @@ -115,7 +127,7 @@ export default class SelectedElementTagsUpdater { if (currentKey.startsWith("_")) { continue } - if(this.metatags.has(currentKey)){ + if (this.metatags.has(currentKey)) { continue } if (currentKey in latestTags) { diff --git a/Logic/SimpleMetaTagger.ts b/Logic/SimpleMetaTagger.ts index f5c1b77e29..cbe30c7268 100644 --- a/Logic/SimpleMetaTagger.ts +++ b/Logic/SimpleMetaTagger.ts @@ -78,6 +78,83 @@ export default class SimpleMetaTagger { return true; } ) + + /** + * Edits the given object to rewrite 'both'-tagging into a 'left-right' tagging scheme. + * These changes are performed in-place. + * + * Returns 'true' is at least one change has been made + * @param tags + */ + public static removeBothTagging(tags: any): boolean{ + let somethingChanged = false + /** + * Sets the key onto the properties (but doesn't overwrite if already existing) + */ + function set(k, value) { + if (tags[k] === undefined || tags[k] === "") { + tags[k] = value + somethingChanged = true + } + } + + if (tags["sidewalk"]) { + + const v = tags["sidewalk"] + switch (v) { + case "none": + case "no": + set("sidewalk:left", "no"); + set("sidewalk:right", "no"); + break + case "both": + set("sidewalk:left", "yes"); + set("sidewalk:right", "yes"); + break; + case "left": + set("sidewalk:left", "yes"); + set("sidewalk:right", "no"); + break; + case "right": + set("sidewalk:left", "no"); + set("sidewalk:right", "yes"); + break; + default: + set("sidewalk:left", v); + set("sidewalk:right", v); + break; + } + delete tags["sidewalk"] + somethingChanged = true + } + + + const regex = /\([^:]*\):both:\(.*\)/ + for (const key in tags) { + const v = tags[key] + if (key.endsWith(":both")) { + const strippedKey = key.substring(0, key.length - ":both".length) + set(strippedKey + ":left", v) + set(strippedKey + ":right", v) + delete tags[key] + continue + } + + const match = key.match(regex) + if (match !== null) { + const strippedKey = match[1] + const property = match[1] + set(strippedKey + ":left:" + property, v) + set(strippedKey + ":right:" + property, v) + console.log("Left-right rewritten " + key) + delete tags[key] + } + } + + + return somethingChanged + } + private static noBothButLeftRight = new SimpleMetaTagger( { keys: ["sidewalk:left", "sidewalk:right", "generic_key:left:property", "generic_key:right:property"], @@ -91,74 +168,7 @@ export default class SimpleMetaTagger { return; } - const tgs = feature.properties; - let somethingChanged = false - - /** - * Sets the key onto the properties (but doesn't overwrite if already existing) - */ - function set(k, value) { - if (tgs[k] === undefined || tgs[k] === "") { - tgs[k] = value - somethingChanged = true - } - } - - if (tgs["sidewalk"]) { - - const v = tgs["sidewalk"] - switch (v) { - case "none": - case "no": - set("sidewalk:left", "no"); - set("sidewalk:right", "no"); - break - case "both": - set("sidewalk:left", "yes"); - set("sidewalk:right", "yes"); - break; - case "left": - set("sidewalk:left", "yes"); - set("sidewalk:right", "no"); - break; - case "right": - set("sidewalk:left", "no"); - set("sidewalk:right", "yes"); - break; - default: - set("sidewalk:left", v); - set("sidewalk:right", v); - break; - } - delete tgs["sidewalk"] - somethingChanged = true - } - - - const regex = /\([^:]*\):both:\(.*\)/ - for (const key in tgs) { - const v = tgs[key] - if (key.endsWith(":both")) { - const strippedKey = key.substring(0, key.length - ":both".length) - set(strippedKey + ":left", v) - set(strippedKey + ":right", v) - delete tgs[key] - continue - } - - const match = key.match(regex) - if (match !== null) { - const strippedKey = match[1] - const property = match[1] - set(strippedKey + ":left:" + property, v) - set(strippedKey + ":right:" + property, v) - console.log("Left-right rewritten " + key) - delete tgs[key] - } - } - - - return somethingChanged + return SimpleMetaTagger.removeBothTagging(feature.properties) }) ) private static surfaceArea = new SimpleMetaTagger(