Report Viewer Component - Custom Resource Locator

Sometimes it is needed to resolve references to report definitions at runtime in the application's code. For example, suppose you use the server-side database to keep report templates and load them from the client-side using the API that requires authorization. In that case, the reporting engine can not obtain those templates, and it relies on the hosting application to provide them. In this situation, you can use the custom resource locator feature. The samples below show the usage of a custom resource locator to resolve subreports with Angular, React, Vue, and pure JavaScript applications. For more details, please visit the Resource Locator documentation. To view the code, scroll down the page.

import React, { Fragment } from "react"; import ReactDOM from "react-dom"; import { Viewer } from "@mescius/activereportsjs-react"; import "@mescius/activereportsjs/pdfexport"; import "@mescius/activereportsjs/htmlexport"; import "@mescius/activereportsjs/tabulardataexport"; import "@mescius/activereportsjs/xlsxexport"; import "@mescius/activereportsjs/xlsxadvexport"; import "@mescius/activereportsjs-i18n"; import { FontStore } from "@mescius/activereportsjs/core"; function App() { const viewerRef = React.useRef(null); function onPreview(){ viewerRef.current.Viewer.open("MainReport", { ResourceLocator: { getResource: (resourceId) => { var reportUrl; switch (resourceId) { case "MainReport": reportUrl = "reports/CarsListing.rdlx-json"; break; case "VehicleDetailsSubreport": reportUrl = "reports/VehicleDetails.rdlx-json"; break; case "ManufacturerDetailsSubreport": reportUrl = "reports/ManufacturerDetails.rdlx-json"; break; default: reportUrl = null; break; } if (reportUrl) return fetch(reportUrl).then((data) => data.json()); }, }, }); } React.useEffect(()=>{ onPreview(); }, []) return ( <div id="viewer-host"> <Viewer ref={viewerRef} theme="ActiveReports" /> </div> ); } FontStore.registerFonts("/activereportsjs/demos/resource/fontsConfig.json"); 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 Viewer Custom Resource Locator Sample</title> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <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" /> <link rel="stylesheet" href="https://cdn.materialdesignicons.com/2.8.94/css/materialdesignicons.min.css" /> <link rel="stylesheet" href="index.css" /> <!-- SystemJS --> <script src="./vendor/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import("./src/app"); </script> </head> <body style="margin: 0"> <div id="root"></div> </body> </html>
(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-react": "npm:@mescius/activereportsjs-react/lib/index.js", "@mescius/activereportsjs/reportviewer": "npm:@mescius/activereportsjs/dist/ar-js-viewer.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/xlsxadvexport": "npm:@mescius/activereportsjs/dist/ar-js-xlsxAdv.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": "npm:@mescius/activereportsjs-i18n/dist/ar-js-locales.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);