diff --git a/ui/src/api/types/application.ts b/ui/src/api/types/application.ts index 02a0f9e5bd3..d38aa2ba06f 100644 --- a/ui/src/api/types/application.ts +++ b/ui/src/api/types/application.ts @@ -8,6 +8,7 @@ export type ApplicationType = (typeof APPLICATION_TYPE)[keyof typeof APPLICATION export interface ApplicationDetail { create_time?: string desc?: string | null + folder?: string folder_id?: string icon?: string id: string diff --git a/ui/src/components/COMPONENT_README.md b/ui/src/components/COMPONENT_README.md index 0b7708bfb72..541c34d6e44 100644 --- a/ui/src/components/COMPONENT_README.md +++ b/ui/src/components/COMPONENT_README.md @@ -959,7 +959,10 @@ Workspace 的文件夹虚拟树业务组件。组件根据当前资源上下文 文件夹树查询、搜索、排序、创建、编辑、移动和删除。通过 `v-model` 控制当前文件夹 ID,首次加载 完成后通过 `loaded` 返回该 ID 对应的完整文件夹,选择文件夹时触发 `select`。传入的 ID 不存在时, 优先回退到“全部”入口,否则回退到首个可用文件夹。`showAll`、`showShared` 分别控制全部和共享入口, -`rootLabel` 可覆盖根入口文案,`disabledFolderIds` 用于只选场景中禁用指定节点。 +`rootLabel` 可覆盖根入口文案,`disabledFolderIds` 用于只选场景中禁用指定节点。显示“全部”入口的 +主目录树初始化时会读取字符串类型的 `folderId` query 并设置当前文件夹;用户选择文件夹时不把 +新 ID 写入路由,但会清除已有的 `folderId`,避免刷新页面后恢复到旧文件夹。隐藏“全部”入口的 +移动目录树继续以调用方传入的 `v-model` 为准。 ```vue @@ -34,7 +34,7 @@ function handleOpen() {

diff --git a/ui/src/views/application/application-card/action-dropdown/DeleteApplicationAction.vue b/ui/src/views/application/application-card/action-dropdown/DeleteApplicationAction.vue index 09f601aa7f0..69cf1aefa15 100644 --- a/ui/src/views/application/application-card/action-dropdown/DeleteApplicationAction.vue +++ b/ui/src/views/application/application-card/action-dropdown/DeleteApplicationAction.vue @@ -17,13 +17,13 @@ function handleDeleteApplication() { loading.value = true return props.api .deleteApplication(props.application.id) + .finally(() => { + loading.value = false + }) .then(() => { emit('delete', props.application.id) MsgSuccess('删除成功') }) - .finally(() => { - loading.value = false - }) }) .catch(() => {}) } diff --git a/ui/src/views/application/application-card/action-dropdown/MoveApplicationAction.vue b/ui/src/views/application/application-card/action-dropdown/MoveApplicationAction.vue index 83ae52e3dc7..8f030b89b25 100644 --- a/ui/src/views/application/application-card/action-dropdown/MoveApplicationAction.vue +++ b/ui/src/views/application/application-card/action-dropdown/MoveApplicationAction.vue @@ -20,7 +20,7 @@ const moveToDialogRef = useTemplateRef<{ close: () => void; open: (currentFolder function handleOpenMoveApplication() { dialogMounted.value = true - return nextTick(() => moveToDialogRef.value?.open(props.application.folder_id)) + return nextTick(() => moveToDialogRef.value?.open(props.application.folder ?? props.currentFolderId)) } function handleMoveApplication(targetFolderId: string) { @@ -28,14 +28,14 @@ function handleMoveApplication(targetFolderId: string) { loading.value = true return props.api .putMoveApplication(props.application.id, targetFolderId) + .finally(() => { + loading.value = false + }) .then(() => { MsgSuccess('移动成功') moveToDialogRef.value?.close() if (props.currentFolderId !== FOLDER_ENTRY_ID.ALL) emit('delete', props.application.id) }) - .finally(() => { - loading.value = false - }) } function handleDialogClosed() { diff --git a/ui/src/views/application/application-card/action-dropdown/SettingApplicationAction.vue b/ui/src/views/application/application-card/action-dropdown/SettingApplicationAction.vue index 341520347d7..542295e47af 100644 --- a/ui/src/views/application/application-card/action-dropdown/SettingApplicationAction.vue +++ b/ui/src/views/application/application-card/action-dropdown/SettingApplicationAction.vue @@ -20,7 +20,6 @@ function handleSettingApplication(event: MouseEvent) { type: props.application.type, workspaceId: route.params.workspaceId, }, - query: route.query, }) return } diff --git a/ui/src/views/application/create-application/AdvancedCreateDialog.vue b/ui/src/views/application/create-application/AdvancedCreateDialog.vue index d6e9c1838a6..03756dee396 100644 --- a/ui/src/views/application/create-application/AdvancedCreateDialog.vue +++ b/ui/src/views/application/create-application/AdvancedCreateDialog.vue @@ -26,8 +26,6 @@ const router = useRouter() const props = defineProps<{ folderId: string }>() -const emit = defineEmits<{ refresh: [] }>() - const dialogVisible = ref(false) const loading = ref(false) const selectedTemplate = ref('blank') @@ -64,7 +62,6 @@ function submit() { return auth.loadAuthBaseProfile().then(() => { MsgSuccess('创建成功') dialogVisible.value = false - emit('refresh') return router.push({ name: 'workflow-application', params: { applicationId: application.id, workspaceId: route.params.workspaceId }, diff --git a/ui/src/views/application/create-application/CreateApplicationDropdown.vue b/ui/src/views/application/create-application/CreateApplicationDropdown.vue index 9c83cf89e99..c13d8a3fc81 100644 --- a/ui/src/views/application/create-application/CreateApplicationDropdown.vue +++ b/ui/src/views/application/create-application/CreateApplicationDropdown.vue @@ -120,6 +120,6 @@ function handleRefresh() { - - + + diff --git a/ui/src/views/application/create-application/SimpleCreateDialog.vue b/ui/src/views/application/create-application/SimpleCreateDialog.vue index ac0ebf8ea28..d3e007bc57b 100644 --- a/ui/src/views/application/create-application/SimpleCreateDialog.vue +++ b/ui/src/views/application/create-application/SimpleCreateDialog.vue @@ -28,8 +28,6 @@ const router = useRouter() const props = defineProps<{ folderId: string }>() -const emit = defineEmits<{ refresh: [] }>() - const dialogVisible = ref(false) const loading = ref(false) const applicationFormRef = ref() @@ -73,7 +71,6 @@ function submit() { return auth.loadAuthBaseProfile().then(() => { MsgSuccess('创建成功') dialogVisible.value = false - emit('refresh') return router.push({ name: 'workspace-application-simple-setting', params: { applicationId: application.id, type: application.type, workspaceId: route.params.workspaceId }, diff --git a/ui/src/views/knowledge/components/KnowledgeCard.vue b/ui/src/views/knowledge/components/KnowledgeCard.vue index d7b7eacbac6..84a2365be3e 100644 --- a/ui/src/views/knowledge/components/KnowledgeCard.vue +++ b/ui/src/views/knowledge/components/KnowledgeCard.vue @@ -18,13 +18,13 @@ function handleDeleteKnowledge() { .then(() => { loading.value = true return KnowledgeApi.deleteKnowledge(props.knowledge.id) + .finally(() => { + loading.value = false + }) .then(() => { emit('delete', props.knowledge.id) MsgSuccess('删除成功') }) - .finally(() => { - loading.value = false - }) }) .catch(() => {}) } diff --git a/ui/src/views/tool/tool-card/action-dropdown/DeleteToolAction.vue b/ui/src/views/tool/tool-card/action-dropdown/DeleteToolAction.vue index 9d72f714a30..695ea8adc0d 100644 --- a/ui/src/views/tool/tool-card/action-dropdown/DeleteToolAction.vue +++ b/ui/src/views/tool/tool-card/action-dropdown/DeleteToolAction.vue @@ -17,11 +17,11 @@ function handleDeleteTool() { loading.value = true return props.api .deleteTool(props.tool.id) + .finally(() => (loading.value = false)) .then(() => { emit('delete', props.tool.id) MsgSuccess('删除成功') }) - .finally(() => (loading.value = false)) }) .catch(() => {}) } diff --git a/ui/src/views/tool/tool-card/action-dropdown/MoveToolAction.vue b/ui/src/views/tool/tool-card/action-dropdown/MoveToolAction.vue index c6fedaf5821..33dfaeaf6ea 100644 --- a/ui/src/views/tool/tool-card/action-dropdown/MoveToolAction.vue +++ b/ui/src/views/tool/tool-card/action-dropdown/MoveToolAction.vue @@ -28,14 +28,14 @@ function handleMoveTool(targetFolderId: string) { loading.value = true return props.api .putTool(props.tool.id, { folder_id: targetFolderId }) + .finally(() => { + loading.value = false + }) .then(() => { MsgSuccess('移动成功') moveToDialogRef.value?.close() if (props.currentFolderId !== FOLDER_ENTRY_ID.ALL) emit('delete', props.tool.id) }) - .finally(() => { - loading.value = false - }) } function handleDialogClosed() {