Skip to content

Commit 0fc76bf

Browse files
committed
more customisable nodes via custom classname
1 parent 1b5e59a commit 0fc76bf

File tree

8 files changed

+148
-105
lines changed

8 files changed

+148
-105
lines changed

apps/vps-web/src/app/custom-nodes/mermaid.tsx

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
IComputeResult,
55
InitialValues,
66
NodeTask,
7+
Rect,
78
ThumbConnectionType,
89
ThumbType,
910
visualNodeFactory,
@@ -22,7 +23,7 @@ const MermaidImage = ({
2223

2324
return (
2425
<div
25-
className="mermaid"
26+
class="mermaid w-min h-min p-4 border-4 border-slate-400 border-solid rounded"
2627
getElement={(element: HTMLElement) => {
2728
render(element);
2829
}}
@@ -60,7 +61,7 @@ export const getMermaidNode =
6061
// (): NodeTaskFactory<NodeInfo> =>
6162
(_updated: () => void): NodeTask<NodeInfo> => {
6263
//let node: IRectNodeComponent<NodeInfo>;
63-
///let rect: Rect<NodeInfo> | undefined;
64+
let rect: Rect<NodeInfo> | undefined;
6465

6566
let nodeRenderElement: HTMLElement | undefined = undefined;
6667
const initializeCompute = () => {
@@ -83,6 +84,9 @@ export const getMermaidNode =
8384
if (nodeRenderElement) {
8485
nodeRenderElement.innerHTML = renderResult.svg;
8586
}
87+
if (rect && rect.resize) {
88+
rect.resize(undefined, true, '.mermaid');
89+
}
8690
resolve({
8791
result: input,
8892
output: input,
@@ -102,6 +106,12 @@ export const getMermaidNode =
102106
};
103107
const onRender = (element: HTMLElement) => {
104108
nodeRenderElement = element;
109+
const resizeObserver = new ResizeObserver(() => {
110+
if (rect && rect.resize) {
111+
rect.resize(undefined, true, '.mermaid');
112+
}
113+
});
114+
resizeObserver.observe(element);
105115
};
106116
return visualNodeFactory(
107117
mermaidNodeName,
@@ -117,14 +127,18 @@ export const getMermaidNode =
117127
(_values?: InitialValues): FormField[] => {
118128
return [];
119129
},
120-
(_nodeInstance) => {
121-
//rect = nodeInstance.rect;
130+
(nodeInstance) => {
131+
rect = nodeInstance.rect;
122132
//node = nodeInstance.node as IRectNodeComponent<NodeInfo>;
123-
//rect?.resize();
133+
if (rect && rect.resize) {
134+
rect.resize();
135+
}
124136
},
125137
{
126138
category: 'Diagrams',
127139
hasStaticWidthHeight: true,
140+
hasCustomStyling: true,
141+
customClassName: 'mermaid-node',
128142
},
129143
<MermaidImage render={onRender} />,
130144
true

apps/vps-web/src/styles.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,3 +783,7 @@ html:active-view-transition-type(normal) {
783783
#breadcrumbs:not(.hidden) ~ .taskbar-container {
784784
@apply top-[116px] max-h-[calc(100vh-166px)];
785785
}
786+
787+
.mermaid-node .inner-node {
788+
@apply bg-white text-black;
789+
}

libs/visual-programming-system/src/canvas-app/base-flow.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
import { Composition } from '../interfaces/composition';
2222
import { Theme } from '../interfaces/theme';
2323
import { BaseNodeInfo } from '../types/base-node-info';
24+
import { LayoutProperties } from '../interfaces/layout-properties';
2425

2526
export interface IBaseFlow<T extends BaseNodeInfo> {
2627
elements: ElementNodeMap<T>;
@@ -98,10 +99,7 @@ export interface IBaseFlow<T extends BaseNodeInfo> {
9899
text?: string,
99100
thumbs?: IThumb[],
100101
markup?: string | INodeComponent<T> | HTMLElement,
101-
layoutProperties?: {
102-
classNames?: string;
103-
autoSizeToContentIfNodeHasNoThumbs?: boolean;
104-
},
102+
layoutProperties?: LayoutProperties,
105103
hasStaticWidthHeight?: boolean,
106104
disableInteraction?: boolean,
107105
disableManualResize?: boolean,
@@ -123,6 +121,8 @@ export interface IBaseFlow<T extends BaseNodeInfo> {
123121
layoutProperties?: {
124122
classNames?: string;
125123
autoSizeToContentIfNodeHasNoThumbs?: boolean;
124+
hasCustomStyling?: boolean;
125+
customClassName?: string;
126126
},
127127
hasStaticWidthHeight?: boolean,
128128
disableInteraction?: boolean,

libs/visual-programming-system/src/canvas-app/index.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import { getCanvasAppCssClasses } from './css-classes/canvasapp-css-classes';
4747
import { IFlowCanvasBase } from './flow-canvas';
4848
import { FlowCore } from './flow-core';
4949
import { GetNodeTaskFactory } from '../interfaces/node-task-registry';
50+
import { LayoutProperties } from '../interfaces/layout-properties';
5051

5152
export const createFlowCanvas = <T extends BaseNodeInfo>(
5253
rootElement: HTMLElement,
@@ -1310,10 +1311,7 @@ export class FlowCanvas<T extends BaseNodeInfo>
13101311
text?: string,
13111312
thumbs?: IThumb[],
13121313
markup?: string | INodeComponent<T> | HTMLElement,
1313-
layoutProperties?: {
1314-
classNames?: string;
1315-
autoSizeToContentIfNodeHasNoThumbs?: boolean;
1316-
},
1314+
layoutProperties?: LayoutProperties,
13171315
hasStaticWidthHeight?: boolean,
13181316
disableInteraction?: boolean,
13191317
disableManualResize?: boolean,
@@ -1347,7 +1345,8 @@ export class FlowCanvas<T extends BaseNodeInfo>
13471345
parentNodeClassNames,
13481346
this.onCanvasAction,
13491347
this.rootElement,
1350-
this.theme
1348+
this.theme,
1349+
layoutProperties?.customClassName
13511350
);
13521351
if (!rectInstance || !rectInstance.nodeComponent) {
13531352
throw new Error('rectInstance is undefined');
@@ -1368,10 +1367,7 @@ export class FlowCanvas<T extends BaseNodeInfo>
13681367
text?: string,
13691368
thumbs?: IThumb[],
13701369
markup?: string | INodeComponent<T>,
1371-
layoutProperties?: {
1372-
classNames?: string;
1373-
autoSizeToContentIfNodeHasNoThumbs?: boolean;
1374-
},
1370+
layoutProperties?: LayoutProperties,
13751371
hasStaticWidthHeight?: boolean,
13761372
disableInteraction?: boolean,
13771373
disableManualResize?: boolean,
@@ -1407,7 +1403,8 @@ export class FlowCanvas<T extends BaseNodeInfo>
14071403
createStraightLineConnection,
14081404
this.onCanvasAction,
14091405
this.rootElement,
1410-
this.theme
1406+
this.theme,
1407+
layoutProperties?.customClassName
14111408
);
14121409
if (!rectInstance || !rectInstance.nodeComponent) {
14131410
throw new Error('rectInstance is undefined');

libs/visual-programming-system/src/components/rect-thumb.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export class RectThumb<T extends BaseNodeInfo> extends Rect<T> {
4747
markup?: string | INodeComponent<T>,
4848
layoutProperties?: {
4949
classNames?: string;
50+
hasCustomStyling?: boolean;
5051
},
5152
hasStaticWidthHeight?: boolean,
5253
disableInteraction?: boolean,
@@ -59,7 +60,8 @@ export class RectThumb<T extends BaseNodeInfo> extends Rect<T> {
5960
createStraightLineConnection?: boolean,
6061
setCanvasAction?: (canvasAction: CanvasAction, payload?: any) => void,
6162
rootElement?: HTMLElement,
62-
theme?: Theme
63+
theme?: Theme,
64+
customClassName?: string
6365
) {
6466
super(
6567
canvas,
@@ -85,7 +87,8 @@ export class RectThumb<T extends BaseNodeInfo> extends Rect<T> {
8587
getRectNodeCssClasses().defaultRectThumbClasses,
8688
setCanvasAction,
8789
rootElement,
88-
theme
90+
theme,
91+
customClassName
8992
);
9093
if (!this.nodeComponent) {
9194
throw new Error('nodeComponent not created');

libs/visual-programming-system/src/components/rect.ts

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export class Rect<T extends BaseNodeInfo> {
9292
layoutProperties?: {
9393
classNames?: string;
9494
autoSizeToContentIfNodeHasNoThumbs?: boolean;
95+
hasCustomStyling?: boolean;
9596
},
9697
hasStaticWidthHeight?: boolean,
9798
disableInteraction?: boolean,
@@ -107,7 +108,8 @@ export class Rect<T extends BaseNodeInfo> {
107108
parentNodeClassName?: string,
108109
setCanvasAction?: (canvasAction: CanvasAction, payload?: any) => void,
109110
rootElement?: HTMLElement,
110-
theme?: Theme
111+
theme?: Theme,
112+
customClassName?: string
111113
) {
112114
this.cssClasses = getRectNodeCssClasses();
113115
this.canvas = canvas;
@@ -156,7 +158,8 @@ export class Rect<T extends BaseNodeInfo> {
156158
disableInteraction,
157159
canvasUpdated,
158160
id,
159-
parentNodeClassName ?? this.cssClasses.defaultRectClasses
161+
parentNodeClassName ?? this.cssClasses.defaultRectClasses,
162+
customClassName
160163
);
161164
this.nodeComponent = this.rectInfo.nodeComponent;
162165
this.nodeComponent.setSize = this.setSize;
@@ -418,8 +421,15 @@ export class Rect<T extends BaseNodeInfo> {
418421
}
419422
}
420423

421-
public resize(width?: number) {
422-
if (this.hasStaticWidthHeight || !this.nodeComponent) {
424+
public resize(
425+
width?: number,
426+
overrideStaticWidthHeight?: boolean,
427+
selectChildElemenSelectorAsReference?: string
428+
) {
429+
if (
430+
(this.hasStaticWidthHeight && !overrideStaticWidthHeight) ||
431+
!this.nodeComponent
432+
) {
423433
return;
424434
}
425435
const { scale } = getCamera();
@@ -468,8 +478,16 @@ export class Rect<T extends BaseNodeInfo> {
468478
minHeightAdd + Math.max(thumbEndHeight, thumbStartHeight);
469479
}
470480

471-
const astElementHtmlElement = this.rectInfo.astElement
481+
let astElementHtmlElement: HTMLElement = this.rectInfo.astElement
472482
?.domElement as unknown as HTMLElement;
483+
484+
if (selectChildElemenSelectorAsReference) {
485+
astElementHtmlElement =
486+
(this.nodeComponent.domElement as unknown as HTMLElement).querySelector(
487+
selectChildElemenSelectorAsReference
488+
) ?? astElementHtmlElement;
489+
}
490+
473491
if (astElementHtmlElement && !this.autSizeToContentIfNodeHasNoThumbs) {
474492
astElementHtmlElement.style.width = width ? `${width}px` : 'auto';
475493
astElementHtmlElement.style.height = 'auto';
@@ -908,7 +926,8 @@ export class Rect<T extends BaseNodeInfo> {
908926
disableInteraction?: boolean,
909927
_canvasUpdated?: () => void,
910928
id?: string,
911-
parentNodeClassName?: string
929+
parentNodeClassName?: string,
930+
customClassName?: string
912931
) => {
913932
/*
914933
draw svg path based on bbox of the hidden path
@@ -942,7 +961,7 @@ export class Rect<T extends BaseNodeInfo> {
942961
{
943962
class: `${parentNodeClassName ?? this.cssClasses.defaultRectClasses} ${
944963
this.cssClasses.rectClasses
945-
} ${autoSizeClasses}`,
964+
} ${autoSizeClasses} ${customClassName ?? ''}`,
946965
['data-node-id']: id ?? '',
947966
},
948967
canvasElement,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export interface LayoutProperties {
2+
classNames?: string;
3+
autoSizeToContentIfNodeHasNoThumbs?: boolean;
4+
hasCustomStyling?: boolean;
5+
customClassName?: string;
6+
}

0 commit comments

Comments
 (0)