|  | @@ -3,21 +3,6 @@
 | 
	
		
			
				|  |  |  // XXX There is no reason to define these shortcuts globally, they should be
 | 
	
		
			
				|  |  |  // attached to a template (most of them will go in the `board` template).
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// Pressing `Escape` should close the last opened “element” and only the last
 | 
	
		
			
				|  |  | -// one -- curently we handle popups and the card detailed view of the sidebar.
 | 
	
		
			
				|  |  | -Mousetrap.bind('esc', function() {
 | 
	
		
			
				|  |  | -  if (currentlyOpenedForm.get() !== null) {
 | 
	
		
			
				|  |  | -    currentlyOpenedForm.get().close();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  } else if (Popup.isOpen()) {
 | 
	
		
			
				|  |  | -    Popup.back();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // XXX We should have a higher level API
 | 
	
		
			
				|  |  | -  } else if (Session.get('currentCard')) {
 | 
	
		
			
				|  |  | -    Utils.goBoardId(Session.get('currentBoard'));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -});
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  Mousetrap.bind('w', function() {
 | 
	
		
			
				|  |  |    Sidebar.toogle();
 | 
	
		
			
				|  |  |  });
 | 
	
	
		
			
				|  | @@ -48,3 +33,46 @@ 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 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.
 | 
	
		
			
				|  |  | +EscapeActions = {
 | 
	
		
			
				|  |  | +  _actions: [],
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  register: function(priority, condition, action) {
 | 
	
		
			
				|  |  | +    // XXX Rewrite this with ES6: .push({ priority, condition, action })
 | 
	
		
			
				|  |  | +    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(maxPriority) {
 | 
	
		
			
				|  |  | +    maxPriority = maxPriority || Infinity;
 | 
	
		
			
				|  |  | +    var currentAction;
 | 
	
		
			
				|  |  | +    for (var i = 0; i < this._actions.length; i++) {
 | 
	
		
			
				|  |  | +      currentAction = this._actions[i];
 | 
	
		
			
				|  |  | +      if (currentAction.priority > maxPriority)
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +      if (!! currentAction.condition())
 | 
	
		
			
				|  |  | +        currentAction.action();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Mousetrap.bind('esc', function() {
 | 
	
		
			
				|  |  | +  EscapeActions.executeLowest();
 | 
	
		
			
				|  |  | +});
 |