Parameter & ParameterUI

In some conditions, you may use a dynamic parameter instead of a static value to regenerate data in a filter.

SpreadJS supports the parameter and parameterUI to help you accomplish this requirement. Try changing the parameters in the below demo to filter the values.

Description
app.js
index.html
styles.css
Copy to CodeMine
Open the demo in new window can open the designer

How to open desgnr

The Parameter interface is as follows:

interface IParameter {
    [parameterName: string]: string | number | boolean | Date;
}
class ReportSheet {
    function setParametersUI(host: HTMLElement | string, initParametersUI: GC.Spread.Report.InitParametersUIFunctionType, onChange: GC.Spread.Report.OnChangeFunctionType): void;
}

type InitParametersUIFunctionType = (sheet: Worksheet) => void;

type OnChangeFunctionType = (sheet: ReportSheet, changedArgs: IParameterChangedArgs) => void;

interface IParameterChangedArgs {
    tag: string; // changed cell bindingPath or tag.
    oldValue: string | number | boolean | Date;
    newValue: string | number | boolean | Date;
}

Right now, the parameter can only be used in a filter.

  1. Define a parameter for a reportSheet:
    const spread = new GC.Spread.Sheets.Workbook('ss', { sheetCount: 1 });
    const ordersTable = spread.dataManager().addTable('Orders', {
        remote: {
            read: {
                url: baseApiUrl + '/Order'
            }
        }
    });
    ordersTable.fetch().then(() => {
        const reportSheet = spread.addSheetTab(0, 'report1', GC.Spread.Sheets.SheetType.reportSheet);
        reportSheet.parameter({
            customerId: "VINET",
            startDate: new Date("1996/7/1"),
            endDate: new Date("1998/7/1"),
        });
    });
  1. Use a parameter in a template cell filter condition:
    const reportSheet = spread.getActiveSheetTab();
    const templateSheet = reportSheet.getTemplate();
    // set value and binding for the template
    templateSheet.setTemplateCell(1, 0, {
        type: 'List',
        binding: `Orders[orderId]`,
        filter: {
            condition: {
                and: [
                    {
                        column: "customerId",
                        operator: "Equal",
                        parameter: "customerId", // use parameter in filter condition.
                    },
                    {
                        column: "orderDate",
                        operator: "GreaterThanOrEqual",
                        parameter: "startDate",
                    },
                    {
                        column: "orderDate",
                        operator: "lessThanOrEqual",
                        parameter: "endDate"
                    }
                ]
            }
        }
    });
    // refresh the report
    reportSheet.refresh();
    // if users want to update the parameter.
    reportSheet.parameter({
        customerId: "TOMSP",
        startDate: new Date("1996/7/1"),
        endDate: new Date("1998/7/1"),
    });
    reportSheet.refresh();
  1. Initialize the parameterUI (Optional):
    var reportSheet = spread.getActiveSheetTab();
    var parameterUIHost = document.getElementById("report-sheet-parameter-ui");
    reportSheet.setParametersUI(parameterUIHost, initParametersUI, parameterOnChanged);

    function initParametersUI (sheet) { // the parameterUI sheet init callback
        sheet.suspendPaint();
        sheet.suspendEvent();
        sheet.getCell(-1, -1).backColor("rgb(225, 225, 225)");
        sheet.setColumnWidth(0, 5);
        sheet.setColumnWidth(1, 220);
        sheet.setColumnWidth(2, 10);
        sheet.setColumnWidth(3, 220);
        sheet.setColumnWidth(4, 10);
        sheet.setColumnWidth(5, 220);
        sheet.setColumnWidth(6, 10);
        sheet.setColumnWidth(7, 105);
        sheet.setRowHeight(0, 10);
        sheet.setRowHeight(1, 30);
        sheet.setRowHeight(2, 30);
        sheet.setValue(1, 1, "CustomerID:");
        sheet.setValue(1, 3, "StartDate:");
        sheet.setValue(1, 5, "EndDate:");
        sheet.getCell(2, 1).bindingPath("customerId"); // bind parameter
        sheet.getCell(2, 3).bindingPath("startDate");
        sheet.getCell(2, 5).bindingPath("endDate");

        let submitButton = new GC.Spread.Sheets.CellTypes.Button(); // add submit button
        submitButton.text("Submit");
        submitButton.buttonBackColor("#00897B");
        submitButton.buttonClickColor("#004D40");
        sheet.getCell(2, 7).tag("submitButton").foreColor("white").cellType(submitButton);
        let style = sheet.getStyle(2, 7);
        style.hAlign = HorizontalAlign.center;
        style.vAlign = VerticalAlign.center;
        style.textIndent = 0;
        sheet.setStyle(2, 7, style);

        sheet.resumeEvent();
        sheet.resumePaint();
    };
    function parameterOnChanged (reportSheet, valueChangedArgs) { // the parameterUI changed callback
        if (valueChangedArgs.tag === "submitButton") { // judge the changed parameter.
            reportSheet.regenerateReport();
        }
    }
Open the demo in new window can open the designer The Parameter interface is as follows: Right now, the parameter can only be used in a filter. Define a parameter for a reportSheet: Use a parameter in a template cell filter condition: Initialize the parameterUI (Optional):
window.onload = async () => { const loadingTip = addLoadingTip(); const { spread, designer } = createSpreadAndDesigner(); const res = await fetch('$DEMOROOT$/en/sample/features/report-sheet/data-settings/parameter/spread.json'); await spread.fromJSON(await res.json()); if (!designer) { initParameterFilterReportParameterUI(spread.getActiveSheetTab()); } loadingTip.remove(); if (designer) { let parameterUIHost = document.getElementById('report-sheet-parameter-ui'); let demoHost = document.getElementById('demo-host') if (parameterUIHost) { parameterUIHost.style.display = 'none'; } if (demoHost) { demoHost.classList.add("full-height"); } designer.refresh(); } } function initParameterFilterReportParameterUI (reportSheet) { let parameterUIHost = document.getElementById("report-sheet-parameter-ui"); reportSheet.setParametersUI(parameterUIHost, initParametersUI, parameterOnChanged); } function initParametersUI (sheet) { } function parameterOnChanged (sheet, valueChangedArgs) { if (valueChangedArgs.tag === "submitOnChangeButton") { sheet.regenerateReport(); } } function addLoadingTip() { const div = document.createElement('div'); div.style.position = 'absolute'; div.style.inset = '0'; div.style.display = 'flex'; div.style.alignItems = 'center'; div.style.justifyContent = 'center'; div.style.background = 'white'; div.style.zIndex = '100'; div.textContent = 'Loading data from server ...'; document.body.appendChild(div); return div; } function createSpreadAndDesigner() { const demoHost = document.getElementById('demo-host'); if (window !== top) { return { spread: new GC.Spread.Sheets.Workbook(demoHost, { sheetCount: 1 }), } } else { const designer = new GC.Spread.Sheets.Designer.Designer(demoHost, undefined, undefined, { sheetCount: 1 }); return { designer, spread: designer.getWorkbook(), } } }
<!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"> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-designer/styles/gc.spread.sheets.designer.min.css"> <link rel="stylesheet" type="text/css" href="styles.css"> <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-print/dist/gc.spread.sheets.print.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-shapes/dist/gc.spread.sheets.shapes.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-charts/dist/gc.spread.sheets.charts.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-reportsheet-addon/dist/gc.spread.report.reportsheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script> const designerDependencyScripts = [ '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-barcode/dist/gc.spread.sheets.barcode.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-pdf/dist/gc.spread.sheets.pdf.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-pivot-addon/dist/gc.spread.pivot.pivottables.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-slicers/dist/gc.spread.sheets.slicers.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-tablesheet/dist/gc.spread.sheets.tablesheet.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-ganttsheet/dist/gc.spread.sheets.ganttsheet.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-formula-panel/dist/gc.spread.sheets.formulapanel.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-io/dist/gc.spread.sheets.io.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-designer-resources-en/dist/gc.spread.sheets.designer.resource.en.min.js', '$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-designer/dist/gc.spread.sheets.designer.all.min.js', '$DEMOROOT$/spread/source/js/designer/license.js', ] function appendScriptNode (src) { const script = document.createElement('script'); script.src = src; script.async = false; script.type = 'text/javascript'; document.head.appendChild(script); } if (top === window) { // not in iframe designerDependencyScripts.forEach(appendScriptNode); } </script> <script src="app.js" type="text/javascript"></script> </head> <body> <div class="sample-tutorial"> <div id="report-sheet-parameter-ui" class="parameter-ui"></div> <div id="demo-host" class="sample-spreadsheets"></div> <div id="optionContainer" class="optionContainer"> </div> </div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .parameter-ui { width: 100%; height: 100px; overflow: hidden; float: left; } .sample-spreadsheets { width: 100%; height: calc(100% - 100px); overflow: hidden; float: left; } .full-height { height: 100% !important; }