@progress/telerik-jquery-report-viewer
Version:
Progress® Telerik® Report Viewer for jQuery
509 lines (504 loc) • 19 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var utils = require('./utils.js');
var stringResources = require('./stringResources.js');
var parameterValidators = require('./parameterValidators.js');
var parameters = require('./parameters.js');
var enums = require('./enums.js');
var eventEmitter = require('./event-emitter.js');
var defaultOptions = {};
var Events = {
PARAMETERS_READY: "pa.parametersReady",
ERROR: "pa.Error"
};
class ParametersArea {
// #region fields
options;
viewerOptions;
element;
$element;
eventEmitter;
controller;
notificationService;
parameters;
editors;
parameterEditors;
initialParameterValues;
recentParameterValues;
processedParameterValues;
_parametersContainer;
_parametersWrapper;
$errorMessage;
$previewButton;
parameterContainerTemplate;
parametersAreaVisible;
parametersAreaNecessary;
enableAccessibility;
loadingCount;
initialized;
// #endregion
// #region constructor
constructor(element, options, viewerOptions) {
this.options = $.extend({}, defaultOptions, options, viewerOptions);
this.element = element;
this.eventEmitter = new eventEmitter.EventEmitter();
this.editors = {};
this.controller = this.options.controller;
if (!this.controller) {
throw "No controller (telerikReporting.reportViewerController) has been specified.";
}
this.notificationService = options.notificationService;
if (!this.notificationService) {
throw "No notificationService (telerikReporting.NotificationService) has been specified.";
}
this.parameterEditors = parameters.ParameterEditors;
if (this.options.parameterEditors && this.options.parameterEditors.length > 0) {
this.parameterEditors = [].concat(this.options.parameterEditors, parameters.ParameterEditors);
}
this.recentParameterValues;
this.parameters;
this.initialParameterValues;
this.processedParameterValues = void 0;
this.$element = $(this.element);
this._parametersContainer = this.element?.querySelector(".trv-parameters-area-content");
this._parametersWrapper = this.element?.querySelector(".trv-parameters-wrapper");
this.$errorMessage = this.$element.find(".trv-error-message");
this.$previewButton = this.$element.find(".trv-parameters-area-preview-button");
this.$previewButton.text(stringResources.stringResources[this.$previewButton.text()]);
this.$previewButton.attr("aria-label", stringResources.stringResources[this.$previewButton.attr("aria-label")]);
this.$previewButton.on("click", (e) => {
e.preventDefault();
if (this.allParametersValid()) {
this.applyParameters();
}
});
this.parameterContainerTemplate = this.options.templates["trv-parameter"];
this.parametersAreaVisible = this.options.parametersAreaVisible !== false;
this.enableAccessibility = this.options.enableAccessibility;
this.loadingCount = 0;
this.parametersAreaNecessary = false;
this.initialized = false;
this.init();
}
// #endregion
// #region methods
init() {
if (this.initialized) {
return;
}
this._attachEvents();
this.replaceStringResources(this.$element);
}
replaceStringResources($paramsArea) {
var $previewButton = $paramsArea.find(".trv-parameters-area-preview-button");
if (!$previewButton) {
return;
}
$previewButton.attr("aria-label", stringResources.stringResources[$previewButton.attr("aria-label")]);
$previewButton.text(stringResources.stringResources[$previewButton.text()]);
}
toggleElementDisplay(el, shouldHide) {
el.style.display = shouldHide ? "none" : "";
}
createParameterContainer() {
return $(this.parameterContainerTemplate);
}
createParameterUI(parameter) {
var $container = this.createParameterContainer();
var $editorPlaceholder = $container.find(".trv-parameter-value");
var $title = $container.find(".trv-parameter-title");
var $error = $container.find(".trv-parameter-error");
var $errorMessage = $container.find(".trv-parameter-error-message");
var $useDefaultValueCheckbox = $container.find(".trv-parameter-use-default input");
var editorsTypes = this.options.parameters && this.options.parameters.editors ? this.options.parameters.editors : null;
var editorFactory = this.selectParameterEditorFactory(parameter, editorsTypes);
var parameterText = utils.escapeHtml(parameter.text);
var isHiddenParameter = !parameter.isVisible;
if (isHiddenParameter) {
parameterText += " [<b>hidden</b>]";
}
$title.html(parameterText).attr("title", parameterText);
$errorMessage.text(parameter.Error);
(parameter.Error ? $.fn.show : $.fn.hide).call($error);
var editor = editorFactory.createEditor(
$editorPlaceholder,
{
templates: this.options.templates,
parameterChanged: (parameter2, newValue) => {
var invalidParameterLI = document.querySelector(".trv-pages-area .trv-error-message ul li." + parameter2.name);
try {
newValue = parameterValidators.ParameterValidators.validate(parameter2, newValue);
$error.hide();
if (invalidParameterLI) {
this.toggleElementDisplay(invalidParameterLI, true);
}
this.onParameterChanged(parameter2, newValue);
} catch (error) {
if (invalidParameterLI) {
this.toggleElementDisplay(invalidParameterLI, false);
}
parameter2.Error = error;
parameter2.value = [];
$errorMessage.text(error);
$error.show();
this.enablePreviewButton(false);
} finally {
this.setAccessibilityErrorState(parameter2);
}
},
enableAccessibility: this.enableAccessibility
}
);
this.editors[parameter.id] = editor;
editor.beginEdit(parameter);
if (this.enableAccessibility && !isHiddenParameter) {
editor.addAccessibility(parameter);
}
if ($useDefaultValueCheckbox.length > 0) {
$useDefaultValueCheckbox.on("click", (event) => {
var useDefaultValue = $(event.currentTarget).is(":checked");
if (useDefaultValue) {
delete this.recentParameterValues[parameter.id];
delete this.initialParameterValues[parameter.id];
this.invalidateChildParameters(parameter);
this.updateParameters(this.onLoadParametersSuccess.bind(this));
} else {
this.recentParameterValues[parameter.id] = parameter.value;
this.initialParameterValues[parameter.id] = parameter.value;
}
editor.enable(!useDefaultValue);
this.trigger(Events.PARAMETERS_READY, this.recentParameterValues);
});
var hasInitialValues = this.initialParameterValues !== null;
if (hasInitialValues) {
if (!(parameter.id in this.initialParameterValues)) {
$useDefaultValueCheckbox.prop("checked", true);
editor.enable(false);
}
} else if (isHiddenParameter) {
$useDefaultValueCheckbox.prop("checked", true);
editor.enable(false);
}
}
return $container;
}
setAccessibilityErrorState(parameter) {
var editor = this.editors[parameter.id];
if (!editor || !this.enableAccessibility) {
return;
}
editor.setAccessibilityErrorState(parameter);
}
enablePreviewButton(enabled) {
if (enabled) {
this.$previewButton.prop("disabled", false);
this.$previewButton.removeClass("k-disabled");
} else {
this.$previewButton.prop("disabled", true);
this.$previewButton.addClass("k-disabled");
}
}
selectParameterEditorFactory(parameter, editorsType) {
var factory = Array.from(this.parameterEditors).find((editor) => {
return editor.match(parameter, editorsType);
});
return factory;
}
showError(error) {
this.$errorMessage.text(error);
(error ? $.fn.addClass : $.fn.removeClass).call(this.$element, "trv-error");
}
showPreviewButton(parameters) {
(this.allParametersAutoRefresh(parameters) && this.controller.autoRunEnabled ? $.fn.removeClass : $.fn.addClass).call(this.$element, "preview");
}
allParametersAutoRefresh(parameters) {
if (!parameters) {
return true;
}
var allAuto = Array.from(parameters).every((parameter) => {
return !parameter.isVisible || parameter.autoRefresh;
});
return allAuto;
}
allParametersValid() {
var allValid = Array.from(this.parameters).every((parameter) => {
return !parameter.Error;
});
return allValid;
}
clearEditors() {
Object.entries(this.editors).forEach(([key, editor]) => {
if (typeof editor.destroy === "function") {
editor.destroy();
}
});
this.editors = {};
}
fill(newParameters) {
this.recentParameterValues = {};
this.processedParameterValues = {};
this.parameters = newParameters || [];
this.clearEditors();
var $parameterContainer;
var $tempContainer = $("<div></div>");
Array.from(this.parameters).forEach((parameter) => {
try {
parameter.value = parameterValidators.ParameterValidators.validate(parameter, parameter.value);
} catch (e) {
parameter.Error = parameter.Error || e;
}
var hasError = Boolean(parameter.Error);
var hasValue = !hasError;
if (hasValue) {
this.recentParameterValues[parameter.id] = parameter.value;
} else {
parameter.Error = stringResources.stringResources.invalidParameter;
}
if (parameter.availableValues) {
this.processedParameterValues[parameter.id] = { valueMember: parameter.value, displayMember: parameter.label, availableValues: parameter.availableValues, multivalue: parameter.multivalue };
} else {
this.processedParameterValues[parameter.id] = parameter.value;
}
if (parameter.isVisible || this.options.showHiddenParameters) {
$parameterContainer = this.createParameterUI(parameter);
if ($parameterContainer) {
$tempContainer.append($parameterContainer);
}
}
});
if (this.initialParameterValues !== void 0) {
if (null === this.initialParameterValues) {
this.initialParameterValues = {};
Array.from(this.parameters).forEach((parameter) => {
if (parameter.isVisible) {
this.initialParameterValues[parameter.id] = parameter.value;
} else {
delete this.recentParameterValues[parameter.id];
}
});
} else {
Array.from(this.parameters).forEach((parameter) => {
if (!(parameter.id in this.initialParameterValues)) {
delete this.recentParameterValues[parameter.id];
}
});
}
}
if (this._parametersWrapper) {
kendo.destroy(this._parametersWrapper);
this._parametersWrapper.innerHTML = "";
if (this.parameters.length > 0) {
this._parametersWrapper.append(...$tempContainer.children().get());
if (this.enableAccessibility) {
this._parametersWrapper.setAttribute("aria-label", "Parameters area. Contains " + this.parameters.length + " parameters.");
}
}
}
this.showPreviewButton(this.parameters);
var allValid = this.allParametersValid();
this.enablePreviewButton(allValid);
this.applyProcessedParameters();
}
applyParameters() {
this.controller.setParameters($.extend({}, this.recentParameterValues));
this.controller.previewReport(false);
}
applyProcessedParameters() {
this.controller.setProcessedParameterValues($.extend({}, this.processedParameterValues));
}
allParametersValidForAutoRefresh() {
var triggerAutoUpdate = true;
for (var i = this.parameters.length - 1; triggerAutoUpdate && i >= 0; i--) {
var p = this.parameters[i];
triggerAutoUpdate = p.id in this.recentParameterValues && (Boolean(p.autoRefresh) || !p.isVisible);
}
return triggerAutoUpdate;
}
tryRefreshReport() {
this.trigger(Events.PARAMETERS_READY, this.recentParameterValues);
if (this.allParametersValidForAutoRefresh() && this.controller.autoRunEnabled) {
this.applyParameters();
}
}
invalidateChildParameters(parameter) {
if (parameter.childParameters) {
Array.from(parameter.childParameters).forEach((parameterId) => {
var childParameter = this.getParameterById(parameterId);
if (childParameter) {
this.invalidateChildParameters(childParameter);
}
delete this.recentParameterValues[parameterId];
this.resetPendingParameterChange(parameterId);
});
}
}
resetPendingParameterChange(parameterId) {
if (this.editors) {
var editor = this.editors[parameterId];
if (editor && typeof editor.clearPendingChange === "function") {
editor.clearPendingChange();
}
}
}
onParameterChanged(parameter, newValue) {
delete parameter["Error"];
parameter.value = newValue;
this.recentParameterValues[parameter.id] = newValue;
if (this.initialParameterValues !== void 0) {
if (parameter.id in this.initialParameterValues) {
this.recentParameterValues[parameter.id] = newValue;
}
} else {
this.recentParameterValues[parameter.id] = newValue;
}
this.invalidateChildParameters(parameter);
if (parameter.childParameters) {
this.updateParameters(this.tryRefreshReport.bind(this));
} else {
var allValid = this.allParametersValid();
this.enablePreviewButton(allValid);
if (allValid) {
var errorMsg = document.querySelector(".trv-pages-area .trv-error-message");
if (this.$previewButton.is(":visible") && errorMsg) {
errorMsg.textContent = stringResources.stringResources.tryReportPreview;
}
this.tryRefreshReport();
}
}
}
getParameterById(parameterId) {
if (this.parameters) {
for (var i = 0; i < this.parameters.length; i++) {
var p = this.parameters[i];
if (p.id === parameterId) {
return p;
}
}
}
return null;
}
setParametersAreaVisibility(visible) {
this.controller.setParametersAreaVisible({ visible });
}
hasVisibleParameters(params) {
return (params || []).some((parameter) => {
return parameter.isVisible;
});
}
beginLoad() {
this.loadingCount++;
this.$element.addClass("trv-loading");
}
endLoad() {
if (this.loadingCount > 0) {
if (0 === --this.loadingCount) {
this.$element.removeClass("trv-loading");
}
}
}
onLoadParametersComplete(params, successAction) {
this.showParametersAreaIfNecessary(params);
this.fill(params);
this.showError("");
if (this.parametersAreaNecessary && this.parametersAreaVisible) {
this.showParametersArea(true);
if (this.enableAccessibility) {
this.setSplitbarAccessibilityAttributes();
}
}
this.notificationService.updateUIInternal();
if (typeof successAction === "function") {
successAction();
}
this.endLoad();
}
showParametersAreaIfNecessary(params) {
this.parametersAreaNecessary = this.hasVisibleParameters(params) || !this.controller.autoRunEnabled;
this.showParametersArea(this.parametersAreaVisible && this.parametersAreaNecessary);
}
updateParameters(successAction) {
this.acceptParameters(this.controller.loadParameters(this.recentParameterValues), successAction);
}
acceptParameters(controllerLoadParametersPromise, successAction) {
this.beginLoad();
controllerLoadParametersPromise.then((parameters) => {
this.onLoadParametersComplete(parameters, successAction);
}).catch((error) => {
this.endLoad();
this.clear();
if (!this.$element.hasClass("k-hidden")) {
this.showError(error);
}
this.trigger(Events.ERROR, error);
});
}
onLoadParametersSuccess() {
if (this.initialParameterValues === null) {
this.initialParameterValues = $.extend({}, this.recentParameterValues);
}
this.trigger(Events.PARAMETERS_READY, this.recentParameterValues);
}
showParametersArea(show) {
var splitter = $("#" + this.options.viewerSelector + "-parameters-splitter").getKendoSplitter();
if (!splitter) {
return;
}
var sibling = this.$element.prev();
if (this.options.parametersAreaPosition === enums.ParametersAreaPositions.TOP || this.options.parametersAreaPosition === enums.ParametersAreaPositions.LEFT) {
sibling = this.$element.next();
}
(this.parametersAreaNecessary ? $.fn.removeClass : $.fn.addClass).call(sibling, "k-hidden");
splitter.toggle(".trv-parameters-area", show);
}
setSplitbarAccessibilityAttributes() {
var splitbar = this.$element.prev();
var tabIndex = this.$element.find(".trv-parameters-area-content").attr("tabIndex");
if (this.options.parametersAreaPosition === enums.ParametersAreaPositions.TOP || this.options.parametersAreaPosition === enums.ParametersAreaPositions.LEFT) {
splitbar = this.$element.next();
}
splitbar.attr("aria-label", stringResources.stringResources.ariaLabelParametersAreaSplitter);
splitbar.attr("tabIndex", tabIndex);
}
_attachEvents() {
this.controller.on("reloadParameters", (controllerLoadParametersPromise) => {
this.showError();
kendo.destroy(this._parametersWrapper);
this._parametersWrapper.innerHTML = "";
this.acceptParameters(controllerLoadParametersPromise, this.onLoadParametersSuccess.bind(this));
}).onAsync("beforeLoadReport", async () => {
this.loadingCount = 0;
this.beginLoad();
}).onAsync("reportLoadComplete", async (reportInfo) => {
this.showParametersAreaIfNecessary(this.parameters);
this.showPreviewButton(this.parameters);
}).on("error", () => this.endLoad()).on("pageReady", () => this.endLoad());
this.notificationService.getParametersAreaState((event, args) => {
var parametersAreaNecessary = false;
if (this.parameters) {
parametersAreaNecessary = this.hasVisibleParameters(this.parameters) || !this.controller.autoRunEnabled;
}
args.enabled = parametersAreaNecessary;
args.visible = this.parametersAreaVisible;
}).setParametersAreaVisible((event, args) => {
this.parametersAreaVisible = args.visible;
this.showParametersArea(args.visible && (this.hasVisibleParameters(this.parameters) || !this.controller.autoRunEnabled));
});
}
clear() {
this.fill([]);
}
setParameters(parameterValues) {
this.initialParameterValues = null === parameterValues ? null : $.extend({}, parameterValues);
}
// #endregion
// #region events
on(type, handler) {
this.eventEmitter.on(type, handler);
return this;
}
trigger(type, ...args) {
return this.eventEmitter.trigger(type, ...args);
}
// #endregion
}
exports.ParametersArea = ParametersArea;