Bids Tracker Report

The bids tracker report can track the progress of bids or proposals submitted by an organization. It provides a comprehensive view of all bids that have been submitted, including details such as the bid number, bid title, submission date, status.

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

How to open desgnr

You can use the 'List' cell type to generate the bids tracker report in the following steps.

  • Define the Bids table in the DataManager.
  • Set the style for the template.
  • Bind the data column to the template and use the 'List' cell type.
const spread = new GC.Spread.Sheets.Workbook('demo-host', { sheetCount: 1 });
const records = [
    ['BID 01', 'Bid number 1', '2023/6/27', 2000, 0.5, '2023/7/27'],
    ['BID 02', 'Bid number 2', '2023/6/17', 3500, 0.25, '2023/7/17'],
    ['BID 03', 'Bid number 3', '2023/6/17', 6500, 0.3, '2023/7/17'],
    ['BID 04', 'Bid number 4', '2023/6/27', 4000, 0.2, '2023/7/27'],
    ['BID 05', 'Bid number 5', '2023/6/9', 3800, 0.75, '2023/7/9'],
    ['BID 06', 'Bid number 6', '2023/6/20', 1500, 0.45, '2023/7/20'],
    ['BID 07', 'Bid number 7', '2023/6/22', 5000, 0.65, '2023/7/22'],
];
const columns = ['BID', 'Description', 'DataReceived', 'Amount', 'Progress', 'Deadline'];
const bidsTable = spread.dataManager().addTable('Bids', {
    data: records.map((x) => {
        const record = {};
        columns.forEach((c, i) => record[c] = x[i]);
        return record;
    })
});
bidsTable.fetch().then(() => {
    const reportSheet = spread.addSheetTab(0, 'report1', GC.Spread.Sheets.SheetType.reportSheet);
    const templateSheet = reportSheet.getTemplate();

    // set style for the template
    templateSheet.options.gridline.showHorizontalGridline = false;
    templateSheet.options.gridline.showVerticalGridline = false;
    templateSheet.defaults.colWidth = 120;
    templateSheet.defaults.rowHeight = 30;
    [10, 110].forEach((h, i) => templateSheet.setRowHeight(i, h));
    [10, 80, 160, 120, 120, 260].forEach((w, i) => templateSheet.setColumnWidth(i, w));
    const headerStyle = new GC.Spread.Sheets.Style();
    headerStyle.backColor = '#90CAF9';
    headerStyle.foreColor = '#424242';
    headerStyle.font = 'bold 12px "Open Sans"';
    headerStyle.hAlign = GC.Spread.Sheets.HorizontalAlign.center;
    headerStyle.vAlign = GC.Spread.Sheets.VerticalAlign.center;
    const titleStyle = headerStyle.clone();
    titleStyle.backColor = '#00587a';
    titleStyle.foreColor = 'white';
    titleStyle.font = '40px "Open Sans"';
    const dataStyle = headerStyle.clone();
    dataStyle.backColor = 'white';
    dataStyle.font = '12px "Open Sans"';
    const border = new GC.Spread.Sheets.LineBorder('#B3E5FC', 1);
    dataStyle.borderRight = border;
    templateSheet.addSpan(1, 1, 1, 6);
    templateSheet.setValue(1, 1, 'BIDS TRACKER');
    templateSheet.setStyle(1, 1, titleStyle);
    templateSheet.getRange(2, 1, 1, 6).setStyle(headerStyle);
    templateSheet.getRange(3, 1, 1, 6).setStyle(dataStyle);
    templateSheet.getStyle(3, 4).formatter = '"$"#,##0.00';
    templateSheet.getStyle(3, 5).formatter = '0%';
    templateSheet.getStyle(3, 6).borderRight = undefined;
    const cfs = templateSheet.conditionalFormats;
    const dataStyle3 = dataStyle.clone();
    dataStyle3.backColor = '#E3F2FD';
    dataStyle3.borderRight = undefined;
    cfs.addFormulaRule('Mod(R.Index(B4), 2) = 0', dataStyle3, [new GC.Spread.Sheets.Range(3, 1, 1, 6)]);
    const ScaleValueType = GC.Spread.Sheets.ConditionalFormatting.ScaleValueType;
    const dataBarRule = cfs.addDataBarRule(ScaleValueType.number, 0, ScaleValueType.number, 1, '#FFCDD2', [new GC.Spread.Sheets.Range(3, 5, 1, 1)]);
    dataBarRule.gradient(false);

    // set binding for the template
    const columns = ['BID', 'Description', 'Data Received', 'Amount', 'Progress', 'Deadline'];
    columns.forEach((columnName, i) => {
        templateSheet.setValue(2, i + 1, columnName);
        templateSheet.setTemplateCell(3, i + 1, {
            type: 'List',
            binding: `Bids[${columnName.replace(' ', '')}]`,
        });
    });

    reportSheet.refresh();
});
Open the demo in new window can open the designer You can use the 'List' cell type to generate the bids tracker report in the following steps. Define the Bids table in the DataManager. Set the style for the template. Bind the data column to the template and use the 'List' cell type.
window.onload = async () => { const loadingTip = addLoadingTip(); const { spread, designer } = createSpreadAndDesigner(); const res = await fetch('$DEMOROOT$/en/sample/features/report-sheet/showcase/row-based-report/bids-tracker-report/spread.json'); await spread.fromJSON(await res.json()); loadingTip.remove(); if (designer) { designer.refresh(); } } 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(), } } } 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; }
<!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="demo-host"></div> </div> </body> </html>
body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } #demo-host { width: 100%; height: 100%; overflow: hidden; float: left; }