Close the Popup when all escape actions are executed

This commit is contained in:
Maxime Quandalle 2015-08-23 11:04:35 +02:00
parent 2248671b7c
commit d2af2ed521
4 changed files with 27 additions and 17 deletions

View file

@ -184,7 +184,7 @@ var draggableMembersLabelsWidgets = function() {
snap: false,
snapMode: 'both',
start: function() {
EscapeActions.executeUpTo('popup');
EscapeActions.executeUpTo('popup-back');
}
});
});

View file

@ -28,7 +28,7 @@ FlowRouter.route('/b/:boardId/:slug/:cardId', {
action: function(params) {
Session.set('currentBoard', params.boardId);
Session.set('currentCard', params.cardId);
EscapeActions.executeUpTo('popup');
EscapeActions.executeUpTo('popup-close');
BlazeLayout.render('defaultLayout', { content: 'board' });
}

View file

@ -9,7 +9,8 @@ EscapeActions = {
// Executed in order
hierarchy: [
'textcomplete',
'popup',
'popup-back',
'popup-close',
'inlinedForm',
'detailsPane',
'multiselection',
@ -30,7 +31,8 @@ EscapeActions = {
priority: priority,
condition: condition,
action: action,
noClickEscapeOn: options.noClickEscapeOn
noClickEscapeOn: options.noClickEscapeOn,
enabledOnClick: !! options.enabledOnClick
});
// XXX Rewrite this with ES6: => function
this._actions = _.sortBy(this._actions, function(a) { return a.priority; });
@ -55,11 +57,12 @@ EscapeActions = {
});
},
clickExecute: function(evt, maxLabel) {
clickExecute: function(target, maxLabel) {
return this._execute({
maxLabel: maxLabel,
multipleActions: false,
evt: evt
isClick: true,
clickTarget: target
});
},
@ -72,8 +75,9 @@ EscapeActions = {
_execute: function(options) {
var maxLabel = options.maxLabel;
var evt = options.evt || {};
var multipleActions = options.multipleActions;
var isClick = !! options.isClick;
var clickTarget = options.clickTarget;
var maxPriority, currentAction;
var executedAtLeastOne = false;
@ -87,11 +91,12 @@ EscapeActions = {
if (currentAction.priority > maxPriority)
return executedAtLeastOne;
if (evt.type === 'click' && this._stopClick(currentAction, evt.target))
if (isClick && this._stopClick(currentAction, clickTarget))
return executedAtLeastOne;
if (currentAction.condition()) {
currentAction.action(evt);
var isEnabled = currentAction.enabledOnClick || ! isClick;
if (isEnabled && currentAction.condition()) {
currentAction.action();
executedAtLeastOne = true;
if (! multipleActions)
return executedAtLeastOne;
@ -153,6 +158,6 @@ Mousetrap.bindGlobal('esc', function() {
$(document).on('click', function(evt) {
if (evt.which === 1 &&
$(evt.target).closest('a,button,.is-editable').length === 0) {
EscapeActions.clickExecute(evt, 'multiselection');
EscapeActions.clickExecute(evt.target, 'multiselection');
}
});

View file

@ -194,9 +194,14 @@ Popup = {
// We close a potential opened popup on any left click on the document, or go
// one step back by pressing escape.
EscapeActions.register('popup',
function(evt) { Popup[evt.type === 'click' ? 'close' : 'back'](); },
_.bind(Popup.isOpen, Popup), {
noClickEscapeOn: '.js-pop-over'
}
);
var escapeActions = ['back', 'close'];
_.each(escapeActions, function(actionName) {
EscapeActions.register('popup-' + actionName,
_.bind(Popup[actionName], Popup),
_.bind(Popup.isOpen, Popup), {
noClickEscapeOn: '.js-pop-over',
enabledOnClick: actionName === 'close'
}
);
});