Skip to content

Commit 6f6342a

Browse files
authored
Merge pull request #5248 from fallXone/keyDownOverrides
Option to override cell navigation defaults
2 parents 5b73e8a + 1ed2cad commit 6f6342a

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)