mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-28 19:59:43 +02:00
feat(sankey): Show values (#4674)
This commit is contained in:
@@ -1298,6 +1298,21 @@ export interface SankeyDiagramConfig extends BaseDiagramConfig {
|
||||
*/
|
||||
nodeAlignment?: 'left' | 'right' | 'center' | 'justify';
|
||||
useMaxWidth?: boolean;
|
||||
/**
|
||||
* Toggle to display or hide values along with title.
|
||||
*
|
||||
*/
|
||||
showValues?: boolean;
|
||||
/**
|
||||
* The prefix to use for values
|
||||
*
|
||||
*/
|
||||
prefix?: string;
|
||||
/**
|
||||
* The suffix to use for values
|
||||
*
|
||||
*/
|
||||
suffix?: string;
|
||||
}
|
||||
/**
|
||||
* This interface was referenced by `MermaidConfig`'s JSON-Schema
|
||||
|
@@ -31,7 +31,7 @@ class SankeyLink {
|
||||
/**
|
||||
* @param source - Node where the link starts
|
||||
* @param target - Node where the link ends
|
||||
* @param value - number, float or integer, describes the amount to be passed
|
||||
* @param value - Describes the amount to be passed
|
||||
*/
|
||||
const addLink = (source: SankeyNode, target: SankeyNode, value: number): void => {
|
||||
links.push(new SankeyLink(source, target, value));
|
||||
|
@@ -18,7 +18,7 @@ import {
|
||||
} from 'd3-sankey';
|
||||
import { configureSvgSize } from '../../setupGraphViewbox.js';
|
||||
import { Uid } from '../../rendering-util/uid.js';
|
||||
import type { SankeyLinkColor, SankeyNodeAlignment } from '../../config.type.js';
|
||||
import type { SankeyNodeAlignment } from '../../config.type.js';
|
||||
|
||||
// Map config options to alignment functions
|
||||
const alignmentsMap: Record<
|
||||
@@ -62,10 +62,13 @@ export const draw = function (text: string, id: string, _version: string, diagOb
|
||||
|
||||
// Establish svg dimensions and get width and height
|
||||
//
|
||||
const width = conf?.width || defaultSankeyConfig.width!;
|
||||
const height = conf?.height || defaultSankeyConfig.width!;
|
||||
const useMaxWidth = conf?.useMaxWidth || defaultSankeyConfig.useMaxWidth!;
|
||||
const nodeAlignment = conf?.nodeAlignment || defaultSankeyConfig.nodeAlignment!;
|
||||
const width = conf?.width ?? defaultSankeyConfig.width!;
|
||||
const height = conf?.height ?? defaultSankeyConfig.width!;
|
||||
const useMaxWidth = conf?.useMaxWidth ?? defaultSankeyConfig.useMaxWidth!;
|
||||
const nodeAlignment = conf?.nodeAlignment ?? defaultSankeyConfig.nodeAlignment!;
|
||||
const prefix = conf?.prefix ?? defaultSankeyConfig.prefix!;
|
||||
const suffix = conf?.suffix ?? defaultSankeyConfig.suffix!;
|
||||
const showValues = conf?.showValues ?? defaultSankeyConfig.showValues!;
|
||||
|
||||
// FIX: using max width prevents height from being set, is it intended?
|
||||
// to add height directly one can use `svg.attr('height', height)`
|
||||
@@ -94,7 +97,7 @@ export const draw = function (text: string, id: string, _version: string, diagOb
|
||||
const sankey = d3Sankey()
|
||||
.nodeId((d: any) => d.id) // we use 'id' property to identify node
|
||||
.nodeWidth(nodeWidth)
|
||||
.nodePadding(10)
|
||||
.nodePadding(10 + (showValues ? 15 : 0))
|
||||
.nodeAlign(nodeAlign)
|
||||
.extent([
|
||||
[0, 0],
|
||||
@@ -130,6 +133,13 @@ export const draw = function (text: string, id: string, _version: string, diagOb
|
||||
.attr('width', (d: any) => d.x1 - d.x0)
|
||||
.attr('fill', (d: any) => colorScheme(d.id));
|
||||
|
||||
const getText = ({ id, value }: { id: string; value: number }) => {
|
||||
if (!showValues) {
|
||||
return id;
|
||||
}
|
||||
return `${id}\n${prefix}${Math.round(value * 100) / 100}${suffix}`;
|
||||
};
|
||||
|
||||
// Create labels for nodes
|
||||
svg
|
||||
.append('g')
|
||||
@@ -141,9 +151,9 @@ export const draw = function (text: string, id: string, _version: string, diagOb
|
||||
.join('text')
|
||||
.attr('x', (d: any) => (d.x0 < width / 2 ? d.x1 + 6 : d.x0 - 6))
|
||||
.attr('y', (d: any) => (d.y1 + d.y0) / 2)
|
||||
.attr('dy', '0.35em')
|
||||
.attr('dy', `${showValues ? '0' : '0.35'}em`)
|
||||
.attr('text-anchor', (d: any) => (d.x0 < width / 2 ? 'start' : 'end'))
|
||||
.text((d: any) => d.id);
|
||||
.text(getText);
|
||||
|
||||
// Creates the paths that represent the links.
|
||||
const link = svg
|
||||
|
@@ -1859,6 +1859,20 @@ $defs: # JSON Schema definition (maybe we should move these to a seperate file)
|
||||
default: justify
|
||||
useMaxWidth:
|
||||
default: false
|
||||
showValues:
|
||||
description: |
|
||||
Toggle to display or hide values along with title.
|
||||
default: true
|
||||
prefix:
|
||||
description: |
|
||||
The prefix to use for values
|
||||
type: string
|
||||
default: ''
|
||||
suffix:
|
||||
description: |
|
||||
The suffix to use for values
|
||||
type: string
|
||||
default: ''
|
||||
|
||||
FontCalculator:
|
||||
title: Font Calculator
|
||||
|
Reference in New Issue
Block a user