This commit is contained in:
Bark 2025-07-04 23:49:45 +08:00 committed by GitHub
commit 86552058cf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 55 additions and 1 deletions

View file

@ -163,6 +163,8 @@ window.qBittorrent.DynamicTable ??= (() => {
}, true);
this.dynamicTableDiv.addEventListener("touchstart", (e) => {
if (e.target.classList.contains("selectRowCheckbox"))
return; // ignore touch events on checkboxes, otherwise breaks on mobile
const tr = e.target.closest("tr");
if (!tr)
return;
@ -588,6 +590,8 @@ window.qBittorrent.DynamicTable ??= (() => {
column["onVisibilityChange"] = null;
column["staticWidth"] = null;
column["calculateBuffer"] = () => 0;
column["jsManaged"] = false;
this.columns.push(column);
this.columns[name] = column;
@ -736,10 +740,12 @@ window.qBittorrent.DynamicTable ??= (() => {
for (const row of this.getFilteredAndSortedRows())
this.selectedRows.push(row.rowId);
this.setRowClass();
this.onSelectedRowChanged();
}
deselectAll() {
this.selectedRows.empty();
this.onSelectedRowChanged();
}
selectRow(rowId) {
@ -1000,7 +1006,10 @@ window.qBittorrent.DynamicTable ??= (() => {
tds[i].style.width = `${this.columns[i].width}px`;
tds[i].style.maxWidth = `${this.columns[i].width}px`;
}
if (this.columns[i].dataProperties.some(prop => Object.hasOwn(data, prop)))
if (
this.columns[i].dataProperties.some(prop => Object.hasOwn(data, prop))
|| (this.columns[i].jsManaged)
)
this.columns[i].updateTd(tds[i], row);
}
row["data"] = {};
@ -1096,12 +1105,18 @@ window.qBittorrent.DynamicTable ??= (() => {
}
class TorrentsTable extends DynamicTable {
setupVirtualList() {
super.setupVirtualList();
this.rowHeight = 22;
}
initColumns() {
if (LocalPreferences.get("use_checkboxes_in_ui", "false") === "true") {
this.newColumn("selected", "width: 20px; text-align: center;", "", 20, true);
this.columns["selected"].jsManaged = true;
}
this.newColumn("priority", "", "#", 30, true);
this.newColumn("state_icon", "", "QBT_TR(Status Icon)QBT_TR[CONTEXT=TransferListModel]", 30, false);
this.newColumn("name", "", "QBT_TR(Name)QBT_TR[CONTEXT=TransferListModel]", 200, true);
@ -1201,6 +1216,29 @@ window.qBittorrent.DynamicTable ??= (() => {
return `stateIcon ${stateClass}`;
};
if (LocalPreferences.get("use_checkboxes_in_ui", "false") === "true") {
const self = this;
this.columns["selected"].updateTd = (td, row) => {
let htmlInput = td.firstElementChild;
if (htmlInput === null)
htmlInput = document.createElement("input");
htmlInput.type = "checkbox";
htmlInput.className = "selectRowCheckbox";
htmlInput.checked = self.isRowSelected(row.rowId);
if (td.firstElementChild === null) {
htmlInput.addEventListener("click", (e) => {
e.stopPropagation();
if (htmlInput.checked)
self.selectRow(row.rowId);
else
self.deselectRow(row.rowId);
});
td.append(htmlInput);
}
};
}
// state_icon
this.columns["state_icon"].updateTd = function(td, row) {
@ -1817,6 +1855,15 @@ window.qBittorrent.DynamicTable ??= (() => {
onSelectedRowChanged() {
updatePropertiesPanel();
this.updateSelectedCheckboxes();
}
updateSelectedCheckboxes() {
const checkboxes = document.getElementsByClassName("selectRowCheckbox");
for (const checkbox of checkboxes) {
const rowId = checkbox.closest("tr").rowId;
checkbox.checked = this.isRowSelected(rowId);
}
}
}

View file

@ -1031,6 +1031,10 @@
<div class="formRow">
<a href="https://github.com/qbittorrent/qBittorrent/wiki/List-of-known-alternate-WebUIs" target="_blank">QBT_TR(List of alternative WebUI)QBT_TR[CONTEXT=OptionsDialog]</a>
</div>
<div class="formRow">
<input type="checkbox" id="use_checkboxes_in_ui">
<label for="use_checkboxes_in_ui">QBT_TR(Use checkboxes in WebUI)QBT_TR[CONTEXT=OptionsDialog]</label>
</div>
</fieldset>
<fieldset class="settings">
@ -2533,6 +2537,7 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD
document.getElementById("use_https_checkbox").checked = pref.use_https;
document.getElementById("ssl_cert_text").value = pref.web_ui_https_cert_path;
document.getElementById("ssl_key_text").value = pref.web_ui_https_key_path;
document.getElementById("use_checkboxes_in_ui").checked = LocalPreferences.get("use_checkboxes_in_ui", "false") === "true";
updateHttpsSettings();
// Authentication
@ -3031,6 +3036,8 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD
}
settings["alternative_webui_enabled"] = alternative_webui_enabled;
settings["alternative_webui_path"] = webui_files_location_textarea;
settings["use_checkboxes_in_ui"] = document.getElementById("use_checkboxes_in_ui").checked;
LocalPreferences.set("use_checkboxes_in_ui", settings["use_checkboxes_in_ui"]);
// Security
settings["web_ui_clickjacking_protection_enabled"] = document.getElementById("clickjacking_protection_checkbox").checked;