mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-13 17:23:02 +00:00
31 lines
1.4 KiB
JavaScript
31 lines
1.4 KiB
JavaScript
export function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
|
|
return function action(graph) {
|
|
var entity = graph.entity(entityID);
|
|
var geometry = entity.geometry(graph);
|
|
var tags = entity.tags;
|
|
const loc = entity.extent(graph).center();
|
|
|
|
// preserve tags that the new preset might care about, if any
|
|
var preserveKeys;
|
|
if (newPreset) {
|
|
preserveKeys = [];
|
|
if (newPreset.addTags) {
|
|
preserveKeys = preserveKeys.concat(Object.keys(newPreset.addTags));
|
|
}
|
|
if (oldPreset && !oldPreset.id.startsWith(newPreset.id)) {
|
|
// only if old preset is not a sub-preset of the new one:
|
|
// preserve tags for which the new preset has a field
|
|
// https://github.com/openstreetmap/iD/issues/9372
|
|
newPreset.fields(loc).concat(newPreset.moreFields(loc))
|
|
.filter(f => f.matchGeometry(geometry))
|
|
.map(f => f.key).filter(Boolean)
|
|
.forEach(key => preserveKeys.push(key));
|
|
}
|
|
}
|
|
if (oldPreset) tags = oldPreset.unsetTags(tags, geometry, preserveKeys, false, loc);
|
|
if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults, loc);
|
|
|
|
return graph.replace(entity.update({tags: tags}));
|
|
};
|
|
}
|