angular-ui/ui-grid

shift + click deselect mode

Open

#6,189 opened on 2017年5月2日

GitHub で見る
 (0 comments) (0 reactions) (0 assignees)JavaScript (5,395 stars) (2,496 forks)batch import
good first issuetype: enhancement

説明

Hello,

It is more of a feature, but it would be nice to allow for shift clicks where the rows are all selected, to deselect a group of rows. I have modified selection.js to that effect, but I am not confident I can make a proper pull request since I think my changed might break something else.

I have included the changed functions below. The main changes are that I needed a deselected row to be the last selected row as well to ensure proper shift click deselect behavior. Also I have added a row selection after the row loop to select the first or last, according to the direction, row.

I've not succeeded in adding this source into a plunker, I get a bad request (too big?)

          toggleRowSelection: function (grid, row, evt, multiSelect, noUnselect) {
          var selected = row.isSelected;
          debugger;
          if ( row.enableSelection === false && !selected ){
            return;
          }

          var selectedRows;
          if (!multiSelect && !selected) {
            service.clearSelectedRows(grid, evt);
          } else if (!multiSelect && selected) {
            selectedRows = service.getSelectedRows(grid);
            if (selectedRows.length > 1) {
              selected = false; // Enable reselect of the row
              service.clearSelectedRows(grid, evt);
            }
          }

          if (selected && noUnselect){
            // don't deselect the row
          } else {
            row.setSelected(!selected);

            grid.selection.lastSelectedRow = row;

            selectedRows = service.getSelectedRows(grid);
            grid.selection.selectAll = grid.rows.length === selectedRows.length;

            grid.api.selection.raise.rowSelectionChanged(row, evt);
          }
        },
        /**
         * @ngdoc function
         * @name shiftSelect
         * @methodOf  ui.grid.selection.service:uiGridSelectionService
         * @description selects a group of rows from the last selected row using the shift key
         * @param {Grid} grid grid object
         * @param {GridRow} clicked row
         * @param {Event} event object if raised from an event
         * @param {bool} multiSelect if false, does nothing this is for multiSelect only
         */
        shiftSelect: function (grid, row, evt, multiSelect) {
            if (!multiSelect) {
                return;
            }
            debugger;
            var selectedRows = service.getSelectedRows(grid);
            var fromRow = selectedRows.length > 0 ? grid.renderContainers.body.visibleRowCache.indexOf(grid.selection.lastSelectedRow) : 0;
            var toRow = grid.renderContainers.body.visibleRowCache.indexOf(row);

            var reversed = false;
            //reverse select direction
            if (fromRow > toRow) {
                reversed = true;
                var tmp = fromRow;
                fromRow = toRow;
                toRow = tmp;
            }

            var changedRows = [];

            //check if the 'last' row is selected to switch to deselect mode
            var isRowSelected;
            if (reversed) {
                isRowSelected = grid.renderContainers.body.visibleRowCache[fromRow].isSelected;
            }
            else {
                isRowSelected = grid.renderContainers.body.visibleRowCache[toRow].isSelected;
            }

            for (var i = fromRow; i <= toRow; i++) {
                var rowToSelect = grid.renderContainers.body.visibleRowCache[i];
                if (rowToSelect) {
                    if (!rowToSelect.isSelected && rowToSelect.enableSelection !== false && !isRowSelected) {
                        rowToSelect.setSelected(true);
                        grid.selection.lastSelectedRow = rowToSelect;
                        service.decideRaiseSelectionEvent(grid, rowToSelect, changedRows, evt);
                    }
                    else {
                        if (isRowSelected) {
                            rowToSelect.setSelected(false);
                            service.decideRaiseSelectionEvent(grid, rowToSelect, changedRows, evt);
                        }
                    }

                    //select the last row modified
                    if (reversed) {
                        rowToSelect = grid.renderContainers.body.visibleRowCache[fromRow];
                    }
                    else {
                        rowToSelect = grid.renderContainers.body.visibleRowCache[toRow];
                    }

                    if (rowToSelect) {
                        grid.selection.lastSelectedRow = rowToSelect;
                        service.decideRaiseSelectionEvent(grid, rowToSelect, changedRows, evt);
                    }
                }
            }
            service.decideRaiseSelectionBatchEvent(grid, changedRows, evt);
        }

edit: fixed typo

コントリビューターガイド

shift + click deselect mode · angular-ui/ui-grid#6189 | Good First Issue