mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-13 17:23:02 +00:00
This is cleaner than adding hooks to transitionable actions, or performing validation on every history change. We want validation to run after each operation, but not while the user is drawing lines or typing in fields.
119 lines
3.7 KiB
JavaScript
119 lines
3.7 KiB
JavaScript
import { t } from '../util/locale';
|
|
|
|
import { actionChangePreset } from '../actions/change_preset';
|
|
import { actionJoin } from '../actions/join';
|
|
import { actionMerge } from '../actions/merge';
|
|
import { actionMergeNodes } from '../actions/merge_nodes';
|
|
import { actionMergePolygon } from '../actions/merge_polygon';
|
|
|
|
import { behaviorOperation } from '../behavior/operation';
|
|
import { modeSelect } from '../modes/select';
|
|
|
|
|
|
export function operationMerge(selectedIDs, context) {
|
|
|
|
function updatePresetTags(newGraph, ids) {
|
|
var id = ids[0];
|
|
var newEntity = newGraph.hasEntity(id);
|
|
|
|
if (!newEntity) return;
|
|
var newPreset = context.presets().match(newEntity, newGraph);
|
|
context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
|
|
}
|
|
|
|
|
|
var join = actionJoin(selectedIDs);
|
|
var merge = actionMerge(selectedIDs);
|
|
var mergePolygon = actionMergePolygon(selectedIDs);
|
|
var mergeNodes = actionMergeNodes(selectedIDs);
|
|
|
|
|
|
var operation = function() {
|
|
var doUpdateTags;
|
|
var action;
|
|
|
|
if (!join.disabled(context.graph())) {
|
|
doUpdateTags = false;
|
|
action = join;
|
|
} else if (!merge.disabled(context.graph())) {
|
|
doUpdateTags = true;
|
|
action = merge;
|
|
} else if (!mergePolygon.disabled(context.graph())) {
|
|
doUpdateTags = false;
|
|
action = mergePolygon;
|
|
} else {
|
|
doUpdateTags = true;
|
|
action = mergeNodes;
|
|
}
|
|
|
|
context.perform(action, operation.annotation());
|
|
|
|
var ids = selectedIDs.filter(function(id) {
|
|
var entity = context.hasEntity(id);
|
|
return entity && entity.type !== 'node';
|
|
});
|
|
|
|
// if we merged tags, rematch preset to update tags if necessary (#3851)
|
|
if (doUpdateTags) {
|
|
updatePresetTags(context.graph(), ids);
|
|
}
|
|
|
|
context.validator().validate();
|
|
context.enter(modeSelect(context, ids));
|
|
};
|
|
|
|
|
|
operation.available = function() {
|
|
return selectedIDs.length >= 2;
|
|
};
|
|
|
|
|
|
operation.disabled = function() {
|
|
return join.disabled(context.graph()) &&
|
|
merge.disabled(context.graph()) &&
|
|
mergePolygon.disabled(context.graph()) &&
|
|
mergeNodes.disabled(context.graph());
|
|
};
|
|
|
|
|
|
operation.tooltip = function() {
|
|
var j = join.disabled(context.graph()); // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
|
|
var m = merge.disabled(context.graph()); // 'not_eligible'
|
|
var p = mergePolygon.disabled(context.graph()); // 'not_eligible', 'incomplete_relation'
|
|
var n = mergeNodes.disabled(context.graph()); // 'not_eligible', 'relation', 'restriction'
|
|
|
|
// disabled for one of various reasons
|
|
if (j && m && p && n) {
|
|
if (j === 'restriction' || n === 'restriction') {
|
|
return t('operations.merge.restriction',
|
|
{ relation: context.presets().item('type/restriction').name() });
|
|
|
|
} else if (p === 'incomplete_relation') {
|
|
return t('operations.merge.incomplete_relation');
|
|
|
|
} else if (n === 'relation') {
|
|
return t('operations.merge.relation');
|
|
|
|
} else {
|
|
return t('operations.merge.' + j);
|
|
}
|
|
|
|
} else {
|
|
return t('operations.merge.description');
|
|
}
|
|
};
|
|
|
|
|
|
operation.annotation = function() {
|
|
return t('operations.merge.annotation', { n: selectedIDs.length });
|
|
};
|
|
|
|
|
|
operation.id = 'merge';
|
|
operation.keys = [t('operations.merge.key')];
|
|
operation.title = t('operations.merge.title');
|
|
operation.behavior = behaviorOperation(context).which(operation);
|
|
|
|
return operation;
|
|
}
|