Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions ui/src/api/admin/system/shared-resources/tool/store.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { post } from '../../../core/request'
import type { AddInternalToolPayload, AddStoreToolPayload, ToolItem, UpdateStoreToolPayload } from '@/api/types'

const prefix = '/system/shared/tool'

/** 将系统内置工具添加到当前工作空间。 */
const postInternalTool = (toolId: string, payload: AddInternalToolPayload) => {
return post<AddInternalToolPayload, ToolItem>(`${prefix}/${toolId}/add_internal_tool`, payload)
}

/** 将商店工具添加到当前工作空间。 */
const postStoreTool = (toolId: string, payload: AddStoreToolPayload) => {
return post<AddStoreToolPayload, ToolItem>(`${prefix}/${toolId}/add_store_tool`, payload)
}

/** 将工作空间中的商店工具更新到最新版本。 */
const postStoreToolUpdate = (toolId: string, payload: UpdateStoreToolPayload) => {
return post<UpdateStoreToolPayload, ToolItem>(`${prefix}/${toolId}/update_store_tool`, payload)
}

export default { postInternalTool, postStoreTool, postStoreToolUpdate }
4 changes: 3 additions & 1 deletion ui/src/views/VIEW_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,9 @@ Workspace 的自定义工具和工作流工具菜单
把不同工具类型的字段重新合并到一个通用表单中。所有调用 `postTool` 创建工具的流程在接口成功后
先调用 `auth.loadAuthBaseProfile()` 刷新当前用户基础资料,再执行成功提示以及列表刷新或工作流页面
跳转;`putTool` 编辑流程不触发该刷新。跨资源范围复用且需要请求的 Action 和表单接收页面传入的完整 Tool API,不额外
维护逐方法接口类型;固定服务于 Workspace 工具商店的 `StoreToolFormDialog` 直接内聚对应请求。
维护逐方法接口类型;`ApplyStoreToolDialog` 内聚商店应用请求,提交时通过
`isSystemSharedResource()` 选择 System 共享资源或 Workspace 的 Tool API 和 Tool Store API,
覆盖内置工具、工作流模板及商店工具三个分支。
工具启用状态属于固定的卡片内交互,由 `ToolStatusSwitch`
使用卡片传入的 Tool API 更新,并通过 `update` 事件通知页面替换列表数据。工具批量选择状态、
批量移动和批量删除流程由 `ToolView` 管理;`MoveToolAction` 复用公共 `MoveToDialog` 完成单个工具移动,
Expand Down
4 changes: 2 additions & 2 deletions ui/src/views/home/components/HomeQuickCreate.vue
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ onMounted(() =>
</template>
</ButtonCreateApplication>
<!-- 创建知识库 -->
<ButtonCreateKnowledge trigger="hover" fit-trigger-width popper-class="rounded-xl!" :folder-id="workspaceId" @refresh="handleCreateKnowledge">
<ButtonCreateKnowledge trigger="hover" fit-trigger-width popper-class="rounded-xl!" folder-id="default" @refresh="handleCreateKnowledge">
<template #trigger>
<el-card shadow="hover">
<div class="flex-between gap-3">
Expand All @@ -74,7 +74,7 @@ onMounted(() =>
</template>
</ButtonCreateKnowledge>
<!-- 创建工具 -->
<ButtonCreateTool trigger="hover" fit-trigger-width popper-class="rounded-xl!" :folder-id="workspaceId" @refresh="handleCreateTool">
<ButtonCreateTool trigger="hover" fit-trigger-width popper-class="rounded-xl!" folder-id="default" @refresh="handleCreateTool">
<template #trigger>
<el-card shadow="hover">
<div class="flex-between gap-3">
Expand Down
2 changes: 1 addition & 1 deletion ui/src/views/system/shared-resources/ToolSharedView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ function handleToolUpdate(tool: ToolItem) {
<div class="flex-align-center gap-3">
<MkComplexSearch :fields="searchFields" @change="handleSearchChange" />
<!-- 创建共享工具 -->
<ButtonCreateTool :api="SystemSharedToolApi" folder-id="" @refresh="refreshTools" />
<ButtonCreateTool folder-id="default" :api="SystemSharedToolApi" @refresh="refreshTools" />
</div>
</component>
<div v-loading="toolOperationLoading" class="min-h-0 flex-1">
Expand Down
2 changes: 1 addition & 1 deletion ui/src/views/tool/ToolView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ onMounted(() => {
<!-- 工具商店 -->
<ButtonToolStore :folder-id="currentFolder.id" @refresh="refreshTool" />
<!-- 创建 -->
<ButtonCreateTool :folder-id="currentFolder.id" @refresh="refreshTool" />
<ButtonCreateTool :folder-id="currentFolder.id" :api="ToolApi" @refresh="refreshTool" />
</template>
</template>
</div>
Expand Down
5 changes: 2 additions & 3 deletions ui/src/views/tool/components/ButtonCreateTool.vue
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,13 @@ const { auth } = useStore()
const props = withDefaults(
defineProps<{
api?: typeof ToolApi | typeof SystemSharedToolApi
showWorkflow?: boolean
folderId: string
trigger?: 'click' | 'hover' | 'contextmenu'
popperStyle?: CSSProperties
popperClass?: string
fitTriggerWidth?: boolean
}>(),
{ api: () => ToolApi, showWorkflow: true, trigger: 'click', fitTriggerWidth: false },
{ api: () => ToolApi, trigger: 'click', fitTriggerWidth: false, folderId: 'default' },
)

const emit = defineEmits<{ refresh: [] }>()
Expand Down Expand Up @@ -128,7 +127,7 @@ function handleRefresh() {
<span>工具</span>
</MkDropdownItem>
<!-- 创建工作流工具 -->
<MkDropdownItem v-if="showWorkflow" class="py-2!" @click="handleOpenWorkflowForm">
<MkDropdownItem class="py-2!" @click="handleOpenWorkflowForm">
<template #icon><ToolIcon :type="TOOL_TYPE.WORKFLOW" /></template>
<span>工作流</span>
</MkDropdownItem>
Expand Down
19 changes: 15 additions & 4 deletions ui/src/views/tool/tool-store/ApplyStoreToolDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,22 @@ import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
import ToolApi from '@/api/admin/workspace/tool/tool'
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 type { ToolItem, ToolStoreItem } from '@/api/types'
import { useStore } from '@/stores'
import { MsgSuccess } from '@/utils/message'
import { isSystemSharedResource } from '@/utils/resource-context'

defineOptions({ name: 'StoreToolFormDialog' })

const props = defineProps<{ folderId?: string }>()
const props = withDefaults(
defineProps<{
folderId: string
}>(),
{ folderId: 'default' },
)

const { auth } = useStore()

Expand All @@ -36,14 +44,17 @@ function handleSubmit() {
loading.value = true

const commonPayload = { folder_id: props.folderId || 'default', name }
const isSharedResource = isSystemSharedResource()
const toolApi = isSharedResource ? SystemSharedToolApi : ToolApi
const toolStoreApi = isSharedResource ? SystemSharedToolStoreApi : WorkspaceToolStoreApi
let request: Promise<ToolItem>

if (tool.source === 'internal') {
request = WorkspaceToolStoreApi.postInternalTool(tool.id, commonPayload)
request = toolStoreApi.postInternalTool(tool.id, commonPayload)
} else if (tool.label === 'workflow_template') {
request = ToolApi.postTool({ ...commonPayload, code: '{}', tool_type: TOOL_TYPE.WORKFLOW, work_flow_template: tool })
request = toolApi.postTool({ ...commonPayload, code: '{}', tool_type: TOOL_TYPE.WORKFLOW, work_flow_template: tool })
} else {
request = WorkspaceToolStoreApi.postStoreTool(tool.id, {
request = toolStoreApi.postStoreTool(tool.id, {
...commonPayload,
download_callback_url: tool.downloadCallbackUrl ?? '',
download_url: tool.downloadUrl ?? '',
Expand Down
Loading