d2b
Version:
83 lines (73 loc) • 3.15 kB
JavaScript
import functor from '../util/functor';
import { scalePow } from 'd3-scale';
/**
* d2b.chartSankeyAdvanced(chart, datum) configures the input chart and formats a returned datum set
*/
export default function (chart, datum) {
const breadcrumbsConfig = datum.breadcrumbs || {};
const tooltipConfig = datum.tooltip || {};
// Chart Config
chart
.label.proxy(d => d.label)
.outerRadius.conditionally(datum.outerRadius, (d, w, h) => functor(datum.outerRadius)(w, h))
.innerRadius.conditionally(datum.innerRadius, (d, w, h) => functor(datum.innerRadius)(w, h))
.color.proxy(d => d.color || functor(datum.color)(d));
// Chart Frame Config
chart.chartFrame()
.size.conditionally(datum.size)
.padding.conditionally(datum.padding)
.chartPadding.conditionally(datum.chartPadding)
.breadcrumbsEnabled.conditionally(breadcrumbsConfig.enabled)
.breadcrumbsOrient.conditionally(breadcrumbsConfig.orient);
// Breadcrumbs Config
chart.breadcrumbs()
.vertical.conditionally(breadcrumbsConfig.orient, ['right', 'left'].includes(breadcrumbsConfig.orient))
.html.proxy(d => {
const data = d.data;
const value = d.value;
const percent = d.value / d.selected.value;
if (data.breadcrumb !== undefined) {
return data.breadcrumb;
} else if (breadcrumbsConfig.html !== undefined) {
return functor(breadcrumbsConfig.html)(data, value, percent);
}
});
// Tooltip Config
chart.tooltip()
.followMouse.conditionally(tooltipConfig.followMouse)
.my.conditionally(tooltipConfig.my)
.at.conditionally(tooltipConfig.at)
.html.proxy(d => {
const data = d.data;
const value = d.value;
const percent = d.value / d.selected.value;
if (data.tooltip !== undefined) {
return data.tooltip;
} else if (tooltipConfig.html !== undefined) {
return functor(tooltipConfig.html)(data, value, percent);
}
});
// Sunburst Config
const sunburst = chart.sunburst()
.root.proxy(d => d.root)
.size.proxy(d => d.size)
.duration.conditionally(datum.duration)
.ancestorPadding.conditionally(datum.ancestorPadding)
.ancestorRatio.conditionally(datum.ancestorRatio)
.descendantLevels.conditionally(datum.descendantLevels)
.startAngle.conditionally(datum.startAngle)
.endAngle.conditionally(datum.endAngle)
.showLabels.conditionally(datum.showLabels)
.zoomable.conditionally(datum.zoomable)
.highlight.conditionally(datum.highlight)
.ancestorBanding.conditionally(datum.ancestorBandingExponent, scalePow().exponent(datum.ancestorBandingExponent))
.descendantBanding.conditionally(datum.descendantBandingExponent, scalePow().exponent(datum.descendantBandingExponent));
// D3 Pie Config
const d3Pie = sunburst.pie();
if (datum.padAngle !== undefined) d3Pie.padAngle(datum.padAngle);
if (datum.sort !== undefined) d3Pie.sort(datum.sort === null ? null : (a, b) => datum.sort.slice(0)(a.data, b.data));
// D3 Arc Config
const d3Arc = sunburst.arc();
if (datum.cornerRadius !== undefined) d3Arc.cornerRadius(datum.cornerRadius, 0);
return datum;
}