Explorar o código

feat(free-layout): add availableLines to WorkflowNodeLinesData (#716)

* feat(free-layout): add availableLines to WorkflowNodeLinesData

* test: add WorkflowNodeLinesData.availableLines docs and test units
xiamidaxia hai 4 meses
pai
achega
0c42514d3b

+ 4 - 2
apps/docs/src/en/guide/advanced/free-layout/line.mdx

@@ -47,10 +47,12 @@ node.getData(WorkflowNodeLinesData).allInputNodes
 node.getData(WorkflowNodeLinesData).outputNodes
 // get all output nodes
 node.getData(WorkflowNodeLinesData).allOutputNodes
-// input lines
+// input lines (contains the line that isDrawing or isHidden)
 node.getData(WorkflowNodeLinesData).inputLines
-// output lines
+// output lines (contains the line that isDrawing or isHidden)
 node.getData(WorkflowNodeLinesData).outputLines
+// all availableLines (Doesn't contain the lines that isDrawing or isHidden)
+node.getData(WorkflowNodeLinesData).availableLines
 ```
 
 ## Line Configuration

+ 4 - 2
apps/docs/src/en/guide/advanced/free-layout/node.mdx

@@ -55,10 +55,12 @@ node.getData(WorkflowNodeLinesData).allInputNodes
 node.getData(WorkflowNodeLinesData).outputNodes
 // get all output nodes
 node.getData(WorkflowNodeLinesData).allOutputNodes
-// input lines
+// input lines (contains the line that isDrawing or isHidden)
 node.getData(WorkflowNodeLinesData).inputLines
-// output lines
+// output lines (contains the line that isDrawing or isHidden)
 node.getData(WorkflowNodeLinesData).outputLines
+// all availableLines (Doesn't contain the lines that isDrawing or isHidden)
+node.getData(WorkflowNodeLinesData).availableLines
 ```
 
 ## Create Node

+ 4 - 2
apps/docs/src/zh/guide/advanced/free-layout/line.mdx

@@ -50,10 +50,12 @@ node.getData(WorkflowNodeLinesData).allInputNodes
 node.getData(WorkflowNodeLinesData).outputNodes
 // 获取所有输出节点
 node.getData(WorkflowNodeLinesData).allOutputNodes
-// 输入线条
+// 输入线条 (包含 isDrawing 或 isHidden 的线条)
 node.getData(WorkflowNodeLinesData).inputLines
-// 输出线条
+// 输出线条 (包含 isDrawing 或 isHidden 的线条)
 node.getData(WorkflowNodeLinesData).outputLines
+// 所有线条 (不包含 isDrawing 或 isHidden 的线条)
+node.getData(WorkflowNodeLinesData).availableLines
 
 ```
 

+ 4 - 2
apps/docs/src/zh/guide/advanced/free-layout/node.mdx

@@ -56,10 +56,12 @@ node.getData(WorkflowNodeLinesData).allInputNodes
 node.getData(WorkflowNodeLinesData).outputNodes
 // 获取所有输出节点
 node.getData(WorkflowNodeLinesData).allOutputNodes
-// 输入线条
+// 输入线条 (包含 isDrawing 或 isHidden 的线条)
 node.getData(WorkflowNodeLinesData).inputLines
-// 输出线条
+// 输出线条 (包含 isDrawing 或 isHidden 的线条)
 node.getData(WorkflowNodeLinesData).outputLines
+// 所有线条 (不包含 isDrawing 或 isHidden 的线条)
+node.getData(WorkflowNodeLinesData).availableLines
 
 ```
 

+ 52 - 2
packages/canvas-engine/free-layout-core/__tests__/workflow-lines-manager.test.ts

@@ -39,15 +39,65 @@ describe('workflow-lines-manager', () => {
       },
     });
   });
-  it('base create', async () => {
+  it('base create and dispose', async () => {
     expect(linesManager.toJSON()).toEqual([]);
-    // document.createWorkflowNode()
     const line = linesManager.createLine({
       from: 'start_0',
       to: 'end_0',
     })!;
+    const startNode = document.getNode('start_0')!.getData(WorkflowNodeLinesData);
+    const endNode = document.getNode('end_0')!.getData(WorkflowNodeLinesData);
+    expect(startNode.outputLines.length).toEqual(1);
+    expect(startNode.allLines.length).toEqual(1);
+    expect(endNode.inputLines.length).toEqual(1);
+    expect(endNode.allLines.length).toEqual(1);
+    expect(startNode.allOutputNodes.length).toEqual(1);
+    expect(endNode.allInputNodes.length).toEqual(1);
     expect(line.id).toBe('start_0_-end_0_');
     expect(linesManager.toJSON()).toEqual([{ sourceNodeID: 'start_0', targetNodeID: 'end_0' }]);
+    // line destroy
+    line.dispose();
+    expect(startNode.outputLines.length).toEqual(0);
+    expect(startNode.allLines.length).toEqual(0);
+    expect(endNode.inputLines.length).toEqual(0);
+    expect(endNode.allLines.length).toEqual(0);
+    expect(startNode.allOutputNodes.length).toEqual(0);
+    expect(endNode.allInputNodes.length).toEqual(0);
+    linesManager.createLine({
+      from: 'start_0',
+      to: 'end_0',
+    })!;
+    expect(startNode.outputLines.length).toEqual(1);
+    // node destroy
+    endNode.entity.dispose();
+    expect(startNode.outputLines.length).toEqual(0);
+    expect(startNode.allLines.length).toEqual(0);
+  });
+  it('base create drawing line or hidden line', async () => {
+    const line = linesManager.createLine({
+      from: 'start_0',
+      drawingTo: { x: 0, y: 0, location: 'right' },
+    })!;
+    const startNode = document.getNode('start_0')!.getData(WorkflowNodeLinesData);
+    expect(startNode.outputLines.length).toEqual(1);
+    expect(startNode.availableLines.length).toEqual(0);
+    line.dispose();
+    expect(startNode.outputLines.length).toEqual(0);
+    expect(startNode.availableLines.length).toEqual(0);
+    const line2 = linesManager.createLine({
+      from: 'start_0',
+      to: 'end_0',
+    })!;
+    line2.updateUIState({
+      highlightColor: line2.linesManager.lineColor.hidden,
+    });
+    expect(startNode.outputLines.length).toEqual(1);
+    expect(startNode.availableLines.length).toEqual(0);
+    line2.updateUIState({
+      highlightColor: '',
+    });
+    expect(startNode.outputLines.length).toEqual(1);
+    expect(startNode.availableLines.length).toEqual(1);
   });
 
   it('test base create line node', async () => {

+ 4 - 0
packages/canvas-engine/free-layout-core/src/entity-datas/workflow-node-lines-data.ts

@@ -57,6 +57,10 @@ export class WorkflowNodeLinesData extends EntityData<WorkflowNodeLines> {
     return this.data.inputLines.concat(this.data.outputLines);
   }
 
+  get availableLines(): WorkflowLineEntity[] {
+    return this.allLines.filter((line) => !line.isDrawing && !line.isHidden);
+  }
+
   /**
    * 输入节点
    */