diff --git a/core/core-frontend/src/views/visualized/data/dataset/form/CodeMirror.vue b/core/core-frontend/src/views/visualized/data/dataset/form/CodeMirror.vue
index 0fab22db5a..7f7d239c55 100644
--- a/core/core-frontend/src/views/visualized/data/dataset/form/CodeMirror.vue
+++ b/core/core-frontend/src/views/visualized/data/dataset/form/CodeMirror.vue
@@ -19,6 +19,8 @@ const props = defineProps({
dimensionMap: propTypes.arrayOf(String).def(() => [])
})
+const emits = defineEmits(['change'])
+
const codeComInit = (doc: string, sqlMode?: boolean) => {
function _optionalChain(ops) {
let lastAccessLHS = undefined
@@ -112,7 +114,17 @@ const codeComInit = (doc: string, sqlMode?: boolean) => {
}
}
const extensionsAttach = sqlMode
- ? [basicSetup, sql(), placeholders, keymap.of([indentWithTab])]
+ ? [
+ basicSetup,
+ sql(),
+ placeholders,
+ keymap.of([indentWithTab]),
+ EditorView.updateListener.of(v => {
+ if (v.docChanged) {
+ emits('change')
+ }
+ })
+ ]
: [basicSetup, placeholders, keymap.of([indentWithTab])]
return new EditorView({
doc,
diff --git a/core/core-frontend/src/views/visualized/data/dataset/form/DatasetUnion.vue b/core/core-frontend/src/views/visualized/data/dataset/form/DatasetUnion.vue
index 0e062efa24..038a9fc44b 100644
--- a/core/core-frontend/src/views/visualized/data/dataset/form/DatasetUnion.vue
+++ b/core/core-frontend/src/views/visualized/data/dataset/form/DatasetUnion.vue
@@ -133,8 +133,14 @@ const delNode = (id, arr) => {
})
}
+const changeSqlId = ref([])
+const changedNodeId = ref([])
const saveSqlNode = (val: SqlNode, cb) => {
- const { tableName, id, sql, datasourceId, sqlVariableDetails = null } = val
+ const { tableName, id, sql, datasourceId, sqlVariableDetails = null, changeFlag = false } = val
+ if (changeFlag) {
+ changedNodeId.value = changedNodeId.value.filter(itx => itx.from !== id && id !== itx.to)
+ !changeSqlId.value.includes(id) && changeSqlId.value.push(id)
+ }
if (state.visualNode) {
Object.assign(state.visualNode, {
info: JSON.stringify({ table: tableName, sql }),
@@ -173,6 +179,11 @@ const saveSqlNode = (val: SqlNode, cb) => {
dfsNodeBack([obj], [id], state.nodeList)
}
+const setChangeStatus = (to, from) => {
+ if (changedNodeId.value.some(ele => ele.from === from && ele.to === to)) return
+ changedNodeId.value.push({ from, to })
+}
+
const closeSqlNode = () => {
if (state.visualNode?.confirm) {
nextTick(() => {
@@ -495,10 +506,26 @@ const dfsNodeShadow = (arr, { tableName, id }, position, parent) => {
}
const flatLine = (item, flatNodeList) => {
+ let sqlChangeFlag = changeSqlId.value.includes(item.id)
+ if (item.children?.length) {
+ sqlChangeFlag = item.children.some(itx => changeSqlId.value.includes(itx.id)) || sqlChangeFlag
+ }
const from = { ...item, d: '' }
;(item.children || []).forEach(ele => {
+ let loaclSqlChangeFlag = true
+ changedNodeId.value.some(element => {
+ if (
+ (element.from === item.id && ele.id === element.to) ||
+ (element.from === ele.id && item.id === element.to)
+ ) {
+ loaclSqlChangeFlag = false
+ return true
+ }
+ return false
+ })
flatNodeList.push({
from,
+ sqlChangeFlag: loaclSqlChangeFlag && sqlChangeFlag,
isShadow: ele.isShadow || item.isShadow,
to: {
...ele
@@ -773,7 +800,8 @@ defineExpose({
setStateBack,
notConfirm,
dfsNodeFieldBack,
- initState
+ initState,
+ setChangeStatus
})
const handleActiveNode = ele => {
@@ -853,7 +881,12 @@ const emits = defineEmits(['addComplete', 'joinEditor', 'updateAllfields'])
width="32"
height="32"
>
-
+
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 2c7ee687da..837e151f8e 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
@@ -24,7 +24,7 @@ import { useRoute, useRouter } from 'vue-router'
import UnionEdit from './UnionEdit.vue'
import type { FormInstance } from 'element-plus-secondary'
import CreatDsGroup from './CreatDsGroup.vue'
-import { guid, getFieldName, timeTypes } from './util'
+import { guid, getFieldName, timeTypes, type DataSource } from './util'
import { fieldType } from '@/utils/attr'
import { cancelMap } from '@/config/axios/service'
import {
@@ -41,18 +41,6 @@ import { cloneDeep, debounce } from 'lodash-es'
interface DragEvent extends MouseEvent {
dataTransfer: DataTransfer
}
-export interface Position {
- x: number
- y: number
-}
-
-export type PointerType = 'mouse' | 'touch' | 'pen'
-
-export interface DataSource {
- id: string
- name: string
- children?: DataSource[]
-}
interface Field {
fieldShortName: string
@@ -755,7 +743,8 @@ const setFieldAll = () => {
}
const confirmEditUnion = () => {
const { node, parent } = fieldUnion.value
-
+ const to = node.id
+ const from = parent.id
let unionFieldsLost = node.unionFields.some(ele => {
const { currentField, parentField } = ele
return !currentField || !parentField
@@ -774,6 +763,7 @@ const confirmEditUnion = () => {
setFieldAll()
editUnion.value = false
addComplete()
+ datasetDrag.value.setChangeStatus(to, from)
}
const updateAllfields = () => {
diff --git a/core/core-frontend/src/views/visualized/data/dataset/form/util.ts b/core/core-frontend/src/views/visualized/data/dataset/form/util.ts
index 1d596529f3..06bf494065 100644
--- a/core/core-frontend/src/views/visualized/data/dataset/form/util.ts
+++ b/core/core-frontend/src/views/visualized/data/dataset/form/util.ts
@@ -149,10 +149,17 @@ interface Field {
id: string
}
+interface DataSource {
+ id: string
+ name: string
+ children?: DataSource[]
+}
+
export {
NodeType,
UnionType,
UnionField,
+ DataSource,
Node,
Field,
timestampFormatDate,