Persisting the Grid State

This example shows how you can save and restore the FlexGrid state, including columnLayout, sortDescriptions, and filter definitions. Try reordering, resizing, sorting, and filtering the columns on the grid below. Then press the "Save" button to save the state to local storage. Run the sample again and press the "Restore" button to restore the layout that you saved.

Learn about FlexGrid | FlexGrid API Reference

import 'bootstrap.css'; import './styles.css'; import '@mescius/wijmo.styles/wijmo.css'; import * as wjInput from '@mescius/wijmo.input'; import * as wjGrid from '@mescius/wijmo.grid'; import * as wjGridFilter from '@mescius/wijmo.grid.filter'; import { CellMaker } from '@mescius/wijmo.grid.cellmaker'; import * as wjCore from '@mescius/wijmo'; import * as dataService from './data'; // document.readyState === 'complete' ? init() : (window.onload = init); // function init() { const map = new wjGrid.DataMap(dataService.getCountries(), 'id', 'name'); //columns definition var columnsCollection = [ { binding: 'id', header: 'ID' }, { header: 'Country', binding: 'country', width: 200, dataMap: getDataMap('country'), }, { header: 'Products', binding: 'products', width: 200, editor: getEditor('products'), }, { binding: 'downloads', header: 'Downloads', cellTemplate: getCellTemplate('downloads'), }, { binding: 'button', header: 'Button CellMaker', isReadOnly: true, width: 200, cellTemplate: getCellTemplate('button') }, ]; function getCellTemplate(binding) { switch (binding) { case 'button': return CellMaker.makeButton({ text: '<b>${item.products}</b> Button', click: (e, ctx) => { alert("Button clicked: " + ctx.item.id); }, }); case 'downloads': return (ctx) => { return `<span class=${ctx.item.downloads > 10000 ? 'high-val' : 'low-val'}>${ctx.text}</span>`; }; } return null; } // function getEditor(binding) { if (binding === 'products') { return new wjInput.ComboBox(document.createElement('div'), { itemsSource: dataService.getProducts(), selectedValuePath: 'id', displayMemberPath: 'name', }); } return null; } // function getDataMap(binding) { if (binding === 'country') { return map; } } // // create a grid with a filter var theGrid = new wjGrid.FlexGrid('#theGrid', { autoGenerateColumns: false, columns: columnsCollection, itemsSource: new wjCore.CollectionView(dataService.getData()), }); var theFilter = new wjGridFilter.FlexGridFilter(theGrid); // // save/restore grid state document.getElementById('btnSave').addEventListener('click', function () { var state = { columns: theGrid.columnLayout, filterDefinition: theFilter.filterDefinition, sortDescriptions: theGrid.collectionView.sortDescriptions.map(function (sortDesc) { return { property: sortDesc.property, ascending: sortDesc.ascending }; }), }; localStorage['GridStatePureJs'] = JSON.stringify(state); }); document.getElementById('btnRestore').addEventListener('click', function () { var json = localStorage['GridStatePureJs']; if (json) { var state = JSON.parse(json); // //restore column layout theGrid.columnLayout = state.columns; //update CellTemplate/Editor/DataMap theGrid.columns.map((col) => (col.cellTemplate = getCellTemplate(col.binding), col.dataMap = getDataMap(col.binding), col.editor = getEditor(col.binding))); // restore filter definitions setTimeout(() => { theFilter.filterDefinition = state.filterDefinition; }); //delay to let columns render first properly // restore sort state var view = theGrid.collectionView; view.deferUpdate(function () { view.sortDescriptions.clear(); for (var i = 0; i < state.sortDescriptions.length; i++) { var sortDesc = state.sortDescriptions[i]; view.sortDescriptions.push(new wjCore.SortDescription(sortDesc.property, sortDesc.ascending)); } }); } }); }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MESCIUS Wijmo FlexGrid Persisting the Grid State</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"> <div id="theGrid"></div> <button id="btnSave" class="btn btn-default"> Save State </button> <button id="btnRestore" class="btn btn-default"> Restore State </button> </div> </body> </html>
// data used to generate random items export function getData() { var countries = getCountries(), products = getProducts(), data = []; for (var i = 0; i < 30; i++) { data.push({ id: i, country: countries[i % countries.length].id, products: products[i % products.length].name, downloads: Math.round(Math.random() * 20000), button: '' }); } return data; } // export function getCountries() { return [ { id: 0, name: 'US' }, { id: 1, name: 'Germany' }, { id: 2, name: 'UK' }, { id: 3, name: 'Japan' }, { id: 4, name: 'Italy' }, { id: 5, name: 'Greece' }, ]; } export function getProducts() { return [ { id: 0, name: 'Widgets' }, { id: 1, name: 'Gadgets' }, { id: 2, name: 'Yahoos' } ]; }
.wj-flexgrid { max-height: 250px; margin: 10px 0; } .wj-flexgrid .wj-cell { padding: 6px 8px; } body { margin-bottom: 20px; } .high-val { color: darkgreen; font-weight: bold; } .low-val { color: darkred; font-weight: bold; }
(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.style': 'npm:@mescius/wijmo.grid.style/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);