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.

app.jsx
index.html
index.css
Copy to CodeMine
import React, { Fragment, useState } from "react"; import ReactDOM from "react-dom"; import {Designer} from "@mescius/activereportsjs-react" function App() { const [modalOpen, setModalOpen] = useState(false); const [selectedReport, setSelectedReport] = useState(null); const [reportPromise, setReportPromise] = useState(null); const counter = React.useRef(0); const [reportStorage, setReportStorage] = React.useState(new Map()); function onSelectReport(reportId) { setSelectedReport(reportId); setModalOpen(false); } function onCreateReport(){ const CPLReport = { Name: "Report", Body: { Width: "8.5in", Height: "11in", }, }; const reportId = `NewReport${++counter.current}`; return Promise.resolve({ definition: CPLReport, id: reportId, displayName: reportId, }); } function onCloseDialog() { setModalOpen(false); if (reportPromise) { reportPromise.resolve(null); setReportPromise(null); } } function onOpenReport(){ setModalOpen(true); return new Promise((resolve, reject) => { setReportPromise({ resolve, reject }); }); } function onSaveReport(info){ const reportId = info.id || `NewReport${++counter.current}`; setReportStorage(new Map(reportStorage.set(reportId, info.definition))); return Promise.resolve({ displayName: reportId }); } function onSaveAsReport(info){ const reportId = `NewReport${++counter.current}`; setReportStorage(new Map(reportStorage.set(reportId, info.definition))); return Promise.resolve({ id: reportId, displayName: reportId }); } React.useEffect(() => { if (selectedReport && reportPromise) { reportPromise.resolve({ definition: reportStorage.get(selectedReport), id: selectedReport, displayName: selectedReport, }); setReportPromise(null); setSelectedReport(null); } }, [selectedReport, reportPromise]); return ( <Fragment> <div id="designer-host"><Designer onCreate={onCreateReport} onSave={onSaveReport} onSaveAs={onSaveAsReport} onOpen={onOpenReport} /></div> {modalOpen && ( <div 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" onClick={()=>onCloseDialog()} > <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <strong>Select Report:</strong> <div class="list-group"> {[...reportStorage.keys()].map((reportId) => ( <button type="button" class="list-group-item list-group-item-action" onClick={() => onSelectReport(reportId)} > {reportId} </button> ))} </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-outline-secondary" onClick={()=>onCloseDialog()} > Close </button> </div> </div> </div>)} </Fragment> ); } ReactDOM.render(<App />, document.getElementById("root"));
import React, { Fragment, useState } from "react"; import ReactDOM from "react-dom"; import {Designer} from "@mescius/activereportsjs-react" function App() { const [modalOpen, setModalOpen] = useState(false); const [selectedReport, setSelectedReport] = useState(null); const [reportPromise, setReportPromise] = useState(null); const counter = React.useRef(0); const [reportStorage, setReportStorage] = React.useState(new Map()); function onSelectReport(reportId) { setSelectedReport(reportId); setModalOpen(false); } function onCreateReport(){ const CPLReport = { Name: "Report", Body: { Width: "8.5in", Height: "11in", }, }; const reportId = `NewReport${++counter.current}`; return Promise.resolve({ definition: CPLReport, id: reportId, displayName: reportId, }); } function onCloseDialog() { setModalOpen(false); if (reportPromise) { reportPromise.resolve(null); setReportPromise(null); } } function onOpenReport(){ setModalOpen(true); return new Promise((resolve, reject) => { setReportPromise({ resolve, reject }); }); } function onSaveReport(info){ const reportId = info.id || `NewReport${++counter.current}`; setReportStorage(new Map(reportStorage.set(reportId, info.definition))); return Promise.resolve({ displayName: reportId }); } function onSaveAsReport(info){ const reportId = `NewReport${++counter.current}`; setReportStorage(new Map(reportStorage.set(reportId, info.definition))); return Promise.resolve({ id: reportId, displayName: reportId }); } React.useEffect(() => { if (selectedReport && reportPromise) { reportPromise.resolve({ definition: reportStorage.get(selectedReport), id: selectedReport, displayName: selectedReport, }); setReportPromise(null); setSelectedReport(null); } }, [selectedReport, reportPromise]); return ( <Fragment> <div id="designer-host"><Designer onCreate={onCreateReport} onSave={onSaveReport} onSaveAs={onSaveAsReport} onOpen={onOpenReport} /></div> {modalOpen && ( <div 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" onClick={()=>onCloseDialog()} > <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <strong>Select Report:</strong> <div class="list-group"> {[...reportStorage.keys()].map((reportId) => ( <button type="button" class="list-group-item list-group-item-action" onClick={() => onSelectReport(reportId)} > {reportId} </button> ))} </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-outline-secondary" onClick={()=>onCloseDialog()} > Close </button> </div> </div> </div>)} </Fragment> ); } ReactDOM.render(<App />, document.getElementById("root"));
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>ActiveReportsJS Report Designer Report Saving Sample</title> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="index.css" /> <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" /> <!-- SystemJS --> <script src="./vendor/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import("./src/app"); </script> </head> <body> <div id="root"></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>
@import url("/activereportsjs/demos/arjs/styles/ar-js-ui.css"); @import url("/activereportsjs/demos/arjs/styles/ar-js-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; }
(function (global) { System.config({ transpiler: "plugin-babel", babelOptions: { es2015: true, react: true, }, meta: { "*.css": { loader: "css" }, }, paths: { // paths serve as alias "npm:": "node_modules/", }, // map tells the System loader where to look for things map: { css: "npm:systemjs-plugin-css/css.js", react: "npm:react/umd/react.production.min.js", "react-dom": "npm:react-dom/umd/react-dom.production.min.js", "@mescius/activereportsjs/pdfexport": "npm:@mescius/activereportsjs/dist/ar-js-pdf.js", "@mescius/activereportsjs/tabulardataexport": "npm:@mescius/activereportsjs/dist/ar-js-tabular-data.js", "@mescius/activereportsjs/htmlexport": "npm:@mescius/activereportsjs/dist/ar-js-html.js", "@mescius/activereportsjs/xlsxexport": "npm:@mescius/activereportsjs/dist/ar-js-xlsx.js", "@mescius/activereportsjs-react": "npm:@mescius/activereportsjs-react/lib/index.js", "@mescius/activereportsjs/reportviewer": "npm:@mescius/activereportsjs/dist/ar-js-viewer.js", "@mescius/activereportsjs/viewer": "npm:@mescius/activereportsjs/dist/ar-js-viewer.js", "@mescius/activereportsjs/reportdesigner": "npm:@mescius/activereportsjs/dist/ar-js-designer.js", "@mescius/activereportsjs/core": "npm:@mescius/activereportsjs/dist/ar-js-core.js", "@mescius/activereportsjs/styles": "npm:@mescius/activereportsjs/styles", "@mescius/activereportsjs-i18n-ja": "npm:@mescius/activereportsjs-i18n/dist/designer/ja-locale.js", "@mescius/activereportsjs-i18n-zh": "npm:@mescius/activereportsjs-i18n/dist/designer/zh-locale.js", "@mescius/ar-js-pagereport": "npm:@mescius/activereportsjs/dist/ar-js-core.js", "plugin-babel": "npm:systemjs-plugin-babel/plugin-babel.js", "systemjs-babel-build": "npm:systemjs-plugin-babel/systemjs-babel-browser.js", }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: "jsx", }, node_modules: { defaultExtension: "js", }, }, }); })(this);