in src/services/dataRenderService.ts [493:579]
private drawLabels(data: ArcDescriptor<AsterDataPoint>[],
context: Selection<AsterArcDescriptor>,
layout: ILabelLayout,
viewport: IViewport,
outlineArc: any,
labelArc: any): void {
// Hide and reposition labels that overlap
let dataLabelManager: DataLabelManager = new DataLabelManager();
let filteredData: any = dataLabelManager.hideCollidedLabels(viewport, data, layout, true /* addTransform */);
if (filteredData.length === 0) {
dataLabelUtils.cleanDataLabels(context, true);
return;
}
// Draw labels
if (context.select(DataRenderService.labelGraphicsContextClass.selectorName).empty()) {
context.append("g").classed(DataRenderService.labelGraphicsContextClass.className, true);
}
let labels: Selection<any> = context
.select(DataRenderService.labelGraphicsContextClass.selectorName)
.selectAll(".data-labels")
.data<LabelEnabledDataPoint>(
filteredData,
(d: AsterArcDescriptor) => (<ISelectionId>d.data.identity).getKey());
labels
.exit()
.remove();
labels = labels.merge(
labels
.enter()
.append("text")
.classed("data-labels", true));
if (!labels) {
return;
}
labels
.attrs({ x: (d: LabelEnabledDataPoint) => d.labelX, y: (d: LabelEnabledDataPoint) => d.labelY, dy: ".35em" })
.text((d: LabelEnabledDataPoint) => d.labeltext)
.styles(layout.style);
// Draw lines
if (context.select(DataRenderService.linesGraphicsContextClass.selectorName).empty())
context.append("g").classed(DataRenderService.linesGraphicsContextClass.className, true);
// Remove lines for null and zero values
filteredData = filter(filteredData, (d: AsterArcDescriptor) => d.data.sliceHeight !== null && d.data.sliceHeight !== 0);
let lines = context
.select(DataRenderService.linesGraphicsContextClass.selectorName)
.selectAll("polyline")
.data<LabelEnabledDataPoint>(
filteredData,
(d: AsterArcDescriptor) => (<ISelectionId>d.data.identity).getKey());
let midAngle = (d: any) => { return d.startAngle + (d.endAngle - d.startAngle) / 2; };
lines
.exit()
.remove();
lines = lines.merge(
lines.enter()
.append("polyline")
.classed("line-label", true));
lines
.attr("points", (d) => {
let textPoint = [d.labelX, d.labelY];
textPoint[0] = textPoint[0] + ((midAngle(<any>d) < Math.PI ? -1 : 1) * DataRenderService.LabelLinePadding);
let chartPoint = outlineArc.centroid(<any>d);
chartPoint[0] *= DataRenderService.ChartLinePadding;
chartPoint[1] *= DataRenderService.ChartLinePadding;
return <any>[chartPoint, textPoint];
})
.style("opacity", 0.5)
.style("fill-opacity", 0)
.style("stroke", () => this.settings.labels.color);
}