From ed415a5bd26a17f26af451728bc0096a2527fabc Mon Sep 17 00:00:00 2001
From: Baobhan Sith <80159437+Heavrnl@users.noreply.github.com>
Date: Tue, 13 May 2025 01:04:45 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=E5=8E=8B=E7=BC=A9=E8=8F=9C?=
=?UTF-8?q?=E5=8D=95=E9=A1=B9=E6=B7=BB=E5=8A=A0=E4=BA=8C=E7=BA=A7=E8=8F=9C?=
=?UTF-8?q?=E5=8D=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/components/FileManagerContextMenu.vue | 72 ++++++++++++++++---
.../file-manager/useFileManagerContextMenu.ts | 29 +++++---
2 files changed, 83 insertions(+), 18 deletions(-)
diff --git a/packages/frontend/src/components/FileManagerContextMenu.vue b/packages/frontend/src/components/FileManagerContextMenu.vue
index b451b99..43f35d0 100644
--- a/packages/frontend/src/components/FileManagerContextMenu.vue
+++ b/packages/frontend/src/components/FileManagerContextMenu.vue
@@ -1,6 +1,7 @@
@@ -41,17 +68,46 @@ const handleItemClick = (item: ContextMenuItem) => {
{{ menuItem.label }}
+
+ {{ menuItem.label }}
+ ›
+
+ -
+ {{ subItem.label }}
+
+
+
diff --git a/packages/frontend/src/composables/file-manager/useFileManagerContextMenu.ts b/packages/frontend/src/composables/file-manager/useFileManagerContextMenu.ts
index 4a68c5d..ab42a8f 100644
--- a/packages/frontend/src/composables/file-manager/useFileManagerContextMenu.ts
+++ b/packages/frontend/src/composables/file-manager/useFileManagerContextMenu.ts
@@ -6,9 +6,10 @@ import type FileManagerContextMenu from '../../components/FileManagerContextMenu
// 定义菜单项类型 (可以根据需要扩展)
export interface ContextMenuItem {
label: string;
- action: () => void;
+ action?: () => void;
disabled?: boolean;
separator?: boolean; // 添加分隔符类型
+ submenu?: ContextMenuItem[]; // 添加二级菜单支持
}
// 支持的压缩格式
@@ -137,11 +138,14 @@ export function useFileManagerContextMenu(options: UseFileManagerContextMenuOpti
// --- 多选压缩 ---
- menu.push(
- { label: t('fileManager.contextMenu.compressZip'), action: () => onCompressRequest(selectedFileItems, 'zip'), disabled: !(isConnected.value && isSftpReady.value) },
- { label: t('fileManager.contextMenu.compressTarGz'), action: () => onCompressRequest(selectedFileItems, 'targz'), disabled: !(isConnected.value && isSftpReady.value) },
- { label: t('fileManager.contextMenu.compressTarBz2'), action: () => onCompressRequest(selectedFileItems, 'tarbz2'), disabled: !(isConnected.value && isSftpReady.value) },
- );
+ menu.push({
+ label: t('fileManager.contextMenu.compress'),
+ submenu: [
+ { label: t('fileManager.contextMenu.compressZip'), action: () => onCompressRequest(selectedFileItems, 'zip'), disabled: !(isConnected.value && isSftpReady.value) },
+ { label: t('fileManager.contextMenu.compressTarGz'), action: () => onCompressRequest(selectedFileItems, 'targz'), disabled: !(isConnected.value && isSftpReady.value) },
+ { label: t('fileManager.contextMenu.compressTarBz2'), action: () => onCompressRequest(selectedFileItems, 'tarbz2'), disabled: !(isConnected.value && isSftpReady.value) }
+ ]
+ });
menu.push({ label: '', action: () => {}, disabled: true, separator: true }); // Separator
@@ -192,10 +196,15 @@ export function useFileManagerContextMenu(options: UseFileManagerContextMenuOpti
const canCompress = isConnected.value && isSftpReady.value;
const canDecompress = isConnected.value && isSftpReady.value && targetItem.attrs.isFile && isSupportedArchive(targetItem.filename);
- // menu.push({ label: t('fileManager.contextMenu.compress'), action: () => {}, disabled: true }); // Removed isSubmenuHeader
- menu.push({ label: t('fileManager.contextMenu.compressZip'), action: () => onCompressRequest([targetItem], 'zip'), disabled: !canCompress });
- menu.push({ label: t('fileManager.contextMenu.compressTarGz'), action: () => onCompressRequest([targetItem], 'targz'), disabled: !canCompress });
- menu.push({ label: t('fileManager.contextMenu.compressTarBz2'), action: () => onCompressRequest([targetItem], 'tarbz2'), disabled: !canCompress });
+ // 添加压缩选项作为二级菜单
+ menu.push({
+ label: t('fileManager.contextMenu.compress'),
+ submenu: [
+ { label: t('fileManager.contextMenu.compressZip'), action: () => onCompressRequest([targetItem], 'zip'), disabled: !canCompress },
+ { label: t('fileManager.contextMenu.compressTarGz'), action: () => onCompressRequest([targetItem], 'targz'), disabled: !canCompress },
+ { label: t('fileManager.contextMenu.compressTarBz2'), action: () => onCompressRequest([targetItem], 'tarbz2'), disabled: !canCompress }
+ ]
+ });
// 只有在支持解压的文件上才显示解压选项
if (canDecompress) {