Designer Component - Saving Reports

These samples show how to save reports in the ActiveReportsJS Designer component within Angular, React, Vue, and pure JavaScript applications. The code uses the in-memory reports storage. The "Save as" button automatically saves the report with the new name. The "Open Report" dialog displays previously saved reports. For more details, please visit the Save Reports page for more information. To view the code, scroll down the page.

<template> <div> <div id="designer-host"> <ReportDesigner :onCreate="onCreateReport" :onSave="onSaveReport" :onSaveAs="onSaveAsReport" :onOpen="onOpenReport" ></ReportDesigner> </div> <div v-if="showModal" class="modal" id="dlgOpen" tabindex="-1" aria-hidden="true" > <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">Open Report</h5> <button type="button" class="close" aria-label="Close" @click="hideModal" > <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <strong>Select Report:</strong> <div class="list-group"> <button type="button" class="list-group-item list-group-item-action" v-for="reportId in reportIds" @click="onSelectReport(reportId)" :key="reportId" > {{ reportId }} </button> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-outline-secondary" @click="hideModal" > Close </button> </div> </div> </div> </div> </template> <script> import { Designer } from "@grapecity/activereports-vue"; let resolveFunc = null; export default { components: { ReportDesigner: Designer, }, data() { return { reportStorage: new Map(), counter: 0, showModal: false, }; }, computed: { reportIds() { const ret = this.counter ? [...this.reportStorage.keys()] : []; return ret; }, }, methods: { onSelectReport(reportId) { if (resolveFunc) { resolveFunc({ definition: this.reportStorage.get(reportId), id: reportId, displayName: reportId, }); this.showModal = false; } }, onCreateReport() { const CPLReport = { Name: "Report", Body: { Width: "8.5in", Height: "11in", }, }; const reportId = `NewReport${this.counter + 1}`; this.counter++; return Promise.resolve({ definition: CPLReport, id: reportId, displayName: reportId, }); }, onSaveReport(info) { const reportId = info.id || `NewReport${this.counter + 1}`; this.reportStorage.set(reportId, info.definition); this.counter++; return Promise.resolve({ displayName: reportId }); }, onSaveAsReport(info) { const reportId = `NewReport${this.counter + 1}`; this.reportStorage.set(reportId, info.definition); this.counter++; return Promise.resolve({ id: reportId, displayName: reportId }); }, onOpenReport() { let me = this; return new Promise(function (resolve) { resolveFunc = resolve; me.showModal = true; }); }, hideModal() { this.showModal = false; if (resolveFunc) { resolveFunc(null); resolveFunc = null; } }, }, }; </script> <style> @import url("/activereportsjs/demos/resource/themes/orange-ui.css"); @import url("/activereportsjs/demos/resource/themes/orange-designer.css"); #designer-host { width: 100%; height: 550px; } .modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 1000; } .modal-content { background: white; padding: 20px; border-radius: 4px; width: 50%; max-width: 500px; max-height: 80%; overflow-y: auto; } </style>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>ActiveReportsJS sample</title> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <!-- SystemJS --> <script src="node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script src="./compiler.js" type="module"></script> <link href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&display=swap" rel="stylesheet" /> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous" /> <script> System.import('$DEMOROOT$/en/lib/vue/license.ts'); System.import("./app.js"); </script> </head> <body style="margin: 0"> <div id="app"></div> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous" ></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous" ></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous" ></script> </body> </html>
(function (global) { SystemJS.config({ transpiler: 'systemjs-plugin-babel', typescriptOptions: { "target": "es2022", "module": "system", }, baseURL: './node_modules/', packageConfigPaths: [ './node_modules/*/package.json', "./node_modules/@grapecity/*/package.json", "./node_modules/@babel/*/package.json", "./node_modules/@vue/*/package.json" ], map: { 'vue': "./node_modules/vue/dist/vue.esm-browser.js", "systemjs-babel-build": "systemjs-plugin-babel/systemjs-babel-browser.js", "@grapecity/activereports/pdfexport": "@grapecity/activereports/dist/ar-js-pdf.js", "@grapecity/activereports/tabulardataexport": "@grapecity/activereports/dist/ar-js-tabular-data.js", "@grapecity/activereports/htmlexport": "@grapecity/activereports/dist/ar-js-html.js", "@grapecity/activereports/xlsxexport": "@grapecity/activereports/dist/ar-js-xlsx.js", "@grapecity/activereports-vue": "@grapecity/activereports-vue/lib/index.js", "@grapecity/activereports/reportviewer": "@grapecity/activereports/dist/ar-js-viewer.js", "@grapecity/activereports/viewer": "@grapecity/activereports/dist/ar-js-viewer.js", "@grapecity/activereports/reportdesigner": "@grapecity/activereports/dist/ar-js-designer.js", "@grapecity/activereports/core": "@grapecity/activereports/dist/ar-js-core.js", "@grapecity/activereports/styles": "@grapecity/activereports/styles", "@grapecity/activereports-localization": "@grapecity/activereports-localization/dist/ar-js-locales.js", "@grapecity/ar-js-pagereport": "@grapecity/activereports/dist/ar-js-core.js", "@grapecity/activereports-localization-ja": "@grapecity/activereports-localization/dist/designer/ja-locale.js", "@grapecity/activereports-localization-zh": "@grapecity/activereports-localization/dist/designer/zh-locale.js", }, meta: { '*.css': { loader: 'systemjs-plugin-css' }, './src/*.vue': { loader: "../plugin-vue/index.js" }, '*.vue': { loader: "./plugin-vue/index.js" }, }, packages: { "vue-demi": { defaultExtension: "mjs", main: "lib/index.mjs" } } }); })(this);