From c6ddb70909e87ced854193ad59b0ba32ff156edb Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Tue, 6 Jan 2026 19:32:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(FileTable):=20=E6=B7=BB=E5=8A=A0=E5=85=A8?= =?UTF-8?q?=E9=80=89=E5=8A=9F=E8=83=BD=E5=92=8C=E9=80=89=E6=8B=A9=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=8C=87=E7=A4=BA=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在文件表格的批量操作区域添加全选复选框和部分选择状态指示器 更新项目信息统计数据 Fixes Feat: 支持“全选”功能以提升批量操作效率 Fixes #435 --- src/config/static/info.template.yaml | 4 +-- web/src/components/FileTable.vue | 48 +++++++++++++++++++++++++++- web/src/stores/info.js | 4 +-- 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/config/static/info.template.yaml b/src/config/static/info.template.yaml index 85fb0116..dd134ce7 100644 --- a/src/config/static/info.template.yaml +++ b/src/config/static/info.template.yaml @@ -16,7 +16,7 @@ branding: features: - label: "GitHub Stars" - value: "3000+" + value: "3800+" description: "开发者社区的认可与支持" icon: "stars" - label: "已解决 Issues" @@ -24,7 +24,7 @@ features: description: "持续改进和问题解决能力" icon: "issues" - label: "累计 Commits" - value: "1100+" + value: "1200+" description: "活跃的开发迭代和功能更新" icon: "commits" - label: "开源协议" diff --git a/web/src/components/FileTable.vue b/web/src/components/FileTable.vue index c9045b99..88224a47 100644 --- a/web/src/components/FileTable.vue +++ b/web/src/components/FileTable.vue @@ -104,8 +104,14 @@ -
+
+ {{ selectedRowKeys.length }} 项
@@ -383,6 +389,46 @@ const selectedRowKeys = computed({ const isSelectionMode = ref(false); +const allSelectableFiles = computed(() => { + const nameFilter = filenameFilter.value.trim().toLowerCase(); + const status = statusFilter.value; + + return files.value.filter(file => { + if (file.is_folder) return false; + // Follow getCheckboxProps logic + if (lock.value || file.status === 'processing' || file.status === 'waiting') return false; + + if (nameFilter || status) { + const nameMatch = !nameFilter || (file.filename && file.filename.toLowerCase().includes(nameFilter)); + const statusMatch = !status || file.status === status || + (status === 'indexed' && file.status === 'done') || + (status === 'error_indexing' && file.status === 'failed'); + return nameMatch && statusMatch; + } + return true; + }); +}); + +const isAllSelected = computed(() => { + const selectableIds = allSelectableFiles.value.map(f => f.file_id); + if (selectableIds.length === 0) return false; + return selectableIds.every(id => selectedRowKeys.value.includes(id)); +}); + +const isPartiallySelected = computed(() => { + const selectableIds = allSelectableFiles.value.map(f => f.file_id); + const selectedCount = selectableIds.filter(id => selectedRowKeys.value.includes(id)).length; + return selectedCount > 0 && selectedCount < selectableIds.length; +}); + +const onSelectAllChange = (e) => { + if (e.target.checked) { + selectedRowKeys.value = allSelectableFiles.value.map(f => f.file_id); + } else { + selectedRowKeys.value = []; + } +}; + const expandedRowKeys = ref([]); const popoverVisibleMap = ref({}); diff --git a/web/src/stores/info.js b/web/src/stores/info.js index d4e5e53d..e9704f3f 100644 --- a/web/src/stores/info.js +++ b/web/src/stores/info.js @@ -27,7 +27,7 @@ export const useInfoStore = defineStore('info', () => { // 计算属性 - 功能特性 const features = computed(() => infoConfig.value.features || [{ label: "GitHub Stars", - value: "3000+", + value: "3200+", description: "开发者社区的认可与支持", icon: "stars" }, { @@ -37,7 +37,7 @@ export const useInfoStore = defineStore('info', () => { icon: "issues" }, { label: "累计 Commits", - value: "1100+", + value: "1200+", description: "活跃的开发迭代和功能更新", icon: "commits" }, {