function selectLabels()

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;
}