@linkdlab/funcnodes_react_flow 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/module/dist/css/style.css +43 -0
  2. package/module/dist/frontend/datarenderer/images.d.ts +12 -0
  3. package/module/dist/frontend/datarenderer/images.d.ts.map +1 -0
  4. package/module/dist/frontend/datarenderer/index.d.ts +17 -0
  5. package/module/dist/frontend/datarenderer/index.d.ts.map +1 -0
  6. package/module/dist/frontend/datarenderer/plotly.d.ts +15 -0
  7. package/module/dist/frontend/datarenderer/plotly.d.ts.map +1 -0
  8. package/module/dist/frontend/dialog.d.ts +18 -0
  9. package/module/dist/frontend/dialog.d.ts.map +1 -0
  10. package/module/dist/frontend/edge.d.ts +6 -0
  11. package/module/dist/frontend/edge.d.ts.map +1 -0
  12. package/module/dist/frontend/funcnodesreactflow/index.d.ts +7 -0
  13. package/module/dist/frontend/funcnodesreactflow/index.d.ts.map +1 -0
  14. package/module/dist/frontend/funcnodesreactflow/react_flow_layer.d.ts +6 -0
  15. package/module/dist/frontend/funcnodesreactflow/react_flow_layer.d.ts.map +1 -0
  16. package/module/dist/frontend/header/index.d.ts +5 -0
  17. package/module/dist/frontend/header/index.d.ts.map +1 -0
  18. package/module/dist/frontend/index.d.ts +4 -0
  19. package/module/dist/frontend/index.d.ts.map +1 -0
  20. package/module/dist/frontend/lib.d.ts +11 -0
  21. package/module/dist/frontend/lib.d.ts.map +1 -0
  22. package/module/{src/frontend/node/index.tsx → dist/frontend/node/index.d.ts} +3 -3
  23. package/module/dist/frontend/node/index.d.ts.map +1 -0
  24. package/module/dist/frontend/node/io/default_input_renderer.d.ts +12 -0
  25. package/module/dist/frontend/node/io/default_input_renderer.d.ts.map +1 -0
  26. package/module/dist/frontend/node/io/default_output_render.d.ts +7 -0
  27. package/module/dist/frontend/node/io/default_output_render.d.ts.map +1 -0
  28. package/module/dist/frontend/node/io/handle_renderer.d.ts +6 -0
  29. package/module/dist/frontend/node/io/handle_renderer.d.ts.map +1 -0
  30. package/module/{src/frontend/node/io/index.tsx → dist/frontend/node/io/index.d.ts} +4 -4
  31. package/module/dist/frontend/node/io/index.d.ts.map +1 -0
  32. package/module/dist/frontend/node/io/io.d.ts +17 -0
  33. package/module/dist/frontend/node/io/io.d.ts.map +1 -0
  34. package/module/dist/frontend/node/io/nodeinput.d.ts +7 -0
  35. package/module/dist/frontend/node/io/nodeinput.d.ts.map +1 -0
  36. package/module/dist/frontend/node/io/nodeoutput.d.ts +7 -0
  37. package/module/dist/frontend/node/io/nodeoutput.d.ts.map +1 -0
  38. package/module/dist/frontend/node/node.d.ts +21 -0
  39. package/module/dist/frontend/node/node.d.ts.map +1 -0
  40. package/module/dist/frontend/utils/colorpicker.d.ts +20 -0
  41. package/module/dist/frontend/utils/colorpicker.d.ts.map +1 -0
  42. package/module/dist/frontend/utils/jsondata.d.ts +7 -0
  43. package/module/dist/frontend/utils/jsondata.d.ts.map +1 -0
  44. package/module/dist/frontend/utils/table.d.ts +12 -0
  45. package/module/dist/frontend/utils/table.d.ts.map +1 -0
  46. package/module/dist/funcnodes/funcnodesworker.d.ts +73 -0
  47. package/module/dist/funcnodes/funcnodesworker.d.ts.map +1 -0
  48. package/module/{src/funcnodes/index.ts → dist/funcnodes/index.d.ts} +5 -4
  49. package/module/dist/funcnodes/index.d.ts.map +1 -0
  50. package/module/dist/funcnodes/websocketworker.d.ts +28 -0
  51. package/module/dist/funcnodes/websocketworker.d.ts.map +1 -0
  52. package/module/dist/funcnodes/workermanager.d.ts +33 -0
  53. package/module/dist/funcnodes/workermanager.d.ts.map +1 -0
  54. package/module/dist/index.d.ts +3 -0
  55. package/module/dist/index.d.ts.map +1 -0
  56. package/module/dist/index.js +4673 -0
  57. package/module/dist/states/edge.d.ts +8 -0
  58. package/module/dist/states/edge.d.ts.map +1 -0
  59. package/module/{src/states/edge.t.ts → dist/states/edge.t.d.ts} +17 -20
  60. package/module/dist/states/edge.t.d.ts.map +1 -0
  61. package/module/dist/states/fnrfzst.d.ts +11 -0
  62. package/module/dist/states/fnrfzst.d.ts.map +1 -0
  63. package/module/dist/states/fnrfzst.t.d.ts +101 -0
  64. package/module/dist/states/fnrfzst.t.d.ts.map +1 -0
  65. package/module/{src/states/index.ts → dist/states/index.d.ts} +8 -7
  66. package/module/dist/states/index.d.ts.map +1 -0
  67. package/module/dist/states/lib.d.ts +4 -0
  68. package/module/dist/states/lib.d.ts.map +1 -0
  69. package/module/dist/states/lib.t.d.ts +25 -0
  70. package/module/dist/states/lib.t.d.ts.map +1 -0
  71. package/module/dist/states/node.d.ts +5 -0
  72. package/module/dist/states/node.d.ts.map +1 -0
  73. package/module/{src/states/node.t.ts → dist/states/node.t.d.ts} +74 -98
  74. package/module/dist/states/node.t.d.ts.map +1 -0
  75. package/module/dist/states/nodeio.t.d.ts +68 -0
  76. package/module/dist/states/nodeio.t.d.ts.map +1 -0
  77. package/module/dist/states/nodespace.d.ts +4 -0
  78. package/module/dist/states/nodespace.d.ts.map +1 -0
  79. package/module/dist/states/nodespace.t.d.ts +17 -0
  80. package/module/dist/states/nodespace.t.d.ts.map +1 -0
  81. package/module/dist/states/reactflow.d.ts +9 -0
  82. package/module/dist/states/reactflow.d.ts.map +1 -0
  83. package/module/dist/states/reactflow.t.d.ts +12 -0
  84. package/module/dist/states/reactflow.t.d.ts.map +1 -0
  85. package/module/{src/types/rendering.t.ts → dist/types/rendering.t.d.ts} +11 -13
  86. package/module/dist/types/rendering.t.d.ts.map +1 -0
  87. package/module/{src/utils/index.ts → dist/utils/index.d.ts} +4 -4
  88. package/module/dist/utils/index.d.ts.map +1 -0
  89. package/module/dist/utils/objects.d.ts +20 -0
  90. package/module/dist/utils/objects.d.ts.map +1 -0
  91. package/package.json +32 -23
  92. package/app/public/favicon.ico +0 -0
  93. package/app/public/index.html +0 -43
  94. package/app/public/logo192.png +0 -0
  95. package/app/public/logo512.png +0 -0
  96. package/app/public/manifest.json +0 -25
  97. package/app/public/robots.txt +0 -3
  98. package/app/public/worker_manager +0 -1
  99. package/app/src/App.css +0 -38
  100. package/app/src/App.test.tsx +0 -9
  101. package/app/src/App.tsx +0 -22
  102. package/app/src/index.css +0 -13
  103. package/app/src/index.tsx +0 -19
  104. package/app/src/react-app-env.d.ts +0 -1
  105. package/app/src/reportWebVitals.ts +0 -15
  106. package/app/src/setupTests.ts +0 -5
  107. package/app/tsconfig.app.json +0 -10
  108. package/app/webpack.config.js +0 -143
  109. package/module/src/frontend/datarenderer/images.tsx +0 -28
  110. package/module/src/frontend/datarenderer/index.tsx +0 -54
  111. package/module/src/frontend/datarenderer/plotly.tsx +0 -82
  112. package/module/src/frontend/dialog.scss +0 -88
  113. package/module/src/frontend/dialog.tsx +0 -71
  114. package/module/src/frontend/edge.scss +0 -15
  115. package/module/src/frontend/edge.tsx +0 -32
  116. package/module/src/frontend/funcnodesreactflow/funcnodesreactflow.scss +0 -63
  117. package/module/src/frontend/funcnodesreactflow/index.tsx +0 -68
  118. package/module/src/frontend/funcnodesreactflow/react_flow_layer.tsx +0 -212
  119. package/module/src/frontend/header/header.scss +0 -48
  120. package/module/src/frontend/header/index.tsx +0 -269
  121. package/module/src/frontend/index.tsx +0 -4
  122. package/module/src/frontend/layout/htmlelements.scss +0 -63
  123. package/module/src/frontend/lib.scss +0 -157
  124. package/module/src/frontend/lib.tsx +0 -199
  125. package/module/src/frontend/node/io/default_input_renderer.tsx +0 -329
  126. package/module/src/frontend/node/io/default_output_render.tsx +0 -25
  127. package/module/src/frontend/node/io/handle_renderer.tsx +0 -94
  128. package/module/src/frontend/node/io/io.scss +0 -91
  129. package/module/src/frontend/node/io/io.tsx +0 -115
  130. package/module/src/frontend/node/io/nodeinput.tsx +0 -127
  131. package/module/src/frontend/node/io/nodeoutput.tsx +0 -43
  132. package/module/src/frontend/node/node.scss +0 -265
  133. package/module/src/frontend/node/node.tsx +0 -209
  134. package/module/src/frontend/utils/colorpicker.scss +0 -37
  135. package/module/src/frontend/utils/colorpicker.tsx +0 -342
  136. package/module/src/frontend/utils/jsondata.tsx +0 -19
  137. package/module/src/frontend/utils/table.scss +0 -22
  138. package/module/src/frontend/utils/table.tsx +0 -160
  139. package/module/src/funcnodes/funcnodesworker.ts +0 -456
  140. package/module/src/funcnodes/websocketworker.ts +0 -152
  141. package/module/src/funcnodes/workermanager.ts +0 -233
  142. package/module/src/index.tsx +0 -4
  143. package/module/src/states/edge.ts +0 -15
  144. package/module/src/states/fnrfzst.t.ts +0 -117
  145. package/module/src/states/fnrfzst.ts +0 -415
  146. package/module/src/states/lib.t.ts +0 -30
  147. package/module/src/states/lib.ts +0 -16
  148. package/module/src/states/node.ts +0 -46
  149. package/module/src/states/nodeio.t.ts +0 -103
  150. package/module/src/states/nodespace.t.ts +0 -57
  151. package/module/src/states/nodespace.ts +0 -90
  152. package/module/src/states/reactflow.t.ts +0 -27
  153. package/module/src/states/reactflow.ts +0 -49
  154. package/module/src/types/funcnodesreactflow.d.ts +0 -1
  155. package/module/src/utils/objects.ts +0 -131
  156. package/module/tsconfig.module.json +0 -15
  157. package/module/webpack.config.js +0 -140
  158. package/tsconfig.json +0 -18
@@ -1,88 +0,0 @@
1
- .dialogoverlay {
2
- background-color: rgba(0, 0, 0, 0.5);
3
- position: fixed;
4
- inset: 0;
5
- animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1);
6
- }
7
-
8
- .dialogconent {
9
- background-color: var(--funcnodesbackground1);
10
- border-radius: 6px;
11
- box-shadow: var(--funheadercolor) 0px 10px 38px -10px,
12
- var(--funheadercolor) 0px 10px 20px -15px;
13
- position: fixed;
14
- top: 50%;
15
- left: 50%;
16
- transform: translate(-50%, -50%);
17
- width: 90vw;
18
- max-width: 85vh;
19
- max-height: 85vh;
20
- padding: 25px;
21
- animation: contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1);
22
- color: var(--funcnodestextcolor1);
23
- border: 1px solid var(--funheadercolor);
24
- display: flex;
25
- flex-direction: column;
26
- }
27
-
28
- .dialogtitle {
29
- margin: 0;
30
- font-weight: 500;
31
- color: var(--funheadercolor);
32
- font-size: 17px;
33
- }
34
-
35
- .dialogdescription {
36
- margin: 10px 0 20px;
37
- font-size: 15px;
38
- line-height: 1.5;
39
- }
40
-
41
- .dialogclosebutton {
42
- border-radius: 100%;
43
- height: 25px;
44
- width: 25px;
45
- display: inline-flex;
46
- background-color: inherit;
47
- align-items: center;
48
- justify-content: center;
49
- color: var(--funheadercolor);
50
- position: absolute;
51
- top: 10px;
52
- right: 10px;
53
- border: none;
54
-
55
- &:hover {
56
- background-color: var(--funheadercolor);
57
- color: var(--funcnodesbackground1);
58
- }
59
- &:active {
60
- background-color: var(--funheadercolor);
61
- color: var(--funcnodestextcolor1);
62
- }
63
- }
64
-
65
- .dialogsendbutton {
66
- background-color: var(--funcnodesbackground1);
67
- color: var(--funheadercolor);
68
- border: 1px solid var(--funheadercolor);
69
- border-radius: 99rem;
70
- padding: 10px 20px;
71
- cursor: pointer;
72
- font-size: 15px;
73
- margin-top: 20px;
74
-
75
- &:hover {
76
- background-color: var(--funheadercolor);
77
- color: var(--funcnodesbackground1);
78
- }
79
- &:active {
80
- background-color: var(--funheadercolor);
81
- color: var(--funcnodestextcolor1);
82
- }
83
- }
84
-
85
- .dialogchildren {
86
- margin-top: 20px;
87
- overflow: auto;
88
- }
@@ -1,71 +0,0 @@
1
- import React from "react";
2
- import * as Dialog from "@radix-ui/react-dialog";
3
- import CloseIcon from "@mui/icons-material/Close";
4
- import "./dialog.scss";
5
- interface CustomDialogProps {
6
- trigger?: React.ReactNode;
7
- title?: string;
8
- description?: string | React.ReactNode;
9
- children: React.ReactNode;
10
- closebutton?: boolean;
11
- onOpenChange?: (open: boolean) => void;
12
- buttons?: {
13
- text: string;
14
- onClick: () => void;
15
- }[];
16
- }
17
- const CustomDialog = ({
18
- trigger,
19
- title,
20
- description,
21
- children,
22
- closebutton = true,
23
- onOpenChange,
24
-
25
- buttons = [],
26
- }: CustomDialogProps) => {
27
- return (
28
- <Dialog.Root onOpenChange={onOpenChange}>
29
- {trigger && <Dialog.Trigger asChild>{trigger}</Dialog.Trigger>}
30
- <Dialog.Portal>
31
- <Dialog.Overlay className="dialogoverlay" />
32
- <Dialog.Content className="dialogconent">
33
- {title && (
34
- <Dialog.Title className="dialogtitle">{title}</Dialog.Title>
35
- )}
36
- {description && (
37
- <Dialog.Description className="dialogdescription">
38
- {description}
39
- </Dialog.Description>
40
- )}
41
- <div className="dialogchildren">{children}</div>
42
- <div
43
- style={{
44
- display: "flex",
45
- marginTop: 25,
46
- justifyContent: "flex-end",
47
- }}
48
- >
49
- {(buttons || []).map((button, index) => (
50
- <Dialog.Close asChild key={index}>
51
- <button className="dialogsendbutton" onClick={button.onClick}>
52
- {button.text}
53
- </button>
54
- </Dialog.Close>
55
- ))}
56
- </div>
57
- {closebutton && (
58
- <Dialog.Close asChild>
59
- <button className="dialogclosebutton" aria-label="Close">
60
- <CloseIcon />
61
- </button>
62
- </Dialog.Close>
63
- )}
64
- </Dialog.Content>
65
- </Dialog.Portal>
66
- </Dialog.Root>
67
- );
68
- };
69
-
70
- export default CustomDialog;
71
- export type { CustomDialogProps };
@@ -1,15 +0,0 @@
1
- :root {
2
- --funcnodesedgecolor: #7bb3ec;
3
- }
4
- .funcnodes-edge {
5
- & .react-flow__edge-path {
6
- stroke: var(--funcnodesedgecolor);
7
- stroke-width: 2px;
8
- }
9
-
10
- &.selected {
11
- & .react-flow__edge-path {
12
- stroke: #11ff00;
13
- }
14
- }
15
- }
@@ -1,32 +0,0 @@
1
- import { EdgeProps, getBezierPath, BaseEdge } from "reactflow";
2
- import "./edge.scss";
3
- import React from "react";
4
-
5
- const DefaultEdge = ({
6
- id,
7
- sourceX,
8
- sourceY,
9
- targetX,
10
- targetY,
11
- sourcePosition,
12
- targetPosition,
13
- data,
14
- ...props
15
- }: EdgeProps) => {
16
- const [edgePath, labelX, labelY] = getBezierPath({
17
- sourceX,
18
- sourceY,
19
- sourcePosition,
20
- targetX,
21
- targetY,
22
- targetPosition,
23
- });
24
-
25
- return (
26
- <>
27
- <BaseEdge id={id} path={edgePath} {...props} />
28
- </>
29
- );
30
- };
31
-
32
- export default DefaultEdge;
@@ -1,63 +0,0 @@
1
- @import "../layout/htmlelements.scss";
2
- :root {
3
- --funheadercolor: #00d9ff; // Dark background color
4
- --funcnodesbackground1: hsl(243, 26%, 13%); // Dark background color
5
- --funcnodesbackground2: hsl(245, 22%, 22%); // Dark background color
6
- --funcnodesbackground_light: hsl(240, 22%, 38%);
7
- --containerboarderradius: 1rem;
8
- --funcnodestextcolor1: #ffffff; // Dark background color
9
- }
10
-
11
- .funcnodesreactflowcontainer {
12
- width: 100%;
13
- height: 100%;
14
- background-color: var(--funcnodesbackground1); // Dark background color
15
- position: relative;
16
- display: flex;
17
- flex-direction: column;
18
- color: var(--funcnodestextcolor1);
19
-
20
- & * {
21
- box-sizing: border-box;
22
- }
23
- }
24
-
25
- .funcnodesreactflowbody {
26
- flex-grow: 1;
27
- position: relative;
28
- display: flex;
29
- flex-direction: row;
30
- overflow: hidden;
31
- }
32
-
33
- .reactflowlayer {
34
- flex-grow: 1;
35
- position: relative;
36
- overflow: hidden;
37
- background-color: var(--funcnodesbackground2); // Dark background color
38
- margin: 0.5rem;
39
- border-radius: var(--containerboarderradius);
40
- }
41
-
42
- .vscrollcontainer {
43
- overflow-y: auto;
44
- overflow-x: hidden;
45
- flex-grow: 1;
46
- padding: 0.5rem;
47
- box-sizing: border-box;
48
- }
49
-
50
- .workerselect {
51
- max-width: 140px;
52
- }
53
- .workerselectoption {
54
- &.selected {
55
- color: var(--funcnodestextcolor1);
56
- }
57
- &.active {
58
- color: green;
59
- }
60
- &.inactive {
61
- color: red;
62
- }
63
- }
@@ -1,68 +0,0 @@
1
- import { createContext, useEffect, useState } from "react";
2
- import FuncNodesWorker from "../../funcnodes/funcnodesworker";
3
- import FuncNodesReactFlowZustand from "../../states/fnrfzst";
4
- import React from "react";
5
- import { WorkerManager } from "../../funcnodes";
6
-
7
- import FuncnodesHeader from "../header";
8
- import Library from "../lib";
9
- import ReactFlowLayer from "./react_flow_layer";
10
- import { FuncNodesReactFlowZustandInterface } from "../../states/fnrfzst.t";
11
-
12
- const FuncNodesContext = createContext<FuncNodesReactFlowZustandInterface>(
13
- FuncNodesReactFlowZustand()
14
- );
15
-
16
- const InnerFuncnodesReactFlow = ({
17
- fnrf_zst,
18
- }: {
19
- fnrf_zst: FuncNodesReactFlowZustandInterface;
20
- }) => {
21
- const [workermanageruri, setWorkermanageruri] = useState<string>("");
22
- const [worker, setWorker] = useState<FuncNodesWorker | undefined>(undefined);
23
-
24
- useEffect(() => {
25
- async function fetch_worker_manager() {
26
- let response = await fetch("/worker_manager");
27
- let workerewsuri = await response.text();
28
- setWorkermanageruri(workerewsuri);
29
- }
30
- fetch_worker_manager();
31
- }, []);
32
-
33
- useEffect(() => {
34
- if (workermanageruri) {
35
- const workermanager = new WorkerManager(workermanageruri, fnrf_zst);
36
- workermanager.on_setWorker = setWorker;
37
- fnrf_zst.workermanager = workermanager;
38
- }
39
- }, [workermanageruri]);
40
-
41
- fnrf_zst.worker = worker;
42
- // const worker = new WebSocketWorker("ws://localhost:9382", fnrf_zst);
43
- // fnrf_zst.worker = worker;
44
-
45
- return (
46
- <FuncNodesContext.Provider value={fnrf_zst}>
47
- <div className="funcnodesreactflowcontainer">
48
- <FuncnodesHeader></FuncnodesHeader>
49
-
50
- <div className="funcnodesreactflowbody">
51
- <Library></Library>
52
- <ReactFlowLayer></ReactFlowLayer>
53
- </div>
54
- </div>
55
- </FuncNodesContext.Provider>
56
- );
57
- };
58
-
59
- const FuncnodesReactFlow = () => {
60
- const fnrf_zst = FuncNodesReactFlowZustand();
61
-
62
- // @ts-ignore
63
- window.fnrf_zst = fnrf_zst; // For debugging
64
- return <InnerFuncnodesReactFlow fnrf_zst={fnrf_zst} />;
65
- };
66
-
67
- export default FuncnodesReactFlow;
68
- export { FuncNodesContext };
@@ -1,212 +0,0 @@
1
- import React, {
2
- useCallback,
3
- useContext,
4
- useEffect,
5
- useRef,
6
- useState,
7
- } from "react";
8
-
9
- import ReactFlow, {
10
- Background,
11
- EdgeTypes,
12
- MiniMap,
13
- Node,
14
- NodeTypes,
15
- useEdges,
16
- useKeyPress,
17
- useNodes,
18
- useReactFlow,
19
- } from "reactflow";
20
- import { FuncNodesContext } from "..";
21
- import { useShallow } from "zustand/react/shallow";
22
- import { RFState } from "../../states/reactflow.t";
23
- import DefaultNode from "../node";
24
- import DefaultEdge from "../edge";
25
- import { NodeType } from "../../states/node.t";
26
- import { FuncNodesReactFlowZustandInterface } from "../../states/fnrfzst.t";
27
- import "reactflow/dist/style.css";
28
- import "./funcnodesreactflow.scss";
29
-
30
- const selector = (state: RFState) => ({
31
- nodes: state.nodes,
32
- edges: state.edges,
33
- onNodesChange: state.onNodesChange,
34
- onEdgesChange: state.onEdgesChange,
35
- onConnect: state.onConnect,
36
- });
37
-
38
- const nodeTypes: NodeTypes = { default: DefaultNode };
39
-
40
- const edgeTypes: EdgeTypes = {
41
- default: DefaultEdge,
42
- };
43
-
44
- const ReactFlowManager = () => {
45
- const rfinstance = useReactFlow();
46
- const fnrf_zst = useContext(FuncNodesContext);
47
- fnrf_zst.rf_instance = rfinstance;
48
- return <></>;
49
- };
50
-
51
- const KeyHandler = () => {
52
- const fnrf_zst = useContext(FuncNodesContext);
53
- const delPressed = useKeyPress("Delete");
54
- const edges = useEdges();
55
- const nodes = useNodes();
56
- if (delPressed) {
57
- for (const edge of edges) {
58
- if (edge.selected) {
59
- if (!fnrf_zst.worker) return <></>;
60
- if (!edge.source || !edge.target) return <></>;
61
- if (!edge.sourceHandle || !edge.targetHandle) return <></>;
62
- fnrf_zst.worker?.remove_edge({
63
- src_nid: edge.source,
64
- src_ioid: edge.sourceHandle,
65
- trg_nid: edge.target,
66
- trg_ioid: edge.targetHandle,
67
- });
68
- }
69
- }
70
- for (const node of nodes) {
71
- if (node.selected) {
72
- if (!fnrf_zst.worker) return <></>;
73
- fnrf_zst.worker.remove_node(node.id);
74
- }
75
- }
76
- }
77
-
78
- return <></>;
79
- };
80
-
81
- type ContextMenuProps = {
82
- id: string;
83
- top?: number;
84
- left?: number;
85
- right?: number;
86
- bottom?: number;
87
- onClick?: () => void;
88
- };
89
-
90
- const ContextMenu = ({
91
- id,
92
- top,
93
- left,
94
- right,
95
- bottom,
96
- ...props
97
- }: ContextMenuProps) => {
98
- const { getNode, setNodes, addNodes, setEdges } = useReactFlow();
99
-
100
- const fnrf_zst = useContext(FuncNodesContext);
101
-
102
- const duplicateNode = useCallback(() => {
103
- const rfnode = getNode(id);
104
- if (!rfnode) return;
105
- const position = {
106
- x: rfnode.position.x + 50,
107
- y: rfnode.position.y + 50,
108
- };
109
-
110
- addNodes({ ...rfnode, id: `${rfnode.id}-copy`, position });
111
- }, [id, getNode, addNodes]);
112
-
113
- const deleteNode = useCallback(() => {
114
- fnrf_zst.on_node_action({ type: "delete", id, from_remote: false });
115
- }, [id, setNodes, setEdges]);
116
-
117
- const nodestore = fnrf_zst.nodespace.get_node(id, false);
118
- if (!nodestore) return <> </>;
119
- const node: NodeType = nodestore();
120
-
121
- return (
122
- <div
123
- style={{ top, left, right, bottom }}
124
- className="context-menu"
125
- {...props}
126
- >
127
- <p style={{ fontWeight: "bold" }}>
128
- <small>{node.name}</small>
129
- </p>
130
- <button onClick={duplicateNode}>duplicate</button>
131
- <button onClick={deleteNode}>delete</button>
132
- </div>
133
- );
134
- };
135
-
136
- const ReactFlowLayer = () => {
137
- const fnrf_zst: FuncNodesReactFlowZustandInterface =
138
- useContext(FuncNodesContext);
139
-
140
- const reactflowRef = useRef<HTMLDivElement>(null);
141
-
142
- useEffect(() => {
143
- fnrf_zst.reactflowRef = reactflowRef.current;
144
- }, [reactflowRef]);
145
-
146
- const [menu, setMenu] = useState<ContextMenuProps | null>(null);
147
-
148
- const onNodeContextMenu = useCallback(
149
- (event: React.MouseEvent, node: Node) => {
150
- if (!reactflowRef.current) return;
151
- // Prevent native context menu from showing
152
- event.preventDefault();
153
-
154
- // Calculate position of the context menu. We want to make sure it
155
- // doesn't get positioned off-screen.
156
- const pane = reactflowRef.current.getBoundingClientRect();
157
- const clientX = event.clientX as number;
158
- const clientY = event.clientY as number;
159
- setMenu({
160
- id: node.id,
161
- top: clientY < pane.height - 200 ? clientY : undefined,
162
- left: clientX < pane.width - 200 ? clientX : undefined,
163
- right: clientX >= pane.width - 200 ? pane.width - clientX : undefined,
164
- bottom:
165
- clientY >= pane.height - 200 ? pane.height - clientY : undefined,
166
- });
167
- },
168
- [setMenu]
169
- );
170
- const onPaneClick = useCallback(() => setMenu(null), [setMenu]);
171
-
172
- const { nodes, edges, onNodesChange, onEdgesChange, onConnect } =
173
- fnrf_zst.useReactFlowStore(useShallow(selector));
174
-
175
- return (
176
- <div className="reactflowlayer">
177
- <ReactFlow
178
- nodes={nodes}
179
- edges={edges}
180
- onNodesChange={onNodesChange}
181
- onEdgesChange={onEdgesChange}
182
- onConnect={onConnect}
183
- nodeTypes={nodeTypes}
184
- edgeTypes={edgeTypes}
185
- minZoom={0.1}
186
- maxZoom={2}
187
- fitView
188
- ref={reactflowRef}
189
- // onNodeContextMenu={onNodeContextMenu}
190
- onPaneClick={onPaneClick}
191
- //multiSelectionKeyCode="Control"
192
- >
193
- <ReactFlowManager />
194
- <KeyHandler />
195
- <Background
196
- color="#888" // Color of the grid lines
197
- gap={16} // Distance between grid lines
198
- size={1} // Thickness of the grid lines
199
- />
200
- <MiniMap
201
- nodeStrokeWidth={3}
202
- pannable={true}
203
- zoomable={true}
204
- zoomStep={3}
205
- />
206
- {menu && <ContextMenu onClick={onPaneClick} {...menu} />}
207
- </ReactFlow>
208
- </div>
209
- );
210
- };
211
-
212
- export default ReactFlowLayer;
@@ -1,48 +0,0 @@
1
- .funcnodesreactflowheader {
2
- display: flex;
3
- flex-direction: row;
4
- height: 50px;
5
- justify-content: flex-start;
6
- position: relative;
7
- top: 0;
8
- left: 0;
9
-
10
- .headerelement {
11
- height: 100%;
12
- // center items vertically
13
- display: flex;
14
- align-items: center;
15
- margin: 4px 4px 4px 4px;
16
- position: relative;
17
- white-space: nowrap;
18
- }
19
-
20
- & .statusbar {
21
- width: 250px;
22
- height: 1.5rem;
23
- background-color: var(--funcnodesbackground2);
24
- display: inline-block;
25
- margin: 2px 4px 0px 4px;
26
- position: relative;
27
- border-radius: 0.5rem;
28
- overflow: hidden;
29
-
30
- &-progressbar {
31
- position: absolute;
32
- top: 0;
33
- left: 0;
34
- width: 0;
35
- height: 100%;
36
- background-color: var(--funheadercolor);
37
- display: inline-block;
38
- }
39
- &-message {
40
- position: relative;
41
- top: 0;
42
- left: 0;
43
- font-size: 0.8rem;
44
- color: var(--funheadercolor);
45
- mix-blend-mode: difference;
46
- }
47
- }
48
- }