Added key navigation also for the ‘narrow’ view

This commit is contained in:
Giulio Cesare Solaroli 2015-01-06 15:42:14 +01:00
parent 2854b9f9c4
commit 1e333d7e22
No known key found for this signature in database
GPG Key ID: 22E34C908F02CBA2
3 changed files with 101 additions and 37 deletions

View File

@ -34,7 +34,7 @@ Clipperz.PM.UI.Components.Cards.List = React.createClass({
}, },
handleClick: function (anEvent) { handleClick: function (anEvent) {
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectCard', {'reference':anEvent.currentTarget.dataset.reference, 'label':anEvent.currentTarget.dataset.label}); MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectCard', {'reference':anEvent.currentTarget.dataset.reference, 'label':anEvent.currentTarget.dataset.label}, true);
}, },
renderItem: function (anItem) { renderItem: function (anItem) {

View File

@ -36,7 +36,7 @@ Clipperz.PM.UI.Components.Cards.View = React.createClass({
handleDirectLoginClick: function (aDirectLogin) { handleDirectLoginClick: function (aDirectLogin) {
var directLoginParameters; var directLoginParameters;
console.log("PROPS", this.props); //console.log("PROPS", this.props);
directLoginParameters = { directLoginParameters = {
'record': this.props['_reference'], 'record': this.props['_reference'],
'directLogin': aDirectLogin['_reference'], 'directLogin': aDirectLogin['_reference'],

View File

@ -79,11 +79,14 @@ Clipperz.PM.UI.MainController = function() {
'exitSearch' 'exitSearch'
]); ]);
Mousetrap.bind({ Mousetrap.bind(['/'], MochiKit.Base.method(this, 'focusOnSearch'));
'/': MochiKit.Base.method(this, 'focusOnSearch'),
'up': MochiKit.Base.method(this, 'selectPreviousCard'), Mousetrap.bind(['left', 'h', 'esc'], MochiKit.Base.method(this, 'exitCurrentSelection'));
'down': MochiKit.Base.method(this, 'selectNextCard'), Mousetrap.bind(['right', 'l', 'enter'], MochiKit.Base.method(this, 'selectDetail'));
})
Mousetrap.bind(['up', 'k'], MochiKit.Base.method(this, 'selectPreviousCard'));
Mousetrap.bind(['down', 'j'], MochiKit.Base.method(this, 'selectNextCard'));
return this; return this;
} }
@ -457,7 +460,14 @@ console.log("THE BROWSER IS OFFLINE");
return deferredResult; return deferredResult;
}, },
updateSelectedCard: function (someInfo, shouldShowLoading) { showCardDetailInNarrowView: function (aValue) {
return Clipperz.Async.callbacks("MainController.showCardDetailInNarrowView", [
MochiKit.Base.method(this, 'setPageProperties', 'cardDetailPage', 'selectedCard', aValue),
MochiKit.Base.method(this, 'moveInPage', this.currentPage(), 'cardDetailPage'),
], {trace:false});
},
updateSelectedCard: function (someInfo, shouldShowLoading, shouldShowCardDetail) {
var deferredResult; var deferredResult;
var showLoading = typeof(shouldShowLoading) !== 'undefined' ? shouldShowLoading : true; var showLoading = typeof(shouldShowLoading) !== 'undefined' ? shouldShowLoading : true;
@ -475,11 +485,10 @@ console.log("THE BROWSER IS OFFLINE");
//console.log("MEDIA QUERY STYLE", this.mediaQueryStyle()); //console.log("MEDIA QUERY STYLE", this.mediaQueryStyle());
deferredResult.addMethod(this, 'setPageProperties', 'mainPage', 'selectedCard'); deferredResult.addMethod(this, 'setPageProperties', 'mainPage', 'selectedCard');
if (this.mediaQueryStyle() == 'narrow') { if ((this.mediaQueryStyle() == 'narrow') && shouldShowCardDetail) {
deferredResult.addMethod(this, 'setPageProperties', 'cardDetailPage', 'selectedCard'); deferredResult.addMethod(this, 'showCardDetailInNarrowView');
deferredResult.addMethod(this, 'moveInPage', this.currentPage(), 'cardDetailPage'); // deferredResult.addMethod(this, 'setPageProperties', 'cardDetailPage', 'selectedCard');
// deferredResult.addCallback(function (aValue) { console.log("SHOULD SLIDE IN PAGE DETAIL"); return aValue; }); // deferredResult.addMethod(this, 'moveInPage', this.currentPage(), 'cardDetailPage');
//console.log("SHOULD SLIDE IN PAGE DETAIL");
} }
MochiKit.Async.callLater(0.1, MochiKit.Base.method(deferredResult, 'callback')); MochiKit.Async.callLater(0.1, MochiKit.Base.method(deferredResult, 'callback'));
@ -989,16 +998,16 @@ console.log("THE BROWSER IS OFFLINE");
this._isSettingsPanelOpen = false; this._isSettingsPanelOpen = false;
}, },
featureAvailableForStyles: function (listOfSupportedStyles) {
return MochiKit.Iter.some(listOfSupportedStyles, MochiKit.Base.partial(MochiKit.Base.operator.eq, this.mediaQueryStyle()));
},
shouldShowCardDetailWhenMovingBetweenCardsUsingKeys: function () {
return !(this.featureAvailableForStyles(['narrow']) && (this.currentPage() == 'mainPage'));
},
isSelectionPanelHidable: function () { isSelectionPanelHidable: function () {
var result; return !this.featureAvailableForStyles(['extra-wide']);
if (this.mediaQueryStyle() == 'extra-wide') {
result = false;
} else {
result = true;
}
return result;
}, },
isSelectionPanelOpen: function () { isSelectionPanelOpen: function () {
@ -1007,6 +1016,9 @@ console.log("THE BROWSER IS OFFLINE");
toggleSelectionPanel_handler: function (anEvent) { toggleSelectionPanel_handler: function (anEvent) {
if (this.isSelectionPanelHidable() == true) { if (this.isSelectionPanelHidable() == true) {
if (this.currentPage() == 'cardDetailPage') {
this.goBackToMainPage();
}
this._isSelectionPanelOpen = !this._isSelectionPanelOpen; this._isSelectionPanelOpen = !this._isSelectionPanelOpen;
this.setCloseMaskAction(MochiKit.Base.method(this, 'toggleSelectionPanel_handler')); this.setCloseMaskAction(MochiKit.Base.method(this, 'toggleSelectionPanel_handler'));
this.refreshCurrentPage(); this.refreshCurrentPage();
@ -1059,9 +1071,8 @@ console.log("THE BROWSER IS OFFLINE");
cardInfoAtIndex: function (anIndex) { cardInfoAtIndex: function (anIndex) {
var card; var card;
console.log("CARD INFO AT INDEX", anIndex);
card = this.selectedCards()[anIndex]; card = this.selectedCards()[anIndex];
return { return {
'label': card['label'], 'label': card['label'],
'reference': card['_reference'] 'reference': card['_reference']
@ -1071,6 +1082,7 @@ console.log("CARD INFO AT INDEX", anIndex);
previousCardInfo: function () { previousCardInfo: function () {
var currentIndex; var currentIndex;
var nextIndex; var nextIndex;
var result;
currentIndex = this.selectedCardIndex(); currentIndex = this.selectedCardIndex();
if (currentIndex == -1) { if (currentIndex == -1) {
@ -1079,12 +1091,19 @@ console.log("CARD INFO AT INDEX", anIndex);
nextIndex = Math.max(currentIndex - 1, 0); nextIndex = Math.max(currentIndex - 1, 0);
} }
return this.cardInfoAtIndex(nextIndex); if (currentIndex == nextIndex) {
result = null;
} else {
result = this.cardInfoAtIndex(nextIndex);
}
return result;
}, },
nextCardInfo: function () { nextCardInfo: function () {
var currentIndex; var currentIndex;
var nextIndex; var nextIndex;
var result;
currentIndex = this.selectedCardIndex(); currentIndex = this.selectedCardIndex();
if (currentIndex == -1) { if (currentIndex == -1) {
@ -1093,23 +1112,36 @@ console.log("CARD INFO AT INDEX", anIndex);
nextIndex = Math.min(currentIndex + 1, this.selectedCards().length - 1); nextIndex = Math.min(currentIndex + 1, this.selectedCards().length - 1);
} }
return this.cardInfoAtIndex(nextIndex); if (currentIndex == nextIndex) {
result = null;
} else {
result = this.cardInfoAtIndex(nextIndex);
}
return result;
}, },
//............................................................................ //............................................................................
goBackToMainPage: function (anEvent) {
if (this.currentPage() == 'cardDetailPage') {
// this.updateSelectedCard(anEvent, true, false); // TODO: is this statement really needed?
this.moveOutPage(this.currentPage(), 'mainPage');
}
},
resetSelectedCard: function () { resetSelectedCard: function () {
this._selectedCardInfo = null; this._selectedCardInfo = null;
}, },
selectCard_handler: function (someInfo) { selectCard_handler: function (someInfo, shouldUpdateCardDetail) {
this._selectedCardInfo = someInfo; this._selectedCardInfo = someInfo;
this.refreshSelectedCards(); this.refreshSelectedCards();
this.updateSelectedCard(someInfo); this.updateSelectedCard(someInfo, true, shouldUpdateCardDetail);
}, },
refreshCardEditDetail_handler: function (aRecordReference) { refreshCardEditDetail_handler: function (aRecordReference) {
this.updateSelectedCard({'reference':aRecordReference}, false); this.updateSelectedCard({'reference':aRecordReference}, false, true);
}, },
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -1170,7 +1202,7 @@ console.log("CARD INFO AT INDEX", anIndex);
info = {'reference': aRecordReference}; info = {'reference': aRecordReference};
} }
this.updateSelectedCard(info, false); this.updateSelectedCard(info, false, true);
}, this) }, this)
], {trace:false}); ], {trace:false});
}, },
@ -1261,7 +1293,7 @@ console.log("CARD INFO AT INDEX", anIndex);
function (aValue) { return cardInfo['reference']; }, function (aValue) { return cardInfo['reference']; },
MochiKit.Base.method(this, 'refreshUI'), MochiKit.Base.method(this, 'refreshUI'),
], {trace:true}); ], {trace:false});
}, },
enterEditMode: function () { enterEditMode: function () {
@ -1316,8 +1348,7 @@ console.log("CARD INFO AT INDEX", anIndex);
}, },
goBackToMainPage_handler: function (anEvent) { goBackToMainPage_handler: function (anEvent) {
this.updateSelectedCard(); this.goBackToMainPage(anEvent);
this.moveOutPage(this.currentPage(), 'mainPage');
}, },
//============================================================================ //============================================================================
@ -1431,7 +1462,7 @@ console.log("CARD INFO AT INDEX", anIndex);
aWindow.location.href = downloadHref; aWindow.location.href = downloadHref;
}, newWindow); }, newWindow);
deferredResult.callback(); deferredResult.callback();
return deferredResult; return deferredResult;
}, },
@ -1442,20 +1473,53 @@ console.log("CARD INFO AT INDEX", anIndex);
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'toggleSelectionPanel'); MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'toggleSelectionPanel');
MochiKit.DOM.getElement('searchValue').focus(); MochiKit.DOM.getElement('searchValue').focus();
}, },
exitSearch_handler: function (anEvent) { exitSearch_handler: function (anEvent) {
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'toggleSelectionPanel'); MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'toggleSelectionPanel');
MochiKit.DOM.getElement('searchValue').blur(); MochiKit.DOM.getElement('searchValue').blur();
}, },
selectPreviousCard: function () { selectPreviousCard: function () {
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectCard', this.previousCardInfo()); var prevCardInfo;
var shouldUpdateCardDetail;
prevCardInfo = this.previousCardInfo();
shouldUpdateCardDetail = this.shouldShowCardDetailWhenMovingBetweenCardsUsingKeys();
//console.log("PREV CARD INFO", prevCardInfo);
if (prevCardInfo != null) {
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectCard', prevCardInfo, shouldUpdateCardDetail);
}
}, },
selectNextCard: function () { selectNextCard: function () {
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectCard', this.nextCardInfo()); var nextCardInfo;
var shouldUpdateCardDetail;
nextCardInfo = this.nextCardInfo();
shouldUpdateCardDetail = this.shouldShowCardDetailWhenMovingBetweenCardsUsingKeys();
//console.log("NEXT CARD INFO", shouldUpdateCardDetail);
if (nextCardInfo != null) {
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectCard', nextCardInfo, shouldUpdateCardDetail);
}
}, },
selectDetail: function () {
//console.log("TODO: SELECT DETAIL (right arrow key)", this.mediaQueryStyle(), this.currentPage(), this.selectedCardInfo());
if ((this.mediaQueryStyle() == 'narrow') && (this.currentPage() == 'mainPage')) {
Clipperz.Async.callbacks("MainController.selectDetail", [
MochiKit.Base.method(this.user(), 'getRecord', this.selectedCardInfo()['reference']),
MochiKit.Base.method(this, 'collectRecordInfo'),
MochiKit.Base.method(this, 'showCardDetailInNarrowView'),
], {trace:false}).callback();
}
},
exitCurrentSelection: function () {
if (this.currentPage() == 'cardDetailPage') {
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'goBackToMainPage', {'reference':this.selectedCardInfo()['reference']});
}
},
//============================================================================ //============================================================================
/* /*
wrongAppVersion: function (anError) { wrongAppVersion: function (anError) {