WebUI: Select multiple files to rename with Shift

Convenience feature in the "Rename Files" menu in the WebUI.
If you click one file's checkbox, and then click another with Shift held, all the checkboxes between those two will be selected/unselected based on the state of the first checkbox.
It's based on what the Windows file explorer does when holding Ctrl and Shift

Closes #22455.
PR #22610.
This commit is contained in:
justusaac 2025-05-10 03:08:19 -05:00 committed by GitHub
commit 86e4b662ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2185,6 +2185,7 @@ window.qBittorrent.DynamicTable ??= (() => {
prevFilteredRows = [];
prevSortedColumn = null;
prevReverseSort = null;
prevCheckboxNum = null;
fileTree = new window.qBittorrent.FileTree.FileTree();
setupVirtualList() {
@ -2344,13 +2345,41 @@ window.qBittorrent.DynamicTable ??= (() => {
checkbox.type = "checkbox";
checkbox.className = "RenamingCB";
checkbox.addEventListener("click", (e) => {
const id = e.target.dataset.id;
const node = that.getNode(id);
node.checked = e.target.checked ? 0 : 1;
node.full_data.checked = node.checked;
that.updateGlobalCheckbox();
that.onRowSelectionChange(node);
e.stopPropagation();
const targetId = e.target.dataset.id;
const ids = [];
// when holding shift, set all files between the previously selected one and the clicked one
if (e.shiftKey && (that.prevCheckboxNum !== null) && (targetId !== that.prevCheckboxNum)) {
const targetState = that.tableBody.querySelector(`.RenamingCB[data-id="${that.prevCheckboxNum}"]`).checked;
const checkboxes = that.tableBody.getElementsByClassName("RenamingCB");
let started = false;
for (const cb of checkboxes) {
const currId = cb.dataset.id;
if ((currId === targetId) || (currId === that.prevCheckboxNum)) {
if (started) {
ids.push(currId);
cb.checked = targetState;
break;
}
started = true;
}
if (started) {
ids.push(currId);
cb.checked = targetState;
}
}
}
else {
ids.push(targetId);
}
for (const id of ids) {
const node = that.getNode(id);
node.checked = e.target.checked ? 0 : 1;
node.full_data.checked = node.checked;
}
that.updateGlobalCheckbox();
that.onRowSelectionChange(that.getNode(targetId));
that.prevCheckboxNum = targetId;
});
checkbox.indeterminate = false;
td.append(checkbox);