mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-02 15:38:15 +00:00
improve multiple selection when hold shift key on list layout (#6640)
This commit is contained in:
@@ -1430,10 +1430,34 @@ class LibContentView extends React.Component {
|
|||||||
newSelectedDirentList.push(clickedDirent);
|
newSelectedDirentList.push(clickedDirent);
|
||||||
}
|
}
|
||||||
} else if (isShiftKeyPressed && lastSelectedIndex !== null) {
|
} else if (isShiftKeyPressed && lastSelectedIndex !== null) {
|
||||||
// Shift key is pressed: Select all items between the last selected and the clicked item
|
// Shift key is pressed: Select or unselect items based on the clicked index
|
||||||
const rangeStart = Math.min(this.state.lastSelectedIndex, clickedIndex);
|
const firstSelectedIndex = direntList.findIndex(dirent => dirent.name === newSelectedDirentList[0].name);
|
||||||
const rangeEnd = Math.max(this.state.lastSelectedIndex, clickedIndex);
|
if (clickedIndex < firstSelectedIndex) {
|
||||||
newSelectedDirentList = direntList.slice(rangeStart, rangeEnd + 1);
|
// Selected all the items between the clicked item and the first selected item
|
||||||
|
const rangeSelectedDirents = direntList.slice(clickedIndex, firstSelectedIndex + 1);
|
||||||
|
const rangeSelectedNames = new Set(rangeSelectedDirents.map(dirent => dirent.name));
|
||||||
|
newSelectedDirentList = [
|
||||||
|
...newSelectedDirentList.filter(dirent => rangeSelectedNames.has(dirent.name)),
|
||||||
|
...rangeSelectedDirents
|
||||||
|
];
|
||||||
|
} else if (clickedIndex >= firstSelectedIndex && clickedIndex < lastSelectedIndex) {
|
||||||
|
// Unselect items between clicked item and the last selected item
|
||||||
|
const rangeSelectedDirents = direntList.slice(firstSelectedIndex, clickedIndex + 1);
|
||||||
|
const rangeSelectedNames = new Set(rangeSelectedDirents.map(dirent => dirent.name));
|
||||||
|
newSelectedDirentList = newSelectedDirentList.filter(dirent => rangeSelectedNames.has(dirent.name));
|
||||||
|
} else {
|
||||||
|
// Select all items between the first selected and the clicked item
|
||||||
|
const rangeStart = Math.min(firstSelectedIndex, clickedIndex);
|
||||||
|
const rangeEnd = Math.max(firstSelectedIndex, clickedIndex);
|
||||||
|
const rangeSelectedDirents = direntList.slice(rangeStart, rangeEnd + 1);
|
||||||
|
|
||||||
|
// Merge the new range selection with the existing selection
|
||||||
|
const rangeSelectedNames = new Set(rangeSelectedDirents.map(dirent => dirent.name));
|
||||||
|
newSelectedDirentList = [
|
||||||
|
...newSelectedDirentList.filter(dirent => !rangeSelectedNames.has(dirent.name)),
|
||||||
|
...rangeSelectedDirents
|
||||||
|
];
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
newSelectedDirentList = [clickedDirent];
|
newSelectedDirentList = [clickedDirent];
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user