Aggregates

The MultiRow control supports CollectionView-based grouping just like FlexGrid.

When showing grouped data, the control adds group header rows that can be used to collapse and expand the groups and also to display aggregate statistics for the groups.

To ensure aggregates are visible on the group header rows, set the multiRowGroupHeaders property to true.

Learn about MultiRow | MultiRow API Reference

import 'bootstrap.css'; import '@mescius/wijmo.styles/wijmo.css'; import './styles.css'; import { GroupRow } from '@mescius/wijmo.grid'; import { MultiRow } from '@mescius/wijmo.grid.multirow'; import { getGroupedData, getLayoutDefinition } from './data'; document.readyState === 'complete' ? init() : window.onload = init; function init() { // create the MultiRow let theMultiRow = new MultiRow('#theMultiRow', { itemsSource: getGroupedData(200), layoutDefinition: getLayoutDefinition(), multiRowGroupHeaders: true }); // start collapsed theMultiRow.collapseGroupsToLevel(1); // toggle multiRowGroupHeaders document.getElementById('cbMultiRowGroupHeaders').addEventListener('click', function (e) { theMultiRow.multiRowGroupHeaders = e.target.checked; }); // // Push aggregate rows as per Multirow's layout definition theMultiRow.columnFooters.rows.push(new GroupRow()); theMultiRow.columnFooters.rows.push(new GroupRow()); theMultiRow.bottomLeftCells.setCellData(1, 0, 'Σ'); }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MESCIUS Wijmo MultiRow Aggregates</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- SystemJS --> <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.21.5/system.src.js" integrity="sha512-skZbMyvYdNoZfLmiGn5ii6KmklM82rYX2uWctBhzaXPxJgiv4XBwJnFGr5k8s+6tE1pcR1nuTKghozJHyzMcoA==" crossorigin="anonymous"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app'); </script> </head> <body> <div class="container-fluid"> <label> multiRowGroupHeaders: <input id="cbMultiRowGroupHeaders" type="checkbox" checked/> </label> <div id="theMultiRow"></div> </div> </body> </html>
import { CollectionView, DateTime } from '@mescius/wijmo'; // raw data export function getData(cnt = 20) { let countries = 'US,Germany,UK,Japan,Italy,Greece,Portugal,Spain'.split(','), names = 'Abe,Bob,Chuck,Dan,Ed,Fred'.split(','), colors = 'Red,Green,Blue,White,Black,Yellow,Orange'.split(','), today = new Date(), data = []; for (let i = 0; i < cnt; i++) { data.push({ id: i, date: DateTime.addDays(today, -i), name: names[i % names.length], country: countries[i % countries.length], color: colors[i % colors.length], active: i % 5 != 0, downloads: Math.round(Math.random() * 200000), sales: Math.round(Math.random() * 20000), expenses: Math.round(Math.random() * 10000) }); } return data; } // grouped data export function getGroupedData(cnt = 20) { return new CollectionView(getData(cnt), { groupDescriptions: ['country', 'color'] }); } // MultiRow layout definition export function getLayoutDefinition() { return [ { cells: [{ binding: 'id', header: 'ID' }] }, { cells: [{ binding: 'country', header: 'Country' }] }, { cells: [{ binding: 'color', header: 'Color' }] }, { cells: [ { binding: 'sales', header: 'Sales', cssClass: 'sales', aggregate: 'Sum' }, { binding: 'expenses', header: 'Expenses', cssClass: 'expenses', aggregate: 'Sum' } ] } ]; }
.wj-multirow { height: 400px; margin: 6px 0; } .wj-cell.sales { color: darkgreen; font-weight: bold; font-style: italic; } .wj-cell.expenses { color: darkred; font-weight: bold; font-style: italic; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { 'jszip': 'npm:jszip/dist/jszip.js', '@mescius/wijmo': 'npm:@mescius/wijmo/index.js', '@mescius/wijmo.input': 'npm:@mescius/wijmo.input/index.js', '@mescius/wijmo.styles': 'npm:@mescius/wijmo.styles', '@mescius/wijmo.cultures': 'npm:@mescius/wijmo.cultures', '@mescius/wijmo.chart': 'npm:@mescius/wijmo.chart/index.js', '@mescius/wijmo.chart.analytics': 'npm:@mescius/wijmo.chart.analytics/index.js', '@mescius/wijmo.chart.animation': 'npm:@mescius/wijmo.chart.animation/index.js', '@mescius/wijmo.chart.annotation': 'npm:@mescius/wijmo.chart.annotation/index.js', '@mescius/wijmo.chart.finance': 'npm:@mescius/wijmo.chart.finance/index.js', '@mescius/wijmo.chart.finance.analytics': 'npm:@mescius/wijmo.chart.finance.analytics/index.js', '@mescius/wijmo.chart.hierarchical': 'npm:@mescius/wijmo.chart.hierarchical/index.js', '@mescius/wijmo.chart.interaction': 'npm:@mescius/wijmo.chart.interaction/index.js', '@mescius/wijmo.chart.radar': 'npm:@mescius/wijmo.chart.radar/index.js', '@mescius/wijmo.chart.render': 'npm:@mescius/wijmo.chart.render/index.js', '@mescius/wijmo.chart.webgl': 'npm:@mescius/wijmo.chart.webgl/index.js', '@mescius/wijmo.chart.map': 'npm:@mescius/wijmo.chart.map/index.js', '@mescius/wijmo.gauge': 'npm:@mescius/wijmo.gauge/index.js', '@mescius/wijmo.grid': 'npm:@mescius/wijmo.grid/index.js', '@mescius/wijmo.grid.detail': 'npm:@mescius/wijmo.grid.detail/index.js', '@mescius/wijmo.grid.filter': 'npm:@mescius/wijmo.grid.filter/index.js', '@mescius/wijmo.grid.search': 'npm:@mescius/wijmo.grid.search/index.js', '@mescius/wijmo.grid.grouppanel': 'npm:@mescius/wijmo.grid.grouppanel/index.js', '@mescius/wijmo.grid.multirow': 'npm:@mescius/wijmo.grid.multirow/index.js', '@mescius/wijmo.grid.transposed': 'npm:@mescius/wijmo.grid.transposed/index.js', '@mescius/wijmo.grid.transposedmultirow': 'npm:@mescius/wijmo.grid.transposedmultirow/index.js', '@mescius/wijmo.grid.pdf': 'npm:@mescius/wijmo.grid.pdf/index.js', '@mescius/wijmo.grid.sheet': 'npm:@mescius/wijmo.grid.sheet/index.js', '@mescius/wijmo.grid.xlsx': 'npm:@mescius/wijmo.grid.xlsx/index.js', '@mescius/wijmo.grid.selector': 'npm:@mescius/wijmo.grid.selector/index.js', '@mescius/wijmo.grid.cellmaker': 'npm:@mescius/wijmo.grid.cellmaker/index.js', '@mescius/wijmo.nav': 'npm:@mescius/wijmo.nav/index.js', '@mescius/wijmo.odata': 'npm:@mescius/wijmo.odata/index.js', '@mescius/wijmo.olap': 'npm:@mescius/wijmo.olap/index.js', '@mescius/wijmo.rest': 'npm:@mescius/wijmo.rest/index.js', '@mescius/wijmo.pdf': 'npm:@mescius/wijmo.pdf/index.js', '@mescius/wijmo.pdf.security': 'npm:@mescius/wijmo.pdf.security/index.js', '@mescius/wijmo.viewer': 'npm:@mescius/wijmo.viewer/index.js', '@mescius/wijmo.xlsx': 'npm:@mescius/wijmo.xlsx/index.js', '@mescius/wijmo.undo': 'npm:@mescius/wijmo.undo/index.js', '@mescius/wijmo.interop.grid': 'npm:@mescius/wijmo.interop.grid/index.js', '@mescius/wijmo.touch': 'npm:@mescius/wijmo.touch/index.js', '@mescius/wijmo.cloud': 'npm:@mescius/wijmo.cloud/index.js', '@mescius/wijmo.barcode': 'npm:@mescius/wijmo.barcode/index.js', '@mescius/wijmo.barcode.common': 'npm:@mescius/wijmo.barcode.common/index.js', '@mescius/wijmo.barcode.composite': 'npm:@mescius/wijmo.barcode.composite/index.js', '@mescius/wijmo.barcode.specialized': 'npm:@mescius/wijmo.barcode.specialized/index.js', 'jszip': 'npm:jszip/dist/jszip.js', 'bootstrap.css': 'npm:bootstrap/dist/css/bootstrap.min.css', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);