balibabu commited on
Commit
dcce454
·
1 Parent(s): 86dad2d

feat: add FlowCanvas (#593)

Browse files

### What problem does this PR solve?

feat: handle operator drag
feat: add FlowCanvas
#592

### Type of change

- [x] New Feature (non-breaking change which adds functionality)

web/package-lock.json CHANGED
@@ -27,6 +27,7 @@
27
  "react-pdf-highlighter": "^6.1.0",
28
  "react-string-replace": "^1.1.1",
29
  "react-syntax-highlighter": "^15.5.0",
 
30
  "recharts": "^2.12.4",
31
  "remark-gfm": "^4.0.0",
32
  "umi": "^4.0.90",
@@ -2420,6 +2421,306 @@
2420
  "node": ">=12.0.0"
2421
  }
2422
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2423
  "node_modules/@rgrove/parse-xml": {
2424
  "version": "2.0.4",
2425
  "resolved": "https://registry.npmmirror.com/@rgrove/parse-xml/-/parse-xml-2.0.4.tgz",
@@ -2679,21 +2980,142 @@
2679
  "@babel/types": "^7.20.7"
2680
  }
2681
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2682
  "node_modules/@types/d3-array": {
2683
  "version": "3.2.1",
2684
  "resolved": "https://registry.npmmirror.com/@types/d3-array/-/d3-array-3.2.1.tgz",
2685
  "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="
2686
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2687
  "node_modules/@types/d3-color": {
2688
  "version": "3.1.3",
2689
  "resolved": "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz",
2690
  "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
2691
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2692
  "node_modules/@types/d3-ease": {
2693
  "version": "3.0.2",
2694
  "resolved": "https://registry.npmmirror.com/@types/d3-ease/-/d3-ease-3.0.2.tgz",
2695
  "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="
2696
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2697
  "node_modules/@types/d3-interpolate": {
2698
  "version": "3.0.4",
2699
  "resolved": "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
@@ -2707,6 +3129,21 @@
2707
  "resolved": "https://registry.npmmirror.com/@types/d3-path/-/d3-path-3.1.0.tgz",
2708
  "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ=="
2709
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2710
  "node_modules/@types/d3-scale": {
2711
  "version": "4.0.8",
2712
  "resolved": "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.8.tgz",
@@ -2715,6 +3152,16 @@
2715
  "@types/d3-time": "*"
2716
  }
2717
  },
 
 
 
 
 
 
 
 
 
 
2718
  "node_modules/@types/d3-shape": {
2719
  "version": "3.1.6",
2720
  "resolved": "https://registry.npmmirror.com/@types/d3-shape/-/d3-shape-3.1.6.tgz",
@@ -2728,11 +3175,33 @@
2728
  "resolved": "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.3.tgz",
2729
  "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw=="
2730
  },
 
 
 
 
 
2731
  "node_modules/@types/d3-timer": {
2732
  "version": "3.0.2",
2733
  "resolved": "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-3.0.2.tgz",
2734
  "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="
2735
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2736
  "node_modules/@types/debug": {
2737
  "version": "4.1.12",
2738
  "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz",
@@ -2774,6 +3243,11 @@
2774
  "@types/estree": "*"
2775
  }
2776
  },
 
 
 
 
 
2777
  "node_modules/@types/glob": {
2778
  "version": "7.2.0",
2779
  "resolved": "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz",
@@ -5834,6 +6308,11 @@
5834
  "node": ">= 0.4"
5835
  }
5836
  },
 
 
 
 
 
5837
  "node_modules/classnames": {
5838
  "version": "2.5.1",
5839
  "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz",
@@ -6722,6 +7201,26 @@
6722
  "node": ">=12"
6723
  }
6724
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6725
  "node_modules/d3-ease": {
6726
  "version": "3.0.1",
6727
  "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz",
@@ -6788,6 +7287,14 @@
6788
  "node": ">=12"
6789
  }
6790
  },
 
 
 
 
 
 
 
 
6791
  "node_modules/d3-shape": {
6792
  "version": "3.2.0",
6793
  "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz",
@@ -6840,6 +7347,39 @@
6840
  "node": ">=12"
6841
  }
6842
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6843
  "node_modules/data-uri-to-buffer": {
6844
  "version": "4.0.1",
6845
  "resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
@@ -15248,6 +15788,23 @@
15248
  "lodash": "^4.0.1"
15249
  }
15250
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15251
  "node_modules/read-pkg": {
15252
  "version": "5.2.0",
15253
  "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz",
 
27
  "react-pdf-highlighter": "^6.1.0",
28
  "react-string-replace": "^1.1.1",
29
  "react-syntax-highlighter": "^15.5.0",
30
+ "reactflow": "^11.11.2",
31
  "recharts": "^2.12.4",
32
  "remark-gfm": "^4.0.0",
33
  "umi": "^4.0.90",
 
2421
  "node": ">=12.0.0"
2422
  }
2423
  },
2424
+ "node_modules/@reactflow/background": {
2425
+ "version": "11.3.12",
2426
+ "resolved": "https://registry.npmmirror.com/@reactflow/background/-/background-11.3.12.tgz",
2427
+ "integrity": "sha512-jBuWVb43JQy5h4WOS7G0PU8voGTEJNA+qDmx8/jyBtrjbasTesLNfQvboTGjnQYYiJco6mw5vrtQItAJDNoIqw==",
2428
+ "dependencies": {
2429
+ "@reactflow/core": "11.11.2",
2430
+ "classcat": "^5.0.3",
2431
+ "zustand": "^4.4.1"
2432
+ },
2433
+ "peerDependencies": {
2434
+ "react": ">=17",
2435
+ "react-dom": ">=17"
2436
+ }
2437
+ },
2438
+ "node_modules/@reactflow/background/node_modules/immer": {
2439
+ "version": "10.1.1",
2440
+ "resolved": "https://registry.npmmirror.com/immer/-/immer-10.1.1.tgz",
2441
+ "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
2442
+ "optional": true,
2443
+ "peer": true
2444
+ },
2445
+ "node_modules/@reactflow/background/node_modules/zustand": {
2446
+ "version": "4.5.2",
2447
+ "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.2.tgz",
2448
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
2449
+ "dependencies": {
2450
+ "use-sync-external-store": "1.2.0"
2451
+ },
2452
+ "engines": {
2453
+ "node": ">=12.7.0"
2454
+ },
2455
+ "peerDependencies": {
2456
+ "@types/react": ">=16.8",
2457
+ "immer": ">=9.0.6",
2458
+ "react": ">=16.8"
2459
+ },
2460
+ "peerDependenciesMeta": {
2461
+ "@types/react": {
2462
+ "optional": true
2463
+ },
2464
+ "immer": {
2465
+ "optional": true
2466
+ },
2467
+ "react": {
2468
+ "optional": true
2469
+ }
2470
+ }
2471
+ },
2472
+ "node_modules/@reactflow/controls": {
2473
+ "version": "11.2.12",
2474
+ "resolved": "https://registry.npmmirror.com/@reactflow/controls/-/controls-11.2.12.tgz",
2475
+ "integrity": "sha512-L9F3+avFRShoprdT+5oOijm5gVsz2rqWCXBzOAgD923L1XFGIspdiHLLf8IlPGsT+mfl0GxbptZhaEeEzl1e3g==",
2476
+ "dependencies": {
2477
+ "@reactflow/core": "11.11.2",
2478
+ "classcat": "^5.0.3",
2479
+ "zustand": "^4.4.1"
2480
+ },
2481
+ "peerDependencies": {
2482
+ "react": ">=17",
2483
+ "react-dom": ">=17"
2484
+ }
2485
+ },
2486
+ "node_modules/@reactflow/controls/node_modules/immer": {
2487
+ "version": "10.1.1",
2488
+ "resolved": "https://registry.npmmirror.com/immer/-/immer-10.1.1.tgz",
2489
+ "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
2490
+ "optional": true,
2491
+ "peer": true
2492
+ },
2493
+ "node_modules/@reactflow/controls/node_modules/zustand": {
2494
+ "version": "4.5.2",
2495
+ "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.2.tgz",
2496
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
2497
+ "dependencies": {
2498
+ "use-sync-external-store": "1.2.0"
2499
+ },
2500
+ "engines": {
2501
+ "node": ">=12.7.0"
2502
+ },
2503
+ "peerDependencies": {
2504
+ "@types/react": ">=16.8",
2505
+ "immer": ">=9.0.6",
2506
+ "react": ">=16.8"
2507
+ },
2508
+ "peerDependenciesMeta": {
2509
+ "@types/react": {
2510
+ "optional": true
2511
+ },
2512
+ "immer": {
2513
+ "optional": true
2514
+ },
2515
+ "react": {
2516
+ "optional": true
2517
+ }
2518
+ }
2519
+ },
2520
+ "node_modules/@reactflow/core": {
2521
+ "version": "11.11.2",
2522
+ "resolved": "https://registry.npmmirror.com/@reactflow/core/-/core-11.11.2.tgz",
2523
+ "integrity": "sha512-+GfgyskweL1PsgRSguUwfrT2eDotlFgaKfDLm7x0brdzzPJY2qbCzVetaxedaiJmIli3817iYbILvE9qLKwbRA==",
2524
+ "dependencies": {
2525
+ "@types/d3": "^7.4.0",
2526
+ "@types/d3-drag": "^3.0.1",
2527
+ "@types/d3-selection": "^3.0.3",
2528
+ "@types/d3-zoom": "^3.0.1",
2529
+ "classcat": "^5.0.3",
2530
+ "d3-drag": "^3.0.0",
2531
+ "d3-selection": "^3.0.0",
2532
+ "d3-zoom": "^3.0.0",
2533
+ "zustand": "^4.4.1"
2534
+ },
2535
+ "peerDependencies": {
2536
+ "react": ">=17",
2537
+ "react-dom": ">=17"
2538
+ }
2539
+ },
2540
+ "node_modules/@reactflow/core/node_modules/immer": {
2541
+ "version": "10.1.1",
2542
+ "resolved": "https://registry.npmmirror.com/immer/-/immer-10.1.1.tgz",
2543
+ "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
2544
+ "optional": true,
2545
+ "peer": true
2546
+ },
2547
+ "node_modules/@reactflow/core/node_modules/zustand": {
2548
+ "version": "4.5.2",
2549
+ "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.2.tgz",
2550
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
2551
+ "dependencies": {
2552
+ "use-sync-external-store": "1.2.0"
2553
+ },
2554
+ "engines": {
2555
+ "node": ">=12.7.0"
2556
+ },
2557
+ "peerDependencies": {
2558
+ "@types/react": ">=16.8",
2559
+ "immer": ">=9.0.6",
2560
+ "react": ">=16.8"
2561
+ },
2562
+ "peerDependenciesMeta": {
2563
+ "@types/react": {
2564
+ "optional": true
2565
+ },
2566
+ "immer": {
2567
+ "optional": true
2568
+ },
2569
+ "react": {
2570
+ "optional": true
2571
+ }
2572
+ }
2573
+ },
2574
+ "node_modules/@reactflow/minimap": {
2575
+ "version": "11.7.12",
2576
+ "resolved": "https://registry.npmmirror.com/@reactflow/minimap/-/minimap-11.7.12.tgz",
2577
+ "integrity": "sha512-SRDU77c2PCF54PV/MQfkz7VOW46q7V1LZNOQlXAp7dkNyAOI6R+tb9qBUtUJOvILB+TCN6pRfD9fQ+2T99bW3Q==",
2578
+ "dependencies": {
2579
+ "@reactflow/core": "11.11.2",
2580
+ "@types/d3-selection": "^3.0.3",
2581
+ "@types/d3-zoom": "^3.0.1",
2582
+ "classcat": "^5.0.3",
2583
+ "d3-selection": "^3.0.0",
2584
+ "d3-zoom": "^3.0.0",
2585
+ "zustand": "^4.4.1"
2586
+ },
2587
+ "peerDependencies": {
2588
+ "react": ">=17",
2589
+ "react-dom": ">=17"
2590
+ }
2591
+ },
2592
+ "node_modules/@reactflow/minimap/node_modules/immer": {
2593
+ "version": "10.1.1",
2594
+ "resolved": "https://registry.npmmirror.com/immer/-/immer-10.1.1.tgz",
2595
+ "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
2596
+ "optional": true,
2597
+ "peer": true
2598
+ },
2599
+ "node_modules/@reactflow/minimap/node_modules/zustand": {
2600
+ "version": "4.5.2",
2601
+ "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.2.tgz",
2602
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
2603
+ "dependencies": {
2604
+ "use-sync-external-store": "1.2.0"
2605
+ },
2606
+ "engines": {
2607
+ "node": ">=12.7.0"
2608
+ },
2609
+ "peerDependencies": {
2610
+ "@types/react": ">=16.8",
2611
+ "immer": ">=9.0.6",
2612
+ "react": ">=16.8"
2613
+ },
2614
+ "peerDependenciesMeta": {
2615
+ "@types/react": {
2616
+ "optional": true
2617
+ },
2618
+ "immer": {
2619
+ "optional": true
2620
+ },
2621
+ "react": {
2622
+ "optional": true
2623
+ }
2624
+ }
2625
+ },
2626
+ "node_modules/@reactflow/node-resizer": {
2627
+ "version": "2.2.12",
2628
+ "resolved": "https://registry.npmmirror.com/@reactflow/node-resizer/-/node-resizer-2.2.12.tgz",
2629
+ "integrity": "sha512-6LHJGuI1zHyRrZHw5gGlVLIWnvVxid9WIqw8FMFSg+oF2DuS3pAPwSoZwypy7W22/gDNl9eD1Dcl/OtFtDFQ+w==",
2630
+ "dependencies": {
2631
+ "@reactflow/core": "11.11.2",
2632
+ "classcat": "^5.0.4",
2633
+ "d3-drag": "^3.0.0",
2634
+ "d3-selection": "^3.0.0",
2635
+ "zustand": "^4.4.1"
2636
+ },
2637
+ "peerDependencies": {
2638
+ "react": ">=17",
2639
+ "react-dom": ">=17"
2640
+ }
2641
+ },
2642
+ "node_modules/@reactflow/node-resizer/node_modules/immer": {
2643
+ "version": "10.1.1",
2644
+ "resolved": "https://registry.npmmirror.com/immer/-/immer-10.1.1.tgz",
2645
+ "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
2646
+ "optional": true,
2647
+ "peer": true
2648
+ },
2649
+ "node_modules/@reactflow/node-resizer/node_modules/zustand": {
2650
+ "version": "4.5.2",
2651
+ "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.2.tgz",
2652
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
2653
+ "dependencies": {
2654
+ "use-sync-external-store": "1.2.0"
2655
+ },
2656
+ "engines": {
2657
+ "node": ">=12.7.0"
2658
+ },
2659
+ "peerDependencies": {
2660
+ "@types/react": ">=16.8",
2661
+ "immer": ">=9.0.6",
2662
+ "react": ">=16.8"
2663
+ },
2664
+ "peerDependenciesMeta": {
2665
+ "@types/react": {
2666
+ "optional": true
2667
+ },
2668
+ "immer": {
2669
+ "optional": true
2670
+ },
2671
+ "react": {
2672
+ "optional": true
2673
+ }
2674
+ }
2675
+ },
2676
+ "node_modules/@reactflow/node-toolbar": {
2677
+ "version": "1.3.12",
2678
+ "resolved": "https://registry.npmmirror.com/@reactflow/node-toolbar/-/node-toolbar-1.3.12.tgz",
2679
+ "integrity": "sha512-4kJRvNna/E3y2MZW9/80wTKwkhw4pLJiz3D5eQrD13XcmojSb1rArO9CiwyrI+rMvs5gn6NlCFB4iN1F+Q+lxQ==",
2680
+ "dependencies": {
2681
+ "@reactflow/core": "11.11.2",
2682
+ "classcat": "^5.0.3",
2683
+ "zustand": "^4.4.1"
2684
+ },
2685
+ "peerDependencies": {
2686
+ "react": ">=17",
2687
+ "react-dom": ">=17"
2688
+ }
2689
+ },
2690
+ "node_modules/@reactflow/node-toolbar/node_modules/immer": {
2691
+ "version": "10.1.1",
2692
+ "resolved": "https://registry.npmmirror.com/immer/-/immer-10.1.1.tgz",
2693
+ "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
2694
+ "optional": true,
2695
+ "peer": true
2696
+ },
2697
+ "node_modules/@reactflow/node-toolbar/node_modules/zustand": {
2698
+ "version": "4.5.2",
2699
+ "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.2.tgz",
2700
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
2701
+ "dependencies": {
2702
+ "use-sync-external-store": "1.2.0"
2703
+ },
2704
+ "engines": {
2705
+ "node": ">=12.7.0"
2706
+ },
2707
+ "peerDependencies": {
2708
+ "@types/react": ">=16.8",
2709
+ "immer": ">=9.0.6",
2710
+ "react": ">=16.8"
2711
+ },
2712
+ "peerDependenciesMeta": {
2713
+ "@types/react": {
2714
+ "optional": true
2715
+ },
2716
+ "immer": {
2717
+ "optional": true
2718
+ },
2719
+ "react": {
2720
+ "optional": true
2721
+ }
2722
+ }
2723
+ },
2724
  "node_modules/@rgrove/parse-xml": {
2725
  "version": "2.0.4",
2726
  "resolved": "https://registry.npmmirror.com/@rgrove/parse-xml/-/parse-xml-2.0.4.tgz",
 
2980
  "@babel/types": "^7.20.7"
2981
  }
2982
  },
2983
+ "node_modules/@types/d3": {
2984
+ "version": "7.4.3",
2985
+ "resolved": "https://registry.npmmirror.com/@types/d3/-/d3-7.4.3.tgz",
2986
+ "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
2987
+ "dependencies": {
2988
+ "@types/d3-array": "*",
2989
+ "@types/d3-axis": "*",
2990
+ "@types/d3-brush": "*",
2991
+ "@types/d3-chord": "*",
2992
+ "@types/d3-color": "*",
2993
+ "@types/d3-contour": "*",
2994
+ "@types/d3-delaunay": "*",
2995
+ "@types/d3-dispatch": "*",
2996
+ "@types/d3-drag": "*",
2997
+ "@types/d3-dsv": "*",
2998
+ "@types/d3-ease": "*",
2999
+ "@types/d3-fetch": "*",
3000
+ "@types/d3-force": "*",
3001
+ "@types/d3-format": "*",
3002
+ "@types/d3-geo": "*",
3003
+ "@types/d3-hierarchy": "*",
3004
+ "@types/d3-interpolate": "*",
3005
+ "@types/d3-path": "*",
3006
+ "@types/d3-polygon": "*",
3007
+ "@types/d3-quadtree": "*",
3008
+ "@types/d3-random": "*",
3009
+ "@types/d3-scale": "*",
3010
+ "@types/d3-scale-chromatic": "*",
3011
+ "@types/d3-selection": "*",
3012
+ "@types/d3-shape": "*",
3013
+ "@types/d3-time": "*",
3014
+ "@types/d3-time-format": "*",
3015
+ "@types/d3-timer": "*",
3016
+ "@types/d3-transition": "*",
3017
+ "@types/d3-zoom": "*"
3018
+ }
3019
+ },
3020
  "node_modules/@types/d3-array": {
3021
  "version": "3.2.1",
3022
  "resolved": "https://registry.npmmirror.com/@types/d3-array/-/d3-array-3.2.1.tgz",
3023
  "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="
3024
  },
3025
+ "node_modules/@types/d3-axis": {
3026
+ "version": "3.0.6",
3027
+ "resolved": "https://registry.npmmirror.com/@types/d3-axis/-/d3-axis-3.0.6.tgz",
3028
+ "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
3029
+ "dependencies": {
3030
+ "@types/d3-selection": "*"
3031
+ }
3032
+ },
3033
+ "node_modules/@types/d3-brush": {
3034
+ "version": "3.0.6",
3035
+ "resolved": "https://registry.npmmirror.com/@types/d3-brush/-/d3-brush-3.0.6.tgz",
3036
+ "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
3037
+ "dependencies": {
3038
+ "@types/d3-selection": "*"
3039
+ }
3040
+ },
3041
+ "node_modules/@types/d3-chord": {
3042
+ "version": "3.0.6",
3043
+ "resolved": "https://registry.npmmirror.com/@types/d3-chord/-/d3-chord-3.0.6.tgz",
3044
+ "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="
3045
+ },
3046
  "node_modules/@types/d3-color": {
3047
  "version": "3.1.3",
3048
  "resolved": "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz",
3049
  "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
3050
  },
3051
+ "node_modules/@types/d3-contour": {
3052
+ "version": "3.0.6",
3053
+ "resolved": "https://registry.npmmirror.com/@types/d3-contour/-/d3-contour-3.0.6.tgz",
3054
+ "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
3055
+ "dependencies": {
3056
+ "@types/d3-array": "*",
3057
+ "@types/geojson": "*"
3058
+ }
3059
+ },
3060
+ "node_modules/@types/d3-delaunay": {
3061
+ "version": "6.0.4",
3062
+ "resolved": "https://registry.npmmirror.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
3063
+ "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="
3064
+ },
3065
+ "node_modules/@types/d3-dispatch": {
3066
+ "version": "3.0.6",
3067
+ "resolved": "https://registry.npmmirror.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz",
3068
+ "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ=="
3069
+ },
3070
+ "node_modules/@types/d3-drag": {
3071
+ "version": "3.0.7",
3072
+ "resolved": "https://registry.npmmirror.com/@types/d3-drag/-/d3-drag-3.0.7.tgz",
3073
+ "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
3074
+ "dependencies": {
3075
+ "@types/d3-selection": "*"
3076
+ }
3077
+ },
3078
+ "node_modules/@types/d3-dsv": {
3079
+ "version": "3.0.7",
3080
+ "resolved": "https://registry.npmmirror.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
3081
+ "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="
3082
+ },
3083
  "node_modules/@types/d3-ease": {
3084
  "version": "3.0.2",
3085
  "resolved": "https://registry.npmmirror.com/@types/d3-ease/-/d3-ease-3.0.2.tgz",
3086
  "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="
3087
  },
3088
+ "node_modules/@types/d3-fetch": {
3089
+ "version": "3.0.7",
3090
+ "resolved": "https://registry.npmmirror.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
3091
+ "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
3092
+ "dependencies": {
3093
+ "@types/d3-dsv": "*"
3094
+ }
3095
+ },
3096
+ "node_modules/@types/d3-force": {
3097
+ "version": "3.0.9",
3098
+ "resolved": "https://registry.npmmirror.com/@types/d3-force/-/d3-force-3.0.9.tgz",
3099
+ "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA=="
3100
+ },
3101
+ "node_modules/@types/d3-format": {
3102
+ "version": "3.0.4",
3103
+ "resolved": "https://registry.npmmirror.com/@types/d3-format/-/d3-format-3.0.4.tgz",
3104
+ "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="
3105
+ },
3106
+ "node_modules/@types/d3-geo": {
3107
+ "version": "3.1.0",
3108
+ "resolved": "https://registry.npmmirror.com/@types/d3-geo/-/d3-geo-3.1.0.tgz",
3109
+ "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
3110
+ "dependencies": {
3111
+ "@types/geojson": "*"
3112
+ }
3113
+ },
3114
+ "node_modules/@types/d3-hierarchy": {
3115
+ "version": "3.1.7",
3116
+ "resolved": "https://registry.npmmirror.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
3117
+ "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="
3118
+ },
3119
  "node_modules/@types/d3-interpolate": {
3120
  "version": "3.0.4",
3121
  "resolved": "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
 
3129
  "resolved": "https://registry.npmmirror.com/@types/d3-path/-/d3-path-3.1.0.tgz",
3130
  "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ=="
3131
  },
3132
+ "node_modules/@types/d3-polygon": {
3133
+ "version": "3.0.2",
3134
+ "resolved": "https://registry.npmmirror.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
3135
+ "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="
3136
+ },
3137
+ "node_modules/@types/d3-quadtree": {
3138
+ "version": "3.0.6",
3139
+ "resolved": "https://registry.npmmirror.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
3140
+ "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="
3141
+ },
3142
+ "node_modules/@types/d3-random": {
3143
+ "version": "3.0.3",
3144
+ "resolved": "https://registry.npmmirror.com/@types/d3-random/-/d3-random-3.0.3.tgz",
3145
+ "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="
3146
+ },
3147
  "node_modules/@types/d3-scale": {
3148
  "version": "4.0.8",
3149
  "resolved": "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.8.tgz",
 
3152
  "@types/d3-time": "*"
3153
  }
3154
  },
3155
+ "node_modules/@types/d3-scale-chromatic": {
3156
+ "version": "3.0.3",
3157
+ "resolved": "https://registry.npmmirror.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz",
3158
+ "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw=="
3159
+ },
3160
+ "node_modules/@types/d3-selection": {
3161
+ "version": "3.0.10",
3162
+ "resolved": "https://registry.npmmirror.com/@types/d3-selection/-/d3-selection-3.0.10.tgz",
3163
+ "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg=="
3164
+ },
3165
  "node_modules/@types/d3-shape": {
3166
  "version": "3.1.6",
3167
  "resolved": "https://registry.npmmirror.com/@types/d3-shape/-/d3-shape-3.1.6.tgz",
 
3175
  "resolved": "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.3.tgz",
3176
  "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw=="
3177
  },
3178
+ "node_modules/@types/d3-time-format": {
3179
+ "version": "4.0.3",
3180
+ "resolved": "https://registry.npmmirror.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
3181
+ "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="
3182
+ },
3183
  "node_modules/@types/d3-timer": {
3184
  "version": "3.0.2",
3185
  "resolved": "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-3.0.2.tgz",
3186
  "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="
3187
  },
3188
+ "node_modules/@types/d3-transition": {
3189
+ "version": "3.0.8",
3190
+ "resolved": "https://registry.npmmirror.com/@types/d3-transition/-/d3-transition-3.0.8.tgz",
3191
+ "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==",
3192
+ "dependencies": {
3193
+ "@types/d3-selection": "*"
3194
+ }
3195
+ },
3196
+ "node_modules/@types/d3-zoom": {
3197
+ "version": "3.0.8",
3198
+ "resolved": "https://registry.npmmirror.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz",
3199
+ "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==",
3200
+ "dependencies": {
3201
+ "@types/d3-interpolate": "*",
3202
+ "@types/d3-selection": "*"
3203
+ }
3204
+ },
3205
  "node_modules/@types/debug": {
3206
  "version": "4.1.12",
3207
  "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz",
 
3243
  "@types/estree": "*"
3244
  }
3245
  },
3246
+ "node_modules/@types/geojson": {
3247
+ "version": "7946.0.14",
3248
+ "resolved": "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.14.tgz",
3249
+ "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg=="
3250
+ },
3251
  "node_modules/@types/glob": {
3252
  "version": "7.2.0",
3253
  "resolved": "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz",
 
6308
  "node": ">= 0.4"
6309
  }
6310
  },
6311
+ "node_modules/classcat": {
6312
+ "version": "5.0.5",
6313
+ "resolved": "https://registry.npmmirror.com/classcat/-/classcat-5.0.5.tgz",
6314
+ "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w=="
6315
+ },
6316
  "node_modules/classnames": {
6317
  "version": "2.5.1",
6318
  "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz",
 
7201
  "node": ">=12"
7202
  }
7203
  },
7204
+ "node_modules/d3-dispatch": {
7205
+ "version": "3.0.1",
7206
+ "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
7207
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
7208
+ "engines": {
7209
+ "node": ">=12"
7210
+ }
7211
+ },
7212
+ "node_modules/d3-drag": {
7213
+ "version": "3.0.0",
7214
+ "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz",
7215
+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
7216
+ "dependencies": {
7217
+ "d3-dispatch": "1 - 3",
7218
+ "d3-selection": "3"
7219
+ },
7220
+ "engines": {
7221
+ "node": ">=12"
7222
+ }
7223
+ },
7224
  "node_modules/d3-ease": {
7225
  "version": "3.0.1",
7226
  "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz",
 
7287
  "node": ">=12"
7288
  }
7289
  },
7290
+ "node_modules/d3-selection": {
7291
+ "version": "3.0.0",
7292
+ "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz",
7293
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
7294
+ "engines": {
7295
+ "node": ">=12"
7296
+ }
7297
+ },
7298
  "node_modules/d3-shape": {
7299
  "version": "3.2.0",
7300
  "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz",
 
7347
  "node": ">=12"
7348
  }
7349
  },
7350
+ "node_modules/d3-transition": {
7351
+ "version": "3.0.1",
7352
+ "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz",
7353
+ "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
7354
+ "dependencies": {
7355
+ "d3-color": "1 - 3",
7356
+ "d3-dispatch": "1 - 3",
7357
+ "d3-ease": "1 - 3",
7358
+ "d3-interpolate": "1 - 3",
7359
+ "d3-timer": "1 - 3"
7360
+ },
7361
+ "engines": {
7362
+ "node": ">=12"
7363
+ },
7364
+ "peerDependencies": {
7365
+ "d3-selection": "2 - 3"
7366
+ }
7367
+ },
7368
+ "node_modules/d3-zoom": {
7369
+ "version": "3.0.0",
7370
+ "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz",
7371
+ "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
7372
+ "dependencies": {
7373
+ "d3-dispatch": "1 - 3",
7374
+ "d3-drag": "2 - 3",
7375
+ "d3-interpolate": "1 - 3",
7376
+ "d3-selection": "2 - 3",
7377
+ "d3-transition": "2 - 3"
7378
+ },
7379
+ "engines": {
7380
+ "node": ">=12"
7381
+ }
7382
+ },
7383
  "node_modules/data-uri-to-buffer": {
7384
  "version": "4.0.1",
7385
  "resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
 
15788
  "lodash": "^4.0.1"
15789
  }
15790
  },
15791
+ "node_modules/reactflow": {
15792
+ "version": "11.11.2",
15793
+ "resolved": "https://registry.npmmirror.com/reactflow/-/reactflow-11.11.2.tgz",
15794
+ "integrity": "sha512-o1fT3stSdhzW+SedCGNSmEvZvULZygZIMLyW67NcWNZrgwx1wuJfzLg5fuQ0Nzf389wItumZX/zP3zdaPX7lEw==",
15795
+ "dependencies": {
15796
+ "@reactflow/background": "11.3.12",
15797
+ "@reactflow/controls": "11.2.12",
15798
+ "@reactflow/core": "11.11.2",
15799
+ "@reactflow/minimap": "11.7.12",
15800
+ "@reactflow/node-resizer": "2.2.12",
15801
+ "@reactflow/node-toolbar": "1.3.12"
15802
+ },
15803
+ "peerDependencies": {
15804
+ "react": ">=17",
15805
+ "react-dom": ">=17"
15806
+ }
15807
+ },
15808
  "node_modules/read-pkg": {
15809
  "version": "5.2.0",
15810
  "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz",
web/package.json CHANGED
@@ -31,6 +31,7 @@
31
  "react-pdf-highlighter": "^6.1.0",
32
  "react-string-replace": "^1.1.1",
33
  "react-syntax-highlighter": "^15.5.0",
 
34
  "recharts": "^2.12.4",
35
  "remark-gfm": "^4.0.0",
36
  "umi": "^4.0.90",
 
31
  "react-pdf-highlighter": "^6.1.0",
32
  "react-string-replace": "^1.1.1",
33
  "react-syntax-highlighter": "^15.5.0",
34
+ "reactflow": "^11.11.2",
35
  "recharts": "^2.12.4",
36
  "remark-gfm": "^4.0.0",
37
  "umi": "^4.0.90",
web/src/pages/flow/canvas/index.tsx ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import ReactFlow, {
3
+ Background,
4
+ Controls,
5
+ Edge,
6
+ Node,
7
+ OnConnect,
8
+ OnEdgesChange,
9
+ OnNodesChange,
10
+ addEdge,
11
+ applyEdgeChanges,
12
+ applyNodeChanges,
13
+ } from 'reactflow';
14
+ import 'reactflow/dist/style.css';
15
+
16
+ import { useHandleDrop } from '../hooks';
17
+ import { TextUpdaterNode } from './node';
18
+
19
+ const nodeTypes = { textUpdater: TextUpdaterNode };
20
+
21
+ const initialNodes = [
22
+ {
23
+ id: 'node-1',
24
+ type: 'textUpdater',
25
+ position: { x: 200, y: 50 },
26
+ data: { value: 123 },
27
+ },
28
+ {
29
+ id: '1',
30
+ data: { label: 'Hello' },
31
+ position: { x: 0, y: 0 },
32
+ type: 'input',
33
+ },
34
+ {
35
+ id: '2',
36
+ data: { label: 'World' },
37
+ position: { x: 100, y: 100 },
38
+ },
39
+ ];
40
+
41
+ const initialEdges = [
42
+ { id: '1-2', source: '1', target: '2', label: 'to the', type: 'step' },
43
+ ];
44
+
45
+ function FlowCanvas() {
46
+ const [nodes, setNodes] = useState<Node[]>(initialNodes);
47
+ const [edges, setEdges] = useState<Edge[]>(initialEdges);
48
+
49
+ const onNodesChange: OnNodesChange = useCallback(
50
+ (changes) => setNodes((nds) => applyNodeChanges(changes, nds)),
51
+ [],
52
+ );
53
+ const onEdgesChange: OnEdgesChange = useCallback(
54
+ (changes) => setEdges((eds) => applyEdgeChanges(changes, eds)),
55
+ [],
56
+ );
57
+
58
+ const onConnect: OnConnect = useCallback(
59
+ (params) => setEdges((eds) => addEdge(params, eds)),
60
+ [],
61
+ );
62
+
63
+ const { handleDrop, allowDrop } = useHandleDrop(setNodes);
64
+
65
+ useEffect(() => {
66
+ console.info('nodes:', nodes);
67
+ console.info('edges:', edges);
68
+ }, [nodes, edges]);
69
+
70
+ return (
71
+ <div
72
+ style={{ height: '100%', width: '100%' }}
73
+ onDrop={handleDrop}
74
+ onDragOver={allowDrop}
75
+ >
76
+ <ReactFlow
77
+ nodes={nodes}
78
+ onNodesChange={onNodesChange}
79
+ edges={edges}
80
+ onEdgesChange={onEdgesChange}
81
+ // fitView
82
+ onConnect={onConnect}
83
+ nodeTypes={nodeTypes}
84
+ >
85
+ <Background />
86
+ <Controls />
87
+ </ReactFlow>
88
+ </div>
89
+ );
90
+ }
91
+
92
+ export default FlowCanvas;
web/src/pages/flow/canvas/node/index.less ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .textUpdaterNode {
2
+ height: 50px;
3
+ border: 1px solid #eee;
4
+ padding: 5px;
5
+ border-radius: 5px;
6
+ background: white;
7
+ label {
8
+ display: block;
9
+ color: #777;
10
+ font-size: 12px;
11
+ }
12
+ }
web/src/pages/flow/canvas/node/index.tsx ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useCallback } from 'react';
2
+ import { Handle, NodeProps, Position } from 'reactflow';
3
+
4
+ import styles from './index.less';
5
+
6
+ const handleStyle = { left: 10 };
7
+
8
+ export function TextUpdaterNode({
9
+ data,
10
+ isConnectable = true,
11
+ }: NodeProps<{ value: number }>) {
12
+ const onChange = useCallback((evt) => {
13
+ console.log(evt.target.value);
14
+ }, []);
15
+
16
+ return (
17
+ <div className={styles.textUpdaterNode}>
18
+ <Handle
19
+ type="target"
20
+ position={Position.Top}
21
+ isConnectable={isConnectable}
22
+ />
23
+ <Handle
24
+ type="source"
25
+ position={Position.Bottom}
26
+ // style={handleStyle}
27
+ isConnectable={isConnectable}
28
+ />
29
+ <div>
30
+ <label htmlFor="text">Text:</label>
31
+ <input id="text" name="text" onChange={onChange} className="nodrag" />
32
+ </div>
33
+ {/* <Handle
34
+ type="source"
35
+ position={Position.Bottom}
36
+ id="b"
37
+ isConnectable={isConnectable}
38
+ /> */}
39
+ </div>
40
+ );
41
+ }
web/src/pages/flow/flow-sider/index.less ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .operatorCard {
2
+ :global(.ant-card-body) {
3
+ padding: 10px;
4
+ }
5
+ .cubeIcon {
6
+ &:hover {
7
+ cursor: pointer;
8
+ }
9
+ }
10
+ }
11
+
12
+ .siderContent {
13
+ padding: 10px 4px;
14
+ }
web/src/pages/flow/flow-sider/index.tsx ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Avatar, Card, Flex, Layout, Space } from 'antd';
2
+ import classNames from 'classnames';
3
+ import { useState } from 'react';
4
+ import { componentList } from '../mock';
5
+
6
+ import { useHandleDrag } from '../hooks';
7
+ import styles from './index.less';
8
+
9
+ const { Sider } = Layout;
10
+
11
+ const FlowSider = () => {
12
+ const [collapsed, setCollapsed] = useState(true);
13
+ const { handleDrag } = useHandleDrag();
14
+
15
+ return (
16
+ <Sider
17
+ collapsible
18
+ collapsed={collapsed}
19
+ collapsedWidth={0}
20
+ theme={'light'}
21
+ onCollapse={(value) => setCollapsed(value)}
22
+ >
23
+ <Flex vertical gap={10} className={styles.siderContent}>
24
+ {componentList.map((x) => (
25
+ <Card
26
+ key={x.name}
27
+ hoverable
28
+ draggable
29
+ className={classNames(styles.operatorCard)}
30
+ onDragStart={handleDrag(x.name)}
31
+ >
32
+ <Flex justify="space-between" align="center">
33
+ <Space size={15}>
34
+ <Avatar icon={x.icon} shape={'square'} />
35
+ <section>
36
+ <b>{x.name}</b>
37
+ <div>{x.description}</div>
38
+ </section>
39
+ </Space>
40
+ </Flex>
41
+ </Card>
42
+ ))}
43
+ </Flex>
44
+ </Sider>
45
+ );
46
+ };
47
+
48
+ export default FlowSider;
web/src/pages/flow/hooks.ts ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { Dispatch, SetStateAction, useCallback } from 'react';
2
+ import { Node } from 'reactflow';
3
+
4
+ export const useHandleDrag = () => {
5
+ const handleDrag = useCallback(
6
+ (operatorId: string) => (ev: React.DragEvent<HTMLDivElement>) => {
7
+ console.info(ev.clientX, ev.pageY);
8
+ ev.dataTransfer.setData('operatorId', operatorId);
9
+ ev.dataTransfer.setData('startClientX', ev.clientX.toString());
10
+ ev.dataTransfer.setData('startClientY', ev.clientY.toString());
11
+ },
12
+ [],
13
+ );
14
+
15
+ return { handleDrag };
16
+ };
17
+
18
+ export const useHandleDrop = (setNodes: Dispatch<SetStateAction<Node[]>>) => {
19
+ const allowDrop = (ev: React.DragEvent<HTMLDivElement>) => {
20
+ ev.preventDefault();
21
+ };
22
+
23
+ const handleDrop = useCallback(
24
+ (ev: React.DragEvent<HTMLDivElement>) => {
25
+ ev.preventDefault();
26
+ const operatorId = ev.dataTransfer.getData('operatorId');
27
+ const startClientX = ev.dataTransfer.getData('startClientX');
28
+ const startClientY = ev.dataTransfer.getData('startClientY');
29
+ console.info(operatorId);
30
+ console.info(ev.pageX, ev.pageY);
31
+ console.info(ev.clientX, ev.clientY);
32
+ console.info(ev.movementX, ev.movementY);
33
+ const x = ev.clientX - 200;
34
+ const y = ev.clientY - 72;
35
+ setNodes((pre) => {
36
+ return pre.concat({
37
+ id: operatorId,
38
+ position: { x, y },
39
+ data: { label: operatorId },
40
+ });
41
+ });
42
+ },
43
+ [setNodes],
44
+ );
45
+
46
+ return { handleDrop, allowDrop };
47
+ };
web/src/pages/flow/index.tsx ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Layout } from 'antd';
2
+ import FlowCanvas from './canvas';
3
+ import Sider from './flow-sider';
4
+
5
+ const { Content } = Layout;
6
+
7
+ function RagFlow() {
8
+ return (
9
+ <Layout style={{ minHeight: '100vh' }}>
10
+ <Sider></Sider>
11
+ <Layout>
12
+ <Content style={{ margin: '0 16px' }}>
13
+ <FlowCanvas></FlowCanvas>
14
+ </Content>
15
+ </Layout>
16
+ </Layout>
17
+ );
18
+ }
19
+
20
+ export default RagFlow;
web/src/pages/flow/mock.tsx ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import {
2
+ MergeCellsOutlined,
3
+ RocketOutlined,
4
+ SendOutlined,
5
+ } from '@ant-design/icons';
6
+
7
+ export const componentList = [
8
+ { name: 'Begin', icon: <SendOutlined />, description: '' },
9
+ { name: 'Retrieval', icon: <RocketOutlined />, description: '' },
10
+ { name: 'Generate', icon: <MergeCellsOutlined />, description: '' },
11
+ ];
web/src/routes.ts CHANGED
@@ -84,6 +84,10 @@ const routes = [
84
  path: '/file',
85
  component: '@/pages/file-manager',
86
  },
 
 
 
 
87
  ],
88
  },
89
  {
 
84
  path: '/file',
85
  component: '@/pages/file-manager',
86
  },
87
+ {
88
+ path: '/flow',
89
+ component: '@/pages/flow',
90
+ },
91
  ],
92
  },
93
  {