|
1 | 1 | (function () {
|
2 | 2 | 'use strict';
|
| 3 | + |
| 4 | + /** |
| 5 | + * @ngdoc overview |
| 6 | + * @name ui.grid.edit |
| 7 | + * @description |
| 8 | + * |
| 9 | + * # ui.grid.edit |
| 10 | + * This module provides cell editing capability to ui.grid. The goal was to emulate keying data in a spreadsheet via |
| 11 | + * a keyboard. |
| 12 | + * <br/> |
| 13 | + * <br/> |
| 14 | + * To really get the full spreadsheet-like data entry, the ui.grid.cellNav module should be used. This will allow the |
| 15 | + * user to key data and then tab, arrow, or enter to the cells beside or below. |
| 16 | + * |
| 17 | + * <div doc-module-components="ui.grid.edit"></div> |
| 18 | + */ |
| 19 | + |
3 | 20 | var module = angular.module('ui.grid.edit', ['ui.grid', 'ui.grid.util']);
|
4 | 21 |
|
5 | 22 | /**
|
|
25 | 42 | *
|
26 | 43 | * @description Services for editing features
|
27 | 44 | */
|
28 |
| - module.service('uiGridEditService', ['$log', '$q', '$templateCache', |
29 |
| - function ($log, $q, $templateCache) { |
| 45 | + module.service('uiGridEditService', ['$log', '$q', '$templateCache', 'uiGridConstants', |
| 46 | + function ($log, $q, $templateCache, uiGridConstants) { |
30 | 47 |
|
31 | 48 | var service = {
|
| 49 | + |
| 50 | + /** |
| 51 | + * @ngdoc service |
| 52 | + * @name isStartEditKey |
| 53 | + * @methodOf ui.grid.edit.service:uiGridEditService |
| 54 | + * @description Determines if a keypress should start editing. Decorate this service to override with your |
| 55 | + * own key events. See service decorator in angular docs. |
| 56 | + * @parm {Event} evt keydown event |
| 57 | + * @returns {boolean} true if an edit should start |
| 58 | + */ |
| 59 | + isStartEditKey: function (evt) { |
| 60 | + if (evt.keyCode === uiGridConstants.keymap.LEFT || |
| 61 | + (evt.keyCode === uiGridConstants.keymap.TAB && evt.shiftKey) || |
| 62 | + |
| 63 | + evt.keyCode === uiGridConstants.keymap.RIGHT || |
| 64 | + evt.keyCode === uiGridConstants.keymap.TAB || |
| 65 | + |
| 66 | + evt.keyCode === uiGridConstants.keymap.UP || |
| 67 | + (evt.keyCode === uiGridConstants.keymap.ENTER && evt.shiftKey) || |
| 68 | + |
| 69 | + evt.keyCode === uiGridConstants.keymap.DOWN || |
| 70 | + evt.keyCode === uiGridConstants.keymap.ENTER) { |
| 71 | + return false; |
| 72 | + |
| 73 | + } |
| 74 | + return true; |
| 75 | + }, |
| 76 | + |
32 | 77 | /**
|
33 | 78 | * @ngdoc service
|
34 | 79 | * @name editColumnBuilder
|
|
150 | 195 | * - uiGridConstants.events.GRID_SCROLL
|
151 | 196 | *
|
152 | 197 | */
|
153 |
| - module.directive('uiGridCell', ['$compile', 'uiGridConstants', 'uiGridEditConstants', '$log', '$parse', |
154 |
| - function ($compile, uiGridConstants, uiGridEditConstants, $log, $parse) { |
155 |
| - return { |
156 |
| - priority: -100, // run after default uiGridCell directive |
157 |
| - restrict: 'A', |
158 |
| - scope: false, |
159 |
| - link: function ($scope, $elm, $attrs) { |
160 |
| - if (!$scope.col.colDef.enableCellEdit) { |
161 |
| - return; |
162 |
| - } |
| 198 | + module.directive('uiGridCell', |
| 199 | + ['$compile', 'uiGridConstants', 'uiGridEditConstants', '$log', '$parse', 'uiGridEditService', |
| 200 | + function ($compile, uiGridConstants, uiGridEditConstants, $log, $parse, uiGridEditService) { |
| 201 | + return { |
| 202 | + priority: -100, // run after default uiGridCell directive |
| 203 | + restrict: 'A', |
| 204 | + scope: false, |
| 205 | + link: function ($scope, $elm, $attrs) { |
| 206 | + if (!$scope.col.colDef.enableCellEdit) { |
| 207 | + return; |
| 208 | + } |
163 | 209 |
|
164 |
| - var html; |
165 |
| - var origCellValue; |
166 |
| - var inEdit = false; |
167 |
| - var cellModel; |
| 210 | + var html; |
| 211 | + var origCellValue; |
| 212 | + var inEdit = false; |
| 213 | + var cellModel; |
168 | 214 |
|
169 |
| - registerBeginEditEvents(); |
| 215 | + registerBeginEditEvents(); |
170 | 216 |
|
171 |
| - function registerBeginEditEvents() { |
172 |
| - $elm.on('dblclick', function () { |
173 |
| - beginEdit(); |
174 |
| - }); |
175 |
| - $elm.on('keydown', function (evt) { |
176 |
| - switch (evt.keyCode) { |
177 |
| - case uiGridConstants.keymap.F2: |
| 217 | + function registerBeginEditEvents() { |
| 218 | + $elm.on('dblclick', function () { |
| 219 | + beginEdit(); |
| 220 | + }); |
| 221 | + $elm.on('keydown', function (evt) { |
| 222 | + if (uiGridEditService.isStartEditKey(evt)) { |
| 223 | + beginEdit(); |
| 224 | + } |
| 225 | + }); |
| 226 | + if ($scope.col.enableCellEditOnFocus) { |
| 227 | + $elm.find('div').on('focus', function (evt) { |
178 | 228 | evt.stopPropagation();
|
179 | 229 | beginEdit();
|
180 |
| - break; |
| 230 | + }); |
181 | 231 | }
|
182 |
| - }); |
183 |
| - if ($scope.col.enableCellEditOnFocus) { |
184 |
| - $elm.find('div').on('focus', function (evt) { |
185 |
| - evt.stopPropagation(); |
186 |
| - beginEdit(); |
187 |
| - }); |
188 | 232 | }
|
189 |
| - } |
190 | 233 |
|
191 |
| - function cancelBeginEditEvents() { |
192 |
| - $elm.off('dblclick'); |
193 |
| - $elm.off('keydown'); |
194 |
| - if ($scope.col.enableCellEditOnFocus) { |
195 |
| - $elm.find('div').off('focus'); |
196 |
| - } |
197 |
| - } |
198 |
| - |
199 |
| - function beginEdit() { |
200 |
| - cellModel = $parse($scope.row.getQualifiedColField($scope.col)); |
201 |
| - //get original value from the cell |
202 |
| - origCellValue = cellModel($scope); |
203 |
| - |
204 |
| - html = $scope.col.editableCellTemplate; |
205 |
| - html = html.replace(uiGridEditConstants.EDITABLE_CELL_DIRECTIVE, $scope.col.editableCellDirective); |
206 |
| - |
207 |
| - var cellElement; |
208 |
| - $scope.$apply(function () { |
209 |
| - inEdit = true; |
210 |
| - cancelBeginEditEvents(); |
211 |
| - cellElement = $compile(html)($scope.$new()); |
212 |
| - angular.element($elm.children()[0]).addClass('ui-grid-cell-contents-hidden'); |
213 |
| - $elm.append(cellElement); |
| 234 | + function cancelBeginEditEvents() { |
| 235 | + $elm.off('dblclick'); |
| 236 | + $elm.off('keydown'); |
| 237 | + if ($scope.col.enableCellEditOnFocus) { |
| 238 | + $elm.find('div').off('focus'); |
214 | 239 | }
|
215 |
| - ); |
| 240 | + } |
216 | 241 |
|
217 |
| - //stop editing when grid is scrolled |
218 |
| - var deregOnGridScroll = $scope.$on(uiGridConstants.events.GRID_SCROLL, function () { |
219 |
| - endEdit(); |
220 |
| - deregOnGridScroll(); |
221 |
| - }); |
| 242 | + function beginEdit() { |
| 243 | + cellModel = $parse($scope.row.getQualifiedColField($scope.col)); |
| 244 | + //get original value from the cell |
| 245 | + origCellValue = cellModel($scope); |
| 246 | + |
| 247 | + html = $scope.col.editableCellTemplate; |
| 248 | + html = html.replace(uiGridEditConstants.EDITABLE_CELL_DIRECTIVE, $scope.col.editableCellDirective); |
| 249 | + |
| 250 | + var cellElement; |
| 251 | + $scope.$apply(function () { |
| 252 | + inEdit = true; |
| 253 | + cancelBeginEditEvents(); |
| 254 | + cellElement = $compile(html)($scope.$new()); |
| 255 | + angular.element($elm.children()[0]).addClass('ui-grid-cell-contents-hidden'); |
| 256 | + $elm.append(cellElement); |
| 257 | + } |
| 258 | + ); |
| 259 | + |
| 260 | + //stop editing when grid is scrolled |
| 261 | + var deregOnGridScroll = $scope.$on(uiGridConstants.events.GRID_SCROLL, function () { |
| 262 | + endEdit(); |
| 263 | + deregOnGridScroll(); |
| 264 | + }); |
222 | 265 |
|
223 |
| - //end editing |
224 |
| - var deregOnEndCellEdit = $scope.$on(uiGridEditConstants.events.END_CELL_EDIT, function () { |
225 |
| - endEdit(); |
226 |
| - deregOnEndCellEdit(); |
227 |
| - }); |
| 266 | + //end editing |
| 267 | + var deregOnEndCellEdit = $scope.$on(uiGridEditConstants.events.END_CELL_EDIT, function () { |
| 268 | + endEdit(); |
| 269 | + deregOnEndCellEdit(); |
| 270 | + }); |
228 | 271 |
|
229 |
| - //cancel editing |
230 |
| - var deregOnCancelCellEdit = $scope.$on(uiGridEditConstants.events.CANCEL_CELL_EDIT, function () { |
231 |
| - cancelEdit(); |
232 |
| - deregOnCancelCellEdit(); |
233 |
| - }); |
| 272 | + //cancel editing |
| 273 | + var deregOnCancelCellEdit = $scope.$on(uiGridEditConstants.events.CANCEL_CELL_EDIT, function () { |
| 274 | + cancelEdit(); |
| 275 | + deregOnCancelCellEdit(); |
| 276 | + }); |
234 | 277 |
|
235 |
| - $scope.$broadcast(uiGridEditConstants.events.BEGIN_CELL_EDIT); |
236 |
| - } |
| 278 | + $scope.$broadcast(uiGridEditConstants.events.BEGIN_CELL_EDIT); |
| 279 | + } |
237 | 280 |
|
238 |
| - function endEdit() { |
239 |
| - if (!inEdit) { |
240 |
| - return; |
| 281 | + function endEdit() { |
| 282 | + if (!inEdit) { |
| 283 | + return; |
| 284 | + } |
| 285 | + angular.element($elm.children()[1]).remove(); |
| 286 | + angular.element($elm.children()[0]).removeClass('ui-grid-cell-contents-hidden'); |
| 287 | + inEdit = false; |
| 288 | + registerBeginEditEvents(); |
241 | 289 | }
|
242 |
| - angular.element($elm.children()[1]).remove(); |
243 |
| - angular.element($elm.children()[0]).removeClass('ui-grid-cell-contents-hidden'); |
244 |
| - inEdit = false; |
245 |
| - registerBeginEditEvents(); |
246 |
| - } |
247 | 290 |
|
248 |
| - function cancelEdit() { |
249 |
| - if (!inEdit) { |
250 |
| - return; |
| 291 | + function cancelEdit() { |
| 292 | + if (!inEdit) { |
| 293 | + return; |
| 294 | + } |
| 295 | + cellModel.assign($scope, origCellValue); |
| 296 | + $scope.$apply(); |
| 297 | + |
| 298 | + endEdit(); |
251 | 299 | }
|
252 |
| - cellModel.assign($scope, origCellValue); |
253 |
| - $scope.$apply(); |
254 | 300 |
|
255 |
| - endEdit(); |
256 | 301 | }
|
257 |
| - |
258 |
| - } |
259 |
| - }; |
260 |
| - }]); |
| 302 | + }; |
| 303 | + }]); |
261 | 304 |
|
262 | 305 | /**
|
263 | 306 | * @ngdoc directive
|
|
296 | 339 | //set focus at start of edit
|
297 | 340 | $scope.$on(uiGridEditConstants.events.BEGIN_CELL_EDIT, function () {
|
298 | 341 | inputElm[0].focus();
|
| 342 | + inputElm[0].select(); |
299 | 343 | inputElm.on('blur', function (evt) {
|
300 | 344 | $scope.stopEdit();
|
301 | 345 | });
|
|
0 commit comments