UNPKG

@progress/telerik-jquery-report-viewer

Version:

Progress® Telerik® Report Viewer for jQuery

667 lines (664 loc) 22.4 kB
import { rTrim, generateGuidString, isApplicationExceptionInstance, stringFormat, escapeHtml, logError, loadScript } from './utils.js'; import { stringResources } from './stringResources.js'; import { ServiceClient } from './serviceClient.js'; import { ReportViewerController } from './controller.js'; import { HistoryManager } from './history.js'; import { Binder } from './binder.js'; import { CommandSet } from './commandSet.js'; import { UIController } from './uiController.js'; import { Accessibility } from './accessibility.js'; import { DocumentMapArea } from './documentMapArea.js'; import { ParametersArea } from './parametersArea.js'; import { PagesArea } from './pagesArea.js'; import { MainMenu } from './mainMenu.js'; import { Search } from './search.js'; import { SendEmail } from './sendEmail.js'; import { SideMenu } from './sideMenu.js'; import { Events } from './events.js'; import { PerspectiveManager } from './perspectives.js'; import { ScaleModes, ViewModes, PageModes, ParametersAreaPositions, DocumentMapAreaPositions, ParameterEditorTypes } from './enums.js'; import { GlobalSettings } from './globalSettings.js'; import { MemStorage } from './mem-storage.js'; import { TemplateCache } from './template-cache.js'; import { ReportViewerSettings } from './report-viewer/report-viewer-settings.js'; import { LinkButton } from './toolbar/link-button.js'; import { PageNumberInput } from './toolbar/page-number-input.js'; import { PageCountLabel } from './toolbar/page-count-label.js'; const Instances = GlobalSettings.viewerInstances; function getDefaultOptions(serviceUrl, version) { return { id: null, serviceUrl: null, templateUrl: rTrim(serviceUrl, "\\/") + "/resources/templates/telerikReportViewerTemplate-" + version + ".html/", reportSource: null, reportServer: null, authenticationToken: null, sendEmail: null, scale: 1, scaleMode: ScaleModes.FIT_PAGE, viewMode: ViewModes.INTERACTIVE, pageMode: PageModes.CONTINUOUS_SCROLL, parametersAreaPosition: ParametersAreaPositions.RIGHT, documentMapAreaPosition: DocumentMapAreaPositions.LEFT, parameters: { editors: { multiSelect: ParameterEditorTypes.LIST_VIEW, singleSelect: ParameterEditorTypes.LIST_VIEW } }, persistSession: false, parameterEditors: [], disabledButtonClass: null, checkedButtonClass: null, parametersAreaVisible: true, documentMapVisible: true, enableAccessibility: false, searchMetadataOnDemand: false, initialPageAreaImageUrl: null, keepClientAlive: true }; } function ReportViewer(dom, options) { var svcApiUrl = options.serviceUrl; var reportServerUrlSVCApiUrl = ""; if (options.reportServer) { reportServerUrlSVCApiUrl = rTrim(options.reportServer.url, "\\/"); svcApiUrl = reportServerUrlSVCApiUrl + "/api/reports"; } var $placeholder = $(dom); var templates = {}; var persistanceKey = options.id || `trv_${dom.id}`; var accessibility; var settings = {}; var client = {}; var controller = {}; var perspectiveManager = {}; var history = {}; var commands = {}; var viewer = {}; var serviceClientOptions = {}; var reportServerUrl = ""; options.viewerSelector = "reportViewer-" + generateGuidString(); $placeholder.attr("data-selector", options.viewerSelector); if (!validateOptions(options)) { return; } var version = "19.0.25.313"; options = $.extend({}, getDefaultOptions(svcApiUrl, version), options); settings = new ReportViewerSettings( persistanceKey, options.persistSession ? window.sessionStorage : new MemStorage(), { scale: options.scale, scaleMode: options.scaleMode, printMode: options.printMode ? options.printMode : options.directPrint, enableAccessibility: options.enableAccessibility, searchMetadataOnDemand: options.searchMetadataOnDemand, sendEmail: options.sendEmail, parametersAreaPosition: options.parametersAreaPosition, documentMapAreaPosition: options.documentMapAreaPosition, keepClientAlive: options.keepClientAlive } ); if (options.reportServer) { reportServerUrl = rTrim(options.reportServer.url, "\\/"); serviceClientOptions.serviceUrl = reportServerUrl + "/api/reports"; serviceClientOptions.loginInfo = { url: reportServerUrl + "/Token", username: options.reportServer.username, password: options.reportServer.password }; } else { serviceClientOptions.serviceUrl = options.serviceUrl; } client = new ServiceClient(serviceClientOptions); controller = options.controller; if (!controller) { controller = new ReportViewerController({ serviceClient: client, settings }); } else { controller.updateSettings(settings); } history = new HistoryManager({ controller, settings }); commands = new CommandSet({ controller, history }); new UIController({ controller, history, commands }); viewer = { stringResources, refreshReport: function(ignoreCache) { if (arguments.length === 0) { ignoreCache = true; } controller.refreshReport(ignoreCache, true); return viewer; }, reportSource: function(rs) { if (rs || rs === null) { controller.setReportSource(rs); controller.refreshReport(false, true); return viewer; } return controller.getReportSource(); }, clearReportSource: function() { controller.clearReportSource(); return viewer; }, viewMode: function(vm) { if (vm) { controller.setViewMode(vm); return viewer; } return controller.getViewMode(); }, pageMode: function(psm) { if (psm) { controller.setPageMode(psm); return viewer; } return controller.getPageMode(); }, printMode: function(pm) { if (pm) { controller.setPrintMode(pm); return viewer; } return controller.getPrintMode(); }, scale: function({ scale, scaleMode } = {}) { if (scale || scaleMode) { controller.setScale(scale || controller.getScale()); controller.setScaleMode(scaleMode || controller.getScaleMode()); return viewer; } return { scale: controller.getScale(), scaleMode: controller.getScaleMode() }; }, currentPage: function() { return controller.getCurrentPageNumber(); }, pageCount: function() { return controller.getPageCount(); }, parametersAreaVisible: function(visible) { controller.setParametersAreaVisible({ visible }); }, getReportParameters: function() { return controller.getReportParameters(); }, isReportAutoRun: function() { return controller.isReportAutoRun(); }, authenticationToken: function(token) { if (token) { controller.setAuthenticationToken(token); } return viewer; }, bind: function(eventName, eventHandler) { eventBinder(eventName, eventHandler, true); }, unbind: function(eventName, eventHandler) { eventBinder(eventName, eventHandler, false); }, accessibilityKeyMap: function(keyMap) { if (accessibility) { if (keyMap) { accessibility.setKeyMap(keyMap); return viewer; } return accessibility.getKeyMap(); } return void 0; }, commands, dispose: function() { controller.dispose(); if (perspectiveManager) { perspectiveManager.dispose(); } } }; function validateOptions(options2) { if (!options2) { $placeholder.text("The report viewer configuration options are not initialized."); return false; } if (options2.reportServer) { if (!options2.reportServer.url) { $placeholder.text("The report server URL is not specified."); return false; } } else { if (!options2.serviceUrl) { $placeholder.text("The serviceUrl is not specified."); return false; } } return true; } function eventBinder(eventName, eventHandler, bind) { if (typeof eventHandler === "function") { if (bind) { $(viewer).on(eventName, { sender: viewer }, eventHandler); } else { $(viewer).off(eventName, eventHandler); } } else if (!eventHandler && !bind) { $(viewer).off(eventName); } } function attachEvents() { var eventMap = { EXPORT_BEGIN: controller.Events.EXPORT_STARTED, EXPORT_END: controller.Events.EXPORT_DOCUMENT_READY, PRINT_BEGIN: controller.Events.PRINT_STARTED, PRINT_END: controller.Events.PRINT_DOCUMENT_READY, RENDERING_BEGIN: controller.Events.BEFORE_LOAD_REPORT, RENDERING_END: controller.Events.REPORT_LOAD_COMPLETE, PAGE_READY: controller.Events.PAGE_READY, ERROR: controller.Events.ERROR, UPDATE_UI: controller.Events.UPDATE_UI, INTERACTIVE_ACTION_EXECUTING: controller.Events.INTERACTIVE_ACTION_EXECUTING, INTERACTIVE_ACTION_ENTER: controller.Events.INTERACTIVE_ACTION_ENTER, INTERACTIVE_ACTION_LEAVE: controller.Events.INTERACTIVE_ACTION_LEAVE, VIEWER_TOOLTIP_OPENING: controller.Events.TOOLTIP_OPENING, SEND_EMAIL_BEGIN: controller.Events.SEND_EMAIL_STARTED, SEND_EMAIL_END: controller.Events.SEND_EMAIL_READY, PARAMETERS_LOADED: controller.Events.PARAMETERS_LOADED }; var $viewer = $(viewer); for (const [viewerEvent, controllerEvent] of Object.entries(eventMap)) { controller.on(controllerEvent, function(e, args) { $viewer.trigger(viewerEvent, args); }); } } function attachEventHandlers() { eventBinder(Events.EXPORT_BEGIN, options.exportBegin, true); eventBinder(Events.EXPORT_END, options.exportEnd, true); eventBinder(Events.PRINT_BEGIN, options.printBegin, true); eventBinder(Events.PRINT_END, options.printEnd, true); eventBinder(Events.RENDERING_BEGIN, options.renderingBegin, true); eventBinder(Events.RENDERING_END, options.renderingEnd, true); eventBinder(Events.PAGE_READY, options.pageReady, true); eventBinder(Events.ERROR, options.error, true); eventBinder(Events.UPDATE_UI, options.updateUi, true); eventBinder(Events.INTERACTIVE_ACTION_EXECUTING, options.interactiveActionExecuting, true); eventBinder(Events.INTERACTIVE_ACTION_ENTER, options.interactiveActionEnter, true); eventBinder(Events.INTERACTIVE_ACTION_LEAVE, options.interactiveActionLeave, true); eventBinder(Events.VIEWER_TOOLTIP_OPENING, options.viewerToolTipOpening, true); eventBinder(Events.SEND_EMAIL_BEGIN, options.sendEmailBegin, true); eventBinder(Events.SEND_EMAIL_END, options.sendEmailEnd, true); eventBinder(Events.PARAMETERS_LOADED, options.parametersLoaded, true); } function init() { $placeholder.html(templates["trv-report-viewer"]); Binder.bind( $placeholder, { controller, commands, templates }, options ); perspectiveManager = new PerspectiveManager(dom, controller); perspectiveManager.attach(); initSplitter(); attachEvents(); attachEventHandlers(); initFromStorage(); initAccessibility(options); } function initSplitter() { var parameterAreaPaneOptions = { max: "500px", min: "50px", size: "210px", collapsible: true }; var parameterAreaTemplate = $placeholder.find(".trv-parameters-area"); var parameterAreaPanes = [{}]; var documentMapPaneOptions = { max: "500px", min: "50px", size: "210px", collapsible: true, collapsed: true }; var documentMapTemplate = $placeholder.find(".trv-document-map"); var documentMapPanes = [{}]; var orientation = "horizontal"; if (options.documentMapAreaPosition === DocumentMapAreaPositions.RIGHT) { documentMapTemplate.insertAfter($placeholder.find(".trv-pages-area")); documentMapPanes.push(documentMapPaneOptions); } else { documentMapPanes.unshift(documentMapPaneOptions); } if (options.parametersAreaPosition === ParametersAreaPositions.TOP || options.parametersAreaPosition === ParametersAreaPositions.BOTTOM) { orientation = "vertical"; parameterAreaTemplate.addClass("-vertical"); parameterAreaPaneOptions.size = "130px"; } if (options.parametersAreaPosition === ParametersAreaPositions.LEFT || options.parametersAreaPosition === ParametersAreaPositions.TOP) { parameterAreaTemplate.insertBefore($placeholder.find(".trv-document-map-splitter")); parameterAreaPanes.unshift(parameterAreaPaneOptions); } else { parameterAreaPanes.push(parameterAreaPaneOptions); } try { var documentMapSplitter = $placeholder.find(".trv-document-map-splitter").kendoSplitter({ panes: documentMapPanes, expand: function(e) { setSplitterPaneVisibility(e.pane, true); }, collapse: function(e) { setSplitterPaneVisibility(e.pane, false); }, resize: function(e) { } }).data("kendoSplitter"); } catch (e) { console.error("Instantiation of Kendo Splitter as Document Map splitter threw an exception", e); throw e; } try { var parametersSplitter = $placeholder.find(".trv-parameters-splitter").kendoSplitter({ panes: parameterAreaPanes, orientation, expand: function(e) { setSplitterPaneVisibility(e.pane, true); }, collapse: function(e) { setSplitterPaneVisibility(e.pane, false); }, resize: function(e) { } }).data("kendoSplitter"); } catch (e) { console.error("Instantiation of Kendo Splitter as Parameters area splitter threw an exception", e); throw e; } var parametersSplitterInstance = { id: options.viewerSelector + "-parameters-splitter", instance: parametersSplitter }; var documentMapSplitterInstance = { id: options.viewerSelector + "-document-map-splitter", instance: documentMapSplitter }; Instances.push(parametersSplitterInstance); Instances.push(documentMapSplitterInstance); } function setSplitterPaneVisibility(pane, visible) { var paneID = $(pane).attr("data-id"); switch (paneID) { case "trv-document-map": controller.setDocumentMapVisible({ visible }); break; case "trv-parameters-area": controller.setParametersAreaVisible({ visible }); break; } } function initFromStorage() { var vm = settings.getViewMode(); var psm = settings.getPageMode(); var pm = settings.getPrintMode(); var s = settings.getScale(); var sm = settings.getScaleMode(); var dm = settings.getDocumentMapVisible(); var pa = settings.getParametersAreaVisible(); settings.getAccessibilityKeyMap(); controller.setViewMode(vm ? vm : options.viewMode); controller.setPageMode(psm ? psm : options.pageMode); controller.setPrintMode(pm ? pm : options.printMode); controller.setScale(s ? s : options.scale); controller.setScaleMode(sm ? sm : options.scaleMode); controller.setDocumentMapVisible({ visible: dm ? dm : options.documentMapVisible }); controller.setParametersAreaVisible({ visible: pa ? pa : options.parametersAreaVisible }); controller.printModeChanged(function() { settings.setPrintMode(controller.getPrintMode()); }); controller.viewModeChanged(function() { settings.setViewMode(controller.getViewMode()); }); controller.pageModeChanged(function() { settings.setPageMode(controller.getPageMode()); }); controller.scaleChanged(function(event, scale) { settings.setScale(scale); }); controller.scaleModeChanged(function(event, scaleMode) { settings.setScaleMode(scaleMode); }); controller.setSideMenuVisible(function(event, args) { window.setTimeout(function() { (args.visible ? $.fn.addClass : $.fn.removeClass).call($placeholder, "trv-side-menu-visible"); }, 1); }); controller.setDocumentMapVisible(function() { var args = {}; controller.getDocumentMapState(args); settings.setDocumentMapVisible(args.visible); }); controller.setParametersAreaVisible(function() { var args = {}; controller.getParametersAreaState(args); settings.setParametersAreaVisible(args.visible); }); } function initAccessibility(options2) { if (options2.enableAccessibility) { accessibility = new Accessibility({ controller, templates }); var am = options2.accessibilityKeyMap; if (am) { accessibility.setKeyMap(am); } settings.contentTabIndex = getTemplateContentTabIndex(); } } function getTemplateContentTabIndex() { var pageAreaSelector = "div.trv-pages-area"; try { var $pagesArea = $placeholder.find(pageAreaSelector); if ($pagesArea.length === 0) { throw "Selector " + pageAreaSelector + " did not return a result."; } return parseInt($pagesArea.attr("tabindex")); } catch (e) { if (console) console.log(e); return 0; } } function start() { var pendingRefresh = false; init(); controller.reportLoadComplete(function() { if (options.documentMapVisible === false) { controller.setDocumentMapVisible({ visible: false }); } }); var rs = settings.getReportSource(); if (rs !== void 0) { controller.setReportSource(rs); var pageNumber = settings.getPageNumber(); if (pageNumber !== void 0) { controller.navigateToPage(pageNumber); } pendingRefresh = true; } else { if (options.viewMode) { controller.setViewMode(options.viewMode); } if (options.pageMode) { controller.setPageMode(options.pageMode); } if (options.reportSource) { controller.setReportSource(options.reportSource); pendingRefresh = true; } } if (typeof options.ready === "function") { options.ready.call(viewer); } if (pendingRefresh) { controller.refreshReport(false, true); } } function loadStyleSheets(styleSheets) { if (!styleSheets) return Promise.resolve(); var $head = $("head"); var currentStyleLinks = $head.find("link").map(function(i, e) { return e.outerHTML; }).toArray(); var promises = []; Array.from(styleSheets).forEach((element) => { if (currentStyleLinks.indexOf(element) === -1) { promises.push( new Promise(function(resolve, reject) { var $link = $(element); $link.on("load", resolve); $link.on("onerror", function() { logError("error loading stylesheet " + element); resolve(); }); $head.append($link); }) ); } }); return Promise.all(promises).then(controller.cssLoaded); } function browserSupportsAllFeatures() { return window.Promise; } function ensureKendo(version2) { if (window.kendo) { return Promise.resolve(); } var kendoUrl = rTrim(svcApiUrl, "\\/") + "/resources/js/telerikReportViewer.kendo-" + version2 + ".min.js/"; return loadScript(kendoUrl).catch(function(errorData) { logError("Kendo could not be loaded automatically. Make sure 'options.serviceUrl' / 'options.reportServer.url' is correct and accessible. The error is: " + errorData.error); }); } function main(version2) { ensureKendo(version2).then(function() { }).then(function() { viewer.authenticationToken(options.authenticationToken); controller.getServiceVersion().catch(function(ex) { var errorOutput = isApplicationExceptionInstance(ex) ? ex.exceptionMessage : stringFormat(stringResources.errorServiceUrl, [escapeHtml(svcApiUrl)]); $placeholder.text(errorOutput); return Promise.reject(); }).then(function(data) { if (data !== version2) { $placeholder.text(stringFormat(stringResources.errorServiceVersion, [data, version2])); return Promise.reject(); } TemplateCache.load(options.templateUrl, svcApiUrl, client).catch(function() { $placeholder.text(stringFormat(stringResources.errorLoadingTemplates, [escapeHtml(options.templateUrl)])); return Promise.reject(); }).then(function(result) { templates = result.templates; return loadStyleSheets(result.styleSheets); }).then(start); }); }); } if (browserSupportsAllFeatures()) { main(version); } else { throw "The current browser does not support the Promise feature which is required for using the Report Viewer."; } return viewer; } var pluginName = "telerik_ReportViewer"; $.fn[pluginName] = function(options) { if (this.selector && !options.selector) { options.selector = this.selector; } return this.each(function() { if (!$.data(this, pluginName)) { $.data(this, pluginName, new ReportViewer(this, options)); } }); }; const plugins = [ { name: "telerik_ReportViewer_DocumentMapArea", constructor: DocumentMapArea }, { name: "telerik_ReportViewer_MainMenu", constructor: MainMenu }, { name: "telerik_ReportViewer_PagesArea", constructor: PagesArea }, { name: "telerik_ReportViewer_ParametersArea", constructor: ParametersArea }, { name: "telerik_ReportViewer_SearchDialog", constructor: Search }, { name: "telerik_ReportViewer_SendEmail", constructor: SendEmail }, { name: "telerik_ReportViewer_SideMenu", constructor: SideMenu }, { name: "telerik_ReportViewer_LinkButton", constructor: LinkButton }, { name: "telerik_ReportViewer_PageNumberInput", constructor: PageNumberInput }, { name: "telerik_ReportViewer_PageCountLabel", constructor: PageCountLabel } ]; plugins.forEach((plugin) => { $.fn[plugin.name] = function(options, otherOptions) { return this.each(function() { if (!$.data(this, plugin.name)) { $.data(this, plugin.name, new plugin.constructor(this, options, otherOptions)); } }); }; }); export { ReportViewer };