Status Bar

The status bar can display TableSheet data and states using custom status bar items. For example, double click in any cell to see the status bar message change to edit.

The status bar can display various sheet status and summary values. Select different ranges of cells to see how the information in the status bar changes. This is the sample code:
/*REPLACE_MARKER*/ /*DO NOT DELETE THESE COMMENTS*/ import { Component, NgModule, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { SpreadSheetsModule } from '@mescius/spread-sheets-angular'; import GC from '@mescius/spread-sheets'; import "@mescius/spread-sheets-tablesheet"; import './styles.css'; var tableName = "Customer"; var baseApiUrl = getBaseApiUrl(); var apiUrl = baseApiUrl + "/" + tableName; var myView: any; @Component({ selector: 'app-component', templateUrl: 'src/app.component.html' }) export class AppComponent { hostStyle = { width: '100%', height: 'calc(100% - 25px)', overflow: 'hidden' }; constructor() { } initSpread($event: any) { let spread = $event.spread; let statusBar = this.initStatusBar(spread); spread.suspendPaint(); spread.clearSheets(); spread.options.autoFitType = GC.Spread.Sheets.AutoFitType.cellWithHeader; //init a data manager var dataManager = spread.dataManager(); //add customer table var customerTable = dataManager.addTable("myTable", { remote: { read: { url: apiUrl } } }); //init a table sheet var sheet = spread.addSheetTab(0, "TableSheet1", GC.Spread.Sheets.SheetType.tableSheet); sheet.options.allowAddNew = false; //hide new row //bind a view to the table sheet myView = customerTable.addView("myView", [ { value: "Id", width: 80 }, { value: "CompanyName", width: 200, caption :"Company Name" }, { value: "ContactName", width: 150, caption :"Contact" }, { value: "ContactTitle", width: 200, caption :"Title" }, { value: "Address", width: 200 }, { value: "City", width: 150, caption :"City" }, { value: "State", width: 100, caption :"State" }, { value: "Region", width: 100, caption :"Region" } ]); myView.fetch().then(function () { sheet.setDataView(myView); if (statusBar) { var recordItem: any = statusBar.get("recordCountItem"); if (recordItem) { recordItem.dataSourceLength = myView.length(); recordItem.visibleLength = myView.visibleLength(); recordItem.onUpdate(); } } }); spread.resumePaint(); } initStatusBar(spread: GC.Spread.Sheets.Workbook) { //define custom status item class RecordCountItem extends GC.Spread.Sheets.StatusBar.StatusItem { private _element: HTMLSpanElement; private _value: number; private dataSourceLength: number; private visibleLength: number; constructor(name: string, options: any) { super(name, options); this._value = 1; this.dataSourceLength = 0; this.visibleLength = 0; } onCreateItemView(container: HTMLElement) { var element = this._element; if (!element) { element = this._element = document.createElement("span"); element.innerHTML = " Rows: <b>" + this.visibleLength + "</b> of <b>" + this.dataSourceLength + "</b> - Record Count: <b>" + this._value + "</b>"; } container.appendChild(element); } onBind(context: GC.Spread.Sheets.Workbook) { var _this = this; context.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e: any, args: any) { _this._value = getRowCount(args.newSelections); _this.onUpdate(); }); context.bind(GC.Spread.Sheets.Events.RangeFiltered, function (e: any, args: any) { _this.dataSourceLength = myView.length(); _this.visibleLength = myView.visibleLength(); _this.onUpdate(); }); context.bind(GC.Spread.Sheets.Events.RangeFilterCleared, function (e: any, args: any) { _this.dataSourceLength = myView.length(); _this.visibleLength = myView.visibleLength(); _this.onUpdate(); }); } onUpdate() { super.onUpdate(); this._element.innerHTML = " Rows: <b>" + this.visibleLength + "</b> of <b>" + this.dataSourceLength + "</b> - Record Count: <b>" + this._value + "</b>"; } } //init status bar var recordCountItem = new RecordCountItem('recordCountItem', { menuContent: 'Record Count', value: 0 }); var statusBar = new GC.Spread.Sheets.StatusBar.StatusBar(document.getElementById('statusBar'), { items: [recordCountItem] }); statusBar.bind(spread); return statusBar; } } function getRowCount(selections: any[]) { var selectedRows = {}; for (var i = 0; i < selections.length; i++) { var row = selections[i].row; var rowCount = selections[i].rowCount; if (row === -1) { return rowCount; } for (var c = 0; c < rowCount; c++) { selectedRows[row + c] = true; } } return Object.keys(selectedRows).length; } function getBaseApiUrl() { return window.location.href.match(/http.+spreadjs\/demos\//)[0] + 'server/api'; } @NgModule({ imports: [BrowserModule, SpreadSheetsModule], declarations: [AppComponent], exports: [AppComponent], bootstrap: [AppComponent] }) export class AppModule { } enableProdMode(); // Bootstrap application with hash style navigation and global services. platformBrowserDynamic().bootstrapModule(AppModule);
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/angular/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- Polyfills --> <script src="$DEMOROOT$/en/angular/node_modules/core-js/client/shim.min.js"></script> <script src="$DEMOROOT$/en/angular/node_modules/zone.js/fesm2015/zone.min.js"></script> <!-- SystemJS --> <script src="$DEMOROOT$/en/angular/node_modules/systemjs/dist/system.js"></script> <script src="systemjs.config.js"></script> <script> // workaround to load 'rxjs/operators' from the rxjs bundle System.import('rxjs').then(function (m) { System.import('@angular/compiler'); System.set(SystemJS.resolveSync('rxjs/operators'), System.newModule(m.operators)); System.import('$DEMOROOT$/en/lib/angular/license.ts'); System.import('./src/app.component'); }); </script> </head> <body> <app-component></app-component> </body> </html>
<div class="sample-tutorial"> <gc-spread-sheets [hostStyle]="hostStyle" (workbookInitialized)="initSpread($event)"> </gc-spread-sheets> <div id="statusBar"></div> </div>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } #statusBar { height: 25px; width: 100%; } .sample-spreadsheets { width: 100%; height: calc(100% - 25px); overflow: hidden; }
(function (global) { System.config({ transpiler: 'ts', typescriptOptions: { tsconfig: true }, meta: { 'typescript': { "exports": "ts" }, '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { 'core-js': 'npm:core-js/client/shim.min.js', 'zone': 'npm:zone.js/fesm2015/zone.min.js', 'rxjs': 'npm:rxjs/dist/bundles/rxjs.umd.min.js', '@angular/core': 'npm:@angular/core/fesm2022', '@angular/common': 'npm:@angular/common/fesm2022/common.mjs', '@angular/compiler': 'npm:@angular/compiler/fesm2022/compiler.mjs', '@angular/platform-browser': 'npm:@angular/platform-browser/fesm2022/platform-browser.mjs', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/fesm2022/platform-browser-dynamic.mjs', '@angular/common/http': 'npm:@angular/common/fesm2022/http.mjs', '@angular/router': 'npm:@angular/router/fesm2022/router.mjs', '@angular/forms': 'npm:@angular/forms/fesm2022/forms.mjs', 'jszip': 'npm:jszip/dist/jszip.min.js', 'typescript': 'npm:typescript/lib/typescript.js', 'ts': './plugin.js', 'tslib':'npm:tslib/tslib.js', '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', '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-tablesheet': 'npm:@mescius/spread-sheets-tablesheet/index.js', '@mescius/spread-sheets-angular': 'npm:@mescius/spread-sheets-angular/fesm2020/mescius-spread-sheets-angular.mjs', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'ts' }, rxjs: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' }, "node_modules/@angular": { defaultExtension: 'mjs' }, "@mescius/spread-sheets-angular": { defaultExtension: 'mjs' }, '@angular/core': { defaultExtension: 'mjs', main: 'core.mjs' } } }); })(this);