Skip to content

Commit 1b5e59a

Browse files
committed
create mermaid diagram node
1 parent c25ea8b commit 1b5e59a

File tree

5 files changed

+1869
-40
lines changed

5 files changed

+1869
-40
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
import {
2+
createJSXElement,
3+
FormField,
4+
IComputeResult,
5+
InitialValues,
6+
NodeTask,
7+
ThumbConnectionType,
8+
ThumbType,
9+
visualNodeFactory,
10+
} from '@devhelpr/visual-programming-system';
11+
import { NodeInfo } from '@devhelpr/web-flow-executor';
12+
import mermaid from 'mermaid';
13+
14+
const MermaidImage = ({
15+
render,
16+
}: {
17+
render: (element: HTMLElement) => void;
18+
}) => {
19+
mermaid.initialize({
20+
startOnLoad: true,
21+
});
22+
23+
return (
24+
<div
25+
className="mermaid"
26+
getElement={(element: HTMLElement) => {
27+
render(element);
28+
}}
29+
></div>
30+
);
31+
};
32+
33+
const fieldName = 'mermaid-input';
34+
const nodeTitle = 'Mermaid diagram';
35+
export const mermaidNodeName = 'mermaid-node';
36+
const familyName = 'flow-canvas';
37+
const thumbs = [
38+
{
39+
thumbType: ThumbType.StartConnectorCenter,
40+
thumbIndex: 0,
41+
connectionType: ThumbConnectionType.start,
42+
color: 'white',
43+
label: ' ',
44+
name: 'output',
45+
maxConnections: -1,
46+
},
47+
{
48+
thumbType: ThumbType.EndConnectorCenter,
49+
thumbIndex: 0,
50+
connectionType: ThumbConnectionType.end,
51+
color: 'white',
52+
label: ' ',
53+
name: 'input',
54+
maxConnections: 1,
55+
},
56+
];
57+
58+
export const getMermaidNode =
59+
() =>
60+
// (): NodeTaskFactory<NodeInfo> =>
61+
(_updated: () => void): NodeTask<NodeInfo> => {
62+
//let node: IRectNodeComponent<NodeInfo>;
63+
///let rect: Rect<NodeInfo> | undefined;
64+
65+
let nodeRenderElement: HTMLElement | undefined = undefined;
66+
const initializeCompute = () => {
67+
return;
68+
};
69+
const computeAsync = (
70+
input: string,
71+
_loopIndex?: number,
72+
_payload?: any
73+
) => {
74+
return new Promise<IComputeResult>((resolve) => {
75+
if (nodeRenderElement && input) {
76+
const mermaidDefintion = input
77+
.replaceAll('```mermaid', '')
78+
.replaceAll('```', '')
79+
.trim();
80+
mermaid
81+
.render('dynamic', mermaidDefintion)
82+
.then((renderResult) => {
83+
if (nodeRenderElement) {
84+
nodeRenderElement.innerHTML = renderResult.svg;
85+
}
86+
resolve({
87+
result: input,
88+
output: input,
89+
followPath: undefined,
90+
});
91+
})
92+
.catch((error) => {
93+
console.error('Error rendering mermaid diagram', error);
94+
resolve({
95+
result: input,
96+
output: input,
97+
followPath: undefined,
98+
});
99+
});
100+
}
101+
});
102+
};
103+
const onRender = (element: HTMLElement) => {
104+
nodeRenderElement = element;
105+
};
106+
return visualNodeFactory(
107+
mermaidNodeName,
108+
nodeTitle,
109+
familyName,
110+
fieldName,
111+
computeAsync,
112+
initializeCompute,
113+
false,
114+
200,
115+
100,
116+
thumbs,
117+
(_values?: InitialValues): FormField[] => {
118+
return [];
119+
},
120+
(_nodeInstance) => {
121+
//rect = nodeInstance.rect;
122+
//node = nodeInstance.node as IRectNodeComponent<NodeInfo>;
123+
//rect?.resize();
124+
},
125+
{
126+
category: 'Diagrams',
127+
hasStaticWidthHeight: true,
128+
},
129+
<MermaidImage render={onRender} />,
130+
true
131+
);
132+
};

apps/vps-web/src/main.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
const url = new URL(window.location.href);
22
import './userWorker';
3-
import { RegisterNodeFactoryFunction } from '@devhelpr/web-flow-executor';
3+
import {
4+
registerNodeFactory,
5+
RegisterNodeFactoryFunction,
6+
} from '@devhelpr/web-flow-executor';
47
import { runFlow } from './app/run-flow';
58
import { ocwgPage } from './app/pages/ocwg';
69
import { pythonPage } from './app/pages/python';
710
import { examplePage } from './app/pages/example';
811
import { setupCustomEditor } from '@devhelpr/visual-programming-system';
912
import * as monaco from 'monaco-editor';
13+
import { getMermaidNode, mermaidNodeName } from './app/custom-nodes/mermaid';
1014

1115
if (url.pathname === '/run-flow') {
1216
runFlow();
@@ -110,6 +114,7 @@ if (url.pathname === '/run-flow') {
110114
undefined,
111115
(_registerNodeFactory: RegisterNodeFactoryFunction) => {
112116
//registerNodeFactory('test-external-node', getExternalTestNode());
117+
registerNodeFactory(mermaidNodeName, getMermaidNode());
113118
},
114119
undefined,
115120
undefined,

0 commit comments

Comments
 (0)