mirror of
https://github.com/wekan/wekan.git
synced 2025-12-27 20:58:48 +01:00
Click on the page to escape the last action
This is a generalization of what we had for closing a popup by clicking outside of it. It now works for inlinedForms and detailsPane as well.
This commit is contained in:
parent
12919cbfc6
commit
92dd05d06d
17 changed files with 199 additions and 145 deletions
|
|
@ -33,72 +33,3 @@ Mousetrap.bind(['down', 'up'], function(evt, key) {
|
|||
Utils.goCardId(nextCardId);
|
||||
}
|
||||
});
|
||||
|
||||
// Pressing `Escape` should close the last opened “element” and only the last
|
||||
// one. Components can register themselves using a label a condition, and an
|
||||
// action. This is used by Popup or inlinedForm for instance. When we press
|
||||
// escape we execute the action which have a condition is valid and his the the
|
||||
// highest in the label hierarchy.
|
||||
EscapeActions = {
|
||||
_actions: [],
|
||||
|
||||
// Executed in order
|
||||
hierarchy: [
|
||||
'textcomplete',
|
||||
'popup',
|
||||
'inlinedForm',
|
||||
'multiselection-disable',
|
||||
'sidebarView',
|
||||
'detailsPane',
|
||||
'multiselection-reset'
|
||||
],
|
||||
|
||||
register: function(label, action, condition) {
|
||||
if (_.isUndefined(condition))
|
||||
condition = function() { return true; };
|
||||
|
||||
// XXX Rewrite this with ES6: .push({ priority, condition, action })
|
||||
var priority = this.hierarchy.indexOf(label);
|
||||
if (priority === -1) {
|
||||
throw Error('You must define the label in the EscapeActions hierarchy');
|
||||
}
|
||||
this._actions.push({
|
||||
priority: priority,
|
||||
condition: condition,
|
||||
action: action
|
||||
});
|
||||
// XXX Rewrite this with ES6: => function
|
||||
this._actions = _.sortBy(this._actions, function(a) { return a.priority; });
|
||||
},
|
||||
|
||||
executeLowest: function() {
|
||||
var topActiveAction = _.find(this._actions, function(a) {
|
||||
return !! a.condition();
|
||||
});
|
||||
return topActiveAction && topActiveAction.action();
|
||||
},
|
||||
|
||||
executeLowerThan: function(label) {
|
||||
var maxPriority, currentAction;
|
||||
if (! label)
|
||||
maxPriority = Infinity;
|
||||
else
|
||||
maxPriority = this.hierarchy.indexOf(label);
|
||||
|
||||
for (var i = 0; i < this._actions.length; i++) {
|
||||
currentAction = this._actions[i];
|
||||
if (currentAction.priority > maxPriority)
|
||||
return;
|
||||
if (!! currentAction.condition())
|
||||
currentAction.action();
|
||||
}
|
||||
},
|
||||
|
||||
executeAll: function() {
|
||||
return this.executeLowerThan();
|
||||
}
|
||||
};
|
||||
|
||||
Mousetrap.bind('esc', function() {
|
||||
EscapeActions.executeLowest();
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue