@hitachivantara/uikit-react-lab 5.9.0 → 5.11.0
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.
- package/dist/cjs/components/Flow/DroppableFlow.cjs +54 -67
- package/dist/cjs/components/Flow/DroppableFlow.cjs.map +1 -1
- package/dist/cjs/components/Flow/Empty/Empty.cjs +19 -0
- package/dist/cjs/components/Flow/Empty/Empty.cjs.map +1 -0
- package/dist/cjs/components/Flow/Empty/Empty.styles.cjs +20 -0
- package/dist/cjs/components/Flow/Empty/Empty.styles.cjs.map +1 -0
- package/dist/cjs/components/Flow/Flow.cjs +2 -15
- package/dist/cjs/components/Flow/Flow.cjs.map +1 -1
- package/dist/cjs/components/Flow/Flow.styles.cjs +2 -2
- package/dist/cjs/components/Flow/FlowContext/FlowContext.cjs +0 -2
- package/dist/cjs/components/Flow/FlowContext/FlowContext.cjs.map +1 -1
- package/dist/cjs/components/Flow/Node/Node.cjs +6 -6
- package/dist/cjs/components/Flow/Node/Node.cjs.map +1 -1
- package/dist/cjs/components/Flow/Sidebar/Sidebar.cjs +40 -21
- package/dist/cjs/components/Flow/Sidebar/Sidebar.cjs.map +1 -1
- package/dist/cjs/components/Flow/Sidebar/SidebarGroup/SidebarGroup.cjs +3 -3
- package/dist/cjs/components/Flow/Sidebar/SidebarGroup/SidebarGroup.cjs.map +1 -1
- package/dist/cjs/components/Flow/Sidebar/SidebarGroup/SidebarGroupItem/DraggableSidebarGroupItem.cjs +12 -4
- package/dist/cjs/components/Flow/Sidebar/SidebarGroup/SidebarGroupItem/DraggableSidebarGroupItem.cjs.map +1 -1
- package/dist/cjs/components/Flow/Sidebar/utils.cjs +4 -3
- package/dist/cjs/components/Flow/Sidebar/utils.cjs.map +1 -1
- package/dist/cjs/components/Flow/base.cjs +16 -0
- package/dist/cjs/components/Flow/base.cjs.map +1 -0
- package/dist/cjs/components/Flow/hooks/useFlowContext.cjs +7 -0
- package/dist/cjs/components/Flow/hooks/useFlowContext.cjs.map +1 -0
- package/dist/cjs/components/Flow/hooks/useFlowNode.cjs +25 -0
- package/dist/cjs/components/Flow/hooks/useFlowNode.cjs.map +1 -0
- package/dist/cjs/index.cjs +6 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/components/Flow/DroppableFlow.js +54 -67
- package/dist/esm/components/Flow/DroppableFlow.js.map +1 -1
- package/dist/esm/components/Flow/Empty/Empty.js +19 -0
- package/dist/esm/components/Flow/Empty/Empty.js.map +1 -0
- package/dist/esm/components/Flow/Empty/Empty.styles.js +20 -0
- package/dist/esm/components/Flow/Empty/Empty.styles.js.map +1 -0
- package/dist/esm/components/Flow/Flow.js +3 -16
- package/dist/esm/components/Flow/Flow.js.map +1 -1
- package/dist/esm/components/Flow/Flow.styles.js +2 -2
- package/dist/esm/components/Flow/FlowContext/FlowContext.js +2 -4
- package/dist/esm/components/Flow/FlowContext/FlowContext.js.map +1 -1
- package/dist/esm/components/Flow/Node/Node.js +5 -5
- package/dist/esm/components/Flow/Node/Node.js.map +1 -1
- package/dist/esm/components/Flow/Sidebar/Sidebar.js +41 -22
- package/dist/esm/components/Flow/Sidebar/Sidebar.js.map +1 -1
- package/dist/esm/components/Flow/Sidebar/SidebarGroup/SidebarGroup.js +2 -2
- package/dist/esm/components/Flow/Sidebar/SidebarGroup/SidebarGroup.js.map +1 -1
- package/dist/esm/components/Flow/Sidebar/SidebarGroup/SidebarGroupItem/DraggableSidebarGroupItem.js +12 -4
- package/dist/esm/components/Flow/Sidebar/SidebarGroup/SidebarGroupItem/DraggableSidebarGroupItem.js.map +1 -1
- package/dist/esm/components/Flow/Sidebar/utils.js +4 -3
- package/dist/esm/components/Flow/Sidebar/utils.js.map +1 -1
- package/dist/esm/components/Flow/base.js +16 -0
- package/dist/esm/components/Flow/base.js.map +1 -0
- package/dist/esm/components/Flow/hooks/useFlowContext.js +7 -0
- package/dist/esm/components/Flow/hooks/useFlowContext.js.map +1 -0
- package/dist/esm/components/Flow/hooks/useFlowNode.js +25 -0
- package/dist/esm/components/Flow/hooks/useFlowNode.js.map +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/types/index.d.ts +39 -16
- package/package.json +4 -4
|
@@ -3,45 +3,43 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const jsxRuntime = require("@emotion/react/jsx-runtime");
|
|
4
4
|
const React = require("react");
|
|
5
5
|
const ReactFlow = require("reactflow");
|
|
6
|
-
require("
|
|
6
|
+
const react = require("@emotion/react");
|
|
7
7
|
const core = require("@dnd-kit/core");
|
|
8
8
|
const uid = require("uid");
|
|
9
9
|
const uikitReactCore = require("@hitachivantara/uikit-react-core");
|
|
10
10
|
const Flow_styles = require("./Flow.styles.cjs");
|
|
11
|
-
const
|
|
11
|
+
const base = require("./base.cjs");
|
|
12
|
+
const useFlowContext = require("./hooks/useFlowContext.cjs");
|
|
12
13
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
13
14
|
const ReactFlow__default = /* @__PURE__ */ _interopDefault(ReactFlow);
|
|
14
15
|
const getNode = (nodes, nodeId) => {
|
|
15
16
|
return nodes.find((n) => n.id === nodeId);
|
|
16
17
|
};
|
|
18
|
+
const validateEdge = (nodes, edge, nodeTypes) => {
|
|
19
|
+
var _a, _b, _c, _d, _e, _f;
|
|
20
|
+
if (!edge.sourceHandle || !edge.targetHandle)
|
|
21
|
+
return false;
|
|
22
|
+
const sourceNode = getNode(nodes, edge.source);
|
|
23
|
+
const targetNode = getNode(nodes, edge.target);
|
|
24
|
+
if (!sourceNode || !targetNode)
|
|
25
|
+
return false;
|
|
26
|
+
const sourceType = sourceNode.type;
|
|
27
|
+
const targetType = targetNode.type;
|
|
28
|
+
if (!sourceType || !targetType)
|
|
29
|
+
return false;
|
|
30
|
+
const inputs = ((_b = (_a = nodeTypes == null ? void 0 : nodeTypes[targetType]) == null ? void 0 : _a.meta) == null ? void 0 : _b.inputs) || [];
|
|
31
|
+
const outputs = ((_d = (_c = nodeTypes == null ? void 0 : nodeTypes[sourceType]) == null ? void 0 : _c.meta) == null ? void 0 : _d.outputs) || [];
|
|
32
|
+
const sourceProvides = ((_e = outputs[edge.sourceHandle]) == null ? void 0 : _e.provides) || "";
|
|
33
|
+
const targetAccepts = ((_f = inputs[edge.targetHandle]) == null ? void 0 : _f.accepts) || [];
|
|
34
|
+
const isValid = targetAccepts.includes(sourceProvides);
|
|
35
|
+
return isValid;
|
|
36
|
+
};
|
|
17
37
|
const validateEdges = (edges, nodes, nodeTypes) => {
|
|
18
38
|
if (edges) {
|
|
19
39
|
const validEdges = [];
|
|
20
40
|
edges.forEach((edge) => {
|
|
21
|
-
|
|
22
|
-
if (
|
|
23
|
-
return [];
|
|
24
|
-
const sourceNode = getNode(nodes, edge.source);
|
|
25
|
-
const targetNode = getNode(nodes, edge.target);
|
|
26
|
-
if (!sourceNode || !targetNode)
|
|
27
|
-
return [];
|
|
28
|
-
const sourceType = sourceNode.type;
|
|
29
|
-
const targetType = targetNode.type;
|
|
30
|
-
if (!sourceType || !targetType)
|
|
31
|
-
return [];
|
|
32
|
-
const output = (_c = (_b = (_a = nodeTypes == null ? void 0 : nodeTypes[sourceType]) == null ? void 0 : _a.meta) == null ? void 0 : _b.outputs) == null ? void 0 : _c[edge.sourceHandle];
|
|
33
|
-
const input = (_f = (_e = (_d = nodeTypes == null ? void 0 : nodeTypes[targetType]) == null ? void 0 : _d.meta) == null ? void 0 : _e.inputs) == null ? void 0 : _f[edge.targetHandle];
|
|
34
|
-
const sourceProvides = (output == null ? void 0 : output.provides) || [];
|
|
35
|
-
const targetAccepts = (input == null ? void 0 : input.accepts) || [];
|
|
36
|
-
let isValid = false;
|
|
37
|
-
sourceProvides.forEach((s) => {
|
|
38
|
-
targetAccepts.forEach((t) => {
|
|
39
|
-
if (s === t) {
|
|
40
|
-
isValid = true;
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
if (isValid) {
|
|
41
|
+
const isValidEdge = validateEdge(nodes, edge, nodeTypes);
|
|
42
|
+
if (isValidEdge) {
|
|
45
43
|
validEdges.push(edge);
|
|
46
44
|
}
|
|
47
45
|
});
|
|
@@ -60,6 +58,7 @@ const HvDroppableFlow = ({
|
|
|
60
58
|
onConnect: onConnectProp,
|
|
61
59
|
onNodesChange: onNodesChangeProp,
|
|
62
60
|
onEdgesChange: onEdgesChangeProp,
|
|
61
|
+
defaultEdgeOptions: defaultEdgeOptionsProp,
|
|
63
62
|
...others
|
|
64
63
|
}) => {
|
|
65
64
|
const {
|
|
@@ -70,7 +69,7 @@ const HvDroppableFlow = ({
|
|
|
70
69
|
const reactFlowInstance = ReactFlow.useReactFlow();
|
|
71
70
|
const {
|
|
72
71
|
nodeTypes
|
|
73
|
-
} =
|
|
72
|
+
} = useFlowContext.useFlowContext();
|
|
74
73
|
const [nodes, setNodes] = React.useState(initialNodes);
|
|
75
74
|
const [edges, setEdges] = React.useState(initialEdges);
|
|
76
75
|
const {
|
|
@@ -79,22 +78,27 @@ const HvDroppableFlow = ({
|
|
|
79
78
|
id: elementId
|
|
80
79
|
});
|
|
81
80
|
const handleDragEnd = React.useCallback((event) => {
|
|
82
|
-
var _a, _b, _c, _d;
|
|
81
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
83
82
|
if (event.over && event.over.id === elementId) {
|
|
84
|
-
const type = event.active.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
83
|
+
const type = (_b = (_a = event.active.data.current) == null ? void 0 : _a.hvFlow) == null ? void 0 : _b.type;
|
|
84
|
+
if (type && (nodeTypes == null ? void 0 : nodeTypes[type])) {
|
|
85
|
+
const position = reactFlowInstance.project({
|
|
86
|
+
x: (((_d = (_c = event.active.data.current) == null ? void 0 : _c.hvFlow) == null ? void 0 : _d.x) || 0) - event.over.rect.left,
|
|
87
|
+
y: (((_f = (_e = event.active.data.current) == null ? void 0 : _e.hvFlow) == null ? void 0 : _f.y) || 0) - event.over.rect.top
|
|
88
|
+
});
|
|
89
|
+
const data = ((_h = (_g = event.active.data.current) == null ? void 0 : _g.hvFlow) == null ? void 0 : _h.data) || {};
|
|
90
|
+
const newNode = {
|
|
91
|
+
id: uid.uid(),
|
|
92
|
+
position,
|
|
93
|
+
data,
|
|
94
|
+
type
|
|
95
|
+
};
|
|
96
|
+
setNodes((nds) => nds.concat(newNode));
|
|
97
|
+
} else {
|
|
98
|
+
console.error(`Could not add node to the flow because of unknown type ${type}. Use nodeTypes to define all the node types.`);
|
|
99
|
+
}
|
|
96
100
|
}
|
|
97
|
-
}, [elementId,
|
|
101
|
+
}, [elementId, nodeTypes, reactFlowInstance]);
|
|
98
102
|
core.useDndMonitor({
|
|
99
103
|
onDragEnd: handleDragEnd
|
|
100
104
|
});
|
|
@@ -123,39 +127,22 @@ const HvDroppableFlow = ({
|
|
|
123
127
|
onEdgesChangeProp == null ? void 0 : onEdgesChangeProp(changes);
|
|
124
128
|
}, [edges, handleFlowChange, nodes, onEdgesChangeProp]);
|
|
125
129
|
const isValidConnection = (connection) => {
|
|
126
|
-
|
|
127
|
-
const sourceNode = getNode(nodes, connection.source);
|
|
128
|
-
const targetNode = getNode(nodes, connection.target);
|
|
129
|
-
if (!sourceNode || !targetNode) {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
const sourceType = sourceNode.type;
|
|
133
|
-
const targetType = targetNode.type;
|
|
134
|
-
if (!sourceType || !targetType) {
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
const inputs = ((_b = (_a = nodeTypes == null ? void 0 : nodeTypes[targetType]) == null ? void 0 : _a.meta) == null ? void 0 : _b.inputs) || [];
|
|
138
|
-
const outputs = ((_d = (_c = nodeTypes == null ? void 0 : nodeTypes[sourceType]) == null ? void 0 : _c.meta) == null ? void 0 : _d.outputs) || [];
|
|
139
|
-
const sourceProvides = ((_e = outputs[connection.sourceHandle]) == null ? void 0 : _e.provides) || [];
|
|
140
|
-
const targetAccepts = ((_f = inputs[connection.targetHandle]) == null ? void 0 : _f.accepts) || [];
|
|
141
|
-
let isValid = false;
|
|
142
|
-
sourceProvides.forEach((s) => {
|
|
143
|
-
targetAccepts.forEach((t) => {
|
|
144
|
-
if (s === t) {
|
|
145
|
-
isValid = true;
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
});
|
|
130
|
+
const isValid = validateEdge(nodes, connection, nodeTypes);
|
|
149
131
|
return isValid;
|
|
150
132
|
};
|
|
151
133
|
const validEdges = validateEdges(edges, nodes, nodeTypes);
|
|
152
|
-
|
|
134
|
+
const defaultEdgeOptions = {
|
|
153
135
|
markerEnd: {
|
|
154
136
|
type: ReactFlow.MarkerType.ArrowClosed,
|
|
155
137
|
height: 20,
|
|
156
138
|
width: 20
|
|
157
|
-
}
|
|
158
|
-
|
|
139
|
+
},
|
|
140
|
+
...defaultEdgeOptionsProp
|
|
141
|
+
};
|
|
142
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
143
|
+
/* @__PURE__ */ jsxRuntime.jsx(react.Global, { styles: base.flowStyles }),
|
|
144
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { id: elementId, ref: setNodeRef, className: cx(classes.root, className), children: /* @__PURE__ */ jsxRuntime.jsx(ReactFlow__default.default, { nodes, edges: validEdges, nodeTypes, onNodesChange: handleNodesChange, onEdgesChange: handleEdgesChange, onConnect: handleConnect, isValidConnection, defaultEdgeOptions, ...others, children }) })
|
|
145
|
+
] });
|
|
159
146
|
};
|
|
160
147
|
exports.flowClasses = Flow_styles.staticClasses;
|
|
161
148
|
exports.HvDroppableFlow = HvDroppableFlow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DroppableFlow.cjs","sources":["../../../../src/components/Flow/DroppableFlow.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\n\nimport ReactFlow, {\n Connection,\n EdgeChange,\n NodeChange,\n ReactFlowProps,\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n useReactFlow,\n MarkerType,\n Edge,\n Node,\n} from \"reactflow\";\nimport \"reactflow/dist/style.css\";\n\nimport { DragEndEvent, useDndMonitor, useDroppable } from \"@dnd-kit/core\";\n\nimport { uid } from \"uid\";\n\nimport { ExtractNames, useUniqueId } from \"@hitachivantara/uikit-react-core\";\n\nimport { HvFlowNodeTypes } from \"./types\";\nimport { staticClasses, useClasses } from \"./Flow.styles\";\nimport { useFlowContext } from \"./FlowContext\";\n\nexport { staticClasses as flowClasses };\n\nexport type HvFlowClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvDroppableFlowProps<\n NodeData = any,\n NodeType extends string | undefined = string | undefined\n> extends Omit<ReactFlowProps, \"nodes\" | \"edges\" | \"nodeTypes\"> {\n /** Flow content: background, controls, and minimap. */\n children?: React.ReactNode;\n /** Flow nodes. */\n nodes?: Node<NodeData, NodeType>[];\n /** Flow edges. */\n edges?: Edge[];\n /** A Jss Object used to override or extend the styles applied to the component. */\n classes?: HvFlowClasses;\n /** Function called when the flow changes. Returns the updated nodes and edges. */\n onFlowChange?: (nodes: Node<NodeData, NodeType>[], edges: Edge[]) => void;\n}\n\nexport const getNode = (nodes: Node[], nodeId: string) => {\n return nodes.find((n) => n.id === nodeId);\n};\n\nconst validateEdges = (\n edges: Edge[],\n nodes: Node[],\n nodeTypes: HvFlowNodeTypes<string> | undefined\n) => {\n if (edges) {\n const validEdges: Edge[] = [];\n\n edges.forEach((edge) => {\n if (!edge.sourceHandle || !edge.targetHandle) return [];\n\n const sourceNode = getNode(nodes, edge.source);\n const targetNode = getNode(nodes, edge.target);\n\n if (!sourceNode || !targetNode) return [];\n\n const sourceType = sourceNode.type;\n const targetType = targetNode.type;\n\n if (!sourceType || !targetType) return [];\n\n const output =\n nodeTypes?.[sourceType]?.meta?.outputs?.[edge.sourceHandle];\n const input = nodeTypes?.[targetType]?.meta?.inputs?.[edge.targetHandle];\n\n const sourceProvides = output?.provides || [];\n const targetAccepts = input?.accepts || [];\n\n let isValid = false;\n sourceProvides.forEach((s) => {\n targetAccepts.forEach((t) => {\n if (s === t) {\n isValid = true;\n }\n });\n });\n\n if (isValid) {\n validEdges.push(edge);\n }\n });\n\n return validEdges;\n }\n return [];\n};\n\nexport const HvDroppableFlow = ({\n id,\n className,\n children,\n onFlowChange,\n classes: classesProp,\n nodes: initialNodes = [],\n edges: initialEdges = [],\n onConnect: onConnectProp,\n onNodesChange: onNodesChangeProp,\n onEdgesChange: onEdgesChangeProp,\n ...others\n}: HvDroppableFlowProps) => {\n const { classes, cx } = useClasses(classesProp);\n\n const elementId = useUniqueId(id, \"hvFlow\");\n\n const reactFlowInstance = useReactFlow();\n\n const { nodeTypes } = useFlowContext();\n\n const [nodes, setNodes] = useState(initialNodes);\n const [edges, setEdges] = useState(initialEdges);\n\n const { setNodeRef } = useDroppable({\n id: elementId,\n });\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n if (event.over && event.over.id === elementId) {\n const type = event.active.id.toString();\n\n // Converts the coordinates to the react flow coordinate system\n const position = reactFlowInstance.project({\n x: (event.active.data.current?.hvFlow?.x || 0) - event.over.rect.left,\n y: (event.active.data.current?.hvFlow?.y || 0) - event.over.rect.top,\n });\n\n const newNode: Node = {\n id: uid(),\n position,\n data: {},\n type,\n };\n\n setNodes((nds) => nds.concat(newNode));\n }\n },\n [elementId, reactFlowInstance, setNodes]\n );\n\n useDndMonitor({\n onDragEnd: handleDragEnd,\n });\n\n const handleFlowChange = useCallback(\n (\n nds: NonNullable<HvDroppableFlowProps[\"nodes\"]>,\n eds: NonNullable<HvDroppableFlowProps[\"edges\"]>\n ) => {\n // The new flow is returned if the user is not dragging nodes\n // This avoids triggering this handler too many times\n const isDragging = nds.find((node) => node.dragging);\n if (!isDragging) {\n onFlowChange?.(nds, eds);\n }\n },\n [onFlowChange]\n );\n\n const handleConnect = useCallback(\n (connection: Connection) => {\n const eds = addEdge(connection, edges);\n setEdges(eds);\n\n handleFlowChange(nodes, eds);\n onConnectProp?.(connection);\n },\n [edges, handleFlowChange, nodes, onConnectProp]\n );\n\n const handleNodesChange = useCallback(\n (changes: NodeChange[]) => {\n const nds = applyNodeChanges(changes, nodes);\n setNodes(nds);\n\n handleFlowChange(nds, edges);\n onNodesChangeProp?.(changes);\n },\n [edges, handleFlowChange, nodes, onNodesChangeProp]\n );\n\n const handleEdgesChange = useCallback(\n (changes: EdgeChange[]) => {\n const eds = applyEdgeChanges(changes, edges);\n setEdges(eds);\n\n handleFlowChange(nodes, eds);\n onEdgesChangeProp?.(changes);\n },\n [edges, handleFlowChange, nodes, onEdgesChangeProp]\n );\n\n const isValidConnection = (connection) => {\n const sourceNode = getNode(nodes, connection.source);\n const targetNode = getNode(nodes, connection.target);\n\n if (!sourceNode || !targetNode) {\n return false;\n }\n\n const sourceType = sourceNode.type;\n const targetType = targetNode.type;\n\n if (!sourceType || !targetType) {\n return false;\n }\n\n const inputs = nodeTypes?.[targetType]?.meta?.inputs || [];\n const outputs = nodeTypes?.[sourceType]?.meta?.outputs || [];\n\n const sourceProvides = outputs[connection.sourceHandle]?.provides || [];\n const targetAccepts = inputs[connection.targetHandle]?.accepts || [];\n\n let isValid = false;\n sourceProvides.forEach((s) => {\n targetAccepts.forEach((t) => {\n if (s === t) {\n isValid = true;\n }\n });\n });\n\n return isValid;\n };\n\n const validEdges = validateEdges(edges, nodes, nodeTypes);\n\n return (\n <div\n id={elementId}\n ref={setNodeRef}\n className={cx(classes.root, className)}\n >\n <ReactFlow\n nodes={nodes}\n edges={validEdges}\n nodeTypes={nodeTypes}\n onNodesChange={handleNodesChange}\n onEdgesChange={handleEdgesChange}\n onConnect={handleConnect}\n isValidConnection={isValidConnection}\n defaultEdgeOptions={{\n markerEnd: {\n type: MarkerType.ArrowClosed,\n height: 20,\n width: 20,\n },\n }}\n {...others}\n >\n {children}\n </ReactFlow>\n </div>\n );\n};\n"],"names":["getNode","nodes","nodeId","find","n","id","validateEdges","edges","nodeTypes","validEdges","forEach","edge","sourceHandle","targetHandle","sourceNode","source","targetNode","target","sourceType","type","targetType","output","meta","outputs","input","inputs","sourceProvides","provides","targetAccepts","accepts","isValid","s","t","push","HvDroppableFlow","className","children","onFlowChange","classes","classesProp","initialNodes","initialEdges","onConnect","onConnectProp","onNodesChange","onNodesChangeProp","onEdgesChange","onEdgesChangeProp","others","cx","useClasses","elementId","useUniqueId","reactFlowInstance","useReactFlow","useFlowContext","setNodes","useState","setEdges","setNodeRef","useDroppable","handleDragEnd","useCallback","event","over","active","toString","position","project","x","data","current","hvFlow","rect","left","y","top","newNode","uid","nds","concat","useDndMonitor","onDragEnd","handleFlowChange","eds","isDragging","node","dragging","handleConnect","connection","addEdge","handleNodesChange","changes","applyNodeChanges","handleEdgesChange","applyEdgeChanges","isValidConnection","jsx","root","ReactFlow","markerEnd","MarkerType","ArrowClosed","height","width"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DroppableFlow.cjs","sources":["../../../../src/components/Flow/DroppableFlow.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\n\nimport ReactFlow, {\n Connection,\n EdgeChange,\n NodeChange,\n ReactFlowProps,\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n useReactFlow,\n MarkerType,\n Edge,\n Node,\n} from \"reactflow\";\n\nimport { Global } from \"@emotion/react\";\n\nimport { DragEndEvent, useDndMonitor, useDroppable } from \"@dnd-kit/core\";\n\nimport { uid } from \"uid\";\n\nimport { ExtractNames, useUniqueId } from \"@hitachivantara/uikit-react-core\";\n\nimport { HvFlowNodeTypes } from \"./types\";\nimport { staticClasses, useClasses } from \"./Flow.styles\";\nimport { useFlowContext } from \"./hooks\";\nimport { flowStyles } from \"./base\";\n\nexport { staticClasses as flowClasses };\n\nexport type HvFlowClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvDroppableFlowProps<\n NodeType extends string | undefined = string | undefined,\n NodeData = any\n> extends Omit<ReactFlowProps, \"nodes\" | \"edges\" | \"nodeTypes\"> {\n /** Flow content: background, controls, and minimap. */\n children?: React.ReactNode;\n /** Flow nodes. */\n nodes?: Node<NodeData, NodeType>[];\n /** Flow edges. */\n edges?: Edge[];\n /** A Jss Object used to override or extend the styles applied to the component. */\n classes?: HvFlowClasses;\n /** Function called when the flow changes. Returns the updated nodes and edges. */\n onFlowChange?: (nodes: Node<NodeData, NodeType>[], edges: Edge[]) => void;\n}\n\nexport const getNode = (nodes: Node[], nodeId: string) => {\n return nodes.find((n) => n.id === nodeId);\n};\n\nconst validateEdge = (\n nodes: Node[],\n edge: Edge,\n nodeTypes: HvFlowNodeTypes<string> | undefined\n) => {\n if (!edge.sourceHandle || !edge.targetHandle) return false;\n\n const sourceNode = getNode(nodes, edge.source);\n const targetNode = getNode(nodes, edge.target);\n\n if (!sourceNode || !targetNode) return false;\n\n const sourceType = sourceNode.type;\n const targetType = targetNode.type;\n\n if (!sourceType || !targetType) return false;\n\n const inputs = nodeTypes?.[targetType]?.meta?.inputs || [];\n const outputs = nodeTypes?.[sourceType]?.meta?.outputs || [];\n\n const sourceProvides = outputs[edge.sourceHandle]?.provides || \"\";\n const targetAccepts = inputs[edge.targetHandle]?.accepts || [];\n\n const isValid = targetAccepts.includes(sourceProvides);\n return isValid;\n};\n\nconst validateEdges = (\n edges: Edge[],\n nodes: Node[],\n nodeTypes: HvFlowNodeTypes<string> | undefined\n) => {\n if (edges) {\n const validEdges: Edge[] = [];\n\n edges.forEach((edge) => {\n const isValidEdge = validateEdge(nodes, edge, nodeTypes);\n if (isValidEdge) {\n validEdges.push(edge);\n }\n });\n\n return validEdges;\n }\n return [];\n};\n\nexport const HvDroppableFlow = ({\n id,\n className,\n children,\n onFlowChange,\n classes: classesProp,\n nodes: initialNodes = [],\n edges: initialEdges = [],\n onConnect: onConnectProp,\n onNodesChange: onNodesChangeProp,\n onEdgesChange: onEdgesChangeProp,\n defaultEdgeOptions: defaultEdgeOptionsProp,\n ...others\n}: HvDroppableFlowProps) => {\n const { classes, cx } = useClasses(classesProp);\n\n const elementId = useUniqueId(id, \"hvFlow\");\n\n const reactFlowInstance = useReactFlow();\n\n const { nodeTypes } = useFlowContext();\n\n const [nodes, setNodes] = useState(initialNodes);\n const [edges, setEdges] = useState(initialEdges);\n\n const { setNodeRef } = useDroppable({\n id: elementId,\n });\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n if (event.over && event.over.id === elementId) {\n const type = event.active.data.current?.hvFlow?.type;\n\n // Only known node types can be dropped in the canvas\n if (type && nodeTypes?.[type]) {\n // Converts the coordinates to the react flow coordinate system\n const position = reactFlowInstance.project({\n x:\n (event.active.data.current?.hvFlow?.x || 0) -\n event.over.rect.left,\n y:\n (event.active.data.current?.hvFlow?.y || 0) - event.over.rect.top,\n });\n\n // Node data\n const data = event.active.data.current?.hvFlow?.data || {};\n\n const newNode: Node = {\n id: uid(),\n position,\n data,\n type,\n };\n\n setNodes((nds) => nds.concat(newNode));\n } else {\n // eslint-disable-next-line no-console\n console.error(\n `Could not add node to the flow because of unknown type ${type}. Use nodeTypes to define all the node types.`\n );\n }\n }\n },\n [elementId, nodeTypes, reactFlowInstance]\n );\n\n useDndMonitor({\n onDragEnd: handleDragEnd,\n });\n\n const handleFlowChange = useCallback(\n (\n nds: NonNullable<HvDroppableFlowProps[\"nodes\"]>,\n eds: NonNullable<HvDroppableFlowProps[\"edges\"]>\n ) => {\n // The new flow is returned if the user is not dragging nodes\n // This avoids triggering this handler too many times\n const isDragging = nds.find((node) => node.dragging);\n if (!isDragging) {\n onFlowChange?.(nds, eds);\n }\n },\n [onFlowChange]\n );\n\n const handleConnect = useCallback(\n (connection: Connection) => {\n const eds = addEdge(connection, edges);\n setEdges(eds);\n\n handleFlowChange(nodes, eds);\n onConnectProp?.(connection);\n },\n [edges, handleFlowChange, nodes, onConnectProp]\n );\n\n const handleNodesChange = useCallback(\n (changes: NodeChange[]) => {\n const nds = applyNodeChanges(changes, nodes);\n setNodes(nds);\n\n handleFlowChange(nds, edges);\n onNodesChangeProp?.(changes);\n },\n [edges, handleFlowChange, nodes, onNodesChangeProp]\n );\n\n const handleEdgesChange = useCallback(\n (changes: EdgeChange[]) => {\n const eds = applyEdgeChanges(changes, edges);\n setEdges(eds);\n\n handleFlowChange(nodes, eds);\n onEdgesChangeProp?.(changes);\n },\n [edges, handleFlowChange, nodes, onEdgesChangeProp]\n );\n\n const isValidConnection = (connection) => {\n const isValid = validateEdge(nodes, connection, nodeTypes);\n return isValid;\n };\n\n const validEdges = validateEdges(edges, nodes, nodeTypes);\n\n const defaultEdgeOptions = {\n markerEnd: {\n type: MarkerType.ArrowClosed,\n height: 20,\n width: 20,\n },\n ...defaultEdgeOptionsProp,\n };\n\n return (\n <>\n <Global styles={flowStyles} />\n <div\n id={elementId}\n ref={setNodeRef}\n className={cx(classes.root, className)}\n >\n <ReactFlow\n nodes={nodes}\n edges={validEdges}\n nodeTypes={nodeTypes}\n onNodesChange={handleNodesChange}\n onEdgesChange={handleEdgesChange}\n onConnect={handleConnect}\n isValidConnection={isValidConnection}\n defaultEdgeOptions={defaultEdgeOptions}\n {...others}\n >\n {children}\n </ReactFlow>\n </div>\n </>\n );\n};\n"],"names":["getNode","nodes","nodeId","find","n","id","validateEdge","edge","nodeTypes","sourceHandle","targetHandle","sourceNode","source","targetNode","target","sourceType","type","targetType","inputs","meta","outputs","sourceProvides","provides","targetAccepts","accepts","isValid","includes","validateEdges","edges","validEdges","forEach","isValidEdge","push","HvDroppableFlow","className","children","onFlowChange","classes","classesProp","initialNodes","initialEdges","onConnect","onConnectProp","onNodesChange","onNodesChangeProp","onEdgesChange","onEdgesChangeProp","defaultEdgeOptions","defaultEdgeOptionsProp","others","cx","useClasses","elementId","useUniqueId","reactFlowInstance","useReactFlow","useFlowContext","setNodes","useState","setEdges","setNodeRef","useDroppable","handleDragEnd","useCallback","event","over","active","data","current","hvFlow","position","project","x","rect","left","y","top","newNode","uid","nds","concat","error","useDndMonitor","onDragEnd","handleFlowChange","eds","isDragging","node","dragging","handleConnect","connection","addEdge","handleNodesChange","changes","applyNodeChanges","handleEdgesChange","applyEdgeChanges","isValidConnection","markerEnd","MarkerType","ArrowClosed","height","width","jsxs","Fragment","jsx","Global","flowStyles","root","ReactFlow"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("@emotion/react/jsx-runtime");
|
|
4
|
+
const ReactFlow = require("reactflow");
|
|
5
|
+
const uikitReactCore = require("@hitachivantara/uikit-react-core");
|
|
6
|
+
const Empty_styles = require("./Empty.styles.cjs");
|
|
7
|
+
const HvFlowEmpty = ({
|
|
8
|
+
className,
|
|
9
|
+
...others
|
|
10
|
+
}) => {
|
|
11
|
+
const {
|
|
12
|
+
classes,
|
|
13
|
+
cx
|
|
14
|
+
} = Empty_styles.useClasses();
|
|
15
|
+
const nodes = ReactFlow.useStore((state) => state.getNodes());
|
|
16
|
+
return !nodes || (nodes.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(uikitReactCore.HvEmptyState, { className: cx(classes.root, className), ...others }) : null);
|
|
17
|
+
};
|
|
18
|
+
exports.HvFlowEmpty = HvFlowEmpty;
|
|
19
|
+
//# sourceMappingURL=Empty.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Empty.cjs","sources":["../../../../../src/components/Flow/Empty/Empty.tsx"],"sourcesContent":["import { useStore } from \"reactflow\";\nimport {\n HvEmptyState,\n HvEmptyStateProps,\n} from \"@hitachivantara/uikit-react-core\";\nimport { useClasses } from \"./Empty.styles\";\n\nexport interface HvFlowEmptyProps extends HvEmptyStateProps {}\n\nexport const HvFlowEmpty = ({ className, ...others }: HvFlowEmptyProps) => {\n const { classes, cx } = useClasses();\n const nodes = useStore((state) => state.getNodes());\n return (\n !nodes ||\n (nodes.length === 0 ? (\n <HvEmptyState className={cx(classes.root, className)} {...others} />\n ) : null)\n );\n};\n"],"names":["HvFlowEmpty","className","others","classes","cx","useClasses","nodes","useStore","state","getNodes","length","jsx","HvEmptyState","root"],"mappings":";;;;;;AASO,MAAMA,cAAcA,CAAC;AAAA,EAAEC;AAAAA,EAAW,GAAGC;AAAyB,MAAM;AACnE,QAAA;AAAA,IAAEC;AAAAA,IAASC;AAAAA,MAAOC,aAAW,WAAA;AACnC,QAAMC,QAAQC,UAAAA,SAAUC,CAAUA,UAAAA,MAAMC,UAAU;AAClD,SACE,CAACH,UACAA,MAAMI,WAAW,IACfC,2BAAAA,IAAAC,eAAAA,cAAA,EAAa,WAAWR,GAAGD,QAAQU,MAAMZ,SAAS,GAAG,GAAIC,OAAU,CAAA,IAClE;AAER;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const uikitReactCore = require("@hitachivantara/uikit-react-core");
|
|
4
|
+
const {
|
|
5
|
+
staticClasses,
|
|
6
|
+
useClasses
|
|
7
|
+
} = uikitReactCore.createClasses("HvFlowEmpty", {
|
|
8
|
+
root: {
|
|
9
|
+
width: "100%",
|
|
10
|
+
height: "100%",
|
|
11
|
+
alignItems: "center",
|
|
12
|
+
justifyContent: "center",
|
|
13
|
+
backgroundColor: uikitReactCore.theme.colors.backgroundColor,
|
|
14
|
+
position: "absolute",
|
|
15
|
+
zIndex: uikitReactCore.theme.zIndices.popover
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
exports.staticClasses = staticClasses;
|
|
19
|
+
exports.useClasses = useClasses;
|
|
20
|
+
//# sourceMappingURL=Empty.styles.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Empty.styles.cjs","sources":["../../../../../src/components/Flow/Empty/Empty.styles.tsx"],"sourcesContent":["import { createClasses, theme } from \"@hitachivantara/uikit-react-core\";\n\nexport const { staticClasses, useClasses } = createClasses(\"HvFlowEmpty\", {\n root: {\n width: \"100%\",\n height: \"100%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: theme.colors.backgroundColor,\n position: \"absolute\",\n zIndex: theme.zIndices.popover,\n },\n});\n"],"names":["staticClasses","useClasses","createClasses","root","width","height","alignItems","justifyContent","backgroundColor","theme","colors","position","zIndex","zIndices","popover"],"mappings":";;;AAEa,MAAA;AAAA,EAAEA;AAAAA,EAAeC;AAAW,IAAIC,eAAAA,cAAc,eAAe;AAAA,EACxEC,MAAM;AAAA,IACJC,OAAO;AAAA,IACPC,QAAQ;AAAA,IACRC,YAAY;AAAA,IACZC,gBAAgB;AAAA,IAChBC,iBAAiBC,eAAAA,MAAMC,OAAOF;AAAAA,IAC9BG,UAAU;AAAA,IACVC,QAAQH,eAAAA,MAAMI,SAASC;AAAAA,EACzB;AACF,CAAC;;;"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("@emotion/react/jsx-runtime");
|
|
4
|
-
const React = require("react");
|
|
5
4
|
const core = require("@dnd-kit/core");
|
|
6
5
|
const modifiers = require("@dnd-kit/modifiers");
|
|
7
6
|
const ReactFlow = require("reactflow");
|
|
8
7
|
const DroppableFlow = require("./DroppableFlow.cjs");
|
|
9
8
|
const FlowContext = require("./FlowContext/FlowContext.cjs");
|
|
10
|
-
const SidebarGroupItem = require("./Sidebar/SidebarGroup/SidebarGroupItem/SidebarGroupItem.cjs");
|
|
11
9
|
const HvFlow = ({
|
|
12
10
|
nodeTypes,
|
|
13
11
|
nodeGroups,
|
|
@@ -16,21 +14,10 @@ const HvFlow = ({
|
|
|
16
14
|
dndContextProps,
|
|
17
15
|
...others
|
|
18
16
|
}) => {
|
|
19
|
-
const [draggingLabel, setDraggingLabel] = React.useState(void 0);
|
|
20
17
|
const sensors = core.useSensors(core.useSensor(core.PointerSensor), core.useSensor(core.KeyboardSensor));
|
|
21
|
-
|
|
22
|
-
var _a, _b;
|
|
23
|
-
if ((_a = event.active.data.current) == null ? void 0 : _a.hvFlow) {
|
|
24
|
-
setDraggingLabel((_b = event.active.data.current.hvFlow) == null ? void 0 : _b.label);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
const handleDragEnd = () => {
|
|
28
|
-
setDraggingLabel(void 0);
|
|
29
|
-
};
|
|
30
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ReactFlow.ReactFlowProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(FlowContext.HvFlowProvider, { nodeGroups, nodeTypes, defaultActions, children: /* @__PURE__ */ jsxRuntime.jsxs(core.DndContext, { onDragStart: handleDragStart, onDragEnd: handleDragEnd, sensors, modifiers: [modifiers.restrictToWindowEdges], ...dndContextProps, children: [
|
|
18
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ReactFlow.ReactFlowProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(FlowContext.HvFlowProvider, { nodeGroups, nodeTypes, defaultActions, children: /* @__PURE__ */ jsxRuntime.jsxs(core.DndContext, { sensors, modifiers: [modifiers.restrictToWindowEdges], ...dndContextProps, children: [
|
|
31
19
|
/* @__PURE__ */ jsxRuntime.jsx(DroppableFlow.HvDroppableFlow, { ...others }),
|
|
32
|
-
sidebar
|
|
33
|
-
/* @__PURE__ */ jsxRuntime.jsx(core.DragOverlay, { modifiers: [modifiers.restrictToWindowEdges], children: draggingLabel ? /* @__PURE__ */ jsxRuntime.jsx(SidebarGroupItem.HvFlowSidebarGroupItem, { label: draggingLabel, isDragging: true }) : null })
|
|
20
|
+
sidebar
|
|
34
21
|
] }) }) });
|
|
35
22
|
};
|
|
36
23
|
exports.HvFlow = HvFlow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Flow.cjs","sources":["../../../../src/components/Flow/Flow.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"Flow.cjs","sources":["../../../../src/components/Flow/Flow.tsx"],"sourcesContent":["import {\n DndContext,\n DndContextProps,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport { restrictToWindowEdges } from \"@dnd-kit/modifiers\";\n\nimport { ReactFlowProvider } from \"reactflow\";\n\nimport {\n HvFlowDefaultActions,\n HvFlowNodeGroups,\n HvFlowNodeTypes,\n} from \"./types\";\nimport { HvFlowProvider } from \"./FlowContext\";\nimport { HvDroppableFlow, HvDroppableFlowProps } from \"./DroppableFlow\";\n\nexport interface HvFlowProps<\n NodeGroups extends keyof any = string,\n NodeType extends string | undefined = string | undefined,\n NodeData = any\n> extends HvDroppableFlowProps<NodeType, NodeData> {\n /** Flow nodes groups. */\n nodeGroups?: HvFlowNodeGroups<NodeGroups>;\n /** Flow nodes types. */\n nodeTypes?: HvFlowNodeTypes<NodeGroups, NodeData>;\n /** Flow sidebar. */\n sidebar?: React.ReactNode;\n /** Flow default actions. */\n defaultActions?: HvFlowDefaultActions[];\n /**\n * Dnd Kit context props. This should be used for accessibility purposes.\n *\n * More information can be found on the [Dnd Kit documentation](https://docs.dndkit.com/guides/accessibility)\n */\n dndContextProps?: Pick<DndContextProps, \"accessibility\">;\n}\n\n/**\n * Flow component to build interactive node-based UIs.\n *\n * This implementation leverages [React Flow](https://reactflow.dev).\n * The drag and drop functionality leverages [Dnd Kit](https://docs.dndkit.com)\n *\n * DISCLAIMER: This component is a work in progress and there might be breaking changes.\n */\nexport const HvFlow = ({\n nodeTypes,\n nodeGroups,\n sidebar,\n defaultActions,\n dndContextProps,\n ...others\n}: HvFlowProps) => {\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor)\n );\n\n // We're wrapping the main Flow component with the ReactFlowProvider to access the react flow instance.\n // HvFlowContext is our custom internal context.\n return (\n <ReactFlowProvider>\n <HvFlowProvider\n nodeGroups={nodeGroups}\n nodeTypes={nodeTypes}\n defaultActions={defaultActions}\n >\n <DndContext\n sensors={sensors}\n modifiers={[restrictToWindowEdges]}\n {...dndContextProps}\n >\n <HvDroppableFlow {...others} />\n {sidebar}\n </DndContext>\n </HvFlowProvider>\n </ReactFlowProvider>\n );\n};\n"],"names":["HvFlow","nodeTypes","nodeGroups","sidebar","defaultActions","dndContextProps","others","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","jsx","ReactFlowProvider","HvFlowProvider","jsxs","DndContext","restrictToWindowEdges","HvDroppableFlow"],"mappings":";;;;;;;;AAiDO,MAAMA,SAASA,CAAC;AAAA,EACrBC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACA,GAAGC;AACQ,MAAM;AACjB,QAAMC,UAAUC,KAAAA,WACdC,KAAAA,UAAUC,KAAa,aAAA,GACvBD,KAAAA,UAAUE,KAAc,cAAA,CAC1B;AAIA,SACGC,2BAAA,IAAAC,UAAA,mBAAA,EACC,UAACD,2BAAA,IAAAE,4BAAA,EACC,YACA,WACA,gBAEA,UAACC,gCAAAC,KAAAA,YAAA,EACC,SACA,WAAW,CAACC,+BAAqB,GACjC,GAAIZ,iBAEJ,UAAA;AAAA,IAACO,2BAAAA,IAAAM,cAAA,iBAAA,EAAgB,GAAIZ,QAAO;AAAA,IAC3BH;AAAAA,EAAAA,GACH,GACF,EACF,CAAA;AAEJ;;"}
|
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const uikitReactCore = require("@hitachivantara/uikit-react-core");
|
|
4
4
|
const Node_styles = require("./Node/Node.styles.cjs");
|
|
5
5
|
require("@emotion/react/jsx-runtime");
|
|
6
|
-
require("@hitachivantara/uikit-react-icons");
|
|
7
|
-
require("@hitachivantara/uikit-styles");
|
|
8
6
|
require("react");
|
|
9
7
|
require("reactflow");
|
|
8
|
+
require("@hitachivantara/uikit-react-icons");
|
|
9
|
+
require("@hitachivantara/uikit-styles");
|
|
10
10
|
const {
|
|
11
11
|
staticClasses,
|
|
12
12
|
useClasses
|
|
@@ -19,8 +19,6 @@ const HvFlowProvider = ({
|
|
|
19
19
|
}), [nodeTypes, nodeGroups, defaultActions, expandedNodeGroups]);
|
|
20
20
|
return /* @__PURE__ */ jsxRuntime.jsx(HvFlowContext.Provider, { value, children });
|
|
21
21
|
};
|
|
22
|
-
const useFlowContext = () => React.useContext(HvFlowContext);
|
|
23
22
|
exports.HvFlowContext = HvFlowContext;
|
|
24
23
|
exports.HvFlowProvider = HvFlowProvider;
|
|
25
|
-
exports.useFlowContext = useFlowContext;
|
|
26
24
|
//# sourceMappingURL=FlowContext.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlowContext.cjs","sources":["../../../../../src/components/Flow/FlowContext/FlowContext.tsx"],"sourcesContent":["import {\n Dispatch,\n SetStateAction,\n createContext,\n
|
|
1
|
+
{"version":3,"file":"FlowContext.cjs","sources":["../../../../../src/components/Flow/FlowContext/FlowContext.tsx"],"sourcesContent":["import {\n Dispatch,\n SetStateAction,\n createContext,\n useMemo,\n useState,\n} from \"react\";\n\nimport {\n HvFlowDefaultActions,\n HvFlowNodeGroups,\n HvFlowNodeTypes,\n} from \"../types\";\n\nexport interface HvFlowContextValue<NodeGroups extends keyof any = string> {\n /** Flow nodes types. */\n nodeTypes?: HvFlowNodeTypes<NodeGroups>;\n /** Flow nodes groups. */\n nodeGroups?: HvFlowNodeGroups<NodeGroups>;\n /** Flow nodes groups expanded on sidebar. */\n expandedNodeGroups?: string[];\n /** Flow default actions. */\n defaultActions?: HvFlowDefaultActions[];\n /** Function to set `expandedNodeGroups`. */\n setExpandedNodeGroups?: Dispatch<SetStateAction<string[]>>;\n}\n\nexport const HvFlowContext = createContext<HvFlowContextValue>({});\n\nexport interface HvFlowProviderProps<NodeGroups extends keyof any = string> {\n /** Flow nodes types. */\n nodeTypes?: HvFlowContextValue<NodeGroups>[\"nodeTypes\"];\n /** Flow nodes groups. */\n nodeGroups?: HvFlowContextValue<NodeGroups>[\"nodeGroups\"];\n /** Flow default actions. */\n defaultActions?: HvFlowDefaultActions[];\n /** Children. */\n children?: React.ReactNode;\n}\n\nexport const HvFlowProvider = ({\n nodeGroups,\n nodeTypes,\n defaultActions,\n children,\n}: HvFlowProviderProps) => {\n const [expandedNodeGroups, setExpandedNodeGroups] = useState<string[]>([]);\n\n const value = useMemo(\n () => ({\n nodeTypes,\n nodeGroups,\n defaultActions,\n expandedNodeGroups,\n setExpandedNodeGroups,\n }),\n [nodeTypes, nodeGroups, defaultActions, expandedNodeGroups]\n );\n\n return (\n <HvFlowContext.Provider value={value}>{children}</HvFlowContext.Provider>\n );\n};\n"],"names":["HvFlowContext","createContext","HvFlowProvider","nodeGroups","nodeTypes","defaultActions","children","expandedNodeGroups","setExpandedNodeGroups","useState","value","useMemo","jsx"],"mappings":";;;;AA2BaA,MAAAA,gBAAgBC,MAAkC,cAAA,EAAE;AAa1D,MAAMC,iBAAiBA,CAAC;AAAA,EAC7BC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AACmB,MAAM;AACzB,QAAM,CAACC,oBAAoBC,qBAAqB,IAAIC,MAAAA,SAAmB,CAAE,CAAA;AAEnEC,QAAAA,QAAQC,MAAAA,QACZ,OAAO;AAAA,IACLP;AAAAA,IACAD;AAAAA,IACAE;AAAAA,IACAE;AAAAA,IACAC;AAAAA,EAAAA,IAEF,CAACJ,WAAWD,YAAYE,gBAAgBE,kBAAkB,CAC5D;AAEA,SACGK,2BAAAA,IAAA,cAAc,UAAd,EAAuB,OAAeN,SAAS,CAAA;AAEpD;;;"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("@emotion/react/jsx-runtime");
|
|
4
|
+
const React = require("react");
|
|
5
|
+
const ReactFlow = require("reactflow");
|
|
4
6
|
const uikitReactCore = require("@hitachivantara/uikit-react-core");
|
|
5
7
|
const uikitReactIcons = require("@hitachivantara/uikit-react-icons");
|
|
6
8
|
const uikitStyles = require("@hitachivantara/uikit-styles");
|
|
7
|
-
const React = require("react");
|
|
8
|
-
const ReactFlow = require("reactflow");
|
|
9
|
-
const FlowContext = require("../FlowContext/FlowContext.cjs");
|
|
10
9
|
const Node_styles = require("./Node.styles.cjs");
|
|
11
10
|
const ParamRenderer = require("./Parameters/ParamRenderer.cjs");
|
|
11
|
+
const useFlowContext = require("../hooks/useFlowContext.cjs");
|
|
12
12
|
const isInputConnected = (id, type, idx, edges) => {
|
|
13
13
|
if (type === "target") {
|
|
14
14
|
return edges.some((e) => e.target === id && e.targetHandle === idx.toString());
|
|
@@ -43,7 +43,7 @@ const HvFlowNode = ({
|
|
|
43
43
|
nodeGroups,
|
|
44
44
|
nodeTypes,
|
|
45
45
|
defaultActions
|
|
46
|
-
} =
|
|
46
|
+
} = useFlowContext.useFlowContext();
|
|
47
47
|
const edges = ReactFlow.useStore((s) => s.edges);
|
|
48
48
|
const nodes = ReactFlow.useStore((s) => s.getNodes());
|
|
49
49
|
const node = nodes.find((n) => n.id === id);
|
|
@@ -100,7 +100,7 @@ const HvFlowNode = ({
|
|
|
100
100
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cx(css({
|
|
101
101
|
border: `1px solid ${color}`
|
|
102
102
|
}), classes.root, className), onMouseEnter: () => setShowActions(true), onMouseLeave: () => setShowActions(false), children: [
|
|
103
|
-
/* @__PURE__ */ jsxRuntime.jsx(ReactFlow.NodeToolbar, { isVisible: showActions, offset: 0, children: defaultActions == null ? void 0 : defaultActions.map((action) => /* @__PURE__ */ jsxRuntime.jsx(uikitReactCore.HvButton, { icon: true, onClick: () => handleDefaultAction(action.id), children: renderedIcon(action.icon) })) }),
|
|
103
|
+
/* @__PURE__ */ jsxRuntime.jsx(ReactFlow.NodeToolbar, { isVisible: showActions, offset: 0, children: defaultActions == null ? void 0 : defaultActions.map((action) => /* @__PURE__ */ jsxRuntime.jsx(uikitReactCore.HvButton, { icon: true, onClick: () => handleDefaultAction(action.id), children: renderedIcon(action.icon) }, action.id)) }),
|
|
104
104
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: cx(css({
|
|
105
105
|
backgroundColor: color
|
|
106
106
|
}), classes.headerContainer), children: [
|
|
@@ -120,7 +120,7 @@ const HvFlowNode = ({
|
|
|
120
120
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: classes.actions, children: (actions == null ? void 0 : actions.length) && (actions == null ? void 0 : actions.length) > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
121
121
|
actsVisible == null ? void 0 : actsVisible.map((action) => /* @__PURE__ */ jsxRuntime.jsx(uikitReactCore.HvTooltip, { title: /* @__PURE__ */ jsxRuntime.jsx(uikitReactCore.HvTypography, { children: action.label }), children: /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(uikitReactCore.HvButton, { icon: true, onClick: (event) => {
|
|
122
122
|
actionCallback == null ? void 0 : actionCallback(event, node.id, action);
|
|
123
|
-
}, "aria-label": action.label, children: renderedIcon(action.icon) }) }) })),
|
|
123
|
+
}, "aria-label": action.label, children: renderedIcon(action.icon) }) }) }, action.id)),
|
|
124
124
|
actsDropdown && actsDropdown.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(uikitReactCore.HvDropDownMenu, { keepOpened: false, dataList: actsDropdown == null ? void 0 : actsDropdown.map((action) => ({
|
|
125
125
|
id: action.id,
|
|
126
126
|
label: action.label
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Node.cjs","sources":["../../../../../src/components/Flow/Node/Node.tsx"],"sourcesContent":["import {\n ExtractNames,\n HvActionGeneric,\n HvActionsGenericProps,\n HvBaseProps,\n HvButton,\n HvDropDownMenu,\n HvTooltip,\n HvTypography,\n} from \"@hitachivantara/uikit-react-core\";\nimport { Down, Info, Up } from \"@hitachivantara/uikit-react-icons\";\nimport { getColor, theme } from \"@hitachivantara/uikit-styles\";\nimport { isValidElement, useCallback, useEffect, useState } from \"react\";\nimport {\n Handle,\n NodeProps,\n NodeToolbar,\n Position,\n useReactFlow,\n useStore,\n} from \"reactflow\";\nimport { useFlowContext } from \"../FlowContext/FlowContext\";\n\nimport {\n HvFlowDefaultAction,\n HvFlowNodeInput,\n HvFlowNodeOutput,\n HvFlowNodeParam,\n} from \"../types\";\nimport { staticClasses, useClasses } from \"./Node.styles\";\nimport ParamRenderer from \"./Parameters/ParamRenderer\";\n\nexport { staticClasses as flowNodeClasses };\n\nexport type HvFlowNodeClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvFlowNodeProps extends Omit<HvBaseProps, \"id\">, NodeProps {\n /** Node description */\n description: string;\n /** Node expanded */\n expanded?: boolean;\n /** Node inputs */\n inputs?: HvFlowNodeInput[];\n /** Node outputs */\n outputs?: HvFlowNodeOutput[];\n /** Node parameters */\n params?: HvFlowNodeParam[];\n /** Node actions */\n actions?: HvActionGeneric[]; // HvFlowNodeActions[];\n /** Node action callback */\n actionCallback?: HvActionsGenericProps[\"actionsCallback\"];\n /** Node maximum number of actions visible */\n maxVisibleActions?: number;\n /** A Jss Object used to override or extend the styles applied to the component. */\n classes?: HvFlowNodeClasses;\n}\n\nconst isInputConnected = (id, type, idx, edges) => {\n if (type === \"target\") {\n return edges.some(\n (e) => e.target === id && e.targetHandle === idx.toString()\n );\n }\n if (type === \"source\") {\n return edges.some(\n (e) => e.source === id && e.sourceHandle === idx.toString()\n );\n }\n};\n\nexport const HvFlowNode = ({\n id,\n type,\n description,\n expanded = false,\n params,\n actions,\n actionCallback,\n maxVisibleActions = 1,\n classes: classesProp,\n className,\n children,\n}: HvFlowNodeProps) => {\n const [showParams, setShowParams] = useState(expanded);\n const [showActions, setShowActions] = useState(false);\n const reactFlowInstance = useReactFlow();\n\n const { classes, cx, css } = useClasses(classesProp);\n\n const { nodeGroups, nodeTypes, defaultActions } = useFlowContext();\n const edges = useStore((s) => s.edges);\n const nodes = useStore((s) => s.getNodes());\n\n const node = nodes.find((n) => n.id === id);\n\n const groupId = nodeTypes?.[type].meta?.groupId;\n const title = nodeTypes?.[type].meta?.label;\n const groupLabel = groupId && nodeGroups && nodeGroups[groupId].label;\n\n const inputs = nodeTypes?.[type]?.meta?.inputs;\n const outputs = nodeTypes?.[type]?.meta?.outputs;\n const icon = groupId && nodeGroups && nodeGroups[groupId].icon;\n const colorProp = groupId && nodeGroups && nodeGroups[groupId].color;\n const color = getColor(colorProp);\n\n useEffect(() => {\n const newNodes = nodes.map((n) => {\n if (n.id === id) {\n if (Object.keys(n.data).length === 0) {\n params?.forEach((param) => {\n n.data[param.id] = param.value;\n });\n }\n }\n return n;\n });\n reactFlowInstance.setNodes(newNodes);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleDefaultAction = useCallback(\n (action: HvFlowDefaultAction) => {\n if (!node) return;\n\n switch (action) {\n case \"delete\":\n reactFlowInstance.deleteElements({ nodes: [node] });\n break;\n case \"duplicate\":\n reactFlowInstance.addNodes([\n {\n ...node,\n id: `${reactFlowInstance.getNodes().length + 1}`,\n position: {\n x: node.position.x,\n y: node.position.y + (node.height || 0) + 20,\n },\n selected: false,\n zIndex: Number(theme.zIndices.overlay),\n },\n ]);\n break;\n default:\n break;\n }\n },\n [node, reactFlowInstance]\n );\n\n const hasParams = !!(params && params.length > 0);\n\n if (!node) return null;\n\n const actsVisible = actions?.slice(0, maxVisibleActions);\n const actsDropdown = actions?.slice(maxVisibleActions);\n\n const renderedIcon = (actionIcon: HvActionGeneric[\"icon\"]) =>\n isValidElement(actionIcon) ? actionIcon : (actionIcon as Function)?.();\n\n return (\n <div\n className={cx(\n css({ border: `1px solid ${color}` }),\n classes.root,\n className\n )}\n onMouseEnter={() => setShowActions(true)}\n onMouseLeave={() => setShowActions(false)}\n >\n <NodeToolbar isVisible={showActions} offset={0}>\n {defaultActions?.map((action) => (\n <HvButton icon onClick={() => handleDefaultAction(action.id)}>\n {renderedIcon(action.icon)}\n </HvButton>\n ))}\n </NodeToolbar>\n <div\n className={cx(css({ backgroundColor: color }), classes.headerContainer)}\n >\n <div className={classes.groupContainer}>\n {icon}\n <HvTypography variant=\"title4\" className={classes.group}>\n {groupLabel}\n </HvTypography>\n </div>\n <div style={{ display: \"flex\" }}>\n <HvTooltip title={<HvTypography>{description}</HvTypography>}>\n <div>\n <Info />\n </div>\n </HvTooltip>\n <HvButton\n icon\n disabled={!hasParams}\n onClick={() => setShowParams((p) => !p)}\n >\n {showParams ? <Up /> : <Down />}\n </HvButton>\n </div>\n </div>\n <div className={classes.titleContainer}>\n <div>\n <HvTypography>{title}</HvTypography>\n </div>\n <div className={classes.actions}>\n {actions?.length && actions?.length > 0 && (\n <>\n {actsVisible?.map((action) => (\n <HvTooltip title={<HvTypography>{action.label}</HvTypography>}>\n <div>\n <HvButton\n icon\n onClick={(event) => {\n actionCallback?.(event, node.id, action);\n }}\n aria-label={action.label}\n >\n {renderedIcon(action.icon)}\n </HvButton>\n </div>\n </HvTooltip>\n ))}\n\n {actsDropdown && actsDropdown.length > 0 && (\n <HvDropDownMenu\n keepOpened={false}\n dataList={actsDropdown?.map((action) => ({\n id: action.id,\n label: action.label,\n }))}\n onClick={(event, action) => {\n actionCallback?.(event, node.id, action as HvActionGeneric);\n }}\n />\n )}\n </>\n )}\n </div>\n </div>\n {children && <div className={classes.contentContainer}>{children}</div>}\n {showParams && params && (\n <div className={classes.paramsContainer}>\n <ParamRenderer nodeId={id} params={params} data={node?.data} />\n </div>\n )}\n {inputs && inputs.length > 0 && (\n <>\n <div className={classes.inputsTitleContainer}>\n <HvTypography>Inputs</HvTypography>\n </div>\n\n <div className={classes.inputsContainer}>\n {inputs?.map((input, idx) => (\n <div className={classes.inputContainer} key={idx}>\n <Handle\n type=\"target\"\n isConnectableStart={false}\n id={`${idx}`}\n position={Position.Left}\n style={{\n top: \"auto\",\n bottom:\n (outputs?.length ? 80 : 18) +\n (outputs?.length || 0) * 29 +\n 29 * idx,\n }}\n />\n <HvTypography>{input.label}</HvTypography>\n {input.isMandatory &&\n !isInputConnected(id, \"target\", idx, edges) && (\n <div className={classes.mandatory} />\n )}\n </div>\n ))}\n </div>\n </>\n )}\n {outputs && outputs.length > 0 && (\n <>\n <div className={classes.outputsTitleContainer}>\n <HvTypography>Outputs</HvTypography>\n </div>\n <div className={classes.outputsContainer}>\n {outputs?.map((output, idx) => (\n <div className={classes.outputContainer} key={idx}>\n <Handle\n type=\"source\"\n isConnectableEnd={false}\n id={`${idx}`}\n position={Position.Right}\n style={{\n bottom: -10 + 29 * (outputs.length - idx),\n top: \"auto\",\n }}\n />\n {output.isMandatory &&\n !isInputConnected(id, \"source\", idx, edges) && (\n <div className={classes.mandatory} />\n )}\n <HvTypography>{output.label}</HvTypography>\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n );\n};\n"],"names":["isInputConnected","id","type","idx","edges","some","e","target","targetHandle","toString","source","sourceHandle","HvFlowNode","description","expanded","params","actions","actionCallback","maxVisibleActions","classes","classesProp","className","children","showParams","setShowParams","useState","showActions","setShowActions","reactFlowInstance","useReactFlow","cx","css","useClasses","nodeGroups","nodeTypes","defaultActions","useFlowContext","useStore","s","nodes","getNodes","node","find","n","groupId","meta","title","label","groupLabel","inputs","outputs","icon","colorProp","color","getColor","useEffect","newNodes","map","Object","keys","data","length","forEach","param","value","setNodes","handleDefaultAction","useCallback","action","deleteElements","addNodes","position","x","y","height","selected","zIndex","Number","theme","zIndices","overlay","hasParams","actsVisible","slice","actsDropdown","renderedIcon","actionIcon","isValidElement","jsxs","border","root","jsx","NodeToolbar","HvButton","backgroundColor","headerContainer","groupContainer","HvTypography","group","display","HvTooltip","Info","p","Up","Down","titleContainer","event","HvDropDownMenu","contentContainer","paramsContainer","ParamRenderer","Fragment","inputsTitleContainer","inputsContainer","input","inputContainer","Handle","Position","Left","top","bottom","isMandatory","mandatory","outputsTitleContainer","outputsContainer","output","outputContainer","Right"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Node.cjs","sources":["../../../../../src/components/Flow/Node/Node.tsx"],"sourcesContent":["import { isValidElement, useCallback, useEffect, useState } from \"react\";\n\nimport {\n Handle,\n NodeProps,\n NodeToolbar,\n Position,\n useReactFlow,\n useStore,\n} from \"reactflow\";\n\nimport {\n ExtractNames,\n HvActionGeneric,\n HvActionsGenericProps,\n HvBaseProps,\n HvButton,\n HvDropDownMenu,\n HvTooltip,\n HvTypography,\n} from \"@hitachivantara/uikit-react-core\";\nimport { Down, Info, Up } from \"@hitachivantara/uikit-react-icons\";\nimport { getColor, theme } from \"@hitachivantara/uikit-styles\";\n\nimport { useFlowContext } from \"../hooks\";\nimport { HvFlowDefaultAction, HvFlowNodeParam } from \"../types\";\nimport { staticClasses, useClasses } from \"./Node.styles\";\nimport ParamRenderer from \"./Parameters/ParamRenderer\";\n\nexport { staticClasses as flowNodeClasses };\n\nexport type HvFlowNodeClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvFlowNodeProps extends Omit<HvBaseProps, \"id\">, NodeProps {\n /** Node description */\n description: string;\n /** Node expanded */\n expanded?: boolean;\n /** Node parameters */\n params?: HvFlowNodeParam[];\n /** Node actions */\n actions?: HvActionGeneric[]; // HvFlowNodeActions[];\n /** Node action callback */\n actionCallback?: HvActionsGenericProps[\"actionsCallback\"];\n /** Node maximum number of actions visible */\n maxVisibleActions?: number;\n /** A Jss Object used to override or extend the styles applied to the component. */\n classes?: HvFlowNodeClasses;\n}\n\nconst isInputConnected = (id, type, idx, edges) => {\n if (type === \"target\") {\n return edges.some(\n (e) => e.target === id && e.targetHandle === idx.toString()\n );\n }\n if (type === \"source\") {\n return edges.some(\n (e) => e.source === id && e.sourceHandle === idx.toString()\n );\n }\n};\n\nexport const HvFlowNode = ({\n id,\n type,\n description,\n expanded = false,\n params,\n actions,\n actionCallback,\n maxVisibleActions = 1,\n classes: classesProp,\n className,\n children,\n}: HvFlowNodeProps) => {\n const [showParams, setShowParams] = useState(expanded);\n const [showActions, setShowActions] = useState(false);\n const reactFlowInstance = useReactFlow();\n\n const { classes, cx, css } = useClasses(classesProp);\n\n const { nodeGroups, nodeTypes, defaultActions } = useFlowContext();\n const edges = useStore((s) => s.edges);\n const nodes = useStore((s) => s.getNodes());\n\n const node = nodes.find((n) => n.id === id);\n\n const groupId = nodeTypes?.[type].meta?.groupId;\n const title = nodeTypes?.[type].meta?.label;\n const groupLabel = groupId && nodeGroups && nodeGroups[groupId].label;\n\n const inputs = nodeTypes?.[type]?.meta?.inputs;\n const outputs = nodeTypes?.[type]?.meta?.outputs;\n const icon = groupId && nodeGroups && nodeGroups[groupId].icon;\n const colorProp = groupId && nodeGroups && nodeGroups[groupId].color;\n const color = getColor(colorProp);\n\n useEffect(() => {\n const newNodes = nodes.map((n) => {\n if (n.id === id) {\n if (Object.keys(n.data).length === 0) {\n params?.forEach((param) => {\n n.data[param.id] = param.value;\n });\n }\n }\n return n;\n });\n reactFlowInstance.setNodes(newNodes);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleDefaultAction = useCallback(\n (action: HvFlowDefaultAction) => {\n if (!node) return;\n\n switch (action) {\n case \"delete\":\n reactFlowInstance.deleteElements({ nodes: [node] });\n break;\n case \"duplicate\":\n reactFlowInstance.addNodes([\n {\n ...node,\n id: `${reactFlowInstance.getNodes().length + 1}`,\n position: {\n x: node.position.x,\n y: node.position.y + (node.height || 0) + 20,\n },\n selected: false,\n zIndex: Number(theme.zIndices.overlay),\n },\n ]);\n break;\n default:\n break;\n }\n },\n [node, reactFlowInstance]\n );\n\n const hasParams = !!(params && params.length > 0);\n\n if (!node) return null;\n\n const actsVisible = actions?.slice(0, maxVisibleActions);\n const actsDropdown = actions?.slice(maxVisibleActions);\n\n const renderedIcon = (actionIcon: HvActionGeneric[\"icon\"]) =>\n isValidElement(actionIcon) ? actionIcon : (actionIcon as Function)?.();\n\n return (\n <div\n className={cx(\n css({ border: `1px solid ${color}` }),\n classes.root,\n className\n )}\n onMouseEnter={() => setShowActions(true)}\n onMouseLeave={() => setShowActions(false)}\n >\n <NodeToolbar isVisible={showActions} offset={0}>\n {defaultActions?.map((action) => (\n <HvButton\n key={action.id}\n icon\n onClick={() => handleDefaultAction(action.id)}\n >\n {renderedIcon(action.icon)}\n </HvButton>\n ))}\n </NodeToolbar>\n <div\n className={cx(css({ backgroundColor: color }), classes.headerContainer)}\n >\n <div className={classes.groupContainer}>\n {icon}\n <HvTypography variant=\"title4\" className={classes.group}>\n {groupLabel}\n </HvTypography>\n </div>\n <div style={{ display: \"flex\" }}>\n <HvTooltip title={<HvTypography>{description}</HvTypography>}>\n <div>\n <Info />\n </div>\n </HvTooltip>\n <HvButton\n icon\n disabled={!hasParams}\n onClick={() => setShowParams((p) => !p)}\n >\n {showParams ? <Up /> : <Down />}\n </HvButton>\n </div>\n </div>\n <div className={classes.titleContainer}>\n <div>\n <HvTypography>{title}</HvTypography>\n </div>\n <div className={classes.actions}>\n {actions?.length && actions?.length > 0 && (\n <>\n {actsVisible?.map((action) => (\n <HvTooltip\n key={action.id}\n title={<HvTypography>{action.label}</HvTypography>}\n >\n <div>\n <HvButton\n icon\n onClick={(event) => {\n actionCallback?.(event, node.id, action);\n }}\n aria-label={action.label}\n >\n {renderedIcon(action.icon)}\n </HvButton>\n </div>\n </HvTooltip>\n ))}\n\n {actsDropdown && actsDropdown.length > 0 && (\n <HvDropDownMenu\n keepOpened={false}\n dataList={actsDropdown?.map((action) => ({\n id: action.id,\n label: action.label,\n }))}\n onClick={(event, action) => {\n actionCallback?.(event, node.id, action as HvActionGeneric);\n }}\n />\n )}\n </>\n )}\n </div>\n </div>\n {children && <div className={classes.contentContainer}>{children}</div>}\n {showParams && params && (\n <div className={classes.paramsContainer}>\n <ParamRenderer nodeId={id} params={params} data={node?.data} />\n </div>\n )}\n {inputs && inputs.length > 0 && (\n <>\n <div className={classes.inputsTitleContainer}>\n <HvTypography>Inputs</HvTypography>\n </div>\n\n <div className={classes.inputsContainer}>\n {inputs?.map((input, idx) => (\n <div className={classes.inputContainer} key={idx}>\n <Handle\n type=\"target\"\n isConnectableStart={false}\n id={`${idx}`}\n position={Position.Left}\n style={{\n top: \"auto\",\n bottom:\n (outputs?.length ? 80 : 18) +\n (outputs?.length || 0) * 29 +\n 29 * idx,\n }}\n />\n <HvTypography>{input.label}</HvTypography>\n {input.isMandatory &&\n !isInputConnected(id, \"target\", idx, edges) && (\n <div className={classes.mandatory} />\n )}\n </div>\n ))}\n </div>\n </>\n )}\n {outputs && outputs.length > 0 && (\n <>\n <div className={classes.outputsTitleContainer}>\n <HvTypography>Outputs</HvTypography>\n </div>\n <div className={classes.outputsContainer}>\n {outputs?.map((output, idx) => (\n <div className={classes.outputContainer} key={idx}>\n <Handle\n type=\"source\"\n isConnectableEnd={false}\n id={`${idx}`}\n position={Position.Right}\n style={{\n bottom: -10 + 29 * (outputs.length - idx),\n top: \"auto\",\n }}\n />\n {output.isMandatory &&\n !isInputConnected(id, \"source\", idx, edges) && (\n <div className={classes.mandatory} />\n )}\n <HvTypography>{output.label}</HvTypography>\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n );\n};\n"],"names":["isInputConnected","id","type","idx","edges","some","e","target","targetHandle","toString","source","sourceHandle","HvFlowNode","description","expanded","params","actions","actionCallback","maxVisibleActions","classes","classesProp","className","children","showParams","setShowParams","useState","showActions","setShowActions","reactFlowInstance","useReactFlow","cx","css","useClasses","nodeGroups","nodeTypes","defaultActions","useFlowContext","useStore","s","nodes","getNodes","node","find","n","groupId","meta","title","label","groupLabel","inputs","outputs","icon","colorProp","color","getColor","useEffect","newNodes","map","Object","keys","data","length","forEach","param","value","setNodes","handleDefaultAction","useCallback","action","deleteElements","addNodes","position","x","y","height","selected","zIndex","Number","theme","zIndices","overlay","hasParams","actsVisible","slice","actsDropdown","renderedIcon","actionIcon","isValidElement","jsxs","border","root","jsx","NodeToolbar","HvButton","backgroundColor","headerContainer","groupContainer","HvTypography","group","display","HvTooltip","Info","p","Up","Down","titleContainer","event","HvDropDownMenu","contentContainer","paramsContainer","ParamRenderer","Fragment","inputsTitleContainer","inputsContainer","input","inputContainer","Handle","Position","Left","top","bottom","isMandatory","mandatory","outputsTitleContainer","outputsContainer","output","outputContainer","Right"],"mappings":"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"}
|