feature: duplicate 02

This commit is contained in:
kodi
2026-03-14 17:27:24 +01:00
parent 7f7665880f
commit cc5a978e79
5 changed files with 57 additions and 4 deletions
+40
View File
@@ -359,6 +359,7 @@ function contextMenuElements() {
editButton: document.getElementById("context-menu-edit-btn"),
downloadButton: document.getElementById("context-menu-download-btn"),
renameButton: document.getElementById("context-menu-rename-btn"),
duplicateButton: document.getElementById("context-menu-duplicate-btn"),
copyButton: document.getElementById("context-menu-copy-btn"),
moveButton: document.getElementById("context-menu-move-btn"),
deleteButton: document.getElementById("context-menu-delete-btn"),
@@ -706,6 +707,8 @@ function openContextMenu(pane, entry, event) {
elements.downloadButton.classList.remove("hidden");
elements.downloadButton.disabled = !downloadableSelection;
elements.renameButton.classList.toggle("hidden", isMulti);
elements.duplicateButton.classList.remove("hidden");
elements.duplicateButton.disabled = items.length === 0;
elements.copyButton.classList.remove("hidden");
elements.copyButton.disabled = items.length === 0;
elements.moveButton.classList.remove("hidden");
@@ -782,6 +785,36 @@ function startContextMenuCopy() {
startCopySelected();
}
async function startDuplicateSelected() {
const sourcePane = state.activePane;
const selectedItems = [...paneState(sourcePane).selectedItems];
if (selectedItems.length === 0) {
return;
}
setError("actions-error", "");
try {
const result = await createDuplicateTask(selectedItems.map((item) => item.path));
state.selectedTaskId = result.task_id;
await refreshTasksSnapshot();
await Promise.all([loadBrowsePane("left"), loadBrowsePane("right")]);
showActionSummary("Duplicate", 1, 0, null);
} catch (err) {
showActionSummary("Duplicate", 0, 1, err.message);
}
}
function startContextMenuDuplicate() {
if (contextMenuElements().duplicateButton?.disabled) {
return;
}
if (!applyContextMenuSelection()) {
closeContextMenu();
return;
}
closeContextMenu();
startDuplicateSelected();
}
function startContextMenuOpen() {
if (contextMenuElements().openButton?.disabled) {
return;
@@ -1165,6 +1198,10 @@ async function createArchiveDownloadTask(paths) {
return apiRequest("POST", "/api/files/download/archive-prepare", { paths });
}
async function createDuplicateTask(paths) {
return apiRequest("POST", "/api/files/duplicate", { paths });
}
async function getTaskRequest(taskId) {
return apiRequest("GET", `/api/tasks/${encodeURIComponent(taskId)}`);
}
@@ -4633,6 +4670,9 @@ function setupEvents() {
if (contextMenu.downloadButton) {
contextMenu.downloadButton.onclick = startContextMenuDownload;
}
if (contextMenu.duplicateButton) {
contextMenu.duplicateButton.onclick = startContextMenuDuplicate;
}
if (contextMenu.copyButton) {
contextMenu.copyButton.onclick = startContextMenuCopy;
}
+1
View File
@@ -144,6 +144,7 @@
<button id="context-menu-edit-btn" type="button" role="menuitem">Edit</button>
<button id="context-menu-download-btn" type="button" role="menuitem">Download</button>
<button id="context-menu-rename-btn" type="button" role="menuitem">Rename</button>
<button id="context-menu-duplicate-btn" type="button" role="menuitem">Duplicate</button>
<button id="context-menu-copy-btn" type="button" role="menuitem">Copy</button>
<button id="context-menu-move-btn" type="button" role="menuitem">Move</button>
<button id="context-menu-delete-btn" type="button" role="menuitem">Delete</button>