Fix for state diagram curve

This commit is contained in:
Knut Sveidqvist
2024-09-23 10:19:55 +02:00
parent c94c3d7c86
commit 1a974eeb39
5 changed files with 64 additions and 9 deletions

View File

@@ -757,6 +757,11 @@ export interface StateDiagramConfig extends BaseDiagramConfig {
edgeLengthFactor?: string; edgeLengthFactor?: string;
compositTitleSize?: number; compositTitleSize?: number;
radius?: number; radius?: number;
/**
* Defines how mermaid renders curves for flowcharts.
*
*/
curve?: 'basis' | 'linear' | 'cardinal' | 'rounded';
/** /**
* Decides which rendering engine that is to be used for the rendering. * Decides which rendering engine that is to be used for the rendering.
* *

View File

@@ -54,16 +54,46 @@ export function stateDomId(itemId = '', counter = 0, type = '', typeSpacer = DOM
return `${DOMID_STATE}-${itemId}${typeStr}-${counter}`; return `${DOMID_STATE}-${itemId}${typeStr}-${counter}`;
} }
const setupDoc = (parentParsedItem, doc, diagramStates, nodes, edges, altFlag, look, classes) => { const setupDoc = (
parentParsedItem,
doc,
diagramStates,
nodes,
edges,
altFlag,
look,
classes,
config
) => {
// graphItemCount = 0; // graphItemCount = 0;
log.trace('items', doc); log.trace('items', doc);
doc.forEach((item) => { doc.forEach((item) => {
switch (item.stmt) { switch (item.stmt) {
case STMT_STATE: case STMT_STATE:
dataFetcher(parentParsedItem, item, diagramStates, nodes, edges, altFlag, look, classes); dataFetcher(
parentParsedItem,
item,
diagramStates,
nodes,
edges,
altFlag,
look,
classes,
config
);
break; break;
case DEFAULT_STATE_TYPE: case DEFAULT_STATE_TYPE:
dataFetcher(parentParsedItem, item, diagramStates, nodes, edges, altFlag, look, classes); dataFetcher(
parentParsedItem,
item,
diagramStates,
nodes,
edges,
altFlag,
look,
classes,
config
);
break; break;
case STMT_RELATION: case STMT_RELATION:
{ {
@@ -75,7 +105,8 @@ const setupDoc = (parentParsedItem, doc, diagramStates, nodes, edges, altFlag, l
edges, edges,
altFlag, altFlag,
look, look,
classes classes,
config
); );
dataFetcher( dataFetcher(
parentParsedItem, parentParsedItem,
@@ -85,7 +116,8 @@ const setupDoc = (parentParsedItem, doc, diagramStates, nodes, edges, altFlag, l
edges, edges,
altFlag, altFlag,
look, look,
classes classes,
config
); );
const edgeData = { const edgeData = {
id: 'edge' + graphItemCount, id: 'edge' + graphItemCount,
@@ -102,6 +134,7 @@ const setupDoc = (parentParsedItem, doc, diagramStates, nodes, edges, altFlag, l
thickness: G_EDGE_THICKNESS, thickness: G_EDGE_THICKNESS,
classes: CSS_EDGE, classes: CSS_EDGE,
look, look,
curve: config.state?.curve,
}; };
edges.push(edgeData); edges.push(edgeData);
graphItemCount++; graphItemCount++;
@@ -181,7 +214,8 @@ export const dataFetcher = (
edges, edges,
altFlag, altFlag,
look, look,
classes classes,
config
) => { ) => {
const itemId = parsedItem.id; const itemId = parsedItem.id;
const dbState = diagramStates.get(itemId); const dbState = diagramStates.get(itemId);
@@ -362,6 +396,7 @@ export const dataFetcher = (
labelType: G_EDGE_LABELTYPE, labelType: G_EDGE_LABELTYPE,
thickness: G_EDGE_THICKNESS, thickness: G_EDGE_THICKNESS,
look, look,
curve: config.state?.curve,
}); });
} else { } else {
insertOrUpdateNode(nodes, nodeData, classes); insertOrUpdateNode(nodes, nodeData, classes);
@@ -369,7 +404,17 @@ export const dataFetcher = (
} }
if (parsedItem.doc) { if (parsedItem.doc) {
log.trace('Adding nodes children '); log.trace('Adding nodes children ');
setupDoc(parsedItem, parsedItem.doc, diagramStates, nodes, edges, !altFlag, look, classes); setupDoc(
parsedItem,
parsedItem.doc,
diagramStates,
nodes,
edges,
!altFlag,
look,
classes,
config
);
} }
}; };

View File

@@ -221,7 +221,7 @@ const extract = (_doc) => {
const config = getConfig(); const config = getConfig();
const look = config.look; const look = config.look;
resetDataFetching(); resetDataFetching();
dataFetcher(undefined, getRootDocV2(), diagramStates, nodes, edges, true, look, classes); dataFetcher(undefined, getRootDocV2(), diagramStates, nodes, edges, true, look, classes, config);
nodes.forEach((node) => { nodes.forEach((node) => {
if (Array.isArray(node.label)) { if (Array.isArray(node.label)) {
// add the rest as description // add the rest as description

View File

@@ -478,7 +478,6 @@ export const insertEdge = function (elem, edge, clusterDb, diagramType, startNod
} }
let curve = curveBasis; let curve = curveBasis;
curve = curveLinear; curve = curveLinear;
// let curve = curveCardinal;
switch (edge.curve) { switch (edge.curve) {
case 'linear': case 'linear':
curve = curveLinear; curve = curveLinear;

View File

@@ -1375,6 +1375,12 @@ $defs: # JSON Schema definition (maybe we should move these to a separate file)
radius: radius:
type: number type: number
default: 5 default: 5
curve:
description: |
Defines how mermaid renders curves for flowcharts.
type: string
enum: ['basis', 'linear', 'cardinal', 'rounded']
default: 'rounded'
defaultRenderer: defaultRenderer:
description: | description: |
Decides which rendering engine that is to be used for the rendering. Decides which rendering engine that is to be used for the rendering.