diff --git a/ui/src/views/home/components/ranking/HomeRankings.vue b/ui/src/views/home/components/ranking/HomeRankings.vue index b91cde855fa..a66bf21573c 100644 --- a/ui/src/views/home/components/ranking/HomeRankings.vue +++ b/ui/src/views/home/components/ranking/HomeRankings.vue @@ -83,6 +83,9 @@ function handleRangeChange({ startTime, endTime }: MkDateRangeValue) { function handleOpenRanking(kind: HomeRankingKind) { selectedKind.value = kind } +function handleRankingDrawerClosed() { + selectedKind.value = undefined +} onMounted(loadRankings) diff --git a/ui/src/views/tool/tool-form/DataSourceFormDrawer.vue b/ui/src/views/tool/tool-form/DataSourceFormDrawer.vue index 47ef9c2174e..3a9a50c4b94 100644 --- a/ui/src/views/tool/tool-form/DataSourceFormDrawer.vue +++ b/ui/src/views/tool/tool-form/DataSourceFormDrawer.vue @@ -5,8 +5,10 @@ import type { FormInstance, FormRules } from 'element-plus' import type ToolApi from '@/api/admin/workspace/tool/tool' import type SystemResourceToolApi from '@/api/admin/system/resource-management/tool/tool' import type SystemSharedToolApi from '@/api/admin/system/shared-resources/tool/tool' -import { TOOL_TYPE } from '@/api/enums' +import { FILE_SOURCE_TYPE, TOOL_TYPE } from '@/api/enums' +import FileApi from '@/api/admin/file' import type { DynamicFormField, ToolInputField, ToolItem, ToolPayload } from '@/api/types' +import MkEditAvatar from '@/components/mk-edit-avatar/index.vue' import { useStore } from '@/stores' import { MsgConfirm, MsgSuccess } from '@/utils/message' import InitFieldTable from './component/init-field/InitFieldTable.vue' @@ -56,28 +58,44 @@ const formRules: FormRules = { name: [{ whitespace: true, required: true, message: '请输入数据源名称', trigger: 'blur' }], } +// 暂存确认后的头像文件,恢复默认时清空。 +const iconFile = ref(null) +function handleIconChange(file: File | null) { + iconFile.value = file +} + function handleSubmit() { - formRef.value?.validate((valid) => { - if (!valid) return + return formRef.value?.validate((valid) => { + if (!valid || loading.value) return - const payload: ToolPayload = { ...cloneDeep(dataSourceForm), tool_type: TOOL_TYPE.DATA_SOURCE } loading.value = true const currentEditId = editId.value const isEdit = Boolean(currentEditId) - const request = currentEditId - ? props.api.putTool(currentEditId, payload) - : 'postTool' in props.api - ? props.api.postTool({ ...payload, folder_id: props.folderId || null }) - : Promise.reject(new Error('资源管理不支持创建工具')) - - request - .then((savedTool) => { - const refreshCurrentUser = isEdit ? Promise.resolve() : auth.loadAuthBaseProfile() - return refreshCurrentUser.then(() => { - MsgSuccess(isEdit ? '保存成功' : '创建成功') - visible.value = false - if (isEdit) emit('update', savedTool) - else emit('refresh') + // 新头像先上传并替换预览地址,再提交完整工具表单。 + const uploadIcon = iconFile.value + ? FileApi.postUploadFile(iconFile.value, currentEditId, FILE_SOURCE_TYPE.TOOL).request.then((icon) => { + dataSourceForm.icon = icon + iconFile.value = null + }) + : Promise.resolve() + + return uploadIcon + .then(() => { + const payload: ToolPayload = { ...cloneDeep(dataSourceForm), tool_type: TOOL_TYPE.DATA_SOURCE } + const request = currentEditId + ? props.api.putTool(currentEditId, payload) + : 'postTool' in props.api + ? props.api.postTool({ ...payload, folder_id: props.folderId || null }) + : Promise.reject(new Error('资源管理不支持创建工具')) + + return request.then((savedTool) => { + const refreshCurrentUser = isEdit ? Promise.resolve() : auth.loadAuthBaseProfile() + return refreshCurrentUser.then(() => { + MsgSuccess(isEdit ? '保存成功' : '创建成功') + visible.value = false + if (isEdit) emit('update', savedTool) + else emit('refresh') + }) }) }) .finally(() => { @@ -123,6 +141,7 @@ function open(tool?: ToolItem, asCopy = false) { } function handleBeforeClose() { + if (loading.value) return if (JSON.stringify(dataSourceForm) === originalForm.value) { visible.value = false return @@ -136,6 +155,7 @@ function handleBeforeClose() { function resetData() { Object.assign(dataSourceForm, { code: codeTemplate, desc: '', icon: '', init_field_list: [], input_field_list: [], name: '' }) + iconFile.value = null editId.value = undefined originalForm.value = '' loading.value = false @@ -155,7 +175,7 @@ defineExpose({ open }) 基本信息
- - + + + +