Skip to content

Commit 1ed2cad

Browse files
Option to override cell navigation defaults
Option to override default cell navigation keyDownOverrides will force the viewPortKeyDown event to be triggered if the specified key event was pressed down, even if it is a default key command for the grid. The handling of the event should then be done in the viewPortKeyDown handler since the grid is no longer handling the event.
1 parent 68681d7 commit 1ed2cad

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed

misc/tutorial/202_cellnav.ngdoc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ Provides an example of scrolling to and setting the focus on a specific cell, us
2828
Provides an example of utilizing the modifierKeysToMultiSelectCells option and getCurrentSelection API function to
2929
extract values of selected cells.
3030

31+
Provides an example of utilizing the keyDownOverrides to add a custom Ctrl + Right to focus the last column in the row,
32+
while still allowing the right arrow to be handled by the grid.
3133
@example
3234
<example module="app">
3335
<file name="app.js">
@@ -36,6 +38,7 @@ extract values of selected cells.
3638
app.controller('MainCtrl', ['$scope', '$http', '$log', function ($scope, $http, $log) {
3739
$scope.gridOptions = {
3840
modifierKeysToMultiSelectCells: true,
41+
keyDownOverrides: [ { keyCode: 39, ctrlKey: true }],
3942
showGridFooter: true
4043
};
4144
$scope.gridOptions.columnDefs = [
@@ -94,6 +97,13 @@ extract values of selected cells.
9497
// }
9598
$log.log('navigation event');
9699
});
100+
gridApi.cellNav.on.viewPortKeyDown($scope,function(event, newRowCol){
101+
var row = newRowCol.row;
102+
var col = newRowCol.col
103+
if (event.keyCode === 39) {
104+
$scope.gridApi.cellNav.scrollToFocus(row.entity, $scope.gridApi.grid.columns[$scope.gridApi.grid.columns.length - 1]);
105+
}
106+
});
97107
};
98108
}]);
99109
</file>

src/features/cellnav/js/cellnav.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,16 @@
418418
* <br/>Defaults to false
419419
*/
420420
gridOptions.modifierKeysToMultiSelectCells = gridOptions.modifierKeysToMultiSelectCells === true;
421+
422+
/**
423+
* @ngdoc array
424+
* @name keyDownOverrides
425+
* @propertyOf ui.grid.cellNav.api:GridOptions
426+
* @description An array of event objects to override on keydown. If an event is overridden, the viewPortKeyDown event will
427+
* be raised with the overridden events, allowing custom keydown behavior.
428+
* <br/>Defaults to []
429+
*/
430+
gridOptions.keyDownOverrides = gridOptions.keyDownOverrides || [];
421431

422432
},
423433

@@ -902,7 +912,12 @@
902912
focuser.on('keydown', function (evt) {
903913
evt.uiGridTargetRenderContainerId = containerId;
904914
var rowCol = uiGridCtrl.grid.api.cellNav.getFocusedCell();
905-
var result = uiGridCtrl.cellNav.handleKeyDown(evt);
915+
var raiseViewPortKeyDown = uiGridCtrl.grid.options.keyDownOverrides.some(function (override) {
916+
return Object.keys(override).every( function (property) {
917+
return override[property] === evt[property];
918+
});
919+
});
920+
var result = raiseViewPortKeyDown ? null : uiGridCtrl.cellNav.handleKeyDown(evt);
906921
if (result === null) {
907922
uiGridCtrl.grid.api.cellNav.raise.viewPortKeyDown(evt, rowCol);
908923
viewPortKeyDownWasRaisedForRowCol = rowCol;

src/features/cellnav/test/uiGridCellNavDirective.spec.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ describe('ui.grid.cellNav directive', function () {
1111

1212
$scope.gridOpts = {
1313
data: [{ name: 'Bob' }, {name: 'Mathias'}, {name: 'Fred'}],
14-
modifierKeysToMultiSelectCells: true
14+
modifierKeysToMultiSelectCells: true,
15+
keyDownOverrides: [{ keyCode: 39 }]
1516
};
1617

1718
$scope.gridOpts.onRegisterApi = function (gridApi) {
@@ -71,4 +72,48 @@ describe('ui.grid.cellNav directive', function () {
7172
$scope.grid.cellNav.broadcastCellNav({ row: $scope.grid.rows[0], col: $scope.grid.columns[0] }, true);
7273
expect($scope.grid.cellNav.focusedCells.length).toEqual(1);
7374
});
75+
76+
it('should not call handleKeyDown if the key event is overridden', function () {
77+
spyOn(elm.controller('uiGrid').cellNav, 'handleKeyDown');
78+
var focuser = elm.find('focuser');
79+
var evt = jQuery.Event("keydown");
80+
evt.keyCode = 39;
81+
82+
focuser.trigger(evt);
83+
84+
expect(elm.controller('uiGrid').cellNav.handleKeyDown).not.toHaveBeenCalled();
85+
});
86+
87+
it('should call handleKeyDown if the key event is not overridden', function () {
88+
spyOn(elm.controller('uiGrid').cellNav, 'handleKeyDown');
89+
var focuser = elm.find('.ui-grid-focuser');
90+
var evt = jQuery.Event("keydown");
91+
evt.keyCode = 37;
92+
93+
focuser.trigger(evt);
94+
95+
expect(elm.controller('uiGrid').cellNav.handleKeyDown).toHaveBeenCalled();
96+
});
97+
98+
it('should raise the viewPortKeyDown event if the key is overridden', function () {
99+
spyOn(elm.controller('uiGrid').grid.api.cellNav.raise, 'viewPortKeyDown');
100+
var focuser = elm.find('.ui-grid-focuser');
101+
var evt = jQuery.Event("keydown");
102+
evt.keyCode = 39;
103+
104+
focuser.trigger(evt);
105+
106+
expect(elm.controller('uiGrid').grid.api.cellNav.raise.viewPortKeyDown).toHaveBeenCalled();
107+
});
108+
109+
it('should not raise the viewPortKeyDown event if the key is not overridden and is part of the base cell navigation keyboard support', function () {
110+
spyOn(elm.controller('uiGrid').grid.api.cellNav.raise, 'viewPortKeyDown');
111+
var focuser = elm.find('.ui-grid-focuser');
112+
var evt = jQuery.Event("keydown");
113+
evt.keyCode = 37;
114+
115+
focuser.trigger(evt);
116+
117+
expect(elm.controller('uiGrid').grid.api.cellNav.raise.viewPortKeyDown).not.toHaveBeenCalled();
118+
});
74119
});

0 commit comments

Comments
 (0)