|
@@ -35,15 +35,28 @@ Mousetrap.bind(['down', 'up'], function(evt, key) {
|
|
|
});
|
|
|
|
|
|
// Pressing `Escape` should close the last opened “element” and only the last
|
|
|
-// one. Components can register themself using a priority number (smaller is
|
|
|
-// closed first), a condition, and an action.This is used by Popup or
|
|
|
-// inlinedForm for instance. When we press escape we execute the action which
|
|
|
-// condition is valid with the highest priority.
|
|
|
+// 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: [],
|
|
|
|
|
|
- register: function(priority, condition, action) {
|
|
|
+ // Executed in order
|
|
|
+ hierarchy: [
|
|
|
+ 'textcomplete',
|
|
|
+ 'popup',
|
|
|
+ 'inlinedForm',
|
|
|
+ 'sidebarView',
|
|
|
+ 'detailedPane'
|
|
|
+ ],
|
|
|
+
|
|
|
+ register: function(label, condition, action) {
|
|
|
// 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,
|
|
@@ -60,9 +73,13 @@ EscapeActions = {
|
|
|
return topActiveAction && topActiveAction.action();
|
|
|
},
|
|
|
|
|
|
- executeLowerThan: function(maxPriority) {
|
|
|
- maxPriority = maxPriority || Infinity;
|
|
|
- var currentAction;
|
|
|
+ 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)
|