feat: copy application

This commit is contained in:
wangdan-fit2cloud 2025-07-04 18:35:54 +08:00
parent ef51afb96e
commit fa842b0d13
10 changed files with 31 additions and 25 deletions

View File

@ -100,4 +100,5 @@ export default {
deleteConfirm: 'Confirm delete', deleteConfirm: 'Confirm delete',
expand: 'Expand', expand: 'Expand',
collapse: 'Collapse', collapse: 'Collapse',
copyTitle: 'Copy',
} }

View File

@ -10,7 +10,6 @@ export default {
workflowPlaceholder: workflowPlaceholder:
'Suitable for advanced users to build complex logic AI assistants using low-code drag-and-drop', 'Suitable for advanced users to build complex logic AI assistants using low-code drag-and-drop',
appTest: 'Debug Preview', appTest: 'Debug Preview',
copy: 'Copy',
searchBar: { searchBar: {
placeholder: 'Search by name', placeholder: 'Search by name',
}, },

View File

@ -104,4 +104,5 @@ export default {
deleteConfirm: '是否删除', deleteConfirm: '是否删除',
expand: '展开', expand: '展开',
collapse: '收起', collapse: '收起',
copyTitle: '副本',
} }

View File

@ -9,7 +9,6 @@ export default {
simplePlaceholder: '适用于初级用户使用表单设置构建AI对话助手', simplePlaceholder: '适用于初级用户使用表单设置构建AI对话助手',
workflowPlaceholder: '适用于高级用户使用低代码拖拉拽方式构建复杂逻辑的AI对话助手', workflowPlaceholder: '适用于高级用户使用低代码拖拉拽方式构建复杂逻辑的AI对话助手',
appTest: '调试预览', appTest: '调试预览',
copy: '副本',
searchBar: { searchBar: {
placeholder: '按名称搜索', placeholder: '按名称搜索',
}, },

View File

@ -28,10 +28,6 @@ export default {
saveMessage: '当前的更改尚未保存,确认退出吗?', saveMessage: '当前的更改尚未保存,确认退出吗?',
}, },
form: { form: {
title: {
copy: '副本',
baseInfo: '基础信息',
},
toolName: { toolName: {
label: '名称', label: '名称',
name: '工具名称', name: '工具名称',

View File

@ -100,4 +100,5 @@ export default {
deleteConfirm: '是否刪除', deleteConfirm: '是否刪除',
expand: '展開', expand: '展開',
collapse: '收起', collapse: '收起',
copyTitle: '副本',
} }

View File

@ -9,7 +9,6 @@ export default {
simplePlaceholder: '適用於初級用戶使用表單設定構建AI對話助手', simplePlaceholder: '適用於初級用戶使用表單設定構建AI對話助手',
workflowPlaceholder: '適用於高階用戶使用低代碼拖拉拽方式構建複雜邏輯的AI對話助手', workflowPlaceholder: '適用於高階用戶使用低代碼拖拉拽方式構建複雜邏輯的AI對話助手',
appTest: '調試預覽', appTest: '調試預覽',
copy: '副本',
searchBar: { searchBar: {
placeholder: '按名稱搜尋', placeholder: '按名稱搜尋',
}, },

View File

@ -104,6 +104,8 @@ const rules = reactive<FormRules<ApplicationFormType>>({
], ],
}) })
const currentFolder = ref('')
watch(dialogVisible, (bool) => { watch(dialogVisible, (bool) => {
if (!bool) { if (!bool) {
applicationForm.value = { applicationForm.value = {
@ -133,10 +135,11 @@ watch(dialogVisible, (bool) => {
} }
}) })
const open = (data: any) => { const open = (data: any, folder: string) => {
currentFolder.value = folder
const obj = cloneDeep(data) const obj = cloneDeep(data)
delete obj['id'] delete obj['id']
obj['name'] = obj['name'] + ` ${t('views.application.form.title.copy')}` obj['name'] = obj['name'] + ` ${t('common.copyTitle')}`
applicationForm.value = obj applicationForm.value = obj
dialogVisible.value = true dialogVisible.value = true
} }
@ -160,15 +163,17 @@ const submitHandle = async (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
await formEl.validate((valid) => { await formEl.validate((valid) => {
if (valid) { if (valid) {
applicationApi.postApplication(applicationForm.value, loading).then((res) => { applicationApi
MsgSuccess(t('common.createSuccess')) .postApplication({ ...applicationForm.value, folder_id: currentFolder.value }, loading)
if (isWorkFlow(applicationForm.value.type)) { .then((res) => {
router.push({ path: `/application/${res.data.id}/workflow` }) MsgSuccess(t('common.createSuccess'))
} else { if (isWorkFlow(applicationForm.value.type)) {
router.push({ path: `/application/${res.data.id}/${res.data.type}/setting` }) router.push({ path: `/application/${res.data.id}/workflow` })
} } else {
dialogVisible.value = false router.push({ path: `/application/${res.data.id}/${res.data.type}/setting` })
}) }
dialogVisible.value = false
})
} }
}) })
} }

View File

@ -244,7 +244,13 @@
<AppIcon iconName="app-migrate"></AppIcon> <AppIcon iconName="app-migrate"></AppIcon>
{{ $t('common.moveTo') }} {{ $t('common.moveTo') }}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item
@click="copyApplication(item)"
v-if="permissionPrecise.create()"
>
<AppIcon iconName="app-copy"></AppIcon>
{{ $t('common.copy') }}
</el-dropdown-item>
<el-dropdown-item <el-dropdown-item
divided divided
@click.stop="exportApplication(item)" @click.stop="exportApplication(item)"
@ -405,15 +411,14 @@ const apiInputParams = ref([])
function copyApplication(row: any) { function copyApplication(row: any) {
application.asyncGetApplicationDetail(row.id, loading).then((res: any) => { application.asyncGetApplicationDetail(row.id, loading).then((res: any) => {
if (res?.data) { if (res?.data) {
CopyApplicationDialogRef.value.open({ ...res.data, model_id: res.data.model }) CopyApplicationDialogRef.value.open(
{ ...res.data, model_id: res.data.model },
folder.currentFolder?.id || 'default',
)
} }
}) })
} }
const is_show_copy_button = (row: any) => {
return user.userInfo ? user.userInfo.id == row.user_id : false
}
function settingApplication(row: any) { function settingApplication(row: any) {
if (isWorkFlow(row.type)) { if (isWorkFlow(row.type)) {
router.push({ path: `/application/${row.id}/workflow` }) router.push({ path: `/application/${row.id}/workflow` })

View File

@ -481,7 +481,7 @@ async function copyTool(row: any) {
) )
const obj = cloneDeep(res.data) const obj = cloneDeep(res.data)
delete obj['id'] delete obj['id']
obj['name'] = obj['name'] + ` ${t('views.tool.form.title.copy')}` obj['name'] = obj['name'] + ` ${t('common.copyTitle')}`
ToolFormDrawerRef.value.open(obj) ToolFormDrawerRef.value.open(obj)
} }