From da64ab0923bf8817fc8599a6e37b953ce38f64c8 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期日, 27 八月 2023 18:37:36 +0800
Subject: [PATCH] 2023-08-27

---
 src/menu/components/chart/antv-X6/index.jsx |  684 +++++++++++++++-----------------------------------------
 1 files changed, 182 insertions(+), 502 deletions(-)

diff --git a/src/menu/components/chart/antv-X6/index.jsx b/src/menu/components/chart/antv-X6/index.jsx
index 6d20b17..4c5cc7c 100644
--- a/src/menu/components/chart/antv-X6/index.jsx
+++ b/src/menu/components/chart/antv-X6/index.jsx
@@ -1,92 +1,68 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Popover, Tooltip, message } from 'antd'
-import { ToolOutlined, DeleteOutlined, FontColorsOutlined, VerticalAlignTopOutlined, VerticalAlignBottomOutlined, SaveOutlined, ZoomInOutlined, ZoomOutOutlined, OneToOneOutlined, DoubleLeftOutlined } from '@ant-design/icons'
-import { Graph, Shape } from '@antv/x6'
-import { Stencil } from '@antv/x6-plugin-stencil'
-import { Transform } from '@antv/x6-plugin-transform'
-import { Selection } from '@antv/x6-plugin-selection'
-import { Snapline } from '@antv/x6-plugin-snapline'
-import { Keyboard } from '@antv/x6-plugin-keyboard'
-import { Clipboard } from '@antv/x6-plugin-clipboard'
-import { History } from '@antv/x6-plugin-history'
+import { Popover } from 'antd'
+import { ToolOutlined, DeleteOutlined, FontColorsOutlined } from '@ant-design/icons'
+import { Graph } from '@antv/x6'
 
 import MKEmitter from '@/utils/events.js'
 import asyncComponent from '@/utils/asyncComponent'
 import asyncIconComponent from '@/utils/asyncIconComponent'
-import { resetStyle, getTables, checkComponent } from '@/utils/utils-custom.js'
+import { resetStyle } from '@/utils/utils-custom.js'
+import lanes from './lane.json'
+import xflows from './xflow.json'
 import './index.scss'
 
-const SettingComponent = asyncIconComponent(() => import('@/menu/datasource'))
 const ChartCompileForm = asyncIconComponent(() => import('./chartcompile'))
-const NodeUpdate = asyncIconComponent(() => import('./nodeupdate'))
 const CopyComponent = asyncIconComponent(() => import('@/menu/components/share/copycomponent'))
 const NormalHeader = asyncComponent(() => import('@/menu/components/share/normalheader'))
 
-// #region 鍒濆鍖栧浘褰�
-const groups = {
-  top: {
-    position: 'top',
+Graph.registerNode(
+  'lane',
+  {
+    inherit: 'rect',
+    markup: [
+      {
+        tagName: 'rect',
+        selector: 'body',
+      },
+      {
+        tagName: 'rect',
+        selector: 'name-rect',
+      },
+      {
+        tagName: 'text',
+        selector: 'name-text',
+      },
+    ],
     attrs: {
-      circle: {
-        r: 4,
-        magnet: true,
-        stroke: 'var(--mk-sys-color)',
+      body: {
+        fill: '#FFF',
+        stroke: '#5F95FF',
         strokeWidth: 1,
+      },
+      'name-rect': {
+        width: 200,
+        height: 36,
+        fill: '#5F95FF',
+        stroke: '#fff',
+        strokeWidth: 1,
+        x: -1,
+      },
+      'name-text': {
+        ref: 'name-rect',
+        refY: 0.5,
+        refX: 0.5,
+        textAnchor: 'middle',
+        fontWeight: 'bold',
         fill: '#fff',
-        style: {
-          visibility: 'hidden'
-        }
-      }
-    }
+        fontSize: 14,
+      },
+    },
+    zIndex: 0
   },
-  right: {
-    position: 'right',
-    attrs: {
-      circle: {
-        r: 4,
-        magnet: true,
-        stroke: 'var(--mk-sys-color)',
-        strokeWidth: 1,
-        fill: '#fff',
-        style: {
-          visibility: 'hidden'
-        }
-      }
-    }
-  },
-  bottom: {
-    position: 'bottom',
-    attrs: {
-      circle: {
-        r: 4,
-        magnet: true,
-        stroke: 'var(--mk-sys-color)',
-        strokeWidth: 1,
-        fill: '#fff',
-        style: {
-          visibility: 'hidden'
-        }
-      }
-    }
-  },
-  left: {
-    position: 'left',
-    attrs: {
-      circle: {
-        r: 4,
-        magnet: true,
-        stroke: 'var(--mk-sys-color)',
-        strokeWidth: 1,
-        fill: '#fff',
-        style: {
-          visibility: 'hidden'
-        }
-      }
-    }
-  }
-}
+  true,
+)
 
 Graph.registerNode(
   'mk-rect',
@@ -97,22 +73,13 @@
     attrs: {
       body: {
         strokeWidth: 1,
-        stroke: '#5F95FF',
-        fill: '#EFF4FF'
+        stroke: '#000000',
+        fill: '#FFFFFF'
       },
       text: {
         fontSize: 12,
         fill: '#262626'
       }
-    },
-    ports: {
-      groups,
-      items: [
-        { group: 'top' },
-        { group: 'right' },
-        { group: 'bottom' },
-        { group: 'left' }
-      ]
     }
   },
   true
@@ -127,22 +94,13 @@
     attrs: {
       body: {
         strokeWidth: 1,
-        stroke: '#5F95FF',
-        fill: '#EFF4FF'
+        stroke: '#000000',
+        fill: '#FFFFFF'
       },
       text: {
         fontSize: 12,
         fill: '#262626'
       }
-    },
-    ports: {
-      groups,
-      items: [
-        { group: 'top' },
-        { group: 'right' },
-        { group: 'bottom' },
-        { group: 'left' }
-      ]
     }
   },
   true
@@ -157,22 +115,13 @@
     attrs: {
       body: {
         strokeWidth: 1,
-        stroke: '#5F95FF',
-        fill: '#EFF4FF'
+        stroke: '#000000',
+        fill: '#FFFFFF'
       },
       text: {
         fontSize: 12,
         fill: '#262626'
       }
-    },
-    ports: {
-      groups,
-      items: [
-        { group: 'top' },
-        { group: 'right' },
-        { group: 'bottom' },
-        { group: 'left' }
-      ]
     }
   },
   true
@@ -187,22 +136,13 @@
     attrs: {
       body: {
         strokeWidth: 1,
-        stroke: '#5F95FF',
-        fill: '#EFF4FF'
+        stroke: '#000000',
+        fill: '#FFFFFF'
       },
       text: {
         fontSize: 12,
         fill: '#262626'
       }
-    },
-    ports: {
-      groups,
-      items: [
-        { group: 'top' },
-        { group: 'right' },
-        { group: 'bottom' },
-        { group: 'left' }
-      ]
     }
   },
   true
@@ -217,8 +157,8 @@
     points: '100,10 40,198 190,78 10,78 160,198',
     attrs: {
       body: {
-        fill: '#EFF4FF',
-        stroke: '#5F95FF',
+        fill: '#FFFFFF',
+        stroke: '#000000',
         strokeWidth: 1,
         fillRule: 'nonzero'
       },
@@ -226,15 +166,26 @@
         fontSize: 12,
         fill: '#262626'
       }
-    },
-    ports: {
-      groups,
-      items: [
-        { group: 'top' },
-        { group: 'right' },
-        { group: 'bottom' },
-        { group: 'left' }
-      ]
+    }
+  },
+  true
+)
+
+Graph.registerNode(
+  'mk-text',
+  {
+    inherit: 'rect',
+    width: 66,
+    height: 36,
+    attrs: {
+      body: {
+        strokeWidth: 0,
+        fill: 'transparent'
+      },
+      text: {
+        fontSize: 12,
+        fill: '#262626'
+      }
     }
   },
   true
@@ -248,15 +199,8 @@
   }
 
   state = {
-    card: null,
-    eventListener: null,
-    toolunfold: true,
-    nodeunfold: true,
-    node: null
+    card: null
   }
-
-  selectNode = null
-  mkGraph = null
 
   UNSAFE_componentWillMount () {
     const { card } = this.props
@@ -264,9 +208,20 @@
     if (card.isNew) {
       let _plot = {
         width: card.width || 24,
-        height: 400,
+        height: 500,
         subtype: card.subtype,
-        name: card.name
+        name: card.name,
+        grid: {
+          visible: true,
+          type: 'dot',
+          args: {
+            color: '#a0a0a0',
+            thickness: 1
+          }
+        },
+        gridType: 'dot',
+        function: 'show',
+        supModule: []
       }
 
       let _card = {
@@ -278,7 +233,7 @@
         width: _plot.width,
         name: _plot.name,
         subtype: card.subtype,
-        setting: { interType: 'system' },
+        setting: { interType: '' },
         style: {
           borderWidth: '1px', borderColor: 'rgb(217, 217, 217)',
           marginLeft: '8px', marginRight: '8px', marginTop: '8px', marginBottom: '8px'
@@ -318,47 +273,50 @@
     }, 1000)
   }
 
-  viewrender = () => {
-    // const { card } = this.state
-
-    // if (card.plot.subtype === 'mindmap') {
-    //   this.ponitrender()
-    // } else if (card.plot.subtype === 'indentTree') {
-    //   this.indentrender()
-    // } else if (card.plot.subtype === 'kapmap') {
-      this.kapmaprender()
-    // }
-  }
-
-  kapmaprender = () => {
+  plotchange = (res) => {
     const { card } = this.state
 
-    // #region 鍒濆鍖栫敾甯�
+    if (
+      card.plot.subtype !== res.plot.subtype ||
+      (res.plot.gridType && card.plot.gridType !== res.plot.gridType) ||
+      (res.plot.gridType && card.plot.backgroundColor !== res.plot.backgroundColor)
+    ) {
+      let _element = document.getElementById(card.uuid + 'container')
+      if (_element) {
+        _element.innerHTML = ''
+      }
+      setTimeout(() => {
+        this.viewrender()
+      }, 50)
+    }
+
+    this.updateComponent(res)
+  }
+
+  viewrender = () => {
+    const { card } = this.state
+
+    if (card.plot.subtype === 'xflow') {
+      this.xflowrender()
+    } else if (card.plot.subtype === 'lane') {
+      this.lanerender()
+    }
+  }
+
+  xflowrender = () => {
+    const { card } = this.state
+
     const graph = new Graph({
       container: document.getElementById(card.uuid + 'container'),
-      // grid: {
-      //   visible: true,
-      //   type: 'doubleMesh',
-      //   args: [
-      //     {
-      //       color: '#eee', // 涓荤綉鏍肩嚎棰滆壊
-      //       thickness: 1   // 涓荤綉鏍肩嚎瀹藉害
-      //     },
-      //     {
-      //       color: '#ddd', // 娆$綉鏍肩嚎棰滆壊
-      //       thickness: 1,  // 娆$綉鏍肩嚎瀹藉害
-      //       factor: 4      // 涓绘缃戞牸绾块棿闅�
-      //     }
-      //   ]
-      // },
+      grid: card.plot.grid,
       scaling: {
         min: 0.5,
         max: 2
       },
       autoResize: true,
-      panning: true,
+      interacting: false,
       background: {
-        color: '#ffffff'
+        color: card.plot.backgroundColor || 'transparent'
       },
       mousewheel: {
         enabled: true,
@@ -378,306 +336,74 @@
         allowBlank: false,
         snap: {
           radius: 20
-        },
-        createEdge() {
-          return new Shape.Edge({
-            attrs: {
-              line: {
-                stroke: '#A2B1C3',
-                strokeWidth: 2,
-                targetMarker: {
-                  name: 'block',
-                  width: 12,
-                  height: 8
-                }
-              }
-            },
-            zIndex: 0
-          })
-        },
-        validateConnection({ targetMagnet }) {
-          return !!targetMagnet
         }
+      }
+    })
+
+    let cells = []
+    xflows.forEach((item) => {
+      if (item.shape === 'edge') {
+        cells.push(graph.createEdge(item))
+      } else {
+        cells.push(graph.createNode(item))
+      }
+    })
+    graph.resetCells(cells)
+    graph.positionContent('center')
+  }
+
+  lanerender = () => {
+    const { card } = this.state
+
+    const graph = new Graph({
+      container: document.getElementById(card.uuid + 'container'),
+      scaling: {
+        min: 0.5,
+        max: 2
       },
-      highlighting: {
-        magnetAdsorbed: {
-          name: 'stroke',
+      autoResize: true,
+      interacting: false,
+      background: { color: '#ffffff' },
+      mousewheel: {
+        enabled: true,
+        zoomAtMousePosition: true,
+        modifiers: 'ctrl'
+      },
+      connecting: {
+        router: 'manhattan',
+        connector: {
+          name: 'rounded',
           args: {
-            attrs: {
-              fill: '#5F95FF',
-              stroke: '#5F95FF'
-            }
+            radius: 8
           }
-        }
-      }
-    })
-
-    // #region 浣跨敤鎻掍欢
-    graph
-      .use(new Transform({
-        resizing: true,
-        rotating: true
-      }))
-      .use(new Selection())
-      .use(new Snapline())
-      .use(new Keyboard())
-      .use(new Clipboard())
-      .use(new History())
-
-    // #region 鍒濆鍖� stencil
-    const stencil = new Stencil({
-      title: '娴佺▼鍥�',
-      target: graph,
-      stencilGraphWidth: 180,
-      stencilGraphHeight: 180,
-      groups: [
-        {
-          title: '閫氱敤鑺傜偣',
-          name: 'group1'
         },
-        {
-          title: '鑷畾涔�',
-          name: 'group2',
-          graphHeight: 120,
-          layoutOptions: {
-            rowHeight: 70
-          }
-        }
-      ],
-      layoutOptions: {
-        columns: 2,
-        columnWidth: 80,
-        rowHeight: 55
-      }
-    })
-
-    document.getElementById(card.uuid + 'stencil').appendChild(stencil.container)
-
-    // #region 蹇嵎閿笌浜嬩欢
-    graph.bindKey(['meta+c', 'ctrl+c'], () => {
-      const cells = graph.getSelectedCells()
-      if (cells.length) {
-        graph.copy(cells)
-      }
-      return false
-    })
-    graph.bindKey(['meta+x', 'ctrl+x'], () => {
-      const cells = graph.getSelectedCells()
-      if (cells.length) {
-        graph.cut(cells)
-      }
-      return false
-    })
-    graph.bindKey(['meta+v', 'ctrl+v'], () => {
-      if (!graph.isClipboardEmpty()) {
-        graph.paste({ offset: 32 })
-      }
-      return false
-    })
-
-    // undo redo
-    graph.bindKey(['meta+z', 'ctrl+z'], () => {
-      if (graph.canUndo()) {
-        graph.undo()
-      }
-      return false
-    })
-    graph.bindKey(['meta+shift+z', 'ctrl+shift+z'], () => {
-      if (graph.canRedo()) {
-        graph.redo()
-      }
-      return false
-    })
-
-    // 鍒犻櫎鍏冪礌
-    graph.bindKey(['backspace', 'delete'], () => {
-      const cells = graph.getSelectedCells()
-      if (cells.length) {
-        graph.removeCells(cells)
-        this.selectNode = null
-        this.setState({node: null})
-      }
-    })
-
-    // 鎺у埗杩炴帴妗╂樉绀�/闅愯棌
-    const showPorts = (ports, show) => {
-      for (let i = 0, len = ports.length; i < len; i += 1) {
-        ports[i].style.visibility = show ? 'visible' : 'hidden'
-      }
-    }
-    graph.on('node:mouseenter', () => {
-      const container = document.getElementById(card.uuid + 'container')
-      const ports = container.querySelectorAll('.x6-port-body')
-      showPorts(ports, true)
-    })
-    graph.on('node:mouseleave', () => {
-      const container = document.getElementById(card.uuid + 'container')
-      const ports = container.querySelectorAll('.x6-port-body')
-      showPorts(ports, false)
-    })
-
-    graph.on('node:click', ({ e, x, y, node, view }) => {
-      this.selectNode = node
-      
-      this.setState({node: node.store.data})
-    })
-    graph.on('edge:click', ({ e, x, y, edge, view }) => {
-      this.selectNode = edge
-      
-      this.setState({node: edge.store.data})
-
-      graph.clearTransformWidgets()
-    })
-    graph.on('blank:click', ({ e, x, y }) => {
-      this.selectNode = null
-      
-      this.setState({node: null})
-    })
-    
-    const r1 = graph.createNode({
-      shape: 'mk-rect',
-      label: '寮�濮�',
-      attrs: {
-        body: {
-          rx: 20,
-          ry: 26
+        anchor: 'center',
+        connectionPoint: 'anchor',
+        allowBlank: false,
+        snap: {
+          radius: 20
         }
       }
     })
-    const r2 = graph.createNode({
-      shape: 'mk-rect',
-      label: '杩囩▼'
-    })
-    const r3 = graph.createNode({
-      shape: 'mk-rect',
-      attrs: {
-        body: {
-          rx: 6,
-          ry: 6
-        }
-      },
-      label: '鍙�夎繃绋�'
-    })
-    const r4 = graph.createNode({
-      shape: 'mk-polygon',
-      attrs: {
-        body: {
-          refPoints: '0,10 10,0 20,10 10,20'
-        }
-      },
-      label: '鍐崇瓥'
-    })
-    const r5 = graph.createNode({
-      shape: 'mk-polygon',
-      attrs: {
-        body: {
-          refPoints: '10,0 40,0 30,20 0,20'
-        }
-      },
-      label: '鏁版嵁'
-    })
-    const r6 = graph.createNode({
-      shape: 'mk-circle',
-      label: '杩炴帴'
-    })
-    
-    stencil.load([r1, r2, r3, r4, r5, r6], 'group1')
-    
-    const p1 = graph.createNode({
-      shape: 'mk-ellipse',
-      label: 'ellipse'
-    })
-    const p2 = graph.createNode({
-      shape: 'mk-star',
-      label: ''
-    })
-    
-    stencil.load([p1, p2], 'group2')
-    
-    this.mkGraph = graph
-  }
-  
-  setTop = () => {
-    if (!this.selectNode) {
-      message.warning('璇烽�夋嫨鑺傜偣锛�')
-      return
-    }
-    this.selectNode.toFront()
-  }
 
-  setBottom = () => {
-    if (!this.selectNode) {
-      message.warning('璇烽�夋嫨鑺傜偣锛�')
-      return
-    }
-    // let cells = this.mkGraph.getCells()
-    this.selectNode.toBack()
-  }
-
-  // zoom() 鍙幏鍙栨垨鑰呰缃缉鏀炬瘮渚�
-  setZoomIn = () => {
-    this.mkGraph.zoom(0.1)
-  }
-
-  setZoomOut = () => {
-    this.mkGraph.zoom(-0.1)
-  }
-
-  setZoomInt = () => {
-    this.mkGraph.zoomTo(1)
-  }
-
-  save = () => {
-    // let nodes = this.mkGraph.toJSON()
-  }
-
-  changeProps = (value, key) => {
-    const { node } = this.state
-
-    if (node.shape === 'edge') {
-      if (key === 'title') {
-        this.selectNode.setLabels(value)
-      } else if (key === 'stroke') {
-        this.selectNode.attr('line/stroke', value)
-      } else if (key === 'strokeWidth') {
-        this.selectNode.attr('line/strokeWidth', value)
-      } else if (key === 'lineType') {
-        if (value === 'dash') {
-          this.selectNode.attr('line/strokeDasharray', 5)
-        } else {
-          this.selectNode.attr('line/strokeDasharray', 0)
-        }
-      } else if (key === 'fontSize') {
-        this.selectNode.attr('text/fontSize', value)
-      } else if (key === 'fontFill') {
-        this.selectNode.attr('text/fill', value)
+    let cells = []
+    lanes.forEach((item) => {
+      if (item.shape === 'edge') {
+        cells.push(graph.createEdge(item))
+      } else {
+        cells.push(graph.createNode(item))
       }
-    } else {
-      if (key === 'title') {
-        this.selectNode.attr('text/text', value)
-      } else if (key === 'fill') {
-        this.selectNode.attr('body/fill', value)
-      } else if (key === 'stroke') {
-        this.selectNode.attr('body/stroke', value)
-      } else if (key === 'fontSize') {
-        this.selectNode.attr('text/fontSize', value)
-      } else if (key === 'fontFill') {
-        this.selectNode.attr('text/fill', value)
-      }
-    }
+    })
+    graph.resetCells(cells)
+    graph.positionContent('top')
   }
 
   updateComponent = (card) => {
     card.width = card.plot.width
     card.name = card.plot.name
     card.subtype = card.plot.subtype
-    
-    card.$c_ds = true
-    card.errors = checkComponent(card)
-
-    if (card.errors.length === 0) {
-      card.$tables = getTables(card)
-    }
+    card.errors = []
+    card.$tables = []
 
     this.setState({
       card: card
@@ -710,74 +436,28 @@
   }
 
   render() {
-    const { card, toolunfold, nodeunfold, node } = this.state
+    const { card } = this.state
     let _style = resetStyle(card.style)
 
     return (
       <div className="menu-x6-chart-edit-box" style={_style} onClick={this.clickComponent} id={card.uuid}>
         <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
           <div className="mk-popover-control">
-            <ChartCompileForm config={card} plotchange={this.updateComponent}/>
-            <CopyComponent type="antvG6" card={card}/>
+            <ChartCompileForm config={card} plotchange={this.plotchange}/>
+            <CopyComponent type="antvX6" card={card}/>
             <FontColorsOutlined className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle}/>
             <DeleteOutlined className="close" title="delete" onClick={() => this.props.deletecomponent(card.uuid)}/>
-            <SettingComponent config={card} updateConfig={this.updateComponent}/>
           </div>
         } trigger="hover">
           <ToolOutlined/>
         </Popover>
         <NormalHeader config={card} updateComponent={this.updateComponent}/>
-        <div className="mk-toolbar">
-          <div className="left-tool">
-            <Tooltip title="缃墠">
-              <VerticalAlignTopOutlined onClick={this.setTop}/>
-            </Tooltip>
-            <Tooltip title="缃悗">
-              <VerticalAlignBottomOutlined onClick={this.setBottom}/>
-            </Tooltip>
-            <Tooltip title="淇濆瓨">
-              <SaveOutlined onClick={this.save}/>
-            </Tooltip>
-          </div>
-          <div className="right-tool">
-            <Tooltip title="鏀惧ぇ">
-              <ZoomInOutlined onClick={this.setZoomIn}/>
-            </Tooltip>
-            <Tooltip title="缂╁皬">
-              <ZoomOutOutlined onClick={this.setZoomOut}/>
-            </Tooltip>
-            <Tooltip title="1:1">
-              <OneToOneOutlined onClick={this.setZoomInt}/>
-            </Tooltip>
-          </div>
-        </div>
         <div className="canvas" style={{width: '100%', minHeight: card.plot.height, height: card.plot.height}} id={card.uuid + 'canvas'}>
-          <div id={card.uuid + 'stencil'} className={'mk-stencil ' + (toolunfold ? '' : 'merge')}>
-            <div className="tool-control" onClick={() => this.setState({toolunfold: !toolunfold})}>
-              <DoubleLeftOutlined />
-            </div>
-          </div>
           <div id={card.uuid + 'container'} className="mk-container"></div>
-          <div className={'mk-node-edit ' + (nodeunfold ? '' : 'merge')}>
-            <div className="tool-control" onClick={() => this.setState({nodeunfold: !nodeunfold})}>
-              <DoubleLeftOutlined />
-            </div>
-            <div className="header">璁剧疆</div>
-            {!node ? <div className="empty">鏈�変腑</div> : <NodeUpdate node={node} onChange={this.changeProps}/>}
-          </div>
         </div>
         <div className="component-name">
           <div className="center">
             <div className="title">{card.name}</div>
-            <div className="content">
-              {card.errors && card.errors.map((err, index) => {
-                if (err.level === 0) {
-                  return <span key={index} className="error">{err.detail}</span>
-                } else {
-                  return <span key={index} className="waring">{err.detail}锛�</span>
-                }
-              })}
-            </div>
           </div>
         </div>
       </div>

--
Gitblit v1.8.0