From 40c2411f2a1ce0bbd177f377828f9d6700112b06 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 26 May 2015 20:30:01 +0200 Subject: Implement a new system to handle "escape actions" The new EscapeActions object decide what to do when the user press the Escape key (such as closing a opened popup or inlined form). This commit also re-introduced the sidebar current view as a sidebar component local state. --- client/lib/keyboard.js | 58 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 15 deletions(-) (limited to 'client/lib/keyboard.js') diff --git a/client/lib/keyboard.js b/client/lib/keyboard.js index 8601e623..723d498b 100644 --- a/client/lib/keyboard.js +++ b/client/lib/keyboard.js @@ -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(); +}); -- cgit v1.2.3-1-g7c22