From 9114923541368fdfdfab269402955695fffe0fe8 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Fri, 23 Oct 2026 15:24:48 +0800 Subject: [PATCH] fix: tool edit bug --- ui/src/components/COMPONENT_README.md | 2 +- .../components/message-list/index.vue | 38 +++---- .../main/chat-panel/index.vue | 5 +- ui/src/views/VIEW_README.md | 5 +- .../model/create-model/ButtonAddModel.vue | 4 +- .../model/create-model/CreateModelDrawer.vue | 16 ++- .../create-model/SelectProviderDrawer.vue | 4 +- .../resource-management/knowledge/index.vue | 4 +- .../system/shared-resources/tool/index.vue | 26 ++--- .../tool/components/ButtonCreateTool.vue | 73 +++++++++++-- ui/src/views/tool/index.vue | 26 ++--- .../views/tool/tool-card/ToolStatusSwitch.vue | 16 ++- .../action-dropdown/EditToolAction.vue | 86 +-------------- ui/src/views/tool/tool-form/EditToolForm.vue | 100 ++++++++++++++++++ ui/src/views/workflow/application/index.vue | 2 +- 15 files changed, 245 insertions(+), 162 deletions(-) create mode 100644 ui/src/views/tool/tool-form/EditToolForm.vue diff --git a/ui/src/components/COMPONENT_README.md b/ui/src/components/COMPONENT_README.md index 30657d83045..69dc431bef3 100644 --- a/ui/src/components/COMPONENT_README.md +++ b/ui/src/components/COMPONENT_README.md @@ -865,7 +865,7 @@ Skills 场景传入 `[TOOL_TYPE.SKILL]`,并通过 `title` 指定标题。两 `prop`(字段名)和 `label`(列名),列宽由表格自动分配。组件不转换接口数据结构, 旧对象映射由调用页面转换为行数组。用户组直接传入 `user_group_workspace` 数组, 使用 `workspace`、`user_group_names` 两列;角色映射由用户列表页面转换。 -数组单元格以“、”连接,空数组、空字符串、null 和 undefined 显示 `-`,长文本使用溢出提示。 +数组单元格以“、”连接,空数组、空字符串、null、undefined 及字符串 `"None"`(含单元素数组)显示 `-`,长文本使用溢出提示。 `data` 为空时禁用关联浮层,保留标签展示;内部 `MkTagGroup` 的标签浮层保持禁用。 ### ResourceAuthorizationDrawer diff --git a/ui/src/conversation-panel/components/message-list/index.vue b/ui/src/conversation-panel/components/message-list/index.vue index fbf09917687..6995d6954d9 100644 --- a/ui/src/conversation-panel/components/message-list/index.vue +++ b/ui/src/conversation-panel/components/message-list/index.vue @@ -83,25 +83,25 @@ const onScroll = () => { // color: var(--t3, #909399); // } -// .welcome { -// flex: 1; -// display: flex; -// flex-direction: column; -// align-items: center; -// justify-content: center; -// text-align: center; -// padding: 32px 16px; -// } -// .welcome-title { -// font-size: 18px; -// font-weight: 600; -// color: var(--t1, #303133); -// margin-bottom: 8px; -// } -// .welcome-sub { -// font-size: 14px; -// color: var(--t3, #909399); -// } +.welcome { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + padding: 32px 16px; +} +.welcome-title { + font-size: 18px; + font-weight: 600; + color: var(--t1, #303133); + margin-bottom: 8px; +} +.welcome-sub { + font-size: 14px; + color: var(--t3, #909399); +} // .msg-row { // display: flex; diff --git a/ui/src/conversation-panel/main/chat-panel/index.vue b/ui/src/conversation-panel/main/chat-panel/index.vue index 97e879c5500..3ceeac3b9c3 100644 --- a/ui/src/conversation-panel/main/chat-panel/index.vue +++ b/ui/src/conversation-panel/main/chat-panel/index.vue @@ -16,7 +16,10 @@ const handleDrop = (e: DragEvent) => input.addFiles(e.dataTransfer?.files)
- +
+ +
+
diff --git a/ui/src/views/VIEW_README.md b/ui/src/views/VIEW_README.md index a853b52e99e..bb1c42b07d5 100644 --- a/ui/src/views/VIEW_README.md +++ b/ui/src/views/VIEW_README.md @@ -83,9 +83,12 @@ 不包含 Workspace 共享或 System 共享,不将缺失方法回退到 Workspace。 切换二级菜单不重复挂载详情容器。 - 创建模型入口接收完整 Model API;创建成功刷新基础资料后通知调用方刷新选项。 + 选择供应商时将模型类型同步到创建抽屉的供应商筛选;未传类型时默认“全部模型”。 - 工具表单按类型放在 `tool-form/`,共用参数及 Python 设置放在 `tool-form/component/`。 创建和编辑复用同一表单,不把不同类型字段合并成通用表单。 -- `ToolCard` 点击工作流进入画布,其他类型调用编辑 Action 的同一表单实例;编辑、启停成功局部更新。 +- `ToolCard` 点击工作流进入画布,其他类型与编辑菜单共用页面级 `EditToolForm` 实例, + 不依赖下拉菜单挂载或维护逐卡片 Action Ref;`EditToolAction` 复用相同表单调度组件。 + 表单按类型打开,关闭动画后卸载具体表单;编辑、启停成功局部更新。 - 智能体的 Workspace 卡片与 System 资源列表复用门户上下架和导出 Action;门户入口按 `is_portal` 显示“上架到门户/从门户下架”,当前通过 mock 接口更新列表局部状态,刷新后恢复服务端状态。 导出使用二级菜单,包含“导出为 Skills”和“导出智能体”;Skills 当前调用 mock 接口并明确提示 diff --git a/ui/src/views/model/create-model/ButtonAddModel.vue b/ui/src/views/model/create-model/ButtonAddModel.vue index 76afb535646..c15c88b08e3 100644 --- a/ui/src/views/model/create-model/ButtonAddModel.vue +++ b/ui/src/views/model/create-model/ButtonAddModel.vue @@ -30,8 +30,8 @@ function handleOpenCreateModel() { selectProviderDrawerRef.value?.open() } -function handleCreateProviderSelect(provider: ModelProviderItem) { - createModelDrawerRef.value?.open(provider) +function handleCreateProviderSelect(provider: ModelProviderItem, modelType: string) { + createModelDrawerRef.value?.open(provider, modelType) } function handleBackToProviderSelect() { diff --git a/ui/src/views/model/create-model/CreateModelDrawer.vue b/ui/src/views/model/create-model/CreateModelDrawer.vue index 1de8945bc4c..bed148f6a71 100644 --- a/ui/src/views/model/create-model/CreateModelDrawer.vue +++ b/ui/src/views/model/create-model/CreateModelDrawer.vue @@ -5,6 +5,7 @@ import type ModelApi from '@/api/admin/workspace/model' import type SystemModelApi from '@/api/admin/system/resource-management/model' import type SystemSharedModelApi from '@/api/admin/system/shared-resources/model' import ProviderApi from '@/api/admin/model-provider' +import { MODEL_TYPE_LABELS } from '@/constants/model' import { MkDynamicsForm, type DynamicFormValue, type FormField } from '@/components/mk-dynamics-form' import { useStore } from '@/stores' import { MsgSuccess } from '@/utils/message' @@ -25,9 +26,10 @@ const emit = defineEmits<{ back: []; refresh: [] }>() const visible = ref(false) const loading = ref(false) const providersLoading = ref(false) +const modelType = ref('all') const currentProvider = ref() const loadedProviders = ref([]) -const providerOptions = computed(() => (props.providers.length ? props.providers : loadedProviders.value)) +const providerOptions = computed(() => (modelType.value === 'all' && props.providers.length ? props.providers : loadedProviders.value)) const modelForm = reactive({ credential: {}, model_name: '', model_type: '', name: '', provider: '' }) @@ -65,7 +67,7 @@ function handleProviderSelect(provider: ModelProviderItem) { function loadModelProviders() { providersLoading.value = true - return ProviderApi.getProviderList() + return ProviderApi.getProviderList(modelType.value === 'all' ? undefined : { model_type: modelType.value }) .then((providers) => { loadedProviders.value = [...providers].sort((left, right) => left.name.localeCompare(right.name)) }) @@ -147,8 +149,9 @@ function handleSubmit() { }) } -function open(provider: ModelProviderItem) { - if (!props.providers.length) loadModelProviders() +function open(provider: ModelProviderItem, selectedModelType = 'all') { + modelType.value = selectedModelType + if (modelType.value !== 'all' || !props.providers.length) loadModelProviders() loadModelTypes(provider) visible.value = true } @@ -165,6 +168,7 @@ function resetModelSelection() { } function resetData() { + modelType.value = 'all' currentProvider.value = undefined loadedProviders.value = [] modelForm.name = '' @@ -193,8 +197,10 @@ defineExpose({ open }) - + @@ -171,7 +171,7 @@ onMounted(() => { - + + diff --git a/ui/src/views/tool/components/ButtonCreateTool.vue b/ui/src/views/tool/components/ButtonCreateTool.vue index 831a9f3cf0f..1aab48845cc 100644 --- a/ui/src/views/tool/components/ButtonCreateTool.vue +++ b/ui/src/views/tool/components/ButtonCreateTool.vue @@ -1,9 +1,10 @@ diff --git a/ui/src/views/tool/tool-form/EditToolForm.vue b/ui/src/views/tool/tool-form/EditToolForm.vue new file mode 100644 index 00000000000..9669f8e139d --- /dev/null +++ b/ui/src/views/tool/tool-form/EditToolForm.vue @@ -0,0 +1,100 @@ + + + diff --git a/ui/src/views/workflow/application/index.vue b/ui/src/views/workflow/application/index.vue index c73e5ba2e08..24cd3e6d40d 100644 --- a/ui/src/views/workflow/application/index.vue +++ b/ui/src/views/workflow/application/index.vue @@ -408,7 +408,7 @@ onBeforeUnmount(() => stopAutoSave()) -
+