in src/data.ts [59:136]
export function convertToDataPointsMap(dataView: DataView): DataPointsMapData {
const formatting = powerbi.extensibility.utils.formatting;
const category = dataView.categorical.categories && dataView.categorical.categories[0];
const values = dataView.categorical.values || <powerbi.DataViewValueColumn[]>[];
const highlights = values[0] && values[0].highlights;
const table = dataView.table;
const rows = table.rows;
const columns = dataView.metadata.columns;
const identities = table.identity || [];
const countColumn = findColumn(dataView, 'count');
const instanceColumn = findColumn(dataView, 'facetInstance');
const facetColumn = findColumn(dataView, 'facet');
const rangeValueColumns = findColumn(dataView, 'rangeValue', true);
const colorColumn = findColumn(dataView, 'facetInstanceColor');
const countFormatter = (countColumn && countColumn.format) && formatting.valueFormatter.create({format: countColumn.format});
const facetFormatter = (facetColumn && facetColumn.format) && formatting.valueFormatter.create({format: facetColumn.format});
const instanceFormatter = (instanceColumn && instanceColumn.format) && formatting.valueFormatter.create({format: instanceColumn.format});
const dataPointsMap = {};
// Convert rows to datapointsMap
rows.forEach((row, index) => {
const highlight = (highlights && <number>highlights[index]) || 0;
const identity = identities[index];
const objects = category && category.objects && category.objects[index];
// map each value with corresponding column name
const rowObj: RowObject = { index, identity };
row.forEach((colValue, idx) => {
const colRoles = Object.keys(columns[idx].roles);
// In sandbox mode, date type colValue sometimes include string so we have to force it to be date.
const columnValue = colValue && (columns[idx].type.dateTime ? new Date(<string>colValue) : colValue);
colRoles.forEach(role => {
if (role === 'rangeValue') {
const format = columns[idx].format;
const columnName = columns[idx].displayName;
const rangeValueFormatter = formatting.valueFormatter.create({ format: format });
!rowObj.rangeValues && (rowObj.rangeValues = []);
const value: RangeValue = {
value: columnValue,
valueLabel: formatValue(rangeValueFormatter, columnValue, ''),
key: safeKey(columnName)
};
columnValue && rowObj.rangeValues.push(value);
} else {
rowObj[role] = columnValue;
}
});
});
const { facet, facetInstance, count, facetInstanceColor, iconClass, rangeValues } = rowObj;
const facetKey = safeKey(String(facet || ' '));
const facetLabel = escape(formatValue(facetFormatter, (isString(facet) ? facet.charAt(0).toUpperCase() + facet.slice(1) : facet)));
const instanceLabel = escape(formatValue(instanceFormatter, facetInstance));
const instanceValue = instanceLabel !== '' ? instanceLabel + index : '';
const instanceCount = Math.max(count, highlight) || 0;
const instanceCountFormatter = countFormatter;
const instanceColor = colorColumn ? (facetInstanceColor && String(facetInstanceColor)) || '#DDDDDD' : undefined;
const instanceIconClass = (iconClass && String(iconClass)) || 'default fa fa-circle';
const dataPoint: DataPoint = {
rows: [rowObj],
highlight,
facetKey,
facetLabel,
instanceValue,
instanceLabel,
instanceCount,
instanceCountFormatter,
instanceColor,
instanceIconClass,
rangeValues,
};
!dataPointsMap[facetKey] && (dataPointsMap[facetKey] = []);
dataPointsMap[facetKey].push(dataPoint);
});
return { dataPointsMap, hasHighlight: !!highlights };
}