|  |  |  | 
|---|
|  |  |  | import React, { useRef, useEffect, useState } from "react"; | 
|---|
|  |  |  | import { Button, Drawer, Input, Switch } from 'antd'; | 
|---|
|  |  |  | import { initNodeData } from "./GraphConfig"; | 
|---|
|  |  |  | import './GrapDrawer.less'; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const { TextArea } = Input; | 
|---|
|  |  |  | import { GraphDrawerNode } from "./Drawer/GraphDrawerNode"; | 
|---|
|  |  |  | import { GraphDrawerEdge } from "./Drawer/GraphDrawerEdge"; | 
|---|
|  |  |  | import { GraphDrawerCrn } from "./Drawer/GraphDrawerCrn"; | 
|---|
|  |  |  | import './css/GrapDrawer.less'; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | export const GraphDrawer = ({ graphRef, isReady }) => { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const [open, setOpen] = useState(false); | 
|---|
|  |  |  | const [init, setInit] = useState(false); | 
|---|
|  |  |  | const [nodeData, setNodeData] = useState(null); | 
|---|
|  |  |  | const [edgeData, setEdgeData] = useState(null); | 
|---|
|  |  |  | const [codeContent, setCodeContent] = useState(null); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const showNodeDrawer = (graph, node) => { | 
|---|
|  |  |  | setOpen(true); | 
|---|
|  |  |  | setNodeData(node); | 
|---|
|  |  |  | if (node.data == null) { | 
|---|
|  |  |  | node.data = initNodeData; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (node.data.codeContent != null) { | 
|---|
|  |  |  | setCodeContent(node.data.codeContent); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const showEdgeDrawer = (graph, edge) => { | 
|---|
|  |  |  | setOpen(true); | 
|---|
|  |  |  | setEdgeData(edge); | 
|---|
|  |  |  | if (edge.data == null) { | 
|---|
|  |  |  | edge.data = initNodeData; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (edge.data.codeContent != null) { | 
|---|
|  |  |  | setCodeContent(edge.data.codeContent); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (edge.labels.length == 0) { | 
|---|
|  |  |  | edge.appendLabel({ | 
|---|
|  |  |  | attrs: { | 
|---|
|  |  |  | label: { | 
|---|
|  |  |  | text: "" | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const onNodeClose = (e) => { | 
|---|
|  |  |  | setOpen(false); | 
|---|
|  |  |  | setNodeData(null); | 
|---|
|  |  |  | setCodeContent(null); | 
|---|
|  |  |  | }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const onEdgeClose = (e) => { | 
|---|
|  |  |  | setOpen(false); | 
|---|
|  |  |  | setEdgeData(null); | 
|---|
|  |  |  | setCodeContent(null); | 
|---|
|  |  |  | }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const nodeTextAreaChange = (e) => { | 
|---|
|  |  |  | setCodeContent(e.target.value); | 
|---|
|  |  |  | nodeData.data.codeContent = e.target.value; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const edgeTextAreaChange = (e) => { | 
|---|
|  |  |  | setCodeContent(e.target.value); | 
|---|
|  |  |  | edgeData.data.codeContent = e.target.value; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const nodeDataInputChange = (e) => { | 
|---|
|  |  |  | nodeData.label = e.target.value; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const edgeDataInputChange = (e) => { | 
|---|
|  |  |  | edgeData.removeLabelAt(0); | 
|---|
|  |  |  | edgeData.appendLabel({ | 
|---|
|  |  |  | attrs: { | 
|---|
|  |  |  | label: { | 
|---|
|  |  |  | text: e.target.value | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | edgeData.data.logicBool = e.target.value == 'true' ? true : false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | useEffect(() => { | 
|---|
|  |  |  | if (isReady) { | 
|---|
|  |  |  | const graph = graphRef.current; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!init) { | 
|---|
|  |  |  | graph.on("node:dblclick", ({ node }) => { | 
|---|
|  |  |  | showNodeDrawer(graph, node); | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | graph.on("edge:dblclick", ({ edge }) => { | 
|---|
|  |  |  | showEdgeDrawer(graph, edge); | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | setInit(true); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (nodeData) { | 
|---|
|  |  |  | return ( | 
|---|
|  |  |  | <> | 
|---|
|  |  |  | <Drawer title={nodeData.label} onClose={onNodeClose} open={open} size="large"> | 
|---|
|  |  |  | <div className="graphDrawerContainer"> | 
|---|
|  |  |  | <div>ID:{nodeData.id}</div> | 
|---|
|  |  |  | <div>组件名:<Input defaultValue={nodeData.label} onChange={nodeDataInputChange} /></div> | 
|---|
|  |  |  | <div>根节点:<Switch checkedChildren="是" unCheckedChildren="否" checked={nodeData.data.root} /></div> | 
|---|
|  |  |  | <div>可执行代码:</div> | 
|---|
|  |  |  | <TextArea value={codeContent} onChange={nodeTextAreaChange} rows={10} /> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </Drawer> | 
|---|
|  |  |  | </> | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | } else if (edgeData) { | 
|---|
|  |  |  | return ( | 
|---|
|  |  |  | <> | 
|---|
|  |  |  | <Drawer title={edgeData.label} onClose={onEdgeClose} open={open} size="large"> | 
|---|
|  |  |  | <div className="graphDrawerContainer"> | 
|---|
|  |  |  | <div>ID:{edgeData.id}</div> | 
|---|
|  |  |  | <div>属性详情:<Input defaultValue={edgeData.labels[0].attrs.label.text} onChange={edgeDataInputChange} /></div> | 
|---|
|  |  |  | <div>根节点:<Switch checkedChildren="是" unCheckedChildren="否" checked={edgeData.data.root} /></div> | 
|---|
|  |  |  | <div>可执行代码:</div> | 
|---|
|  |  |  | <TextArea value={codeContent} onChange={edgeTextAreaChange} rows={10} /> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </Drawer> | 
|---|
|  |  |  | </> | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return ( | 
|---|
|  |  |  | <> | 
|---|
|  |  |  | <GraphDrawerNode graphRef={graphRef} isReady={isReady} /> | 
|---|
|  |  |  | <GraphDrawerEdge graphRef={graphRef} isReady={isReady} /> | 
|---|
|  |  |  | <GraphDrawerCrn graphRef={graphRef} isReady={isReady} /> | 
|---|
|  |  |  | </> | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | } | 
|---|