diff --git a/ui/src/components/COMPONENT_README.md b/ui/src/components/COMPONENT_README.md index 3d7630a49f9..4d23f7daf66 100644 --- a/ui/src/components/COMPONENT_README.md +++ b/ui/src/components/COMPONENT_README.md @@ -817,6 +817,7 @@ Workspace 的文件夹虚拟树业务组件。组件根据当前资源上下文 后可调用 `refresh()` 重新加载文件夹树。 `VirtualizedTree.vue` 基于 `@he-tree/vue` 的 `Draggable` 实现虚拟渲染和拖拽交互,只负责树 UI, 不调用 API;不要替换为 Element Plus `el-tree-v2`。 +“全部”入口 ID 使用当前工作空间 ID;未传入 `v-model` 时,在实例创建时读取该 ID 作为默认选择。 ### MoveToDialog diff --git a/ui/src/components/business/folder-tree/index.vue b/ui/src/components/business/folder-tree/index.vue index 318a8cecad2..c9aab85c052 100644 --- a/ui/src/components/business/folder-tree/index.vue +++ b/ui/src/components/business/folder-tree/index.vue @@ -29,7 +29,7 @@ const props = withDefaults( { canEdit: true, disabledFolderIds: () => [], draggable: false, rootLabel: '', showAll: true, showShared: true }, ) -const currentNodeKey = defineModel({ default: FOLDER_ENTRY_ID.ALL }) +const currentNodeKey = defineModel({ default: () => FOLDER_ENTRY_ID.ALL }) const route = useRoute() const router = useRouter() const routeFolderId = route.query.folderId diff --git a/ui/src/constants/CONSTANT_README.md b/ui/src/constants/CONSTANT_README.md index 00dbf753076..c31be040b75 100644 --- a/ui/src/constants/CONSTANT_README.md +++ b/ui/src/constants/CONSTANT_README.md @@ -8,6 +8,9 @@ 不要创建收集无关常量的通用文件,也不要为了统一导出而新增只做二次转发的 `index.ts`。 常量名称使用能够表达所属领域和用途的全大写命名,使用方从具体文件直接导入。 +`folder.ts` 的 `FOLDER_ENTRY_ID.ALL` 与 `FOLDER_ENTRIES` 的全部入口 ID 在读取时取当前路由的工作空间 ID, +不在模块初始化时缓存;无工作空间上下文时保留 `default`,共享入口固定为 `shared`。 + 后端枚举与类型归属统一见 [API_README.md](../api/API_README.md#枚举与类型组织)。`constants` 只维护标签、颜色、选项等前端映射;映射的键应引用 API 枚举值。例如角色类型和登录方式以 `src/api/enums` 为唯一数据源,`constants/auth.ts` 只维护它们的展示文案。 diff --git a/ui/src/constants/folder.ts b/ui/src/constants/folder.ts index 08c6f1add16..2706ae32ea8 100644 --- a/ui/src/constants/folder.ts +++ b/ui/src/constants/folder.ts @@ -1,10 +1,30 @@ +/** 提供资源文件夹的全部与共享入口,全部入口使用当前工作空间 ID。 */ + import { RESOURCE_TYPE } from '@/api/enums' import type { FolderItem, FolderSource } from '@/api/types' +import { getWorkspaceId } from '@/utils/resource-context' + +export const FOLDER_ENTRY_ID = { + get ALL() { + return getWorkspaceId() ?? 'default' + }, + SHARED: 'shared', +} as const -export const FOLDER_ENTRY_ID = { ALL: 'default', SHARED: 'shared' } as const +function createFolderEntries(resourceName: string) { + return { + all: { + get id() { + return FOLDER_ENTRY_ID.ALL + }, + name: `全部${resourceName}`, + }, + shared: { id: FOLDER_ENTRY_ID.SHARED, name: `共享${resourceName}` }, + } +} export const FOLDER_ENTRIES = { - [RESOURCE_TYPE.APPLICATION]: { all: { id: FOLDER_ENTRY_ID.ALL, name: '全部智能体' }, shared: { id: FOLDER_ENTRY_ID.SHARED, name: '共享智能体' } }, - [RESOURCE_TYPE.KNOWLEDGE]: { all: { id: FOLDER_ENTRY_ID.ALL, name: '全部知识库' }, shared: { id: FOLDER_ENTRY_ID.SHARED, name: '共享知识库' } }, - [RESOURCE_TYPE.TOOL]: { all: { id: FOLDER_ENTRY_ID.ALL, name: '全部工具' }, shared: { id: FOLDER_ENTRY_ID.SHARED, name: '共享工具' } }, + [RESOURCE_TYPE.APPLICATION]: createFolderEntries('智能体'), + [RESOURCE_TYPE.KNOWLEDGE]: createFolderEntries('知识库'), + [RESOURCE_TYPE.TOOL]: createFolderEntries('工具'), } satisfies Record diff --git a/ui/src/views/tool/tool-store/ApplyStoreToolDialog.vue b/ui/src/views/tool/tool-store/ApplyStoreToolDialog.vue index 81b3b349946..046f8150fce 100644 --- a/ui/src/views/tool/tool-store/ApplyStoreToolDialog.vue +++ b/ui/src/views/tool/tool-store/ApplyStoreToolDialog.vue @@ -6,6 +6,7 @@ import WorkspaceToolStoreApi from '@/api/admin/workspace/tool/store' import SystemSharedToolApi from '@/api/admin/system/shared-resources/tool/tool' import SystemSharedToolStoreApi from '@/api/admin/system/shared-resources/tool/store' import { TOOL_TYPE } from '@/api/enums' +import { FOLDER_ENTRY_ID } from '@/constants/folder' import type { ToolItem, ToolStoreItem } from '@/api/types' import { useStore } from '@/stores' import { MsgSuccess } from '@/utils/message' @@ -17,7 +18,7 @@ const props = withDefaults( defineProps<{ folderId: string }>(), - { folderId: 'default' }, + { folderId: () => FOLDER_ENTRY_ID.ALL }, ) const { auth } = useStore() @@ -43,7 +44,7 @@ function handleSubmit() { const name = storeToolForm.name loading.value = true - const commonPayload = { folder_id: props.folderId || 'default', name } + const commonPayload = { folder_id: props.folderId || FOLDER_ENTRY_ID.ALL, name } const isSharedResource = isSystemSharedResource() let request: Promise diff --git a/ui/src/views/tool/tool-store/ToolStoreDialog.vue b/ui/src/views/tool/tool-store/ToolStoreDialog.vue index 6320aa02d38..6bc9d9149cb 100644 --- a/ui/src/views/tool/tool-store/ToolStoreDialog.vue +++ b/ui/src/views/tool/tool-store/ToolStoreDialog.vue @@ -2,6 +2,7 @@ import { computed, nextTick, ref, shallowRef, useTemplateRef } from 'vue' import StoreApi from '@/api/admin/store.ts' import { TOOL_TYPE } from '@/api/enums' +import { FOLDER_ENTRY_ID } from '@/constants/folder' import type { ToolStoreItem, ToolStoreTag, ToolType } from '@/api/types' import ToolStoreCard from './component/ToolStoreCard.vue' import ApplyStoreToolDialog from './ApplyStoreToolDialog.vue' @@ -24,7 +25,7 @@ const visible = ref(false) const loading = ref(false) const activeCategoryId = ref('') const appliedSearchKeyword = ref('') -const folderId = ref('default') +const folderId = ref(FOLDER_ENTRY_ID.ALL) const searchKeyword = ref('') const storeTools = ref([]) const storeTags = ref([]) @@ -85,7 +86,7 @@ function loadStoreTools() { } function open(targetFolderId: string) { - folderId.value = targetFolderId || 'default' + folderId.value = targetFolderId || FOLDER_ENTRY_ID.ALL visible.value = true loadStoreTools() }