in src/visual.ts [340:463]
private static converter(
dataView: DataView,
visualHost: IVisualHost,
localizationManager: ILocalizationManager,
colorHelper: ColorHelper,
): LineDotChartViewModel {
let categorical: LineDotChartColumns<DataViewCategoryColumn & DataViewValueColumn[]>
= LineDotChartColumns.getCategoricalColumns(dataView);
if (!categorical
|| !categorical.Date
|| !categorical.Date.source
|| _.isEmpty(categorical.Date.values)
|| !categorical.Values
|| !categorical.Values[0]
|| !categorical.Values[0].source
|| _.isEmpty(categorical.Values[0].values)) {
return null;
}
let counterValues: PrimitiveValue[] = null;
for (let i = 0; i < dataView.categorical.values.length; i++) {
if (dataView.categorical.values[i].source.roles["Counter"]) {
counterValues = dataView.categorical.values[i].values;
}
}
const valuesColumn: DataViewValueColumn = categorical.Values[0];
const categoryType: valueType = AxisHelper.getCategoryValueType(categorical.Date.source, true);
const categoricalValues: LineDotChartColumns<any[]> = LineDotChartColumns.getCategoricalValues(dataView);
const settings: Settings = Settings.parseSettings(
dataView,
localizationManager,
colorHelper,
);
if (counterValues && counterValues.length > 0) {
let fValue: any = counterValues[0];
settings.isCounterDateTime.isCounterDateTime = fValue.getDate ? true : false;
}
let hasHighlights: boolean = !!(categorical.Values.length > 0 && valuesColumn.highlights);
const dateColumnFormatter = valueFormatter.create({
format: valueFormatter.getFormatStringByColumn(categorical.Date.source, true) || categorical.Date.source.format,
cultureSelector: visualHost.locale
});
let extentValues: [number, number] = d3.extent(categoricalValues.Values),
yMinValue: number = extentValues[0],
yMaxValue: number = extentValues[1],
dotPoints: LineDotPoint[] = [],
sumOfValues: number = 0;
const dateValues: DateValue[] = [],
isOrdinal: boolean = AxisHelper.isOrdinal(categoryType),
isDateTime: boolean = AxisHelper.isDateTime(categoryType);
for (let valueIndex: number = 0, length: number = categoricalValues.Date.length; valueIndex < length; valueIndex++) {
const value: number = categoricalValues.Values[valueIndex] || 0;
let dateValue: DateValue = new DateValue(categoricalValues.Date[valueIndex], null);
if (isDateTime) {
dateValue.value = categoricalValues.Date[valueIndex].getTime();
} else if (!isOrdinal) {
dateValue.value = categoricalValues.Date[valueIndex];
} else {
dateValue.value = valueIndex;
}
dateValues.push(dateValue);
sumOfValues += value;
const selector: ISelectionId = visualHost.createSelectionIdBuilder()
.withCategory(categorical.Date, valueIndex)
.createSelectionId();
dotPoints.push({
dateValue,
value,
dot: (yMaxValue - yMinValue)
? (value - yMinValue) / (yMaxValue - yMinValue)
: 0,
sum: sumOfValues,
selected: false,
identity: selector,
highlight: hasHighlights && !!(valuesColumn.highlights[valueIndex]),
opacity: settings.dotoptions.percentile / 100,
counter: counterValues ? counterValues[valueIndex] : null
});
}
// make some space for counter + 25%
sumOfValues = sumOfValues + (sumOfValues - yMinValue) * LineDotChart.makeSomeSpaceForCounter;
const columnNames: ColumnNames = {
category: LineDotChart.getDisplayName(categorical.Date),
values: LineDotChart.getDisplayName(valuesColumn)
};
const dataValueFormatter: IValueFormatter = valueFormatter.create({
format: valueFormatter.getFormatStringByColumn(valuesColumn.source, true) || "#",
cultureSelector: visualHost.locale
});
return {
columnNames,
dotPoints,
settings,
dataValueFormatter,
dateColumnFormatter,
isOrdinal,
dateValues,
yMinValue,
yMaxValue,
sumOfValues,
hasHighlights,
dateMetadataColumn: categorical.Date.source,
valuesMetadataColumn: valuesColumn.source
};
}