Custom

Users can customize actions by passing a self-defined option with icons, iconSelector, tooltip, shortcutKey and command.

Description
app.component.ts
index.html
app.component.html
styles.css
Copy to CodeMine

You can get the row action options using the tableSheet.rowActionOptions() method.

You can customize it using tableSheet.rowActionOptions(rowActionOptions), where rowActionOptions includes the following:

Operation Type Description
name string The name of the option
icons (string | GC.Spread.Sheets.ButtonImageType)[] An icon that indicates the different statuses
iconSelector (item: any, index: number) => number | boolean Select a icon according to different status
tooltip string the tooltip for the row action
command string the name of the command when clicking the row action
shortcutKey GC.Spread.Sheets.TableSheet.IShortcutKey the shortcut key of the command for the row action

Adding a row action for having a comment can be done with the following code:

let options = tableSheet.rowActionOptions();
options.push({
    icons: ["./comment.png"],
    iconSelector: (item) => {
        return item.comment ? item.comment.length > 0 : false;
    }
});
tableSheet.rowActionOptions(options);

Adding a row action for showing a comment can be done as follows:

const ShowComment = "ShowComment";
let Commands = GC.Spread.Sheets.Commands;
    Commands[ShowComment] = {
        canUndo: false,
        execute: function (context, options) {
            alert(options.item.Comments);
            return true;
        }
    };
let options = tableSheet.rowActionOptions();
options.push({
    icons: ["./comment.png"],
    tooltip: "Show the comment",
    shortcutKey: { key: 65 /* A */, ctrl: true, alt: true },
    command: ShowComment
});
tableSheet.rowActionOptions(options);

Specify a command to the default first row action as follows:

// Get the default first row action
let options = tableSheet.rowActionOptions();
let defaultFirstRowAction = options[0];
// Specify a command to the default first row action
defaultFirstRowAction.command = GC.Spread.Sheets.TableSheet.BuiltInRowActions.pinRow.command;
// set row action options
tablesheet.rowActionOptions(options);
You can get the row action options using the tableSheet.rowActionOptions() method. You can customize it using tableSheet.rowActionOptions(rowActionOptions), where rowActionOptions includes the following: Operation Type Description name string The name of the option icons (string | GC.Spread.Sheets.ButtonImageType)[] An icon that indicates the different statuses iconSelector (item: any, index: number) => number | boolean Select a icon according to different status tooltip string the tooltip for the row action command string the name of the command when clicking the row action shortcutKey GC.Spread.Sheets.TableSheet.IShortcutKey the shortcut key of the command for the row action Adding a row action for having a comment can be done with the following code: Adding a row action for showing a comment can be done as follows: Specify a command to the default first row action as follows:
/*REPLACE_MARKER*/ /*DO NOT DELETE THESE COMMENTS*/ import { Component, NgModule, enableProdMode } from "@angular/core"; import { BrowserModule } from "@angular/platform-browser"; import { FormsModule } from "@angular/forms"; 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 = "Employee"; var baseApiUrl = getBaseApiUrl(); var apiUrl = baseApiUrl + "/" + tableName; var ShowComment = "ShowComment"; var CheckRow = "CheckRow"; @Component({ selector: "app-component", templateUrl: "src/app.component.html" }) export class AppComponent { spread: GC.Spread.Sheets.Workbook; tablesheet: GC.Spread.Sheets.TableSheet; checkMap: any = {}; newRowVisible = true; hostStyle = { width: "100%", height: "100%", overflow: "hidden", float: "left" }; constructor() { } init($event: any) { // register self-defined row action command this.registerCommands(); this.initSpread($event); } initSpread($event: any) { let spread = $event.spread; this.spread = spread; spread.suspendPaint(); spread.clearSheets(); spread.options.autoFitType = GC.Spread.Sheets.AutoFitType.cellWithHeader; // init a data manager var dataManager = spread.dataManager(); var myTable = dataManager.addTable("myTable", { remote: { read: { url: apiUrl }, update: { url: apiUrl, method: "PUT" }, create: { url: apiUrl }, delete: { url: apiUrl } }, autoSync: true }); // init a table sheet var sheet = spread.addSheetTab(0, "MyTableSheet", GC.Spread.Sheets.SheetType.tableSheet); this.tablesheet = sheet; var options = sheet.rowActionOptions(); var _this = this; // Specify a command to the default first row action var defaultFirstRowAction = options[0]; defaultFirstRowAction.command = GC.Spread.Sheets.TableSheet.BuiltInRowActions.pinRow.command; // add a action of check/uncheck options.push({ name: "check", icons: ["data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjEyIiBoZWlnaHQ9IjEyIiBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8cmVjdCB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIGZpbGw9InRyYW5zcGFyZW50Ii8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTIgMEgwVjEySDEyVjBaTTEgMTFWMUgxMVYxMUgxWiIgZmlsbD0iIzY2NjY2NiIvPgo8L3N2Zz4K", "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjEyIiBoZWlnaHQ9IjEyIiBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8cmVjdCB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIGZpbGw9InRyYW5zcGFyZW50Ii8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTIgMEgwVjEySDEyVjBaTTEgMTFWMUgxMVYxMUgxWiIgZmlsbD0iIzY2NjY2NiIvPgo8cGF0aCBkPSJNNS4yNSA5TDIgNS42MTI5TDMuMDA3MTQgNC41NjMyOEw1LjI1IDYuODkzM0w4Ljk4NTcxIDNMMTAgNC4wNDk2M0w1LjI1IDlINS4yNVoiIGZpbGw9IiM2NjY2NjYiLz4KPC9zdmc+Cg=="], tooltip: "Check/Uncheck", iconSelector: function (item: any) { return !!_this.checkMap[item.Id]; }, command: CheckRow }); // show the comment flag if the data has a comment options.push({ name: "comment", icons: ["./image/comment.png"], tooltip: "Show the comment", iconSelector: function (item: any) { return item.Notes ? item.Notes.length > 0 : false; }, shortcutKey: { key: 65 /* A */, ctrl: true, alt: true }, command: ShowComment }); // show the attachment flag if the data has a attachment options.push({ name: "attachment", icons: ["./image/attachment.png"], tooltip: "Attachment", iconSelector: function (item: any) { return item.PhotoPath ? item.PhotoPath.length > 0 : false; } }); sheet.rowActionOptions(options); // bind a view to the table sheet myTable.fetch().then(function() { var view = myTable.addView("myView", [ { value: "Id", width: 50, caption: "ID" }, { value: "FirstName", width: 100, caption: "First Name" }, { value: "LastName", width: 100, caption: "Last Name" }, { value: "HomePhone", width: 150, caption: "Phone" }, { value: "PhotoPath", width: 150, caption: "Attachment" }, { value: "Notes", width: 400, caption: "Comments" }, ]); sheet.setDataView(view); }); spread.resumePaint(); } registerCommands() { var _this = this; var Commands = GC.Spread.Sheets.Commands; Commands[ShowComment] = { canUndo: false, execute: function(context: any, options: any) { alert(options.item.Notes); return true; } }; Commands[CheckRow] = { canUndo: false, execute: function(context: any, options: any) { var id = options.item.Id; _this.checkMap[id] = !_this.checkMap[id]; return true; } }; } } function getBaseApiUrl() { return window.location.href.match(/http.+spreadjs\/demos\//)[0] + "server/api"; } @NgModule({ imports: [BrowserModule, SpreadSheetsModule, FormsModule], 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)="init($event)"></gc-spread-sheets> </div>
body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: 100%; height: 100%; overflow: hidden; float: left; }
(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);