diff --git a/core/core-frontend/src/views/visualized/data/dataset/form/AddSql.vue b/core/core-frontend/src/views/visualized/data/dataset/form/AddSql.vue
index dd14869d13..7cb7868999 100644
--- a/core/core-frontend/src/views/visualized/data/dataset/form/AddSql.vue
+++ b/core/core-frontend/src/views/visualized/data/dataset/form/AddSql.vue
@@ -159,6 +159,18 @@ const calculateHeight = (e: MouseEvent) => {
dragHeight.value = e.pageY - 164
}
+const calculateWidth = (e: MouseEvent) => {
+ if (e.pageX < 240) {
+ LeftWidth.value = 240
+ return
+ }
+ if (e.pageX > 400) {
+ LeftWidth.value = 400
+ return
+ }
+ LeftWidth.value = e.pageX
+}
+
const insertParamToCodeMirror = (value: string) => {
codeCom.value.dispatch({
changes: { from: 0, to: codeCom.value.state.doc.toString().length, insert: '' }
@@ -329,6 +341,7 @@ const copyInfo = async (value: string) => {
const mouseupDrag = () => {
const dom = document.querySelector('.sql-eidtor')
+ dom.removeEventListener('mousemove', calculateWidth)
dom.removeEventListener('mousemove', calculateHeight)
}
@@ -377,7 +390,7 @@ const saveVariable = () => {
ElMessage.success('参数设置成功')
}
const mousedownDrag = () => {
- document.querySelector('.sql-eidtor').addEventListener('mousemove', calculateHeight)
+ document.querySelector('.sql-eidtor').addEventListener('mousemove', calculateWidth)
}
diff --git a/core/core-frontend/src/views/visualized/data/dataset/form/CreatDsGroup.vue b/core/core-frontend/src/views/visualized/data/dataset/form/CreatDsGroup.vue
index 85ec90c558..f47da32311 100644
--- a/core/core-frontend/src/views/visualized/data/dataset/form/CreatDsGroup.vue
+++ b/core/core-frontend/src/views/visualized/data/dataset/form/CreatDsGroup.vue
@@ -2,6 +2,7 @@
import { ref, reactive, computed, watch, nextTick } from 'vue'
import { ElMessage } from 'element-plus-secondary'
import { useI18n } from '@/hooks/web/useI18n'
+import { useEmitt } from '@/hooks/web/useEmitt'
import {
getDatasetTree,
moveDatasetTree,
@@ -270,6 +271,7 @@ const saveDataset = () => {
ElMessage.success('重命名成功')
break
default:
+ useEmitt().emitter.emit('onDatasetSave')
ElMessage.success(t('common.save_success'))
break
}
diff --git a/core/core-frontend/src/views/visualized/data/dataset/form/index.vue b/core/core-frontend/src/views/visualized/data/dataset/form/index.vue
index 10febd87ea..0f39f2fa33 100644
--- a/core/core-frontend/src/views/visualized/data/dataset/form/index.vue
+++ b/core/core-frontend/src/views/visualized/data/dataset/form/index.vue
@@ -11,6 +11,7 @@ import {
onBeforeUnmount
} from 'vue'
import { useI18n } from '@/hooks/web/useI18n'
+import { useEmitt } from '@/hooks/web/useEmitt'
import { ElIcon, ElMessageBox, ElMessage } from 'element-plus-secondary'
import type { Action } from 'element-plus-secondary'
import FieldMore from './FieldMore.vue'
@@ -70,7 +71,6 @@ const editUnion = ref(false)
const datasetDrag = ref()
const datasetName = ref('未命名数据集')
const tabActive = ref('preview')
-const originName = ref('')
const activeName = ref('')
const dataSource = ref('')
const searchTable = ref('')
@@ -316,6 +316,9 @@ const editeSave = () => {
})
.then(() => {
ElMessage.success('保存成功')
+ if (willBack) {
+ pushDataset()
+ }
})
.finally(() => {
loading.value = false
@@ -563,23 +566,26 @@ const getTableName = async (datasourceId, tableName) => {
const initEdite = () => {
const { id, datasourceId, tableName } = route.query
+ const { id: copyId } = route.params
if (datasourceId) {
dataSource.value = datasourceId as string
getTableName(datasourceId as string, tableName)
}
- if (!id) return
+ if (!id && !copyId) return
loading.value = true
- getDatasetDetails(id)
+ getDatasetDetails(copyId || id)
.then(res => {
let arr = []
const { id, pid, name } = res || {}
nodeInfo = {
id,
pid,
- name
+ name: copyId ? '复制数据集' : name
}
- datasetName.value = name
- originName.value = name
+ if (copyId) {
+ nodeInfo.id = ''
+ }
+ datasetName.value = nodeInfo.name
allfields.value = res.allFields || []
dfsUnion(arr, res.union || [])
const [fir] = res.union as { currentDs: { datasourceId: string } }[]
@@ -822,8 +828,17 @@ const handleResize = debounce(() => {
}
dragHeight.value = clientHeight - sqlResultHeight.value - 56
}, 60)
+let willBack = false
+const saveAndBack = () => {
+ if (!willBack) return
+ pushDataset()
+}
onMounted(() => {
+ useEmitt({
+ name: 'onDatasetSave',
+ callback: saveAndBack
+ })
window.addEventListener('resize', handleResize)
getSqlResultHeight()
quotaTableHeight.value = sqlResultHeight.value - 242
@@ -855,7 +870,7 @@ const datasetSave = () => {
}
const union = []
dfsNodeList(union, datasetDrag.value.nodeList)
- const { pid } = route.query
+ const pid = route.query.pid || nodeInfo.pid
if (!union.length) {
ElMessage.error('数据集不能为空')
return
@@ -868,6 +883,10 @@ const datasetSave = () => {
datasetName.value
)
}
+const datasetSaveAndBack = () => {
+ willBack = true
+ datasetSave()
+}
const datasetPreviewLoading = ref(false)
@@ -1118,6 +1137,9 @@ const getDsIconName = data => {
+ 保存并返回
保存
diff --git a/core/core-frontend/src/views/visualized/data/dataset/index.vue b/core/core-frontend/src/views/visualized/data/dataset/index.vue
index 68e58dd4c4..2448dc9845 100644
--- a/core/core-frontend/src/views/visualized/data/dataset/index.vue
+++ b/core/core-frontend/src/views/visualized/data/dataset/index.vue
@@ -320,6 +320,15 @@ const handleClick = (tabName: TabPaneName) => {
}
const operation = (cmd: string, data: BusiTreeNode, nodeType: string) => {
+ if (cmd === 'copy') {
+ router.push({
+ name: 'dataset-form',
+ params: {
+ id: data.id
+ }
+ })
+ return
+ }
if (cmd === 'delete') {
let options = {
confirmButtonType: 'danger',
@@ -417,6 +426,18 @@ const filterNode = (value: string, data: BusiTreeNode) => {
if (!value) return true
return data.name?.toLocaleLowerCase().includes(value.toLocaleLowerCase())
}
+
+const getMenuList = (val: boolean) => {
+ return !val
+ ? menuList
+ : [
+ {
+ label: t('common.copy'),
+ svgName: 'icon_copy_filled',
+ command: 'copy'
+ }
+ ].concat(menuList)
+}
@@ -498,7 +519,7 @@ const filterNode = (value: string, data: BusiTreeNode) => {
operation(cmd, data, data.leaf ? 'dataset' : 'folder')"
- :menu-list="menuList"
+ :menu-list="getMenuList(data.leaf)"
>
diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue
index d1246637a4..bbf32d13e4 100644
--- a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue
+++ b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue
@@ -964,6 +964,9 @@ defineExpose({
}
.input-with-append {
+ :deep(.ed-input__wrapper) {
+ padding-right: 1px;
+ }
:deep(.ed-input-group__append) {
width: 55px;
background: #eff0f1;
diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/index.vue b/core/core-frontend/src/views/visualized/data/datasource/form/index.vue
index 43e66ff474..ff8f3f98e6 100644
--- a/core/core-frontend/src/views/visualized/data/datasource/form/index.vue
+++ b/core/core-frontend/src/views/visualized/data/datasource/form/index.vue
@@ -381,7 +381,7 @@ const saveDS = () => {
const validate = detail.value.submitForm()
validate(val => {
if (val) {
- if (editDs.value) {
+ if (editDs.value && form.id) {
let options = {
confirmButtonType: 'danger',
type: 'warning',
@@ -478,7 +478,7 @@ const drawTitle = computed(() => {
if (creator && id && currentDsType.value == 'Excel') {
return editType === 1 ? '追加数据' : '替换数据'
}
- return editDs.value ? t('datasource.modify') : '创建数据源'
+ return editDs.value ? (!form.id ? '复制数据源' : t('datasource.modify')) : '创建数据源'
})
const beforeClose = () => {
diff --git a/core/core-frontend/src/views/visualized/data/datasource/index.vue b/core/core-frontend/src/views/visualized/data/datasource/index.vue
index 7b0b1b2d7d..5714104ade 100644
--- a/core/core-frontend/src/views/visualized/data/datasource/index.vue
+++ b/core/core-frontend/src/views/visualized/data/datasource/index.vue
@@ -424,6 +424,7 @@ const handleNodeClick = data => {
createTime,
creator,
type,
+ pid,
configuration,
syncSetting,
apiConfigurationStr,
@@ -440,6 +441,7 @@ const handleNodeClick = data => {
}
Object.assign(nodeInfo, {
name,
+ pid,
description,
fileName,
size,
@@ -534,6 +536,13 @@ const handleEdit = async data => {
datasourceEditor.value.init(nodeInfo)
}
+const handleCopy = async data => {
+ await handleNodeClick(data)
+ nodeInfo.id = ''
+ nodeInfo.name = '复制数据源'
+ datasourceEditor.value.init(nodeInfo)
+}
+
const handleDatasourceTree = (cmd: string, data?: Tree) => {
if (cmd === 'datasource') {
createDatasource(data)
@@ -543,6 +552,10 @@ const handleDatasourceTree = (cmd: string, data?: Tree) => {
}
}
const operation = (cmd: string, data: Tree, nodeType: string) => {
+ if (cmd === 'copy') {
+ handleCopy(data)
+ return
+ }
if (cmd === 'delete') {
let options = {
confirmButtonText: t('common.sure'),
@@ -633,6 +646,18 @@ onMounted(() => {
datasourceEditor.value.init(null, null)
}
})
+
+const getMenuList = (val: boolean) => {
+ return !val
+ ? menuList
+ : [
+ {
+ label: t('common.copy'),
+ svgName: 'icon_copy_filled',
+ command: 'copy'
+ }
+ ].concat(menuList)
+}
@@ -718,7 +743,7 @@ onMounted(() => {
@handle-command="
cmd => operation(cmd, data, data.leaf ? 'datasource' : 'folder')
"
- :menu-list="menuList"
+ :menu-list="getMenuList(!['Excel', 'API'].includes(data.type) && data.leaf)"
>