|
208 | 208 | service.toggleRowSelection(grid, row, evt, grid.options.multiSelect, grid.options.noUnselect); |
209 | 209 | } |
210 | 210 | }, |
| 211 | + /** |
| 212 | + * @ngdoc function |
| 213 | + * @name unSelectRowByVisibleIndex |
| 214 | + * @methodOf ui.grid.selection.api:PublicApi |
| 215 | + * @description Unselect the specified row by visible index (i.e. if you |
| 216 | + * specify row 0 you'll get the first visible row unselected). In this context |
| 217 | + * visible means of those rows that are theoretically visible (i.e. not filtered), |
| 218 | + * rather than rows currently rendered on the screen. |
| 219 | + * @param {number} index index within the rowsVisible array |
| 220 | + * @param {Event} event object if raised from an event |
| 221 | + */ |
| 222 | + unSelectRowByVisibleIndex: function (rowNum, evt) { |
| 223 | + var row = grid.renderContainers.body.visibleRowCache[rowNum]; |
| 224 | + if (row !== null && typeof (row) !== 'undefined' && row.isSelected) { |
| 225 | + service.toggleRowSelection(grid, row, evt, grid.options.multiSelect, grid.options.noUnselect); |
| 226 | + } |
| 227 | + }, |
211 | 228 | /** |
212 | 229 | * @ngdoc function |
213 | 230 | * @name selectAllRows |
|
238 | 255 | * @param {Event} event object if raised from an event |
239 | 256 | */ |
240 | 257 | selectAllVisibleRows: function (evt) { |
241 | | - if (grid.options.multiSelect === false) { |
242 | | - return; |
243 | | - } |
244 | | - |
245 | | - var changedRows = []; |
246 | | - grid.rows.forEach(function (row) { |
247 | | - if (row.visible) { |
248 | | - if (!row.isSelected && row.enableSelection !== false) { |
249 | | - row.setSelected(true); |
250 | | - service.decideRaiseSelectionEvent(grid, row, changedRows, evt); |
251 | | - } |
| 258 | + if (grid.options.multiSelect !== false) { |
| 259 | + var changedRows = []; |
| 260 | + var rowCache = []; |
| 261 | + if (grid.treeBase && grid.treeBase.tree) { |
| 262 | + rowCache = getAllTreeRows(grid.treeBase.tree); |
252 | 263 | } else { |
253 | | - if (row.isSelected) { |
254 | | - row.setSelected(false); |
255 | | - service.decideRaiseSelectionEvent(grid, row, changedRows, evt); |
| 264 | + rowCache = grid.rows; |
| 265 | + } |
| 266 | + |
| 267 | + for (var i = 0; i<rowCache.length; i++) { |
| 268 | + var row = rowCache[i]; |
| 269 | + if (row.visible) { |
| 270 | + if (!row.isSelected && row.enableSelection !== false) { |
| 271 | + row.setSelected(true); |
| 272 | + service.decideRaiseSelectionEvent(grid, row, changedRows, event); |
| 273 | + } |
| 274 | + } else { |
| 275 | + if (row.isSelected) { |
| 276 | + row.setSelected(false); |
| 277 | + service.decideRaiseSelectionEvent(grid, row, changedRows, event); |
| 278 | + } |
256 | 279 | } |
257 | 280 | } |
258 | | - }); |
259 | | - service.decideRaiseSelectionBatchEvent(grid, changedRows, evt); |
260 | | - grid.selection.selectAll = true; |
| 281 | + service.decideRaiseSelectionBatchEvent(grid, changedRows, event); |
| 282 | + grid.selection.selectAll = true; |
| 283 | + } |
261 | 284 | }, |
262 | 285 | /** |
263 | 286 | * @ngdoc function |
|
493 | 516 | grid.selection.selectAll = grid.rows.length === selectedRows.length; |
494 | 517 |
|
495 | 518 | grid.api.selection.raise.rowSelectionChanged(row, evt); |
| 519 | + |
| 520 | + toggleParentHeaders(grid, row, event, multiSelect, noUnselect); |
496 | 521 | } |
497 | 522 | }, |
498 | 523 | /** |
|
540 | 565 | * @param {Grid} grid grid object |
541 | 566 | */ |
542 | 567 | getSelectedRows: function (grid) { |
543 | | - return grid.rows.filter(function (row) { |
544 | | - return row.isSelected; |
545 | | - }); |
| 568 | + var rows; |
| 569 | + if (grid.treeBase && grid.treeBase.tree) { |
| 570 | + rows = getAllTreeRows(grid.treeBase.tree); |
| 571 | + } else { |
| 572 | + rows = grid.rows; |
| 573 | + } |
| 574 | + |
| 575 | + var selectedRows = []; |
| 576 | + for (var i = 0; i<rows.length; i++) { |
| 577 | + if (rows[i].isSelected) { |
| 578 | + selectedRows.push(rows[i]); |
| 579 | + } |
| 580 | + } |
| 581 | + return selectedRows; |
546 | 582 | }, |
547 | 583 |
|
548 | 584 | /** |
|
605 | 641 |
|
606 | 642 | return service; |
607 | 643 |
|
| 644 | + function toggleParentHeaders(grid, row, event, multiSelect, noUnselect){ |
| 645 | + if (row.treeNode &&row.treeNode.parentRow) { |
| 646 | + var parentRow = row.treeNode.parentRow; |
| 647 | + var siblingSelectedStatus = []; |
| 648 | + for (var i = 0; i < parentRow.treeNode.children.length; i++) { |
| 649 | + siblingSelectedStatus.push(parentRow.treeNode.children[i].row.isSelected); |
| 650 | + } |
| 651 | + var allSiblingsSelected = siblingSelectedStatus.indexOf(false) === -1; |
| 652 | + |
| 653 | + if (parentRow.isSelected !== allSiblingsSelected) { |
| 654 | + service.toggleRowSelection(grid, parentRow, event, multiSelect, noUnselect); |
| 655 | + } |
| 656 | + } |
| 657 | + } |
| 658 | + |
| 659 | + function getAllTreeRows(rowTree){ |
| 660 | + var selectedRows = []; |
| 661 | + for (var i = 0; i<rowTree.length; i++) { |
| 662 | + var node = rowTree[i]; |
| 663 | + selectedRows.push(node.row); |
| 664 | + selectedRows = selectedRows.concat(getAllTreeRows(node.children)); |
| 665 | + } |
| 666 | + return selectedRows; |
| 667 | + } |
608 | 668 | }]); |
609 | 669 |
|
610 | 670 | /** |
|
726 | 786 | function selectButtonClick(row, evt) { |
727 | 787 | evt.stopPropagation(); |
728 | 788 |
|
729 | | - if (evt.shiftKey) { |
730 | | - uiGridSelectionService.shiftSelect(self, row, evt, self.options.multiSelect); |
731 | | - } |
732 | | - else if (evt.ctrlKey || evt.metaKey) { |
733 | | - uiGridSelectionService.toggleRowSelection(self, row, evt, self.options.multiSelect, self.options.noUnselect); |
734 | | - } |
735 | | - else if (row.groupHeader) { |
| 789 | + if (row.groupHeader) { |
| 790 | + selectByKeyState(row, evt); |
| 791 | + var selectionState = row.isSelected; |
736 | 792 | for (var i = 0; i < row.treeNode.children.length; i++) { |
737 | | - uiGridSelectionService.toggleRowSelection(self, row.treeNode.children[i].row, evt, self.options.multiSelect, self.options.noUnselect); |
| 793 | + if (row.treeNode.children[i].row.isSelected !== selectionState) { |
| 794 | + selectButtonClick(row.treeNode.children[i].row, evt); |
| 795 | + } |
738 | 796 | } |
| 797 | + }else { |
| 798 | + selectByKeyState(row, evt); |
739 | 799 | } |
740 | | - else { |
| 800 | + } |
| 801 | + |
| 802 | + function selectByKeyState(row, evt){ |
| 803 | + if (evt.shiftKey) { |
| 804 | + uiGridSelectionService.shiftSelect(self, row, evt, self.options.multiSelect); |
| 805 | + } else if (evt.ctrlKey || evt.metaKey) { |
| 806 | + uiGridSelectionService.toggleRowSelection(self, row, evt, self.options.multiSelect, self.options.noUnselect); |
| 807 | + } else { |
741 | 808 | uiGridSelectionService.toggleRowSelection(self, row, evt, (self.options.multiSelect && !self.options.modifierKeysToMultiSelect), self.options.noUnselect); |
742 | 809 | } |
743 | 810 | } |
|
0 commit comments