in src/TornadoChart.ts [189:293]
public static CONVERTER(
dataView: DataView,
hostService: IVisualHost,
textOptions: TornadoChartTextOptions,
colors: IColorPalette,
localizationManager: ILocalizationManager
): TornadoChartDataView {
let categorical: DataViewCategorical = dataView.categorical;
let categories: DataViewCategoryColumn[] = categorical.categories || [];
let values: DataViewValueColumns = categorical.values;
let category: DataViewCategoryColumn = categories[0];
let maxValue: number = d3.max(<number[]>values[0].values);
let minValue: number = Math.min(d3.min(<number[]>values[0].values), 0);
if (values.length >= TornadoChart.MaxSeries) {
minValue = d3.min([minValue, d3.min(<number[]>values[1].values)]);
maxValue = d3.max([maxValue, d3.max(<number[]>values[1].values)]);
}
let settings: TornadoChartSettings = TornadoChart.parseSettings(dataView.metadata.objects, maxValue, colors);
let hasDynamicSeries: boolean = !!values.source;
let hasHighlights: boolean = values.length > 0 && values.some(value => value.highlights && value.highlights.some(_ => _));
let labelHeight: number = textMeasurementService.estimateSvgTextHeight({
fontFamily: dataLabelUtils.StandardFontFamily,
fontSize: PixelConverter.fromPoint(settings.labelSettings.fontSize),
});
let series: TornadoChartSeries[] = [];
let dataPoints: TornadoChartPoint[] = [];
let highlightedDataPoints: TornadoChartPoint[] = [];
let categorySourceFormatter: IValueFormatter = valueFormatter.create({
format: valueFormatter.getFormatStringByColumn(category.source)
});
let categoriesLabels: TextData[] = category.values.map(value => TornadoChart.getTextData(categorySourceFormatter.format(value), textOptions, true));
let groupedValues: DataViewValueColumnGroup[] = values.grouped ? values.grouped() : null;
for (let seriesIndex = 0; seriesIndex < Math.min(values.length, TornadoChart.MaxSeries); seriesIndex++) {
let columnGroup: DataViewValueColumnGroup = groupedValues && groupedValues.length > seriesIndex
&& groupedValues[seriesIndex].values ? groupedValues[seriesIndex] : null;
let parsedSeries: TornadoChartSeries = TornadoChart.PARSE_SERIES(dataView, values, hostService, seriesIndex, hasDynamicSeries, columnGroup, colors);
let currentSeries: DataViewValueColumn = values[seriesIndex];
let measureName: string = currentSeries.source.queryName;
series.push(parsedSeries);
for (let i: number = 0; i < category.values.length; i++) {
let value: number = currentSeries.values[i] == null || isNaN(<number>currentSeries.values[i]) ? 0 : <number>currentSeries.values[i];
let identity: ISelectionId = TornadoChart.buildIdentitySelection(hostService, category, i, values, columnGroup, measureName);
let formattedCategoryValue: string = categoriesLabels[i].text;
const buildTooltip = (highlightedValue) => tooltipBuilder.createTooltipInfo(
categorical,
formattedCategoryValue,
localizationManager,
value,
seriesIndex,
highlightedValue || null);
// Limit maximum value with what the user choose
let currentMaxValue = parsedSeries.categoryAxisEnd ? parsedSeries.categoryAxisEnd : maxValue;
let formatString: string = dataView.categorical.values[seriesIndex].source.format;
let highlight: number = null;
const dataPointCommon = {
value,
minValue,
maxValue: currentMaxValue,
formatString,
color: parsedSeries.fill,
selected: false,
identity,
categoryIndex: i,
};
if (hasHighlights) {
highlight = <number>currentSeries.highlights[i];
let highlightedValue: number = highlight != null ? highlight : value;
highlightedDataPoints.push({
...dataPointCommon,
value: highlightedValue,
tooltipData: buildTooltip(highlightedValue),
highlight: !!highlight,
});
}
dataPoints.push({
...dataPointCommon,
tooltipData: buildTooltip(null),
highlight: hasHighlights && !!highlight,
});
}
}
return {
categories: categoriesLabels,
series: series,
settings: settings,
legend: TornadoChart.getLegendData(series, hasDynamicSeries),
dataPoints: dataPoints,
highlightedDataPoints: highlightedDataPoints,
maxLabelsWidth: Math.max(...categoriesLabels.map(x => x.width)),
hasDynamicSeries: hasDynamicSeries,
hasHighlights: hasHighlights,
labelHeight: labelHeight,
legendObjectProperties: dataViewObjects.getObject(dataView.metadata.objects, "legend", {}),
categoriesObjectProperties: dataViewObjects.getObject(dataView.metadata.objects, "categories", {}),
};
}