xujunjie 2 år sedan
förälder
incheckning
4db836c313

+ 4 - 1
src/components/Flow/config-toolbar.ts

@@ -200,6 +200,8 @@ namespace NSToolbarConfig {
                 // delete item.originData;
                 // delete item.outgoingEdges;
                 // delete item.ports.groups
+                let ports = {...item.ports}
+                delete ports.groups
                 return {
                   id: item.id,
                   renderKey: item.renderKey,
@@ -207,7 +209,7 @@ namespace NSToolbarConfig {
                   label: item.label,
                   width: item.width,
                   height: item.height,
-                  ports: item.ports,
+                  ports: ports,
                   isCustom: item.isCustom,
                   parentKey: item.parentKey,
                   x: item.x,
@@ -229,6 +231,7 @@ namespace NSToolbarConfig {
                   id: item.id,
                   source: item.source,
                   target: item.target,
+                  attrs: item.attrs
                 };
               });
               console.log(data);

+ 3 - 3
src/pages/PurchaseAdmin/PurchaseList/Detail/CommitAuditModal.js

@@ -42,15 +42,15 @@ function CommitAuditModal(props) {
         }
       }
 
-      // // 判断业务节点是否允许多版本
+      // // 判断业务节点是否允许多清单
       // if (!serviceNode.muti_version) {
-      //   //audit_status=4 表示为版本推进后留存的副本.不计入多版本计算
+      //   //audit_status=4 表示为清单推进后留存的副本.不计入多清单计算
       //   let serviceVersion = versionList.find(
       //     item => item.audit_status != 4 && item.template_node_id == serviceNode.Id
       //   );
       //   if (serviceVersion) {
       //     message.error(
-      //       `流转失败!业务节点【${serviceNode.label}】为单版本节点。已存在版本【${serviceVersion.version_name}】。`
+      //       `流转失败!业务节点【${serviceNode.label}】为单清单节点。已存在清单【${serviceVersion.version_name}】。`
       //     );
       //     return;
       //   }

+ 1 - 1
src/pages/PurchaseAdmin/PurchaseList/Detail/CompareModal.js

@@ -6,7 +6,7 @@ import { connect } from 'dva';
 
 const { TabPane } = Tabs;
 
-// 选择比对版本
+// 选择比对清单
 function CompareModal(props) {
   const { visible, versionList, onClose, onOk, dispatch, version, flowDetail } = props;
 

+ 1 - 1
src/pages/PurchaseAdmin/PurchaseList/Detail/ExportModal.js

@@ -27,7 +27,7 @@ const { Step } = Steps;
 const { TextArea } = Input;
 const { TabPane } = Tabs;
 
-// 选择比对版本
+// 选择比对清单
 function CompareModal(props) {
   const { visible, onClose, onOk, sheet } = props;
 

+ 1 - 1
src/pages/PurchaseAdmin/PurchaseList/Detail/FilesModal.js

@@ -7,7 +7,7 @@ const { TabPane } = Tabs;
 const { confirm } = Modal;
 import moment from 'moment/moment';
 import PreviewFile from '@/components/PreviewFile';
-// 历史版本
+// 历史清单
 function FilesModal(props) {
     const { visible, onClose, onUpload, data, uploadProps, DeleteFile, downloadFile, loading } = props;
     const handleSelect = item => {

+ 2 - 2
src/pages/PurchaseAdmin/PurchaseList/Detail/FlowModal.js

@@ -71,7 +71,7 @@ function FlowModal(props) {
         <Col span={6}>
           <List
             size="small"
-            header={<div>版本列表</div>}
+            header={<div>清单列表</div>}
             bordered
             dataSource={data}
             loading={nodeLoading}
@@ -120,7 +120,7 @@ const getColor = item => {
       color = '#7cb305';
       break;
     case 4:
-      // 历史版本
+      // 历史清单
       color = '#9b9b9b';
       break;
 

+ 2 - 2
src/pages/PurchaseAdmin/PurchaseList/Detail/HistoryModal.js

@@ -2,7 +2,7 @@ import React, { useEffect, useState, useRef } from 'react';
 import { Modal, Table } from 'antd';
 import { connect } from 'dva';
 
-// 历史版本
+// 历史清单
 function HistoryModal(props) {
   const { visible, onClose, version, onSelect, historyList } = props;
   const handleSelect = item => {
@@ -30,7 +30,7 @@ function HistoryModal(props) {
   
 
   return (
-    <Modal title="版本记录" width="60%" onCancel={onClose} visible={visible} footer={false}>
+    <Modal title="清单记录" width="60%" onCancel={onClose} visible={visible} footer={false}>
       <Table rowKey="id" columns={columns} dataSource={historyList[version.id]} />
     </Modal>
   );

+ 28 - 14
src/pages/PurchaseAdmin/PurchaseList/Detail/Index.js

@@ -219,13 +219,13 @@ function Detail(props) {
     let currentData = sheetRef.current.getSheetJson().data;
     let sheets = JSON.parse(JSON.stringify(currentData));
     if (!currentNode.muti_version) {
-      // audit_status=4 表示为版本推进后留存的副本.不计入多版本计算
+      // audit_status=4 表示为清单推进后留存的副本.不计入多清单计算
       let serviceVersion = versionList.find(
         item => item.audit_status != 4 && item.template_node_id == currentNode.Id
       );
       if (serviceVersion) {
         message.error(
-          `新建版本失败!业务节点【${currentNode.label}】为单版本节点。已存在版本【${serviceVersion.version_name}】。`
+          `新建清单失败!业务节点【${currentNode.label}】为单清单节点。已存在清单【${serviceVersion.version_name}】。`
         );
         return;
       }
@@ -308,7 +308,6 @@ function Detail(props) {
             id: templateId,
           },
         });
-        // 最后一个审核节点通过后  需要更新version id
         localStorage.excelId = newVersion.id;
         setVersion({
           ...version,
@@ -345,19 +344,34 @@ function Detail(props) {
       setAuditVisible(true);
       return;
     }
+
+    let isSingle = false;
+    let serviceNode;
+    const flowNode = flow.currentNode;
+    // 判断是否为最后一个审批节点
+    if (flow.current == flow.list.FlowNodes.length - 1) {
+      serviceNode = flowDetail.nodes.find?.(item => item.Id == version.next_template_node_id);
+      if (!serviceNode.muti_version) {
+        //audit_status=4 表示为清单推进后留存的副本.不计入多清单计算
+        isSingle = versionList.find(
+          item => item.audit_status != 4 && item.template_node_id == serviceNode.Id
+        );
+      }
+    }
     Modal.confirm({
       title: '提示',
-      content: `是否${flag ? '通过' : '拒绝'}审批。`,
+      content: isSingle
+        ? `节点【${serviceNode.label}】只能拥有一个清单,是否覆盖?`
+        : `是否通过审批。`,
       okText: '确定',
       cancelText: '取消',
       onOk: () => {
-        var flowNode = flow.currentNode;
         dispatch({
           type: 'detail/approve',
           payload: {
             id: flow.active_id,
             project_id: projectId,
-            audit_status: flag ? 3 : 2,
+            audit_status: 3,
             flow_id: flowNode.flow_id,
             node_id: flowNode.seq,
           },
@@ -440,13 +454,13 @@ function Detail(props) {
         router.push(`/home`);
         break;
       // case 'version':
-      //   // 版本
+      //   // 清单
       //   queryHistory();
       //   setCommentVisible(false);
       //   setHistoryVisible(true);
       //   break;
       case 'bomDetail':
-        // 版本
+        // 清单
         setCommentVisible(true);
         break;
       case 'export':
@@ -481,7 +495,7 @@ function Detail(props) {
       //   // 编辑
       //   handleEdit(true);
       case 'merge':
-        // 同步版本
+        // 同步清单
         setMergeVisible(true);
         break;
       case 'commit':
@@ -505,7 +519,7 @@ function Detail(props) {
   const renderBtns = () => {
     // 判断是否为比对模式
     if (compareList.length == 2) {
-      // 判断是否为同步最新版本的比对
+      // 判断是否为同步最新清单的比对
       if (isMerge) {
         return (
           <>
@@ -631,7 +645,7 @@ function Detail(props) {
       },
     });
   };
-  
+
   const getUploadProps = () => {
     const token = getToken() || GetTokenFromUrl();
     const uploadProps = {
@@ -753,7 +767,7 @@ function Detail(props) {
     const nodeId = version.template_node_id;
     if (!flowDetail?.nodes || !nodeId) return;
     const node = flowDetail.nodes.find(item => item.Id == nodeId);
-    return `当前版本:${version.version_name || '-'};    当前节点:${node?.label || '-'}`;
+    return `当前清单:${version.version_name || '-'};    当前节点:${node?.label || '-'}`;
   };
 
   const handleSubmitCell = (value, callback) => {
@@ -819,10 +833,10 @@ function Detail(props) {
             查看流程
           </Button>
 
-          {/* 非审批节点可以创建版本 */}
+          {/* 非审批节点可以创建清单 */}
           {flow?.active == 0 && (
             <Button type="primary" onClick={() => setVersionVisible(true)}>
-              新建版本
+              新建清单
             </Button>
           )}
           <span style={{ marginLeft: 20 }}>{renderNode()}</span>

+ 1 - 1
src/pages/PurchaseAdmin/PurchaseList/Detail/LuckySheet.js

@@ -124,7 +124,7 @@ class LuckySheet extends React.Component {
       } else if(version.audit_status == 4) {
         option.authority = {
           sheet: true,
-          hintText: '当前版本为历史版本,不可编辑!'
+          hintText: '当前清单为历史清单,不可编辑!'
         }
       }
     } else if (data && data.length > 0) {

+ 2 - 2
src/pages/PurchaseAdmin/PurchaseList/Detail/MergeModal.js

@@ -6,7 +6,7 @@ import { connect } from 'dva';
 
 const { TabPane } = Tabs;
 
-// 选择比对版本
+// 选择比对清单
 function MergeModal(props) {
   const { visible, versionList, onClose, onOk, dispatch, version, flowDetail } = props;
 
@@ -18,7 +18,7 @@ function MergeModal(props) {
 
   const handleOk = () => {
     if (!checkValue) {
-      message.error('请选择要合并的版本');
+      message.error('请选择要合并的清单');
     } else {
       let checkSheet = versionList.find(item => item.id == checkValue);
       onOk(checkSheet);

+ 4 - 4
src/pages/PurchaseAdmin/PurchaseList/Detail/RightDrawer.js

@@ -57,7 +57,7 @@ function RightDrawer(props) {
   return (
     <Drawer
       width={600}
-      title="版本"
+      title="清单"
       mask={false}
       placement="right"
       onClose={onClose}
@@ -65,7 +65,7 @@ function RightDrawer(props) {
     >
       <BomContetn version={version} userList={userList} />
       <CommentContent
-        title="版本沟通记录"
+        title="清单沟通记录"
         comment={bomComment}
         onSubmit={handleSubmitBom}
         loading={
@@ -80,9 +80,9 @@ function BomContetn(props) {
   const { version, userList } = props;
   console.log(userList)
   return (
-    <Card title="版本详情" type="inner">
+    <Card title="清单详情" type="inner">
       <Descriptions column={2}>
-        <Descriptions.Item label="版本名称">{version.version_name}</Descriptions.Item>
+        <Descriptions.Item label="清单名称">{version.version_name}</Descriptions.Item>
         <Descriptions.Item label="创建人">
           {userList.find(item => item.ID == version.author)?.CName}
         </Descriptions.Item>

+ 1 - 1
src/pages/PurchaseAdmin/PurchaseList/Detail/VersionModal.js

@@ -20,7 +20,7 @@ function VersionModal(props) {
     <Modal
       confirmLoading={loading}
       destroyOnClose
-      title="新建版本"
+      title="新建清单"
       visible={visible}
       onCancel={onClose}
       onOk={handleOk}

+ 1 - 1
src/pages/PurchaseAdmin/PurchaseList/Detail/models/detail.js

@@ -129,7 +129,7 @@ export default {
         });
       }
     },
-    // 查询子版本详情
+    // 查询子清单详情
     *queryRecord({ payload, callback }, { call, put }) {
       const response = yield call(queryRecord, payload);
       if (response && response.data) {

+ 1 - 1
src/pages/PurchaseAdmin/PurchaseList/Flow/AuditNodeModal.js

@@ -41,7 +41,7 @@ function AuditModal(props) {
             filterOption={(input, option) => option.props.children.indexOf(input) >= 0}
           >
             {roleList &&
-              roleList.map(item => (
+              roleList.filter(item => item.RoleType == 4).map(item => (
                 <Option key={item.ID} value={item.ID + ''}>
                   {item.Name}
                 </Option>

+ 149 - 841
src/pages/PurchaseAdmin/PurchaseList/Flow/FlowDetail.json

@@ -14,65 +14,7 @@
           { "group": "right", "id": "92334433" },
           { "group": "bottom", "id": "c2ab5849" },
           { "group": "left", "id": "6079a903" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -93,65 +35,7 @@
           { "group": "right", "id": "821f59c0" },
           { "group": "bottom", "id": "17360bc4" },
           { "group": "left", "id": "15d1b217" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -172,65 +56,7 @@
           { "group": "right", "id": "ce88d7e2" },
           { "group": "bottom", "id": "e69d8709" },
           { "group": "left", "id": "c29d7b43" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -251,65 +77,7 @@
           { "group": "right", "id": "ff6724ee" },
           { "group": "bottom", "id": "16b4df46" },
           { "group": "left", "id": "34c9dbc6" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -330,65 +98,7 @@
           { "group": "right", "id": "e67dc19c" },
           { "group": "bottom", "id": "a06aba2c" },
           { "group": "left", "id": "b578cc26" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -409,65 +119,7 @@
           { "group": "right", "id": "d2030f1b" },
           { "group": "bottom", "id": "188c9b68" },
           { "group": "left", "id": "4e9ce7ad" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -488,65 +140,7 @@
           { "group": "right", "id": "b3dfbc16" },
           { "group": "bottom", "id": "89c0bc16" },
           { "group": "left", "id": "a3adcac9" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -567,65 +161,7 @@
           { "group": "right", "id": "9a699e3f" },
           { "group": "bottom", "id": "d348b56a" },
           { "group": "left", "id": "47317157" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -646,65 +182,7 @@
           { "group": "right", "id": "1eb352b0" },
           { "group": "bottom", "id": "83b59198" },
           { "group": "left", "id": "94f485b5" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -725,65 +203,7 @@
           { "group": "right", "id": "4dee75d9" },
           { "group": "bottom", "id": "0f72f2ba" },
           { "group": "left", "id": "bac7962b" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -804,65 +224,7 @@
           { "group": "right", "id": "0d594eef" },
           { "group": "bottom", "id": "17ff5fe6" },
           { "group": "left", "id": "73307680" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -883,65 +245,7 @@
           { "group": "right", "id": "e3a42bda" },
           { "group": "bottom", "id": "0f06668a" },
           { "group": "left", "id": "8e0bff55" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -962,65 +266,7 @@
           { "group": "right", "id": "205f1437" },
           { "group": "bottom", "id": "761ad2b5" },
           { "group": "left", "id": "22d16375" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -1041,65 +287,7 @@
           { "group": "right", "id": "0bccd839" },
           { "group": "bottom", "id": "42c0d925" },
           { "group": "left", "id": "58f52f2c" }
-        ],
-        "groups": {
-          "top": {
-            "position": { "name": "top" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "right": {
-            "position": { "name": "right" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "bottom": {
-            "position": { "name": "bottom" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          },
-          "left": {
-            "position": { "name": "left" },
-            "attrs": {
-              "circle": {
-                "r": 4,
-                "magnet": true,
-                "stroke": "#31d0c6",
-                "strokeWidth": 2,
-                "fill": "#fff",
-                "style": { "visibility": "hidden" }
-              }
-            },
-            "zIndex": 10
-          }
-        }
+        ]
       },
       "isCustom": true,
       "parentKey": "1",
@@ -1112,77 +300,197 @@
     {
       "id": "41561012:92334433-975bf288:15d1b217",
       "source": { "cell": "41561012", "port": "92334433" },
-      "target": { "cell": "975bf288", "port": "15d1b217" }
+      "target": { "cell": "975bf288", "port": "15d1b217" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "975bf288:821f59c0-5764f3ce:c29d7b43",
       "source": { "cell": "975bf288", "port": "821f59c0" },
-      "target": { "cell": "5764f3ce", "port": "c29d7b43" }
+      "target": { "cell": "5764f3ce", "port": "c29d7b43" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "975bf288:a61170c3-8c1f18d0:89c0bc16",
       "source": { "cell": "975bf288", "port": "a61170c3" },
-      "target": { "cell": "8c1f18d0", "port": "89c0bc16" }
+      "target": { "cell": "8c1f18d0", "port": "89c0bc16" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "8c1f18d0:a3adcac9-41561012:293a90b5",
       "source": { "cell": "8c1f18d0", "port": "a3adcac9" },
-      "target": { "cell": "41561012", "port": "293a90b5" }
+      "target": { "cell": "41561012", "port": "293a90b5" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "5764f3ce:4b4d9fa6-1aed14d1:d348b56a",
       "source": { "cell": "5764f3ce", "port": "4b4d9fa6" },
-      "target": { "cell": "1aed14d1", "port": "d348b56a" }
+      "target": { "cell": "1aed14d1", "port": "d348b56a" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": "5 5",
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "1aed14d1:9a699e3f-4651130e:94f485b5",
       "source": { "cell": "1aed14d1", "port": "9a699e3f" },
-      "target": { "cell": "4651130e", "port": "94f485b5" }
+      "target": { "cell": "4651130e", "port": "94f485b5" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "5764f3ce:ce88d7e2-3fb8d302:22d16375",
       "source": { "cell": "5764f3ce", "port": "ce88d7e2" },
-      "target": { "cell": "3fb8d302", "port": "22d16375" }
+      "target": { "cell": "3fb8d302", "port": "22d16375" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "3fb8d302:205f1437-a48131e0:bac7962b",
       "source": { "cell": "3fb8d302", "port": "205f1437" },
-      "target": { "cell": "a48131e0", "port": "bac7962b" }
+      "target": { "cell": "a48131e0", "port": "bac7962b" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "a48131e0:4dee75d9-b57b57c8:73307680",
       "source": { "cell": "a48131e0", "port": "4dee75d9" },
-      "target": { "cell": "b57b57c8", "port": "73307680" }
+      "target": { "cell": "b57b57c8", "port": "73307680" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": "5 5",
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "a48131e0:0f72f2ba-3631eae9:2aae2a71",
       "source": { "cell": "a48131e0", "port": "0f72f2ba" },
-      "target": { "cell": "3631eae9", "port": "2aae2a71" }
+      "target": { "cell": "3631eae9", "port": "2aae2a71" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "3631eae9:8e0bff55-399bddb7:0bccd839",
       "source": { "cell": "3631eae9", "port": "8e0bff55" },
-      "target": { "cell": "399bddb7", "port": "0bccd839" }
+      "target": { "cell": "399bddb7", "port": "0bccd839" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "399bddb7:58f52f2c-c28a18d3:e67dc19c",
       "source": { "cell": "399bddb7", "port": "58f52f2c" },
-      "target": { "cell": "c28a18d3", "port": "e67dc19c" }
+      "target": { "cell": "c28a18d3", "port": "e67dc19c" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "c28a18d3:b578cc26-5359e23c:ff6724ee",
       "source": { "cell": "c28a18d3", "port": "b578cc26" },
-      "target": { "cell": "5359e23c", "port": "ff6724ee" }
+      "target": { "cell": "5359e23c", "port": "ff6724ee" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "5359e23c:34c9dbc6-5216c5dc:d2030f1b",
       "source": { "cell": "5359e23c", "port": "34c9dbc6" },
-      "target": { "cell": "5216c5dc", "port": "d2030f1b" }
+      "target": { "cell": "5216c5dc", "port": "d2030f1b" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     },
     {
       "id": "b57b57c8:04c81e99-4651130e:1eb352b0",
       "source": { "cell": "b57b57c8", "port": "04c81e99" },
-      "target": { "cell": "4651130e", "port": "1eb352b0" }
+      "target": { "cell": "4651130e", "port": "1eb352b0" },
+      "attrs": {
+        "line": {
+          "stroke": "#A2B1C3",
+          "targetMarker": { "name": "block", "width": 12, "height": 8 },
+          "strokeDasharray": [0, 0],
+          "strokeWidth": 1
+        }
+      }
     }
   ]
 }