Rewrite left-right tags when updating them on click

This commit is contained in:
Pieter Vander Vennet 2021-10-22 13:35:11 +02:00
parent 45e8ee310b
commit 40c4ae769d
2 changed files with 95 additions and 73 deletions

View file

@ -6,6 +6,8 @@ import {ElementStorage} from "../ElementStorage";
import {Changes} from "../Osm/Changes"; import {Changes} from "../Osm/Changes";
import {OsmObject} from "../Osm/OsmObject"; import {OsmObject} from "../Osm/OsmObject";
import {OsmConnection} from "../Osm/OsmConnection"; import {OsmConnection} from "../Osm/OsmConnection";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import SimpleMetaTagger from "../SimpleMetaTagger";
export default class SelectedElementTagsUpdater { export default class SelectedElementTagsUpdater {
@ -20,7 +22,8 @@ export default class SelectedElementTagsUpdater {
selectedElement: UIEventSource<any>, selectedElement: UIEventSource<any>,
allElements: ElementStorage, allElements: ElementStorage,
changes: Changes, changes: Changes,
osmConnection: OsmConnection osmConnection: OsmConnection,
layoutToUse: LayoutConfig
}) { }) {
@ -37,7 +40,8 @@ export default class SelectedElementTagsUpdater {
selectedElement: UIEventSource<any>, selectedElement: UIEventSource<any>,
allElements: ElementStorage, allElements: ElementStorage,
changes: Changes, changes: Changes,
osmConnection: OsmConnection osmConnection: OsmConnection,
layoutToUse: LayoutConfig
}) { }) {
@ -70,11 +74,18 @@ export default class SelectedElementTagsUpdater {
selectedElement: UIEventSource<any>, selectedElement: UIEventSource<any>,
allElements: ElementStorage, allElements: ElementStorage,
changes: Changes, changes: Changes,
osmConnection: OsmConnection osmConnection: OsmConnection,
layoutToUse: LayoutConfig
}, latestTags: any, id: string }, latestTags: any, id: string
) { ) {
try { 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 const pendingChanges = state.changes.pendingChanges.data
.filter(change => change.type + "/" + change.id === id) .filter(change => change.type + "/" + change.id === id)
.filter(change => change.tags !== undefined); .filter(change => change.tags !== undefined);
@ -92,6 +103,7 @@ export default class SelectedElementTagsUpdater {
} }
} }
// With the changes applied, we merge them onto the upstream object // With the changes applied, we merge them onto the upstream object
let somethingChanged = false; let somethingChanged = false;
const currentTagsSource = state.allElements.getEventSourceById(id); const currentTagsSource = state.allElements.getEventSourceById(id);

View file

@ -78,35 +78,29 @@ export default class SimpleMetaTagger {
return true; return true;
} }
) )
private static noBothButLeftRight = new SimpleMetaTagger(
{
keys: ["sidewalk:left", "sidewalk:right", "generic_key:left:property", "generic_key:right:property"],
doc: "Rewrites tags from 'generic_key:both:property' as 'generic_key:left:property' and 'generic_key:right:property' (and similar for sidewalk tagging). Note that this rewritten tags _will be reuploaded on a change_. To prevent to much unrelated retagging, this is only enabled if the layer has at least some lineRenderings with offset defined",
includesDates: false,
cleanupRetagger: true
},
((feature, state, layer) => {
if(!layer.lineRendering.some(lr => lr.leftRightSensitive)){ /**
return; * Edits the given object to rewrite 'both'-tagging into a 'left-right' tagging scheme.
} * These changes are performed in-place.
*
const tgs = feature.properties; * Returns 'true' is at least one change has been made
* @param tags
*/
public static removeBothTagging(tags: any): boolean{
let somethingChanged = false let somethingChanged = false
/** /**
* Sets the key onto the properties (but doesn't overwrite if already existing) * Sets the key onto the properties (but doesn't overwrite if already existing)
*/ */
function set(k, value) { function set(k, value) {
if (tgs[k] === undefined || tgs[k] === "") { if (tags[k] === undefined || tags[k] === "") {
tgs[k] = value tags[k] = value
somethingChanged = true somethingChanged = true
} }
} }
if (tgs["sidewalk"]) { if (tags["sidewalk"]) {
const v = tgs["sidewalk"] const v = tags["sidewalk"]
switch (v) { switch (v) {
case "none": case "none":
case "no": case "no":
@ -130,19 +124,19 @@ export default class SimpleMetaTagger {
set("sidewalk:right", v); set("sidewalk:right", v);
break; break;
} }
delete tgs["sidewalk"] delete tags["sidewalk"]
somethingChanged = true somethingChanged = true
} }
const regex = /\([^:]*\):both:\(.*\)/ const regex = /\([^:]*\):both:\(.*\)/
for (const key in tgs) { for (const key in tags) {
const v = tgs[key] const v = tags[key]
if (key.endsWith(":both")) { if (key.endsWith(":both")) {
const strippedKey = key.substring(0, key.length - ":both".length) const strippedKey = key.substring(0, key.length - ":both".length)
set(strippedKey + ":left", v) set(strippedKey + ":left", v)
set(strippedKey + ":right", v) set(strippedKey + ":right", v)
delete tgs[key] delete tags[key]
continue continue
} }
@ -153,12 +147,28 @@ export default class SimpleMetaTagger {
set(strippedKey + ":left:" + property, v) set(strippedKey + ":left:" + property, v)
set(strippedKey + ":right:" + property, v) set(strippedKey + ":right:" + property, v)
console.log("Left-right rewritten " + key) console.log("Left-right rewritten " + key)
delete tgs[key] delete tags[key]
} }
} }
return somethingChanged return somethingChanged
}
private static noBothButLeftRight = new SimpleMetaTagger(
{
keys: ["sidewalk:left", "sidewalk:right", "generic_key:left:property", "generic_key:right:property"],
doc: "Rewrites tags from 'generic_key:both:property' as 'generic_key:left:property' and 'generic_key:right:property' (and similar for sidewalk tagging). Note that this rewritten tags _will be reuploaded on a change_. To prevent to much unrelated retagging, this is only enabled if the layer has at least some lineRenderings with offset defined",
includesDates: false,
cleanupRetagger: true
},
((feature, state, layer) => {
if(!layer.lineRendering.some(lr => lr.leftRightSensitive)){
return;
}
return SimpleMetaTagger.removeBothTagging(feature.properties)
}) })
) )
private static surfaceArea = new SimpleMetaTagger( private static surfaceArea = new SimpleMetaTagger(