UNPKG

@progress/telerik-jquery-report-viewer

Version:

Progress® Telerik® Report Viewer for jQuery

623 lines (618 loc) 21.9 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var utils = require('./utils.js'); var domUtils = require('./domUtils.js'); var stringResources = require('./stringResources.js'); var touch = require('./touch.js'); var scroll = require('./scroll.js'); var uiFreezeCoordinator = require('./uiFreezeCoordinator.js'); var enums = require('./enums.js'); var defaultOptions = {}; function PagesArea(placeholder, options, otherOptions) { options = $.extend({}, defaultOptions, options, otherOptions); var controller = options.controller; if (!controller) throw "No controller (telerikReportViewer.reportViewerController) has been specified."; var $placeholder = $(placeholder); var $pageContainer = $placeholder.find(".trv-page-container"); var pageContainer = $pageContainer[0]; var $pageWrapper = $placeholder.find(".trv-page-wrapper"); var pageWrapper = $pageWrapper[0]; var $errorMessage = $placeholder.find(".trv-error-message"); var actions; var pendingElement; var pageScaleMode = controller.getScaleMode(); var pageScale = controller.getScale(); var minPageScale = 0.1; var maxPageScale = 8; var documentReady = true; var navigateToPageOnDocReady; var navigateToElementOnDocReady; var isNewReportSource; var showErrorTimeoutId; var showPageAreaImage = false; var reportPageIsLoaded = false; var pageAreaImageStyle = '.trv-page-container {background: #ffffff url("{0}") no-repeat center 50px}'; var pageAreaImageID = "trv-initial-image-styles"; var scroll$1 = $.extend({}, scroll.Scroll); var uiFreezeCoordinator$1 = null; init(); if (scroll$1) { scroll$1.init(placeholder, options); } function init() { replaceStringResources($placeholder); } function replaceStringResources($pagesArea) { $pagesArea.attr("aria-label", stringResources.stringResources[$pagesArea.attr("aria-label")]); } $(window).on("resize", function(event, args) { if (shouldAutosizePage()) { updatePageDimensions(); } }); enableTouch($placeholder); function clearPendingTimeoutIds() { if (showErrorTimeoutId) { window.clearTimeout(showErrorTimeoutId); } } function invalidateCurrentlyLoadedPage() { var page = findPage(navigateToPageOnDocReady); if (page) { pageNo(page, -1); } } function navigateWhenPageAvailable(pageNumber, pageCount) { if (pageNumber && pageNumber <= pageCount) { navigateToPage(pageNumber, navigateToElementOnDocReady); } } function navigateOnLoadComplete(pageNumber, pageCount) { if (pageNumber) { pageNumber = Math.min(pageNumber, pageCount); navigateToPage(pageNumber, navigateToElementOnDocReady); } } function clearPage() { clear(isNewReportSource); isNewReportSource = false; } controller.pageModeChanged(function() { if (controller.getPageMode() === enums.PageModes.CONTINUOUS_SCROLL) { scroll$1.enable(); } else { scroll$1.disable(); } controller.refreshReport(true); }).reportSourceChanged(function() { isNewReportSource = true; navigateToPageOnDocReady = null; navigateToElementOnDocReady = null; documentReady = false; }).beforeLoadParameters(function(event, initial) { if (initial) { showError(stringResources.stringResources.loadingReport); } }).beforeLoadReport(function() { documentReady = false; if (!navigateToPageOnDocReady) { navigateToPageOnDocReady = 1; } clearPendingTimeoutIds(); clear(); disablePagesArea(true); showError(stringResources.stringResources.loadingReport); }).beginLoadReport(function(event, args) { documentReady = true; invalidateCurrentlyLoadedPage(); }).reportLoadProgress(function(event, args) { navigateWhenPageAvailable(navigateToPageOnDocReady, args.pageCount); showError(utils.stringFormat(stringResources.stringResources.loadingReportPagesInProgress, [args.pageCount])); }).reportLoadComplete(function(event, args) { if (0 === args.pageCount) { clearPage(); showError(stringResources.stringResources.noPageToDisplay); } else { navigateOnLoadComplete(navigateToPageOnDocReady, args.pageCount); showError(utils.stringFormat(stringResources.stringResources.loadedReportPagesComplete, [args.pageCount])); showErrorTimeoutId = window.setTimeout(showError, 2e3); enableInteractivity(); } if (args.containsFrozenContent && !uiFreezeCoordinator$1) { uiFreezeCoordinator$1 = $.extend({}, uiFreezeCoordinator.UIFreezeCoordinator); if (controller.getViewMode() === enums.ViewModes.INTERACTIVE) { uiFreezeCoordinator$1.init($placeholder); } } }).navigateToPage(function(event, pageNumber, targetElement) { navigateToPage(pageNumber, targetElement); }).pageReady(function(event, page) { if (controller.getPageMode() === enums.PageModes.SINGLE_PAGE) { if (scroll$1.isEnabled()) { scroll$1.disable(); } setPageContent(page); } else { scroll$1.renderPage(page); } if (!reportPageIsLoaded) { reportPageIsLoaded = true; } if (showPageAreaImage) { clearPageAreaImage(); } if (controller.getViewMode() === enums.ViewModes.INTERACTIVE && uiFreezeCoordinator$1) { uiFreezeCoordinator$1.init($placeholder); } disablePagesArea(false); }).error(function(event, error) { disablePagesArea(false); clearPage(); showError(error); }).showNotification(function(event, args) { showError(stringResources.stringResources[args.stringResources]); }).hideNotification(function(event, args) { showError(); }).scaleChanged(function(event, scale) { setPageScale({ scale, scaleMode: controller.getScaleMode() }); }).scaleModeChanged(function(event, scaleMode) { setPageScale({ scale: controller.getScale(), scaleMode }); }).serverActionStarted(function() { disablePagesArea(true); showError(stringResources.stringResources.loadingReport); }).scrollPageReady(function(event, args) { setScrollablePage(args); }).missingOrInvalidParameters(function(event, args) { if (options.initialPageAreaImageUrl && !reportPageIsLoaded) { clearPage(); setPageAreaImage(); } }).renderingStopped(function() { clear(true); showError(stringResources.stringResources.renderingCanceled); }); controller.setDocumentMapVisible(function() { if (shouldAutosizePage()) { setTimeout(function() { updatePageDimensions(); }); } }).setParametersAreaVisible(function() { if (shouldAutosizePage()) { setTimeout(function() { updatePageDimensions(); }); } }); function enableTouch(dom) { var allowSwipeLeft; var allowSwipeRight; touch.TouchBehavior( dom, { swipe: function(e) { var pageNumber = controller.getCurrentPageNumber(); if (allowSwipeLeft && e.direction === "left") { if (pageNumber < controller.getPageCount()) { controller.navigateToPage(pageNumber + 1); } } else if (allowSwipeRight && e.direction === "right") { if (pageNumber > 1) { controller.navigateToPage(pageNumber - 1); } } }, pinch: function(e) { var page = getCurrentPage(); var scale = $(page).data("pageScale") || pageScale; var f = e.distance / e.lastDistance; setPageScale({ scale: scale * f, scaleMode: enums.ScaleModes.SPECIFIC }); }, doubletap: function(e) { options.commands.toggleZoomMode.exec(); }, touchstart: function(e) { var el = pageWrapper; allowSwipeRight = 0 === el.scrollLeft; allowSwipeLeft = el.scrollWidth - el.offsetWidth === el.scrollLeft; } } ); } function shouldAutosizePage() { return -1 !== [enums.ScaleModes.FIT_PAGE, enums.ScaleModes.FIT_PAGE_WIDTH].indexOf(pageScaleMode); } function updatePageDimensions() { for (var i = 0, children = $pageContainer.find(".trv-report-page"), len = children.length; i < len; i++) { var pageNumber = parseInt($(children[i]).attr("data-page")); setPageDimensions(children[i], pageScaleMode, pageScale, pageNumber); } controller.updatePageDimensionsReady(); } function setPageScale({ scale, scaleMode }) { pageScale = scale || pageScale; pageScaleMode = scaleMode || pageScaleMode; pageScale = Math.max(minPageScale, Math.min(maxPageScale, pageScale)); updatePageDimensions(); } function clear(clearPageWrapper) { disableInteractivity(); pendingElement = void 0; if (clearPageWrapper) { $pageWrapper.empty(); } showError(); } function getCurrentPage() { return findPage(controller.getCurrentPageNumber()); } function findPage(pageNumber) { var result; var allPages = $pageContainer.find(".trv-report-page"); if (controller.getPageMode() === enums.PageModes.SINGLE_PAGE) { result = Array.from(allPages).find((page) => { return pageNo(page) === pageNumber; }); } else { result = Array.from(allPages).find((page) => { var dataPageNumber = parseInt($(page).attr("data-page")); return dataPageNumber === pageNumber; }); } return result; } function navigateToPage(pageNumber, targetElement) { if (documentReady) { navigateToPageCore(pageNumber, targetElement); } else { navigateToPageOnDocumentReady(pageNumber, targetElement); } } function navigateToPageOnDocumentReady(pageNumber, targetElement) { navigateToPageOnDocReady = pageNumber; navigateToElementOnDocReady = targetElement; } function navigateToPageCore(pageNumber, targetElement) { var page = findPage(pageNumber); if (page) { if (targetElement) { navigateToElement(targetElement, pageNumber); } if (scroll$1.isEnabled() && !targetElement) { scroll$1.navigateToElement(page.offsetTop, pageNumber); } } else { pendingElement = targetElement; beginLoadPage(pageNumber); } } function navigateToElement(targetElement, pageNumber) { if (targetElement) { var el = $pageContainer.find("[data-" + targetElement.type + "-id=" + targetElement.id + "]")[0]; if (el) { if (options.enableAccessibility) { var $nextFocusable = findNextFocusableElement($(el)); if ($nextFocusable) { $nextFocusable.focus(); } } var container = $pageContainer[0]; var offsetTop = 0; var offsetLeft = 0; while (el && el !== container) { if ($(el).is(".trv-page-wrapper")) { var scale = $(el).data("pageScale"); if (typeof scale === "number") { offsetTop *= scale; offsetLeft *= scale; } } offsetTop += el.offsetTop; offsetLeft += el.offsetLeft; el = el.offsetParent; } if (scroll$1.isEnabled() && pageNumber) { scroll$1.navigateToElement(offsetTop, pageNumber); } else { container.scrollTop = offsetTop; container.scrollLeft = offsetLeft; } } else { if (scroll$1.isEnabled() && pageNumber) { scroll$1.navigateToElement($placeholder.find('[data-page="' + pageNumber + '"]')[0].offsetTop, pageNumber); } } } } function findNextFocusableElement(element) { if (!element || element.length === 0) { return null; } var num = utils.tryParseInt(element.attr("tabindex")); if (!isNaN(num) && num > -1) { return element; } return findNextFocusableElement(element.next()); } function disablePagesArea(disable) { (disable ? $.fn.addClass : $.fn.removeClass).call($placeholder, "trv-loading"); } function showError(error) { $errorMessage.text(error); (error ? $.fn.addClass : $.fn.removeClass).call($placeholder, "trv-error"); } function pageNo(page, no) { var $page = page.$ ? page : $(page); var dataKey = "pageNumber"; if (no === void 0) { return $page.data(dataKey); } $page.data(dataKey, no); return page; } function beginLoadPage(pageNumber) { disablePagesArea(true); window.setTimeout(controller.getReportPage.bind(controller, pageNumber), 1); navigateToPageOnDocReady = null; } function setPageDimensions(page, scaleMode, scale, pageNumber) { var $target = $(page); var $page = pageNumber ? $target : $target.find("div.trv-report-page"); var $pageContent = $page.find("div.sheet"); var $pageSkeletonContent = $page.find("div.trv-skeleton-wrapper"); var pageContent = $pageContent[0] || $pageSkeletonContent[0]; var pageSkeletonContent = $pageSkeletonContent[0]; if (!pageContent) { return; } var pageWidth; var pageHeight; var box = $target.data("box"); if (!box) { var margins = domUtils.getMargins($target); var borders = domUtils.getBorderWidth($page); var padding = domUtils.getPadding($page); box = { padLeft: margins.left + borders.left + padding.left, padRight: margins.right + borders.right + padding.right, padTop: margins.top + borders.top + padding.top, padBottom: margins.bottom + borders.bottom + padding.bottom }; $target.data("box", box); } if ($target.data("pageWidth") === void 0) { pageWidth = pageContent.offsetWidth; pageHeight = pageContent.offsetHeight; $target.data("pageWidth", pageWidth); $target.data("pageHeight", pageHeight); } else { pageWidth = $target.data("pageWidth"); pageHeight = $target.data("pageHeight"); } var scrollBarV = pageHeight > pageWidth && scaleMode === enums.ScaleModes.FIT_PAGE_WIDTH ? 20 : 0; var scaleW = (pageContainer.clientWidth - scrollBarV - box.padLeft - box.padRight) / pageWidth; var scaleH = (pageContainer.clientHeight - 1 - box.padTop - box.padBottom) / pageHeight; if (scaleMode === enums.ScaleModes.FIT_PAGE_WIDTH) { scale = scaleW; } else if (!scale || scaleMode === enums.ScaleModes.FIT_PAGE) { scale = Math.min(scaleW, scaleH); } if (uiFreezeCoordinator$1) { uiFreezeCoordinator$1.setScaleFactor(scale); } $target.data("pageScale", scale); $page.data("pageScale", scale); if (!pageSkeletonContent) { domUtils.scale($pageContent, scale, scale); } $page.css({ "height": scale * pageHeight, "width": scale * pageWidth }); } function enableInteractivity() { $pageContainer.on("click", "[data-reporting-action]", onInteractiveItemClick); $pageContainer.on("mouseenter", "[data-reporting-action]", onInteractiveItemEnter); $pageContainer.on("mouseleave", "[data-reporting-action]", onInteractiveItemLeave); $pageContainer.on("mouseenter", "[data-tooltip-title],[data-tooltip-text]", onToolTipItemEnter); $pageContainer.on("mouseleave", "[data-tooltip-title],[data-tooltip-text]", onToolTipItemLeave); } function disableInteractivity() { $pageContainer.off("click", "[data-reporting-action]", onInteractiveItemClick); $pageContainer.off("mouseenter", "[data-reporting-action]", onInteractiveItemEnter); $pageContainer.off("mouseleave", "[data-reporting-action]", onInteractiveItemLeave); $pageContainer.off("mouseenter", "[data-tooltip-title],[data-tooltip-text]", onToolTipItemEnter); $pageContainer.off("mouseleave", "[data-tooltip-title],[data-tooltip-text]", onToolTipItemLeave); } function onInteractiveItemClick(event) { var $eventTarget = $(this); var actionId = $eventTarget.attr("data-reporting-action"); var action = getAction(actionId); if (action) { navigateToPageOnDocReady = getNavigateToPageOnDocReady(event, action.Type); controller.executeReportAction({ element: event.currentTarget, action, cancel: false }); } event.stopPropagation(); } function getNavigateToPageOnDocReady(event, actionType) { if (scroll$1.isEnabled() && (actionType === "sorting" || actionType === "toggleVisibility")) { return $(event.target).closest(".trv-report-page").attr("data-page") || controller.getCurrentPageNumber(); } return controller.getCurrentPageNumber(); } function onInteractiveItemEnter(args) { var $t = $(this); var actionId = $t.attr("data-reporting-action"); var a = getAction(actionId); if (a !== null && args.currentTarget === this) { controller.reportActionEnter({ element: args.currentTarget, action: a }); } } function onInteractiveItemLeave(args) { var $t = $(this); var actionId = $t.attr("data-reporting-action"); var a = getAction(actionId); if (a !== null && args.currentTarget === this) { controller.reportActionLeave({ element: args.currentTarget, action: a }); } } function getAction(actionId) { if (actions) { return Array.from(actions).find(function(action) { return action.Id === actionId; }); } return null; } function onToolTipItemEnter(args) { var $t = $(this); var title = $t.attr("data-tooltip-title"); var text = $t.attr("data-tooltip-text"); if (!title && !text) { return; } var toolTipArgs = { element: args.currentTarget, toolTip: { title: title || "", text: text || "" }, cancel: false }; controller.reportToolTipOpening(toolTipArgs); if (toolTipArgs.cancel) { return; } var content = applyToolTipTemplate(toolTipArgs); var viewportElement = args.currentTarget.viewportElement; var ktt = getToolTip($t, content); ktt.show($t); if (viewportElement && viewportElement.nodeName === "svg") { positionToolTip(ktt, args); } } function applyToolTipTemplate(toolTipArgs) { var toolTipTemplate = options.templates["trv-pages-area-kendo-tooltip"]; var $container = $(toolTipTemplate); var $titleSpan = $container.find(".trv-pages-area-kendo-tooltip-title"); var $textSpan = $container.find(".trv-pages-area-kendo-tooltip-text"); $titleSpan.html(replaceNewLineSymbols(toolTipArgs.toolTip.title)); $textSpan.html(replaceNewLineSymbols(toolTipArgs.toolTip.text)); return $container.clone().wrap("<p>").parent().html(); } function replaceNewLineSymbols(tooltipText) { tooltipText = utils.escapeHtml(tooltipText); tooltipText = tooltipText.replaceAll("\r\n", "<br>"); tooltipText = tooltipText.replaceAll("\n", "<br>"); return tooltipText; } function positionToolTip(toolTip, e) { var x = e.pageX; var y = e.pageY; var container = toolTip.popup.element.closest("[role=region]"); container.css({ left: x + 10, top: y + 5 }); } function getToolTip(target, toolTipContent) { var ktt = target.data("kendoTooltip"); if (!ktt) { try { ktt = target.kendoTooltip({ content: toolTipContent, autohide: true, callout: false }).data("kendoTooltip"); } catch (e) { console.error("Instantiation of Kendo Tooltip threw an exception", e); throw e; } } return ktt; } function onToolTipItemLeave(args) { var $t = $(this); var toolTip = $t.data("kendoTooltip"); if (toolTip) { toolTip.hide(); } } function updatePageStyle(page) { var styleId = "trv-" + controller.clientId() + "-styles"; $("#" + styleId).remove(); var pageStyles = $("<style id=" + styleId + "></style>"); pageStyles.append(page.pageStyles); pageStyles.appendTo("head"); } function setPageContent(page) { actions = JSON.parse(page.pageActions); updatePageStyle(page); var pageNumber = page.pageNumber; var wrapper = $($.parseHTML(page.pageContent)); var $pageContent = wrapper.find("div.sheet"); var $page = $('<div class="trv-report-page" data-page="' + pageNumber + '"></div>'); $pageContent.css("margin", 0); $page.append($pageContent).append($('<div class="trv-page-overlay"></div>')); var $target = $pageWrapper.empty().removeData().data("pageNumber", pageNumber).append($page); controller.setCurrentPageNumber(pageNumber); if (controller.getViewMode() === enums.ViewModes.INTERACTIVE) { $placeholder.removeClass("printpreview"); $placeholder.addClass("interactive"); } else { $placeholder.removeClass("interactive"); $placeholder.addClass("printpreview"); } setPageDimensions($target, pageScaleMode, pageScale); $pageContainer.scrollTop(0); $pageContainer.scrollLeft(0); navigateToElement(pendingElement); } function setScrollablePage(args) { var pageActions = JSON.parse(args.page.pageActions); if (!actions) { actions = pageActions; } else { actions = actions.concat(pageActions); } if (controller.getViewMode() === enums.ViewModes.INTERACTIVE) { $placeholder.removeClass("printpreview"); $placeholder.addClass("interactive"); } else { $placeholder.removeClass("interactive"); $placeholder.addClass("printpreview"); } setPageDimensions(args.target, pageScaleMode, pageScale, args.page.pageNumber); } function setPageAreaImage() { var pageStyles = $("<style id=" + pageAreaImageID + "></style>"); clearPageAreaImage(); pageStyles.append(utils.stringFormat(pageAreaImageStyle, [options.initialPageAreaImageUrl])); pageStyles.appendTo("head"); showPageAreaImage = true; } function clearPageAreaImage() { $("#" + pageAreaImageID).remove(); } } exports.PagesArea = PagesArea;