diff --git a/webui/backend/data/tasks.db b/webui/backend/data/tasks.db index 325f4c3..b3484b6 100644 Binary files a/webui/backend/data/tasks.db and b/webui/backend/data/tasks.db differ diff --git a/webui/backend/tests/golden/__pycache__/test_ui_smoke_golden.cpython-313.pyc b/webui/backend/tests/golden/__pycache__/test_ui_smoke_golden.cpython-313.pyc index eed3f9e..d977911 100644 Binary files a/webui/backend/tests/golden/__pycache__/test_ui_smoke_golden.cpython-313.pyc and b/webui/backend/tests/golden/__pycache__/test_ui_smoke_golden.cpython-313.pyc differ diff --git a/webui/backend/tests/golden/test_ui_smoke_golden.py b/webui/backend/tests/golden/test_ui_smoke_golden.py index cd6e393..710a638 100644 --- a/webui/backend/tests/golden/test_ui_smoke_golden.py +++ b/webui/backend/tests/golden/test_ui_smoke_golden.py @@ -72,6 +72,7 @@ class UiSmokeGoldenTest(unittest.TestCase): self.assertIn('id="context-menu-scope"', body) self.assertIn('id="context-menu-target"', body) self.assertIn('id="context-menu-rename-btn"', body) + self.assertIn('id="context-menu-copy-btn"', body) self.assertIn('id="context-menu-move-btn"', body) self.assertIn('id="context-menu-delete-btn"', body) self.assertIn('id="settings-btn"', body) @@ -211,6 +212,7 @@ class UiSmokeGoldenTest(unittest.TestCase): self.assertIn('function closeContextMenu()', app_js) self.assertIn('function applyContextMenuSelection()', app_js) self.assertIn('function startContextMenuRename()', app_js) + self.assertIn('function startContextMenuCopy()', app_js) self.assertIn('function startContextMenuMove()', app_js) self.assertIn('function startContextMenuDelete()', app_js) self.assertIn('selectedPathsSet.has(entry.path)', app_js) @@ -220,8 +222,10 @@ class UiSmokeGoldenTest(unittest.TestCase): self.assertIn('if (!row) {', app_js) self.assertIn('closeContextMenu();', app_js) self.assertIn('elements.renameButton.classList.toggle("hidden", isMulti);', app_js) + self.assertIn('elements.copyButton.classList.remove("hidden");', app_js) self.assertIn('elements.moveButton.classList.remove("hidden");', app_js) self.assertIn('openRenamePopup();', app_js) + self.assertIn('startCopySelected();', app_js) self.assertIn('openF6Flow();', app_js) self.assertIn('deleteSelected();', app_js) self.assertIn('document.getElementById("upload-menu-toggle").onclick = (event) => {', app_js) diff --git a/webui/html/app.js b/webui/html/app.js index 125d6a1..5dd5684 100644 --- a/webui/html/app.js +++ b/webui/html/app.js @@ -327,6 +327,7 @@ function contextMenuElements() { scope: document.getElementById("context-menu-scope"), target: document.getElementById("context-menu-target"), renameButton: document.getElementById("context-menu-rename-btn"), + copyButton: document.getElementById("context-menu-copy-btn"), moveButton: document.getElementById("context-menu-move-btn"), deleteButton: document.getElementById("context-menu-delete-btn"), }; @@ -370,6 +371,7 @@ function openContextMenu(pane, entry, event) { elements.scope.textContent = isMulti ? "Multi-selection" : "Single item"; elements.target.textContent = isMulti ? `${items.length} selected items` : entry.name; elements.renameButton.classList.toggle("hidden", isMulti); + elements.copyButton.classList.remove("hidden"); elements.moveButton.classList.remove("hidden"); elements.deleteButton.classList.remove("hidden"); @@ -430,6 +432,15 @@ function startContextMenuMove() { openF6Flow(); } +function startContextMenuCopy() { + if (!applyContextMenuSelection()) { + closeContextMenu(); + return; + } + closeContextMenu(); + startCopySelected(); +} + function settingsElements() { return { overlay: document.getElementById("settings-modal"), @@ -3751,6 +3762,9 @@ function setupEvents() { if (contextMenu.renameButton) { contextMenu.renameButton.onclick = startContextMenuRename; } + if (contextMenu.copyButton) { + contextMenu.copyButton.onclick = startContextMenuCopy; + } if (contextMenu.moveButton) { contextMenu.moveButton.onclick = startContextMenuMove; } diff --git a/webui/html/index.html b/webui/html/index.html index 2f4e381..54017f2 100644 --- a/webui/html/index.html +++ b/webui/html/index.html @@ -123,6 +123,7 @@
+