From e7aa2f5139713ed64490c1043e30b4b5ead54148 Mon Sep 17 00:00:00 2001 From: Feynman Date: Thu, 18 Jun 2026 12:54:44 +0800 Subject: [PATCH 1/5] feat: enhance NodesPopover and NodeToolbar with new input fields and tooltips for improved user interaction; update i18n for new button labels --- .../src/components/elements/NodeToolbar.vue | 69 ++++++++++++++----- .../src/components/elements/NodesPopover.vue | 11 +++ .../dag/src/composables/useCanvasOperation.ts | 18 ++--- .../src/composables/useFetchConnections.ts | 29 ++++++-- packages/i18n/src/locale/lang/en.js | 2 + packages/i18n/src/locale/lang/zh-CN.js | 2 + packages/i18n/src/locale/lang/zh-TW.js | 2 + 7 files changed, 104 insertions(+), 29 deletions(-) diff --git a/packages/dag/src/components/elements/NodeToolbar.vue b/packages/dag/src/components/elements/NodeToolbar.vue index 810c3a90b..f8668a558 100644 --- a/packages/dag/src/components/elements/NodeToolbar.vue +++ b/packages/dag/src/components/elements/NodeToolbar.vue @@ -25,22 +25,59 @@ const handleToggleDisable = () => { class="node-toolbar-actions rounded-lg p-0.5 cursor-pointer" style="--btn-space: 2px" > - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/packages/dag/src/components/elements/NodesPopover.vue b/packages/dag/src/components/elements/NodesPopover.vue index b0d4fc304..73f5dccd0 100644 --- a/packages/dag/src/components/elements/NodesPopover.vue +++ b/packages/dag/src/components/elements/NodesPopover.vue @@ -582,6 +582,17 @@ defineExpose({ + + + () - const offset = - (node?.dimensions?.width || node?.width || NODE_WIDTH) + X_OFFSET + const offset = (canvasNode?.dimensions?.width || NODE_WIDTH) + X_OFFSET - const hasMultiInputOutput = outputs.some((outputId: string) => - dataflowStore + const hasMultiInputOutput = outputs.some((outputId: string) => { + return dataflowStore .getAfterNodesInSameBranch(outputId) - .some((outputNode: any) => (outputNode?.$inputs?.length || 0) > 1), - ) + .some((outputNode: any) => (outputNode?.$inputs?.length || 0) > 1) + }) if (hasMultiInputOutput) { node.$inputs?.forEach((inputId: string) => { @@ -512,8 +514,8 @@ export function useCanvasOperation() { historyStore.startRecordingUndo() } - connectAdjacentNodes(node.id, { trackHistory }) moveDownstreamNodesForward(node, { trackHistory }) + connectAdjacentNodes(node.id, { trackHistory }) deleteConnectionsByNodeId(node.id, { trackHistory, trackBulk: false }) dataflowStore.deleteNode(node) diff --git a/packages/dag/src/composables/useFetchConnections.ts b/packages/dag/src/composables/useFetchConnections.ts index 5f9984f11..65a975667 100644 --- a/packages/dag/src/composables/useFetchConnections.ts +++ b/packages/dag/src/composables/useFetchConnections.ts @@ -31,6 +31,8 @@ export function useFetchConnections() { const currentConnectionId = ref('') const currentConnection = shallowRef(null) const connectionWhere = shallowRef({}) + let fetchConnectionsAbortController: AbortController | null = null + let fetchTablesAbortController: AbortController | null = null const tableState = reactive({ query: '', currentPage: 1, @@ -50,6 +52,9 @@ export function useFetchConnections() { ) const handleFetchConnections = async () => { + fetchConnectionsAbortController?.abort() + fetchConnectionsAbortController = new AbortController() + connectionsLoading.value = true const params = { page: connectionsCurrentPage.value, @@ -68,7 +73,9 @@ export function useFetchConnections() { params.where.name = { like: query, options: 'i' } } - const data = await fetchConnections(params).finally(() => { + const data = await fetchConnections(params, { + signal: fetchConnectionsAbortController.signal, + }).finally(() => { connectionsLoading.value = false }) @@ -108,7 +115,8 @@ export function useFetchConnections() { const runFetchMoreConnections = async (direction: ScrollbarDirection) => { if ( direction !== 'bottom' || - connectionsCurrentPage.value >= connectionsTotalPage.value + connectionsCurrentPage.value >= connectionsTotalPage.value || + connectionsLoading.value ) return @@ -152,9 +160,14 @@ export function useFetchConnections() { params.fields.source = !sourceId } + fetchTablesAbortController?.abort() + fetchTablesAbortController = new AbortController() + tableState.loading = true - const data = await fetchMetadataInstances(params).finally(() => { + const data = await fetchMetadataInstances(params, { + signal: fetchTablesAbortController.signal, + }).finally(() => { tableState.loading = false }) @@ -181,16 +194,22 @@ export function useFetchConnections() { })) } - const runFetchTables = debounce(async () => { + const _fetchTablesDebounced = debounce(async () => { tableState.currentPage = 1 const items = await handleFetchTables() tables.value = items }, 200) + const runFetchTables = () => { + fetchTablesAbortController?.abort() + _fetchTablesDebounced() + } + const runFetchMoreTables = async (direction: ScrollbarDirection) => { if ( direction !== 'bottom' || - tableState.currentPage >= tableTotalPage.value + tableState.currentPage >= tableTotalPage.value || + tableState.loading ) return diff --git a/packages/i18n/src/locale/lang/en.js b/packages/i18n/src/locale/lang/en.js index e20abc0fb..f3e445853 100644 --- a/packages/i18n/src/locale/lang/en.js +++ b/packages/i18n/src/locale/lang/en.js @@ -116,6 +116,8 @@ export default { public_button_duplicate: 'Duplicate', public_button_details: 'Details', public_button_preview: 'Preview', + public_button_enable: 'Enable', + public_button_disable: 'Disable', public_button_reload: 'Reload', public_button_restart: 'Restart', public_button_start: 'Start', diff --git a/packages/i18n/src/locale/lang/zh-CN.js b/packages/i18n/src/locale/lang/zh-CN.js index e06f414ea..3724c13da 100644 --- a/packages/i18n/src/locale/lang/zh-CN.js +++ b/packages/i18n/src/locale/lang/zh-CN.js @@ -116,6 +116,8 @@ export default { public_button_duplicate: '复制', public_button_details: '详情', public_button_preview: '预览', + public_button_enable: '启用', + public_button_disable: '禁用', public_button_reload: '重新加载', public_button_restart: '重启', public_button_start: '启动', diff --git a/packages/i18n/src/locale/lang/zh-TW.js b/packages/i18n/src/locale/lang/zh-TW.js index 52380ee21..941ad524b 100644 --- a/packages/i18n/src/locale/lang/zh-TW.js +++ b/packages/i18n/src/locale/lang/zh-TW.js @@ -116,6 +116,8 @@ export default { public_button_duplicate: '複製', public_button_details: '詳情', public_button_preview: '預覽', + public_button_enable: '啟用', + public_button_disable: '停用', public_button_reload: '重新加載', public_button_restart: '重啟', public_button_start: '啟動', From a4c71a2cdc8d40622d63c323bc33bfe8daeaf66e Mon Sep 17 00:00:00 2001 From: Feynman Date: Thu, 18 Jun 2026 18:38:19 +0800 Subject: [PATCH 2/5] chore: update @vue-flow/core and @vue-flow/background dependencies to version 1.48.2 in pnpm-lock.yaml and package.json for improved compatibility --- packages/dag/package.json | 2 +- pnpm-lock.yaml | 27 ++++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/dag/package.json b/packages/dag/package.json index df98790a3..84a07bfbc 100644 --- a/packages/dag/package.json +++ b/packages/dag/package.json @@ -27,7 +27,7 @@ "@tap/i18n": "workspace:*", "@tap/shared": "workspace:*", "@vue-flow/background": "^1.3.2", - "@vue-flow/core": "^1.47.0", + "@vue-flow/core": "^1.48.2", "@vueuse/core": "catalog:", "axios": "catalog:", "core-js": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d94b34d30..a46f88d41 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -924,10 +924,10 @@ importers: version: link:../shared '@vue-flow/background': specifier: ^1.3.2 - version: 1.3.2(@vue-flow/core@1.47.0(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) + version: 1.3.2(@vue-flow/core@1.48.2(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3)) '@vue-flow/core': - specifier: ^1.47.0 - version: 1.47.0(vue@3.5.25(typescript@5.8.3)) + specifier: ^1.48.2 + version: 1.48.2(vue@3.5.25(typescript@5.8.3)) '@vueuse/core': specifier: 'catalog:' version: 14.0.0(vue@3.5.25(typescript@5.8.3)) @@ -2635,6 +2635,11 @@ packages: peerDependencies: vue: ^3.3.0 + '@vue-flow/core@1.48.2': + resolution: {integrity: sha512-raxhgKWE+G/mcEvXJjGFUDYW9rAI3GOtiHR3ZkNpwBWuIaCC1EYiBmKGwJOoNzVFgwO7COgErnK7i08i287AFA==} + peerDependencies: + vue: ^3.3.0 + '@vue/babel-helper-vue-transform-on@2.0.1': resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==} @@ -7785,6 +7790,11 @@ snapshots: '@vue-flow/core': 1.47.0(vue@3.5.25(typescript@5.8.3)) vue: 3.5.25(typescript@5.8.3) + '@vue-flow/background@1.3.2(@vue-flow/core@1.48.2(vue@3.5.25(typescript@5.8.3)))(vue@3.5.25(typescript@5.8.3))': + dependencies: + '@vue-flow/core': 1.48.2(vue@3.5.25(typescript@5.8.3)) + vue: 3.5.25(typescript@5.8.3) + '@vue-flow/core@1.47.0(vue@3.5.25(typescript@5.8.3))': dependencies: '@vueuse/core': 10.11.1(vue@3.5.25(typescript@5.8.3)) @@ -7796,6 +7806,17 @@ snapshots: transitivePeerDependencies: - '@vue/composition-api' + '@vue-flow/core@1.48.2(vue@3.5.25(typescript@5.8.3))': + dependencies: + '@vueuse/core': 10.11.1(vue@3.5.25(typescript@5.8.3)) + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + vue: 3.5.25(typescript@5.8.3) + transitivePeerDependencies: + - '@vue/composition-api' + '@vue/babel-helper-vue-transform-on@2.0.1': {} '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.28.5)': From c3ce3a04034b0fae84efa74d5ea6636e1d7ba49a Mon Sep 17 00:00:00 2001 From: Feynman Date: Fri, 19 Jun 2026 08:56:09 +0800 Subject: [PATCH 3/5] refactor(CanvasNode.vue): replace v-if with v-show for source and target handles, and add connectable prop for improved performance and rendering --- packages/dag/src/components/elements/CanvasNode.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/dag/src/components/elements/CanvasNode.vue b/packages/dag/src/components/elements/CanvasNode.vue index dba7a9be4..e51122c2a 100644 --- a/packages/dag/src/components/elements/CanvasNode.vue +++ b/packages/dag/src/components/elements/CanvasNode.vue @@ -110,13 +110,15 @@ const canBeTarget = computed(() => {