Handsontable example
HTML
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/handsontable.full.min.js"></script>
<link type="text/css" rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/handsontable.full.min.css" />
<div id="example8" class="hot "></div>
JavaScript
const container = document.getElementById('example8');
const hot = new Handsontable(container, {
licenseKey: 'non-commercial-and-evaluation',
data: [
{
value: null,
__children: [
{value: 5},
{value: 6},
{value: 7},
]
},
{
__children: [
{value: 15},
{value: 16},
{value: 17},
]
},
{
value: null
}
],
columns: [
{ data: 'value' }
],
nestedRows: true,
rowHeaders: true,
colHeaders: ['sum', 'min', 'max', 'count', 'average'],
columnSummary() {
const endpoints = [];
const nestedRowsPlugin = this.hot.getPlugin('nestedRows');
const getRowIndex = nestedRowsPlugin.dataManager.getRowIndex.bind(nestedRowsPlugin.dataManager);
const resultColumn = 0;
let tempEndpoint = null;
let nestedRowsCache = null;
if (nestedRowsPlugin.isEnabled()) {
nestedRowsCache = this.hot.getPlugin('nestedRows').dataManager.cache;
} else {
return;
}
for (let i = 0; i < nestedRowsCache.levels[0].length; i++) {
tempEndpoint = {};
if (!nestedRowsCache.levels[0][i].__children || nestedRowsCache.levels[0][i].__children.length === 0) {
continue;
}
tempEndpoint.destinationColumn = resultColumn;
tempEndpoint.destinationRow = getRowIndex(nestedRowsCache.levels[0][i]);
tempEndpoint.type = 'sum';
tempEndpoint.forceNumeric = true;
tempEndpoint.ranges = [];
tempEndpoint.ranges.push([
getRowIndex(nestedRowsCache.levels[0][i].__children[0]),
getRowIndex(nestedRowsCache.levels[0][i].__children[nestedRowsCache.levels[0][i].__children.length - 1])
]);
endpoints.push(tempEndpoint);
tempEndpoint = null;
}
//Add final SUM
endpoints.push({
sourceColumn: 0,
type: 'SUM',
// count row coordinates backward
reversedRowCoords: true,
// display the column summary in the bottom row (because of the...