in src/plugins/vis_type_table/public/agg_table/agg_table.js [121:258]
function () {
const { table, exportTitle, percentageCol } = $scope;
const showPercentage = percentageCol !== '';
if (!table) {
$scope.rows = null;
$scope.formattedColumns = null;
$scope.splitRow = null;
return;
}
self.csv.filename = (exportTitle || table.title || 'unsaved') + '.csv';
$scope.rows = table.rows;
$scope.formattedColumns = [];
if (typeof $scope.dimensions === 'undefined') return;
const { buckets, metrics, splitColumn, splitRow } = $scope.dimensions;
$scope.formattedColumns = table.columns
.map(function (col, i) {
const isBucket = buckets.find((bucket) => bucket.accessor === i);
const isSplitColumn = splitColumn
? splitColumn.find((splitColumn) => splitColumn.accessor === i)
: undefined;
const isSplitRow = splitRow
? splitRow.find((splitRow) => splitRow.accessor === i)
: undefined;
const dimension =
isBucket || isSplitColumn || metrics.find((metric) => metric.accessor === i);
const formatter = dimension
? getFormatService().deserialize(dimension.format)
: undefined;
const formattedColumn = {
id: col.id,
title: col.name,
formatter: formatter,
filterable: !!isBucket,
};
if (isSplitRow) {
$scope.splitRow = formattedColumn;
}
if (!dimension) return;
const last = i === table.columns.length - 1;
if (last || !isBucket) {
formattedColumn.class = 'visualize-table-right';
}
const isDate =
dimension.format?.id === 'date' || dimension.format?.params?.id === 'date';
const allowsNumericalAggregations = formatter?.allowsNumericalAggregations;
let { totalFunc } = $scope;
if (typeof totalFunc === 'undefined' && showPercentage) {
totalFunc = 'sum';
}
if (allowsNumericalAggregations || isDate || totalFunc === 'count') {
const sum = (tableRows) => {
return _.reduce(
tableRows,
function (prev, curr) {
// some metrics return undefined for some of the values
// derivative is an example of this as it returns undefined in the first row
if (curr[col.id] === undefined) return prev;
return prev + curr[col.id];
},
0
);
};
formattedColumn.sumTotal = sum(table.rows);
switch (totalFunc) {
case 'sum': {
if (!isDate) {
const total = formattedColumn.sumTotal;
formattedColumn.formattedTotal = formatter.convert(total);
formattedColumn.total = formattedColumn.sumTotal;
}
break;
}
case 'avg': {
if (!isDate) {
const total = sum(table.rows) / table.rows.length;
formattedColumn.formattedTotal = formatter.convert(total);
formattedColumn.total = total;
}
break;
}
case 'min': {
const total = _.chain(table.rows).map(col.id).min().value();
formattedColumn.formattedTotal = formatter.convert(total);
formattedColumn.total = total;
break;
}
case 'max': {
const total = _.chain(table.rows).map(col.id).max().value();
formattedColumn.formattedTotal = formatter.convert(total);
formattedColumn.total = total;
break;
}
case 'count': {
const total = table.rows.length;
formattedColumn.formattedTotal = total;
formattedColumn.total = total;
break;
}
default:
break;
}
}
return formattedColumn;
})
.filter((column) => column);
if (showPercentage) {
const insertAtIndex = _.findIndex($scope.formattedColumns, { title: percentageCol });
// column to show percentage for was removed
if (insertAtIndex < 0) return;
const { cols, rows } = addPercentageCol(
$scope.formattedColumns,
percentageCol,
table.rows,
insertAtIndex
);
$scope.rows = rows;
$scope.formattedColumns = cols;
}
}