Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/4935 subgraph title margin config option #5041

Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
b134766
Add subgraph title margin config options to schema.
mathbraga Nov 11, 2023
0bcd5d2
Create helper function for subgraph title margin fetching.
mathbraga Nov 11, 2023
52ed387
Fix nesting of getSubGraphTitleMargins test.
mathbraga Nov 11, 2023
8b0a5be
Include subgraph margin into label positioning
mathbraga Nov 11, 2023
56c3809
Add logic to add subgraph title margin on layout
mathbraga Nov 12, 2023
453c16d
Remove unnecessary code
mathbraga Nov 17, 2023
7e77433
Add tests for subgraph title margin
mathbraga Nov 17, 2023
42ac630
Merge branch 'develop' into feature/4935_subgraph-title-margin-config…
mathbraga Nov 18, 2023
ad6c761
Modify getSubGraphTitleMargins to use null coalescing operator
mathbraga Nov 20, 2023
c0a43f5
Change getSubGraphTitleMargins to accept config object as parameter
mathbraga Nov 20, 2023
63c2d36
Rename file and update imports
mathbraga Nov 20, 2023
fc3018e
Move subgraph title margin tests to independent file
mathbraga Nov 20, 2023
d61bfde
Replace string concat with string templates
mathbraga Nov 21, 2023
a935380
Merge branch 'feature/4935_subgraph-title-margin-config-option' of ht…
mathbraga Nov 21, 2023
d79671e
Resolve lint issue
mathbraga Nov 21, 2023
997a377
Merge branch 'develop' into feature/4935_subgraph-title-margin-config…
mathbraga Nov 21, 2023
3489fc4
Replace multiple calls of getConfig() for a single at top of the scope
mathbraga Nov 25, 2023
904be16
Merge branch 'develop' into feature/4935_subgraph-title-margin-config…
mathbraga Nov 25, 2023
ce875c9
Move getConfig() call out of recursiveRender to its parent caller
mathbraga Nov 26, 2023
a807a58
Modify margin logic to avoid creating unnecessary space in subgraph
mathbraga Nov 28, 2023
7979b28
Add test for subgraphs with title margins and edge labels
mathbraga Nov 28, 2023
8e794e3
Merge branch 'feature/4935_subgraph-title-margin-config-option' of ht…
mathbraga Nov 28, 2023
5718be5
Merge branch 'develop' into feature/4935_subgraph-title-margin-config…
mathbraga Nov 28, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions cypress/integration/rendering/flowchart-v2.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -874,4 +874,72 @@ end
});
});
});
describe('Subgraph title margins', () => {
it('Should render subgraphs with title margins set (LR)', () => {
imgSnapshotTest(
`flowchart LR

subgraph TOP
direction TB
subgraph B1
direction RL
i1 -->f1
end
subgraph B2
direction BT
i2 -->f2
end
end
A --> TOP --> B
B1 --> B2
`,
{ flowchart: { subGraphTitleMargin: { top: 10, bottom: 5 } } }
);
});
it('Should render subgraphs with title margins set (TD)', () => {
imgSnapshotTest(
`flowchart TD

subgraph TOP
direction LR
subgraph B1
direction RL
i1 -->f1
end
subgraph B2
direction BT
i2 -->f2
end
end
A --> TOP --> B
B1 --> B2
`,
{ flowchart: { subGraphTitleMargin: { top: 8, bottom: 16 } } }
);
});
it('Should render subgraphs with title margins set (LR) and htmlLabels set to false', () => {
imgSnapshotTest(
`flowchart LR

subgraph TOP
direction TB
subgraph B1
direction RL
i1 -->f1
end
subgraph B2
direction BT
i2 -->f2
end
end
A --> TOP --> B
B1 --> B2
`,
{
htmlLabels: false,
flowchart: { htmlLabels: false, subGraphTitleMargin: { top: 10, bottom: 5 } },
}
);
});
});
});
8 changes: 8 additions & 0 deletions packages/mermaid/src/config.type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1411,6 +1411,14 @@ export interface FlowchartDiagramConfig extends BaseDiagramConfig {
* Margin top for the text over the diagram
*/
titleTopMargin?: number;
/**
* Defines a top/bottom margin for subgraph titles
*
*/
subGraphTitleMargin?: {
top?: number;
bottom?: number;
};
arrowMarkerAbsolute?: boolean;
/**
* The amount of padding around the diagram as a whole so that embedded
Expand Down
12 changes: 10 additions & 2 deletions packages/mermaid/src/dagre-wrapper/clusters.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { createText } from '../rendering-util/createText.js';
import { select } from 'd3';
import { getConfig } from '../diagram-api/diagramAPI.js';
import { evaluate } from '../diagrams/common/common.js';
import { getSubGraphTitleMargins } from '../utils/getSubGraphTitleMargins.js';

const rect = (parent, node) => {
log.info('Creating subgraph rect for ', node.id, node);
Expand Down Expand Up @@ -63,17 +64,22 @@ const rect = (parent, node) => {
.attr('width', width)
.attr('height', node.height + padding);

const { subGraphTitleTopMargin } = getSubGraphTitleMargins();
if (useHtmlLabels) {
label.attr(
'transform',
// This puts the labal on top of the box instead of inside it
'translate(' + (node.x - bbox.width / 2) + ', ' + (node.y - node.height / 2) + ')'
'translate(' +
(node.x - bbox.width / 2) +
', ' +
(node.y - node.height / 2 + subGraphTitleTopMargin) +
')'
sidharthv96 marked this conversation as resolved.
Show resolved Hide resolved
);
} else {
label.attr(
'transform',
// This puts the labal on top of the box instead of inside it
'translate(' + node.x + ', ' + (node.y - node.height / 2) + ')'
'translate(' + node.x + ', ' + (node.y - node.height / 2 + subGraphTitleTopMargin) + ')'
sidharthv96 marked this conversation as resolved.
Show resolved Hide resolved
);
}
// Center the label
Expand Down Expand Up @@ -175,6 +181,7 @@ const roundedWithTitle = (parent, node) => {
.attr('width', width + padding)
.attr('height', node.height + padding - bbox.height - 3);

const { subGraphTitleTopMargin } = getSubGraphTitleMargins();
// Center the label
label.attr(
'transform',
Expand All @@ -185,6 +192,7 @@ const roundedWithTitle = (parent, node) => {
node.height / 2 -
node.padding / 3 +
(evaluate(getConfig().flowchart.htmlLabels) ? 5 : 3)) +
subGraphTitleTopMargin +
')'
);

Expand Down
6 changes: 5 additions & 1 deletion packages/mermaid/src/dagre-wrapper/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ import { insertNode, positionNode, clear as clearNodes, setNodeElem } from './no
import { insertCluster, clear as clearClusters } from './clusters.js';
import { insertEdgeLabel, positionEdgeLabel, insertEdge, clear as clearEdges } from './edges.js';
import { log } from '../logger.js';
import { getSubGraphTitleMargins } from '../utils/getSubGraphTitleMargins.js';

const { subGraphTitleTotalMargin } = getSubGraphTitleMargins();
sidharthv96 marked this conversation as resolved.
Show resolved Hide resolved

const recursiveRender = async (_elem, graph, diagramtype, id, parentCluster) => {
log.info('Graph in recursive render: XXX', graphlibJson.write(graph), parentCluster);
Expand Down Expand Up @@ -114,13 +117,14 @@ const recursiveRender = async (_elem, graph, diagramtype, id, parentCluster) =>
);
if (node && node.clusterNode) {
// clusterDb[node.id].node = node;

node.y += subGraphTitleTotalMargin;
positionNode(node);
} else {
// Non cluster node
if (graph.children(v).length > 0) {
// A cluster in the non-recursive way
// positionCluster(node);
node.height += subGraphTitleTotalMargin * 2;
insertCluster(clusters, node);
clusterDb[node.id].node = node;
} else {
Expand Down
15 changes: 15 additions & 0 deletions packages/mermaid/src/schemas/config.schema.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1863,6 +1863,7 @@ $defs: # JSON Schema definition (maybe we should move these to a separate file)
unevaluatedProperties: false
required:
- titleTopMargin
- subGraphTitleMargin
- diagramPadding
- htmlLabels
- nodeSpacing
Expand All @@ -1875,6 +1876,20 @@ $defs: # JSON Schema definition (maybe we should move these to a separate file)
titleTopMargin:
$ref: '#/$defs/GitGraphDiagramConfig/properties/titleTopMargin'
default: 25
subGraphTitleMargin:
description: |
Defines a top/bottom margin for subgraph titles
type: object
properties:
top:
type: integer
minimum: 0
bottom:
type: integer
minimum: 0
default:
top: 0
bottom: 0
arrowMarkerAbsolute:
type: boolean # TODO, is this actually used here (it has no default value but was in types)
diagramPadding:
Expand Down
22 changes: 22 additions & 0 deletions packages/mermaid/src/utils.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { vi } from 'vitest';
import utils, { calculatePoint, cleanAndMerge, detectDirective } from './utils.js';
import { getSubGraphTitleMargins } from './utils/getSubGraphTitleMargins.js';
import * as configApi from './config.js';
import assignWithDepth from './assignWithDepth.js';
import { detectType } from './diagram-api/detectType.js';
import { addDiagrams } from './diagram-api/diagram-orchestration.js';
Expand Down Expand Up @@ -594,3 +596,23 @@ describe('calculatePoint', () => {
);
});
});

describe('getSubGraphTitleMargins', () => {
it('should get subgraph title margins after config has been set', () => {
const config_0 = {
flowchart: {
subGraphTitleMargin: {
top: 10,
bottom: 5,
},
},
};

configApi.setSiteConfig(config_0);
expect(getSubGraphTitleMargins()).toEqual({
subGraphTitleTopMargin: 10,
subGraphTitleBottomMargin: 5,
subGraphTitleTotalMargin: 15,
});
});
});
sidharthv96 marked this conversation as resolved.
Show resolved Hide resolved
17 changes: 17 additions & 0 deletions packages/mermaid/src/utils/getSubGraphTitleMargins.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { getConfig } from '../diagram-api/diagramAPI.js';

export const getSubGraphTitleMargins = (): {
subGraphTitleTopMargin: number;
subGraphTitleBottomMargin: number;
subGraphTitleTotalMargin: number;
} => {
const subGraphTitleTopMargin = getConfig().flowchart?.subGraphTitleMargin?.top || 0;
const subGraphTitleBottomMargin = getConfig().flowchart?.subGraphTitleMargin?.bottom || 0;
sidharthv96 marked this conversation as resolved.
Show resolved Hide resolved
const subGraphTitleTotalMargin = subGraphTitleTopMargin + subGraphTitleBottomMargin;

return {
subGraphTitleTopMargin,
subGraphTitleBottomMargin,
subGraphTitleTotalMargin,
};
};
Loading