|
@@ -1,5 +1,5 @@
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
-import { computed } from 'vue'
|
|
|
|
|
|
|
+import { computed, ref } from 'vue'
|
|
|
import { Icon } from '@repo/ui'
|
|
import { Icon } from '@repo/ui'
|
|
|
import { NodeResizer } from '@vue-flow/node-resizer'
|
|
import { NodeResizer } from '@vue-flow/node-resizer'
|
|
|
import type { OnResize } from '@vue-flow/node-resizer'
|
|
import type { OnResize } from '@vue-flow/node-resizer'
|
|
@@ -32,6 +32,8 @@ const childrenEdges = computed(() =>
|
|
|
const emit = defineEmits<{
|
|
const emit = defineEmits<{
|
|
|
update: [id: string, attrs: Record<string, unknown>]
|
|
update: [id: string, attrs: Record<string, unknown>]
|
|
|
move: [position: XYPosition]
|
|
move: [position: XYPosition]
|
|
|
|
|
+ 'click:node': [id: string, position: XYPosition]
|
|
|
|
|
+ 'dblclick:node': [id: string, position: XYPosition]
|
|
|
'click:node:add': [
|
|
'click:node:add': [
|
|
|
payload: { nodeId: string; handle: string; position: XYPosition; event?: MouseEvent }
|
|
payload: { nodeId: string; handle: string; position: XYPosition; event?: MouseEvent }
|
|
|
]
|
|
]
|
|
@@ -44,6 +46,7 @@ const emit = defineEmits<{
|
|
|
}>()
|
|
}>()
|
|
|
|
|
|
|
|
const nodeData = computed(() => node.props.value.node?.data ?? node.props.value.data)
|
|
const nodeData = computed(() => node.props.value.node?.data ?? node.props.value.data)
|
|
|
|
|
+
|
|
|
const nodeType = computed(() => {
|
|
const nodeType = computed(() => {
|
|
|
const type = nodeData.value?.nodeType
|
|
const type = nodeData.value?.nodeType
|
|
|
return type ? nodeMap.value[type] : undefined
|
|
return type ? nodeMap.value[type] : undefined
|
|
@@ -109,15 +112,18 @@ function onAddEdge(connection: Connection) {
|
|
|
>
|
|
>
|
|
|
<Icon :icon="nodeType?.icon ?? 'lucide:infinity'" color="#ffffff" :size="16" />
|
|
<Icon :icon="nodeType?.icon ?? 'lucide:infinity'" color="#ffffff" :size="16" />
|
|
|
</div>
|
|
</div>
|
|
|
- <span class="text-14px font-medium text-#333">{{ nodeType?.displayName ?? '循环' }}</span>
|
|
|
|
|
|
|
+ <span class="text-14px font-medium text-#333">{{
|
|
|
|
|
+ node.props.value.node?.name ?? '节点标题'
|
|
|
|
|
+ }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 内部画布区域:虚线网格 + 占位内容 -->
|
|
<!-- 内部画布区域:虚线网格 + 占位内容 -->
|
|
|
<div class="loop-body flex-1 min-h-0 relative">
|
|
<div class="loop-body flex-1 min-h-0 relative">
|
|
|
<div
|
|
<div
|
|
|
- class="absolute top-16px right-16px bottom-16px left-16px rounded-8px border-1 border-dashed border-#d9d9d9 bg-[repeating-linear-gradient(to_right,#e8e8e8_0,transparent_1px),repeating-linear-gradient(to_bottom,#e8e8e8_0,transparent_1px)] bg-[length:12px_12px]"
|
|
|
|
|
- />
|
|
|
|
|
- <div class="absolute top-16px right-16px bottom-16px left-16px z-1">
|
|
|
|
|
|
|
+ class="absolute top-16px right-16px bottom-16px left-16px z-1 rounded-8px border-1 border-dashed border-#d9d9d9 nopan"
|
|
|
|
|
+ @click.stop
|
|
|
|
|
+ @dblclick.stop
|
|
|
|
|
+ >
|
|
|
<Canvas
|
|
<Canvas
|
|
|
:id="node.props.value.id"
|
|
:id="node.props.value.id"
|
|
|
:nodes="childrenNodes"
|
|
:nodes="childrenNodes"
|
|
@@ -129,6 +135,10 @@ function onAddEdge(connection: Connection) {
|
|
|
:zoom-to-fit="false"
|
|
:zoom-to-fit="false"
|
|
|
:max-zoom="1"
|
|
:max-zoom="1"
|
|
|
:min-zoom="1"
|
|
:min-zoom="1"
|
|
|
|
|
+ :pan-on-drag="false"
|
|
|
|
|
+ :auto-pan-on-node-drag="false"
|
|
|
|
|
+ @click:node="(id, position) => emit('click:node', id, position)"
|
|
|
|
|
+ @dblclick:node="(id, position) => emit('dblclick:node', id, position)"
|
|
|
@click:node:add="emit('click:node:add', $event)"
|
|
@click:node:add="emit('click:node:add', $event)"
|
|
|
@create:node="onAddNode"
|
|
@create:node="onAddNode"
|
|
|
@create:connection:end="onAddEdge"
|
|
@create:connection:end="onAddEdge"
|