diff --git a/webui/backend/data/tasks.db b/webui/backend/data/tasks.db index 742621b..320bdc4 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 d54c409..822f628 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 fa0a338..fdbf96e 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-open-btn"', body) + self.assertIn('id="context-menu-edit-btn"', 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) @@ -214,6 +215,7 @@ class UiSmokeGoldenTest(unittest.TestCase): self.assertIn('function closeContextMenu()', app_js) self.assertIn('function applyContextMenuSelection()', app_js) self.assertIn('function startContextMenuOpen()', app_js) + self.assertIn('function startContextMenuEdit()', app_js) self.assertIn('function startContextMenuRename()', app_js) self.assertIn('function startContextMenuCopy()', app_js) self.assertIn('function startContextMenuMove()', app_js) @@ -227,6 +229,9 @@ class UiSmokeGoldenTest(unittest.TestCase): self.assertIn('closeContextMenu();', app_js) self.assertIn('elements.openButton.classList.toggle("hidden", isMulti);', app_js) self.assertIn('elements.openButton.disabled = isMulti || items.length !== 1;', app_js) + self.assertIn('const editableSingle = items.length === 1 && isEditableSelection(items[0]);', app_js) + self.assertIn('elements.editButton.classList.toggle("hidden", isMulti || items.length !== 1 || items[0].kind !== "file");', app_js) + self.assertIn('elements.editButton.disabled = !editableSingle;', app_js) self.assertIn('elements.renameButton.classList.toggle("hidden", isMulti);', app_js) self.assertIn('elements.copyButton.classList.remove("hidden");', app_js) self.assertIn('elements.copyButton.disabled = items.length === 0;', app_js) @@ -234,6 +239,7 @@ class UiSmokeGoldenTest(unittest.TestCase): self.assertIn('elements.propertiesButton.classList.remove("hidden");', app_js) self.assertIn('elements.propertiesButton.disabled = items.length === 0;', app_js) self.assertIn('openCurrentDirectory();', app_js) + self.assertIn('openEditor();', app_js) self.assertIn('openRenamePopup();', app_js) self.assertIn('startCopySelected();', app_js) self.assertIn('openF6Flow();', app_js) diff --git a/webui/html/app.js b/webui/html/app.js index 084ac25..b6f6bdc 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"), openButton: document.getElementById("context-menu-open-btn"), + editButton: document.getElementById("context-menu-edit-btn"), renameButton: document.getElementById("context-menu-rename-btn"), copyButton: document.getElementById("context-menu-copy-btn"), moveButton: document.getElementById("context-menu-move-btn"), @@ -370,10 +371,13 @@ function openContextMenu(pane, entry, event) { contextMenuState.anchorPath = entry.path; const isMulti = items.length > 1; + const editableSingle = items.length === 1 && isEditableSelection(items[0]); elements.scope.textContent = isMulti ? "Multi-selection" : "Single item"; elements.target.textContent = isMulti ? `${items.length} selected items` : entry.name; elements.openButton.classList.toggle("hidden", isMulti); elements.openButton.disabled = isMulti || items.length !== 1; + elements.editButton.classList.toggle("hidden", isMulti || items.length !== 1 || items[0].kind !== "file"); + elements.editButton.disabled = !editableSingle; elements.renameButton.classList.toggle("hidden", isMulti); elements.copyButton.classList.remove("hidden"); elements.copyButton.disabled = items.length === 0; @@ -463,6 +467,18 @@ function startContextMenuOpen() { openCurrentDirectory(); } +function startContextMenuEdit() { + if (contextMenuElements().editButton?.disabled) { + return; + } + if (!applyContextMenuSelection()) { + closeContextMenu(); + return; + } + closeContextMenu(); + openEditor(); +} + function startContextMenuProperties() { if (contextMenuElements().propertiesButton?.disabled) { return; @@ -3806,6 +3822,9 @@ function setupEvents() { if (contextMenu.openButton) { contextMenu.openButton.onclick = startContextMenuOpen; } + if (contextMenu.editButton) { + contextMenu.editButton.onclick = startContextMenuEdit; + } if (contextMenu.copyButton) { contextMenu.copyButton.onclick = startContextMenuCopy; } diff --git a/webui/html/index.html b/webui/html/index.html index 52f8e51..b28f6f6 100644 --- a/webui/html/index.html +++ b/webui/html/index.html @@ -123,6 +123,7 @@
+