in seatunnel-ui/src/views/task/synchronization-definition/dag/canvas/index.tsx [40:173]
setup(props, ctx) {
const graph = ref<Graph>()
provide('graph', graph)
const container = ref()
const dagContainer = ref()
const minimapContainer = ref()
const { t } = useI18n()
const state = reactive({
nodeInfo: {
type: 'source',
label: '',
pluginId: '',
transform: ''
} as NodeInfo,
show: false
})
let currentNodeId = ''
const handlePreventDefault = (e: DragEvent) => {
e.preventDefault()
}
const handleDrop = (e: DragEvent) => {
ctx.emit('drop', e)
}
const initGraph = () => {
graph.value = useDagGraph(
graph,
dagContainer.value,
minimapContainer.value
)
}
const registerNode = () => {
Graph.unregisterNode(DagNodeName)
Graph.registerNode(DagNodeName, useDagNode())
}
const registerEdge = () => {
Graph.unregisterEdge(DagEdgeName)
Graph.registerEdge(DagEdgeName, EdgeDefaultConfig)
}
const onDoubleClick = () => {
graph.value &&
(graph.value as Graph).on(
'cell:dblclick',
({ cell }: { cell: any }) => {
if (cell.isEdge()) return
let fields = [] as string[]
const incomingEdges = graph.value?.getIncomingEdges(cell)
if (incomingEdges?.length) {
const sourceNode = incomingEdges[0].getSourceNode()
const sourceData = sourceNode?.getData()
fields = sourceData.selectTableFields?.tableFields || []
}
state.nodeInfo = {
...cell.getData(),
type: cell.getData().type.toLowerCase(),
sourceFields: fields,
predecessorsNodeId: (graph.value?.getPredecessors(cell) as Cell[]).length > 0 ? graph.value?.getPredecessors(cell)[0].id : ''
}
currentNodeId = cell.id
state.show = true
graph.value!.lockScroller()
}
)
}
const onCancelModal = () => {
state.show = false
}
const onConfirmModal = (values: InputPlugin) => {
state.show = false
const node = graph.value?.getCellById(currentNodeId)
node?.replaceData({
...values,
unsaved: false,
isError: false,
type: values.type.toLowerCase()
})
// Used to determine whether the current node has data saved.
updateNode(graph.value as Graph)
}
useDagResize(container, graph as Ref<Graph>)
ctx.expose({
addNode: (cell: Cell.Metadata) => {
addNode(graph.value as Graph, cell)
},
getGraph: () => graph.value,
addNodesAndEdges: (cells: Cell.Metadata[], edges: InputEdge[]) => {
initNodesAndEdges(graph.value as Graph, cells, edges)
},
getSelectedCells: () => graph.value?.getSelectedCells(),
removeCell: (id: string) => graph.value?.removeCell(id),
getDagData: () => getDagData(graph.value as Graph, t),
layoutDag: (layoutType: 'grid' | 'dagre', cols: number, rows: number) =>
formatLayout(graph.value, layoutType, cols, rows)
})
onMounted(() => {
initGraph()
registerNode()
registerEdge()
onDoubleClick()
})
return () => (
<div
ref={container}
class={styles.container}
onDrop={handleDrop}
onDragenter={handlePreventDefault}
onDragover={handlePreventDefault}
onDragleave={handlePreventDefault}
>
<div ref={dagContainer} class={styles['dag-container']} />
<div ref={minimapContainer} class={styles.minimap} />
{state.nodeInfo.type && (
<NodeSetting
show={state.show}
nodeInfo={state.nodeInfo}
onCancelModal={onCancelModal}
onConfirmModal={onConfirmModal}
/>
)}
</div>
)
}