瀏覽代碼

Prioritize escape actions with a label hierarchy instead of an integer

Maxime Quandalle 10 年之前
父節點
當前提交
42f6dc686f

+ 1 - 1
client/components/boards/router.js

@@ -57,7 +57,7 @@ Router.route('/boards/:boardId/:slug/:cardId', {
 });
 
 // Close the card details pane by pressing escape
-EscapeActions.register(50,
+EscapeActions.register('detailedPane',
   function() { return ! Session.equals('currentCard', null); },
   function() { Utils.goBoardId(Session.get('currentBoard')); }
 );

+ 2 - 4
client/components/forms/inlinedform.js

@@ -17,8 +17,6 @@
 // keyboard.js
 var currentlyOpenedForm = new ReactiveVar(null);
 
-var inlinedFormEscapePriority = 30;
-
 BlazeComponent.extendComponent({
   template: function() {
     return 'inlinedForm';
@@ -37,7 +35,7 @@ BlazeComponent.extendComponent({
     // if (currentlyOpenedForm.get() !== null) {
     //   currentlyOpenedForm.get().close();
     // }
-    EscapeActions.executeLowerThan(inlinedFormEscapePriority);
+    EscapeActions.executeLowerThan('inlinedForm');
     this.isOpen.set(true);
     currentlyOpenedForm.set(this);
   },
@@ -97,7 +95,7 @@ BlazeComponent.extendComponent({
 }).register('inlinedForm');
 
 // Press escape to close the currently opened inlinedForm
-EscapeActions.register(inlinedFormEscapePriority,
+EscapeActions.register('inlinedForm',
   function() { return currentlyOpenedForm.get() !== null; },
   function() { currentlyOpenedForm.get().close(); }
 );

+ 1 - 1
client/components/main/editor.js

@@ -60,7 +60,7 @@ Template.editor.onRendered(function() {
   });
 });
 
-EscapeActions.register(10,
+EscapeActions.register('textcomplete',
   function() { return dropdownMenuIsOpened; },
   function() {}
 );

+ 1 - 1
client/components/sidebar/sidebar.js

@@ -97,7 +97,7 @@ BlazeComponent.extendComponent({
   }
 }).register('sidebar');
 
-EscapeActions.register(40,
+EscapeActions.register('sidebarView',
   function() { return Sidebar && Sidebar.getView() !== defaultView; },
   function() { Sidebar.setView(defaultView); }
 );

+ 25 - 8
client/lib/keyboard.js

@@ -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)

+ 4 - 1
client/lib/popup.js

@@ -204,4 +204,7 @@ $(document).on('click', function(evt) {
 
 // Press escape to close the popup.
 var bindPopup = function(f) { return _.bind(f, Popup); };
-EscapeActions.register(20, bindPopup(Popup.isOpen), bindPopup(Popup.close));
+EscapeActions.register('popup',
+  bindPopup(Popup.isOpen),
+  bindPopup(Popup.close)
+);