@adaptabletools/adaptable-cjs
Version:
Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements
67 lines (66 loc) • 2.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.weightedAverage = exports.getNumericValue = void 0;
const tslib_1 = require("tslib");
const toNumber_1 = tslib_1.__importDefault(require("lodash/toNumber"));
const getNumericValue = (input) => {
if (typeof input === 'number') {
return input;
}
const numericValue = (0, toNumber_1.default)(input);
return isNaN(numericValue) ? null : numericValue;
};
exports.getNumericValue = getNumericValue;
function getWeightedAverageLeafNodes(gridApi, groupRowNode, filteredOnly) {
const nodeList = (filteredOnly ? groupRowNode.childrenAfterFilter : groupRowNode.childrenAfterGroup) ?? [];
let leafNodes = [];
nodeList.forEach((rowNode) => {
if (rowNode.group === true) {
// Recursively extract leaf nodes from group
leafNodes = leafNodes.concat(getWeightedAverageLeafNodes(gridApi, rowNode, filteredOnly));
}
else {
leafNodes.push(rowNode);
}
});
return leafNodes;
}
const weightedAverage = (params, columnId, weightColumnId) => {
const { api: gridApi, rowNode: groupRowNode } = params;
let weightedColumnValueSum = 0;
let columnValueSum = 0;
const filteredOnly = !gridApi.getGridOption('suppressAggFilteredOnly');
const leafNodes = getWeightedAverageLeafNodes(gridApi, groupRowNode, filteredOnly);
leafNodes.forEach((rowNode) => {
// when editing values might be converted to strings
const rawColumnValue = gridApi.getCellValue({ colKey: columnId, rowNode });
const columnValue = (0, exports.getNumericValue)(rawColumnValue);
const rawWeightedColumnValue = gridApi.getCellValue({ colKey: weightColumnId, rowNode });
const weightedColumnValue = (0, exports.getNumericValue)(rawWeightedColumnValue);
if (weightedColumnValue !== null) {
weightedColumnValueSum += weightedColumnValue;
}
if (columnValue !== null) {
columnValueSum += columnValue * weightedColumnValue;
}
});
let result = columnValueSum / weightedColumnValueSum;
// 0 / 0 = NaN
if (isNaN(result)) {
result = 0;
}
return {
// the grid by default uses toString to render values for an object, so this
// is a trick to get the default cellRenderer to display the avg value
toString: () => {
return String(result);
},
// used for sorting
toNumber: function () {
return result;
},
[columnId]: columnValueSum,
[weightColumnId]: weightedColumnValueSum,
};
};
exports.weightedAverage = weightedAverage;