@progress/telerik-jquery-report-viewer
Version:
Progress® Telerik® Report Viewer for jQuery
388 lines (383 loc) • 12.7 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
require('@progress/telerik-common-report-viewer');
var stringResources = require('./stringResources.js');
var binder = require('./binder.js');
var command = require('./command.js');
var defaultOptions = {};
function replaceStringResources($sendEmailDialog) {
if (!$sendEmailDialog) {
return;
}
var labels = $sendEmailDialog.find(".trv-replace-string");
var ariaLabel = $sendEmailDialog.find("[aria-label]").add($sendEmailDialog);
var titles = $sendEmailDialog.find("[title]");
var requiredMsg = $sendEmailDialog.find("[data-required-msg]");
var emailMsg = $sendEmailDialog.find("[data-email-msg]");
if (labels.length) {
Array.from(labels).forEach((element) => {
replaceText($(element));
});
}
if (ariaLabel.length) {
Array.from(ariaLabel).forEach((element) => {
replaceAttribute($(element), "aria-label");
});
}
if (titles.length) {
Array.from(titles).forEach((element) => {
replaceAttribute($(element), "title");
});
}
if (requiredMsg.length) {
Array.from(requiredMsg).forEach((element) => {
replaceAttribute($(element), "data-required-msg");
});
}
if (emailMsg.length) {
Array.from(emailMsg).forEach((element) => {
replaceAttribute($(element), "data-email-msg");
});
}
}
function replaceText($el) {
if ($el) {
$el.text(stringResources.stringResources[$el.text()]);
}
}
function replaceAttribute($el, attribute) {
if ($el) {
$el.attr(attribute, stringResources.stringResources[$el.attr(attribute)]);
}
}
class SendEmail {
// #region fields
// #endregion
// #region constructor
constructor(element, options, viewerOptions) {
this.options = $.extend({}, defaultOptions, options);
this.viewerOptions = viewerOptions;
this.element = element;
this.$element = $(element);
this.viewerElement = $(`[data-selector='${this.viewerOptions.viewerSelector}']`);
this.viewer = this.viewerElement.data("telerik_ReportViewer");
this.controller = this.options.controller;
this.notificationService = options.notificationService;
this.initialized = false;
this.dialogVisible = false;
this.kendoSendEmailDialog;
this.inputFrom;
this.inputTo;
this.inputCC;
this.inputSubject;
this.docFormat;
this.docFormatEl;
this.bodyEditorEl;
this.bodyEditor;
this.docFormatList;
this.optionsCommandSet;
this.windowLocation;
if (!this.controller) {
throw "No controller (telerikReporting.ReportViewerController) has been specified.";
}
if (!this.notificationService) {
throw "No notificationService (telerikReporting.NotificationService) has been specified.";
}
if (!this.viewerOptions.sendEmail || !this.viewerOptions.sendEmail.enabled) {
this.viewerElement.find("[data-command='toggleSendEmailDialog']").addClass("send-email-hidden");
return;
}
this.init();
}
// #endregion
// #region methods
init() {
if (this.initialized) {
return;
}
replaceStringResources(this.$element);
this.controller.getDocumentFormats().then((formats) => {
this.docFormatList = formats;
this.docFormat?.setDataSource(this.docFormatList);
if (this.viewerOptions?.sendEmail && this.viewerOptions?.sendEmail.format) {
this.docFormat?.value(this.viewerOptions.sendEmail.format);
this.docFormat?.trigger("change");
}
});
this._initDialog();
this._initInputFields();
this._attachCommands();
this._attachEvents();
this.initialized = true;
}
_attachEvents() {
this.controller.on("beginLoadReport", this.close.bind(this)).on("viewModeChanged", this.close.bind(this));
this.notificationService.getSendEmailDialogState((event, args) => {
args.visible = this.dialogVisible;
}).setSendEmailDialogVisible((event, args) => {
if (args.visible === true) {
this.open();
} else {
this.close();
}
}).setSearchDialogVisible((event, args) => {
if (args.visible && this.dialogVisible) {
this.close();
}
});
$(window).on("resize", () => {
if (this.kendoSendEmailDialog && this.kendoSendEmailDialog.options.visible) {
this.storeDialogPosition();
this.adjustDialogPosition();
}
});
}
open() {
this.dialogVisible = true;
this.kendoSendEmailDialog.open();
}
close() {
this.dialogVisible = false;
if (this.kendoSendEmailDialog && this.kendoSendEmailDialog.options.visible) {
this.kendoSendEmailDialog.close();
}
}
getBody() {
return this.bodyEditor ? this.bodyEditor.value() : "";
}
_initDialog() {
this.kendoSendEmailDialog = new kendo.ui.Window(this.element, {
title: stringResources.stringResources.sendEmailDialogTitle,
visible: false,
width: 800,
minWidth: 350,
minHeight: 350,
modal: true,
close: () => {
this.storeDialogPosition();
this.kendoValidator.reset();
},
open: () => {
this.adjustDialogPosition();
},
deactivate: () => {
this.notificationService.setSendEmailDialogVisible({
visible: false
});
},
activate: () => {
this.inputFrom.focus();
setTimeout(() => {
this.setValidation();
}, 250);
}
});
this.kendoSendEmailDialog.element.removeClass("trv-send-email-dialog k-hidden");
this.kendoSendEmailDialog.wrapper.addClass("trv-send-email-dialog");
}
_initInputFields() {
const prefix = this.viewerOptions.viewerSelector;
this.setAttrs();
this.inputFrom = new kendo.ui.TextBox(this.element.querySelector(`[name="${prefix}-from"]`), {});
this.inputTo = new kendo.ui.TextBox(this.element.querySelector(`[name="${prefix}-to"]`), {});
this.inputCC = new kendo.ui.TextBox(this.element.querySelector(`[name="${prefix}-cc"]`), {});
this.inputSubject = new kendo.ui.TextBox(this.element.querySelector(`[name="${prefix}-subject"]`), {});
this.docFormat = new kendo.ui.ComboBox(this.element.querySelector(`[name="${prefix}-format"]`), {
dataTextField: "localizedName",
dataValueField: "name",
dataSource: this.docFormatList || [],
filter: "startswith",
dataBound: (event) => {
event.sender.select(0);
event.sender.trigger("change");
}
});
this.bodyEditor = new kendo.ui.Editor(this.element.querySelector(`[name="${prefix}-emailBody"]`), {
tools: [
"bold",
"italic",
"underline",
"strikethrough",
"justifyLeft",
"justifyCenter",
"justifyRight",
"justifyFull",
"insertUnorderedList",
"insertOrderedList",
"indent",
"outdent",
"createLink",
"unlink",
"cleanFormatting",
"formatting",
"fontName",
"fontSize",
"foreColor",
"backColor",
"subscript",
"superscript"
]
});
this.setDefaultValues(this.viewerOptions.sendEmail);
this.kendoValidator = new kendo.ui.Validator(this.element.querySelector(".trv-send-email-fields"), {});
}
setAttrs() {
const prefix = this.viewerOptions.viewerSelector;
Array.from(this.element.querySelectorAll(".trv-send-email-field input, .trv-send-email-field textarea")).forEach((element) => {
var attrName = element.getAttribute("name");
if (attrName === null) {
return;
}
element.setAttribute("id", `${prefix}-${attrName}`);
element.setAttribute("name", `${prefix}-${attrName}`);
});
Array.from(this.element.querySelectorAll(".trv-send-email-label label")).forEach((element) => {
var attrFor = element.getAttribute("for");
if (attrFor === null) {
return;
}
element.setAttribute("for", `${prefix}-${attrFor}`);
});
}
storeDialogPosition() {
var kendoWindow = this.kendoSendEmailDialog.element.parent(".k-window");
this.windowLocation = kendoWindow.offset();
}
adjustDialogPosition() {
var windowWidth = $(window).innerWidth();
var windowHeight = $(window).innerHeight();
var width = this.kendoSendEmailDialog.wrapper.outerWidth(true);
var height = this.kendoSendEmailDialog.wrapper.outerHeight(true);
var padding = 10;
if (!this.windowLocation) {
this.kendoSendEmailDialog.center();
} else {
var left = this.windowLocation.left;
var top = this.windowLocation.top;
var right = left + width;
var bottom = top + height;
if (right > windowWidth - padding) {
left = Math.max(padding, windowWidth - width - padding);
this.kendoSendEmailDialog.setOptions({
position: {
left
}
});
}
if (bottom > windowHeight - padding) {
top = Math.max(padding, windowHeight - height - padding);
this.kendoSendEmailDialog.setOptions({
position: {
top
}
});
}
}
}
_attachCommands() {
this.optionsCommandSet = {
"sendEmail_Cancel": new command.Command(() => {
this.close();
}),
"sendEmail_Send": new command.Command(() => {
this.sendingEmail();
})
};
binder.Binder.attachCommands(this.$element.find(".trv-send-email-actions"), this.optionsCommandSet, this.viewerOptions);
}
sendingEmail(cmd, args) {
var sendEmailArgs = {
from: this.inputFrom.value(),
to: this.inputTo.value(),
cc: this.inputCC.value(),
subject: this.inputSubject.value(),
format: this.docFormat.value(),
body: this.getBody(),
deviceInfo: {}
};
if (this.validateFields()) {
this.controller.sendReport(sendEmailArgs);
this.close();
}
}
setValidation() {
this.inputFrom.element.off("blur").on("blur", () => {
if (!this.isEmpty(this.inputFrom)) {
this.isValidEmail(this.inputFrom, false);
}
});
this.inputTo.element.off("blur").on("blur", () => {
if (!this.isEmpty(this.inputTo)) {
this.isValidEmail(this.inputTo, true);
}
});
this.inputCC.element.off("blur").on("blur", () => {
if (this.inputCC.value().toString().length) {
this.isValidEmail(this.inputCC, true);
} else {
this.hideError(this.inputCC.element);
}
});
}
validateFields() {
var fromIsValid = !this.isEmpty(this.inputFrom) && this.isValidEmail(this.inputFrom, false);
var toIsValid = !this.isEmpty(this.inputTo) && this.isValidEmail(this.inputTo, true);
var ccIsValid = this.isEmpty(this.inputCC) || this.isValidEmail(this.inputCC, true);
var hasFormat = this.docFormat.value().length > 0;
if (!hasFormat) {
this.showError(this.docFormat.element, "data-required-msg");
}
return fromIsValid && toIsValid && ccIsValid && hasFormat;
}
/* Sets all default email values except the format as it depends on a request */
setDefaultValues(sendEmail) {
this.inputFrom.value(sendEmail && sendEmail.from || "");
this.inputTo.value(sendEmail && sendEmail.to || "");
this.inputCC.value(sendEmail && sendEmail.cc || "");
this.inputSubject.value(sendEmail && sendEmail.subject || "");
this.bodyEditor.value(sendEmail && sendEmail.body || "");
}
isEmpty(input) {
var $el = input.element;
if (!input.value().length) {
this.showError($el, "data-required-msg");
return true;
}
this.hideError($el);
return false;
}
showError($el, tag) {
var validationMsg = stringResources.stringResources[$el.attr(tag)];
$('[data-for="' + $el.attr("name") + '"]').addClass("-visible").text(validationMsg);
}
hideError($el) {
$('[data-for="' + $el.attr("name") + '"]').removeClass("-visible");
}
isValidEmail(input, moreThenOneEmail) {
var inputValue = input.value();
var $el = input.element;
if (moreThenOneEmail) {
var listEmailsAddress = inputValue.split(/[\s,;]+/);
for (var i = 0; i < listEmailsAddress.length; i++) {
if (!this._validateEmail(listEmailsAddress[i].trim(), $el)) {
return false;
}
}
return true;
}
return this._validateEmail(inputValue, $el);
}
_validateEmail(email, $el) {
var regexEmail = /\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
if (email.indexOf(",") > -1 || email.indexOf(";") > -1) {
this.showError($el, "data-single-email-msg");
return false;
}
if (!regexEmail.test(email)) {
this.showError($el, "data-email-msg");
return false;
}
return true;
}
}
exports.SendEmail = SendEmail;
;