diff --git a/webui/backend/app/services/__pycache__/file_ops_service.cpython-313.pyc b/webui/backend/app/services/__pycache__/file_ops_service.cpython-313.pyc index e86d77c..4bcb0f6 100644 Binary files a/webui/backend/app/services/__pycache__/file_ops_service.cpython-313.pyc and b/webui/backend/app/services/__pycache__/file_ops_service.cpython-313.pyc differ diff --git a/webui/backend/app/services/file_ops_service.py b/webui/backend/app/services/file_ops_service.py index 59d9086..6f87481 100644 --- a/webui/backend/app/services/file_ops_service.py +++ b/webui/backend/app/services/file_ops_service.py @@ -20,6 +20,7 @@ TEXT_EDIT_MAX_BYTES = 256 * 1024 TEXT_CONTENT_TYPES = { ".txt": "text/plain", ".log": "text/plain", + ".conf": "text/plain", ".md": "text/markdown", ".yml": "text/yaml", ".yaml": "text/yaml", diff --git a/webui/backend/data/archive_tmp/14e942d8-7921-42c4-bf84-4a0ebbae390c.zip b/webui/backend/data/archive_tmp/14e942d8-7921-42c4-bf84-4a0ebbae390c.zip deleted file mode 100644 index 2937009..0000000 Binary files a/webui/backend/data/archive_tmp/14e942d8-7921-42c4-bf84-4a0ebbae390c.zip and /dev/null differ diff --git a/webui/backend/data/archive_tmp/f9131f12-dc5f-4ddc-9e9a-1c4b977f4ea8.zip b/webui/backend/data/archive_tmp/f9131f12-dc5f-4ddc-9e9a-1c4b977f4ea8.zip new file mode 100644 index 0000000..58c599f Binary files /dev/null and b/webui/backend/data/archive_tmp/f9131f12-dc5f-4ddc-9e9a-1c4b977f4ea8.zip differ diff --git a/webui/backend/data/tasks.db b/webui/backend/data/tasks.db index c4ca545..1697f4d 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_api_edit_golden.cpython-313.pyc b/webui/backend/tests/golden/__pycache__/test_api_edit_golden.cpython-313.pyc index 614cd71..55c5edc 100644 Binary files a/webui/backend/tests/golden/__pycache__/test_api_edit_golden.cpython-313.pyc and b/webui/backend/tests/golden/__pycache__/test_api_edit_golden.cpython-313.pyc 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 528d7d6..1583f27 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_api_edit_golden.py b/webui/backend/tests/golden/test_api_edit_golden.py index 4e734e0..54d47f0 100644 --- a/webui/backend/tests/golden/test_api_edit_golden.py +++ b/webui/backend/tests/golden/test_api_edit_golden.py @@ -80,6 +80,19 @@ class EditApiGoldenTest(unittest.TestCase): self.assertEqual(body["content_type"], "text/x-python") self.assertEqual(body["content"], "print('hello')\n") + def test_edit_view_conf_success(self) -> None: + file_path = self.root / "app.conf" + file_path.write_text("enabled=true\n", encoding="utf-8") + + response = self._request("GET", "/api/files/view", params={"path": "storage1/app.conf", "for_edit": "true"}) + + self.assertEqual(response.status_code, 200) + body = response.json() + self.assertEqual(body["path"], "storage1/app.conf") + self.assertEqual(body["name"], "app.conf") + self.assertEqual(body["content_type"], "text/plain") + self.assertEqual(body["content"], "enabled=true\n") + def test_save_success(self) -> None: file_path = self.root / "notes.txt" file_path.write_text("hello", encoding="utf-8") diff --git a/webui/backend/tests/golden/test_ui_smoke_golden.py b/webui/backend/tests/golden/test_ui_smoke_golden.py index 9fff341..6460eff 100644 --- a/webui/backend/tests/golden/test_ui_smoke_golden.py +++ b/webui/backend/tests/golden/test_ui_smoke_golden.py @@ -303,6 +303,8 @@ class UiSmokeGoldenTest(unittest.TestCase): self.assertIn('if (item.kind === "directory") {', app_js) self.assertIn('return isImageSelection(item) || isVideoSelection(item);', app_js) self.assertIn('const editableSingle = items.length === 1 && isEditableSelection(items[0]);', app_js) + self.assertIn('return [".txt", ".log", ".md", ".yml", ".yaml", ".json", ".js", ".py", ".css", ".html", ".conf"].some((suffix) => lower.endsWith(suffix));', app_js) + self.assertIn('if (!item || item.kind !== "file") {', 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('const downloadableSelection = items.length > 0;', app_js) @@ -316,6 +318,7 @@ class UiSmokeGoldenTest(unittest.TestCase): self.assertIn('elements.propertiesButton.disabled = items.length === 0;', app_js) self.assertIn('openCurrentDirectory();', app_js) self.assertIn('openEditor();', app_js) + self.assertIn('if (selectedItems.length !== 1 || !isEditableSelection(selectedItems[0])) {', app_js) self.assertIn('const created = await createArchiveDownloadTask(selectedPaths);', app_js) self.assertIn('const task = await waitForArchiveDownloadReady(created.task_id);', app_js) self.assertIn('startArchiveDownload(task.id, task.destination);', app_js) diff --git a/webui/html/app.js b/webui/html/app.js index 056feff..22a788e 100644 --- a/webui/html/app.js +++ b/webui/html/app.js @@ -1985,7 +1985,7 @@ function isEditableSelection(item) { if (lower === "dockerfile" || lower === "containerfile") { return true; } - return [".txt", ".log", ".md", ".yml", ".yaml", ".json", ".js", ".py", ".css", ".html"].some((suffix) => lower.endsWith(suffix)); + return [".txt", ".log", ".md", ".yml", ".yaml", ".json", ".js", ".py", ".css", ".html", ".conf"].some((suffix) => lower.endsWith(suffix)); } function formatBinarySize(bytes) {