in modules/behavior/select.js [274:365]
function processClick(datum, isMultiselect, point, alsoSelectId) {
var mode = context.mode();
var showMenu = _showMenu;
var interactionType = _lastInteractionType;
var entity = datum && datum.properties && datum.properties.entity;
if (entity) datum = entity;
if (datum && datum.type === 'midpoint') {
// treat targeting midpoints as if targeting the parent way
datum = datum.parents[0];
}
var newMode;
if (datum && datum.__fbid__) { // clicked a RapiD feature ..
context
.selectedNoteID(null)
.selectedErrorID(null)
.enter(modeRapidSelectFeatures(context, datum));
} else if (datum instanceof osmEntity) { // clicked an entity..
var selectedIDs = context.selectedIDs();
context.selectedNoteID(null);
context.selectedErrorID(null);
if (!isMultiselect) {
// don't change the selection if we're toggling the menu atop a multiselection
if (!showMenu ||
selectedIDs.length <= 1 ||
selectedIDs.indexOf(datum.id) === -1) {
if (alsoSelectId === datum.id) alsoSelectId = null;
selectedIDs = (alsoSelectId ? [alsoSelectId] : []).concat([datum.id]);
// always enter modeSelect even if the entity is already
// selected since listeners may expect `context.enter` events,
// e.g. in the walkthrough
newMode = mode.id === 'select' ? mode.selectedIDs(selectedIDs) : modeSelect(context, selectedIDs).selectBehavior(behavior);
context.enter(newMode);
}
} else {
if (selectedIDs.indexOf(datum.id) !== -1) {
// clicked entity is already in the selectedIDs list..
if (!showMenu) {
// deselect clicked entity, then reenter select mode or return to browse mode..
selectedIDs = selectedIDs.filter(function(id) { return id !== datum.id; });
newMode = selectedIDs.length ? mode.selectedIDs(selectedIDs) : modeBrowse(context).selectBehavior(behavior);
context.enter(newMode);
}
} else {
// clicked entity is not in the selected list, add it..
selectedIDs = selectedIDs.concat([datum.id]);
newMode = mode.selectedIDs(selectedIDs);
context.enter(newMode);
}
}
} else if (datum && datum.__featurehash__ && !isMultiselect) {
// targeting custom data
context
.selectedNoteID(null)
.enter(modeSelectData(context, datum));
} else if (datum instanceof osmNote && !isMultiselect) {
// targeting a note
context
.selectedNoteID(datum.id)
.enter(modeSelectNote(context, datum.id));
} else if (datum instanceof QAItem & !isMultiselect) {
// targeting an external QA issue
context
.selectedErrorID(datum.id)
.enter(modeSelectError(context, datum.id, datum.service));
} else {
// targeting nothing
context.selectedNoteID(null);
context.selectedErrorID(null);
if (!isMultiselect && mode.id !== 'browse') {
context.enter(modeBrowse(context));
}
}
context.ui().closeEditMenu();
// always request to show the edit menu in case the mode needs it
if (showMenu) context.ui().showEditMenu(point, interactionType);
resetProperties();
}