Row Actions

TableSheet data ranges support row actions in each row's header, so records can be eidted easily.

Description
app.js
index.html
styles.css
Copy to CodeMine

Usage

The below code shows how to render a TableSheet with row actions in a worksheet:

var tableSheetName = "TableSheet1";
var dataRangeName = "TableSheetDataRange";
var dataRangeStartRow = 2;
var dataRangeStartCol = 2;
sheet.dataRanges.add(dataRangeName, tableSheetName, new GC.Spread.Sheets.Range(dataRangeStartRow, dataRangeStartCol, -1, -1));

Features in This Demo

  • Row actions
Usage The below code shows how to render a TableSheet with row actions in a worksheet: Features in This Demo Row actions
window.onload = function() { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 1 }); initSpread(spread); }; function initSpread(spread) { spread.suspendPaint(); var sheet = spread.getActiveSheet(); initTableSheet(spread, function(tableSheet) { spread.setActiveSheet(sheet.name()); var dataRange = registerTableSheetIntoWorksheet(tableSheet, sheet); beautifySheet(sheet, dataRange); spread.undoManager().clear(); }); spread.resumePaint(); } async function initTableSheet(spread, callback) { spread.options.autoFitType = GC.Spread.Sheets.AutoFitType.cellWithHeader; //init a data manager var dataManager = spread.dataManager(); var categoryAPI = getBaseApiUrl() + "/Category"; var categoryTable = dataManager.addTable("categoryTable", { remote: { read: { url: categoryAPI } } }); var supplierAPI = getBaseApiUrl() + "/Supplier"; var supplierTable = dataManager.addTable("supplierTable", { remote: { read: { url: supplierAPI } } }); var productAPI = getBaseApiUrl() + "/Product"; var productTable = dataManager.addTable("productTable", { autoSync: true, remote: { read: { url: productAPI }, update: { url: productAPI, method: "PUT" }, create: { url: productAPI }, delete: { url: productAPI } }, schema: { columns: { CategoryId: { lookup: { name: "category", columns: [ { value: "Id", width: 100 }, { value: "CategoryName", width: 160 }, { value: "Description", width: 400 } ] } }, SupplierId: { lookup: { name: "supplier", columns: [ { value: "Id", width: 100 }, { value: "CompanyName", width: 180 }, { value: "ContactName", width: 140 }, { value: "ContactTitle", width: 140 }, { value: "ContactTitle", width: 140 }, { value: "City", width: 100 }, { value: "Address", width: 140 }, { value: "Phone", width: 100 } ] } } } } }); dataManager.addRelationship(productTable, "CategoryId", "category", categoryTable, "Id", "product"); dataManager.addRelationship(productTable, "SupplierId", "supplier", supplierTable, "Id", "product"); //init a table sheet var tableSheet = spread.addSheetTab(0, "MyTableSheet", GC.Spread.Sheets.SheetType.tableSheet); //row actions var rowActions = GC.Spread.Sheets.TableSheet.BuiltInRowActions; let options = tableSheet.rowActionOptions(); options.push( rowActions.removeRow, rowActions.saveRow, rowActions.resetRow, ); tableSheet.rowActionOptions(options); //bind a view to the table sheet await categoryTable.fetch(); await supplierTable.fetch(); await productTable.fetch(); var nameStyle = { fontWeight: "bold" }; var relationStyle = { foreColor: "#818181" }; var formulaRule = { ruleType: "formulaRule", formula: "@>1000", style: { foreColor: "orange" } }; var myView = productTable.addView("myView", [ { value: "ProductName", caption: "Name", width: 250, style: nameStyle }, { value: "QuantityPerUnit", caption: "Quantity Per Unit", width: 140 }, { value: "SupplierId", caption: "Supplier Id", width: 140 }, { value: "supplier.CompanyName", caption: "Supplier Company", width: 200, style: relationStyle, headerStyle: relationStyle }, { value: "CategoryId", caption: "Category Id", width: 140 }, { value: "category.CategoryName", caption: "Category Name", width: 140, style: relationStyle, headerStyle: relationStyle }, { value: "UnitPrice", caption: "Unit Price", width: 140 }, { value: "UnitsInStock", caption: "Units In Stock", width: 140 }, { value: "=[@UnitPrice]*[@UnitsInStock]", caption: "Total Price", conditionalFormats: [formulaRule] } ]); tableSheet.setDataView(myView); spread.suspendPaint(); callback && callback(tableSheet); spread.resumePaint(); return tableSheet; } function registerTableSheetIntoWorksheet (tableSheet, sheet) { var name = tableSheet.name() + "_DataRange"; var row = 1; var col = 1; var dataRange = sheet.dataRanges.add(name, tableSheet.name(), new GC.Spread.Sheets.Range(row, col, -1, -1)); return dataRange; } function beautifySheet(sheet, dataRange) { var range = dataRange.range(); for (var i = range.row; i < range.row + range.rowCount; i++) { sheet.autoFitRow(i); } for (var i = range.col; i < range.col + range.colCount; i++) { sheet.autoFitColumn(i); } sheet.setColumnWidth(1, 30); sheet.setColumnWidth(2, 30); sheet.setColumnWidth(3, 30); sheet.setColumnWidth(4, 30); } function getBaseApiUrl() { return window.location.href.match(/http.+spreadjs\/demos\//)[0] + 'server/api'; }
<!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/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- Promise Polyfill for IE, https://www.npmjs.com/package/promise-polyfill --> <script src="https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-tablesheet/dist/gc.spread.sheets.tablesheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div id="ss"></div> </html>
body, html { width: 100%; height: 100%; position: relative; overflow: hidden; margin: 0; padding: 0; } #ss { width: 100%; height: 100%; }