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