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" }, {