in src/dataLabel/dataLabelUtils.ts [247:294]
function selectLabels(filteredData: LabelEnabledDataPoint[], context: Selection<any, any, any, any>, isDonut: boolean = false, forAnimation: boolean = false, animationDuration?: number): Selection<BaseType, any, BaseType, any> {
// Check for a case where resizing leaves no labels - then we need to remove the labels "g"
if (filteredData.length === 0) {
cleanDataLabels(context, true);
return null;
}
if (context.select(labelGraphicsContextClass.selectorName).empty()) {
context.append("g").classed(labelGraphicsContextClass.className, true);
}
// line chart ViewModel has a special "key" property for point identification since the "identity" field is set to the series identity
let hasKey: boolean = (<any>filteredData)[0].key != null;
let hasDataPointIdentity: boolean = (<any>filteredData)[0].identity != null;
let getIdentifier = hasKey ?
(d: any) => d.key
: hasDataPointIdentity ?
(d: SelectionDataPoint) => (d.identity as ISelectionId).getKey()
: undefined;
let labels: Selection<any, any, any, any> = isDonut ?
context.select(labelGraphicsContextClass.selectorName).selectAll(labelsClass.selectorName).data(filteredData, (d: any) => d.data.identity.getKey())
: getIdentifier != null ?
context.select(labelGraphicsContextClass.selectorName).selectAll(labelsClass.selectorName).data(filteredData, getIdentifier)
: context.select(labelGraphicsContextClass.selectorName).selectAll(labelsClass.selectorName).data(filteredData);
if (forAnimation) {
labels
.exit()
.transition()
.duration(animationDuration)
.style("opacity", 0) // fade out labels that are removed
.remove();
} else {
labels.exit().remove();
}
let allLabels = labels.enter()
.append("text")
.classed(labelsClass.className, true)
.merge(labels);
if (forAnimation) {
allLabels.style("opacity", 0);
}
return allLabels;
}