@progress/telerik-jquery-report-viewer
Version:
Progress® Telerik® Report Viewer for jQuery
320 lines (315 loc) • 11.2 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var binder = require('./binder.js');
var command = require('./command.js');
var stringResources = require('./stringResources.js');
var defaultOptions = {};
function replaceStringResources($aiDialogsWrapper) {
if (!$aiDialogsWrapper) {
return;
}
var labels = $aiDialogsWrapper.find(".trv-replace-string");
var ariaLabel = $aiDialogsWrapper.find("[aria-label]").add($aiDialogsWrapper);
var titles = $aiDialogsWrapper.find("[title]");
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");
});
}
}
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 AiPrompt {
constructor(element, options, viewerOptions) {
this.options = $.extend({}, defaultOptions, options);
this.viewerOptions = viewerOptions;
this.controller = this.options.controller;
if (!this.controller) {
throw "No controller (telerikReporting.ReportViewerController) has been specified.";
}
this.notificationService = this.options.notificationService;
if (!this.notificationService) {
throw "No notificationService (telerikReporting.NotificationService) has been specified.";
}
this.element = element;
this.$element = $(element);
this.kendoAiConsentDialog;
this.kendoAiPromptDialog;
this.kendoAiPrompt;
this.kendoAiPromtDialogLocation;
this.reportViewerWrapper = $(`[data-selector='${this.viewerOptions.viewerSelector}']`);
this.pagesAreaContainer = this.reportViewerWrapper.find('[data-id="trv-pages-area"]');
this.aiPromptDialogInitialized = false;
this.aiPromptInitialized = false;
this.requireConsent = false;
this.allowCustomPrompts = true;
this.predefinedPrompts = [];
this.init();
}
init() {
if (this.aiPromptDialogInitialized) {
return;
}
replaceStringResources(this.$element);
this._initAiConsentDialog();
this._attachAiConsentDialogCommands();
this._initAiPromptDialog();
this._attachEvents();
this.aiPromptDialogInitialized = true;
}
_attachEvents() {
this.controller.on("beginLoadReport", this.close.bind(this)).on("viewModeChanged", this.close.bind(this));
this.notificationService.setAiPromptDialogVisible((event, args) => {
this.toggleAiPromptDialog(args.visible);
}).setSendEmailDialogVisible((event, args) => {
if (args.visible && this.controller.getAiPromptInitiated()) {
this.close();
}
});
$(window).on("resize", () => {
if (this.kendoAiPromptDialog && this.kendoAiPromptDialog.options.visible) {
this.storeDialogPosition();
this.adjustDialogPosition(this.kendoAiPromptDialog);
}
});
}
_attachAiConsentDialogCommands() {
const optionsCommandSet = {
"aiConsent_Cancel": new command.Command(() => {
this.kendoAiConsentDialog.close();
this.notificationService.setAiPromptDialogVisible({
visible: false
});
}),
"aiConsent_Accept": new command.Command(() => {
this.kendoAiConsentDialog.close();
this.controller.saveToSessionStorage("trvAiConsent", "true");
this.controller.setAiPromptInitiated(true);
if (this.kendoAiPromptDialog) {
this._initAiPrompt(this.predefinedPrompts);
this.kendoAiPromptDialog.open();
}
})
};
binder.Binder.attachCommands(this.kendoAiConsentDialog.element.find(".trv-ai-consent-actions"), optionsCommandSet, this.viewerOptions);
}
_initAiConsentDialog() {
const aiConsentDialogElement = this.element.querySelector(".trv-ai-consent-dialog");
if (!aiConsentDialogElement) {
console.warn('Failed to initialize AI consent dialog due to missing element with class "trv-ai-consent-dialog".');
return;
}
this.kendoAiConsentDialog = new kendo.ui.Window(aiConsentDialogElement, {
title: stringResources.stringResources["aiPromptDialogConsentTitle"] || "",
width: 500,
minWidth: 400,
minHeight: 106,
maxHeight: 800,
resizable: false,
scrollable: true,
open: (event) => {
this.adjustDialogPosition(this.kendoAiConsentDialog);
}
});
this.kendoAiConsentDialog.element.removeClass("trv-ai-consent-dialog k-hidden");
this.kendoAiConsentDialog.wrapper.addClass("trv-ai-consent-dialog");
}
_initAiPromptDialog() {
const aiPromptDialogElement = this.element.querySelector(".trv-ai-prompt-dialog");
if (!aiPromptDialogElement) {
console.warn('Failed to initialize AI prompt dialog due to missing element with class "trv-ai-prompt-dialog".');
return;
}
this.kendoAiPromptDialog = new kendo.ui.Window(aiPromptDialogElement, {
title: false,
visible: false,
draggable: {
dragHandle: ".k-prompt-header"
},
height: "fit-content",
width: 500,
minWidth: 400,
maxHeight: 800,
scrollable: true,
close: (event) => {
this.storeDialogPosition();
},
open: (event) => {
this.adjustDialogPosition(this.kendoAiPromptDialog);
},
deactivate: (event) => {
this.notificationService.setAiPromptDialogVisible({
visible: false
});
}
});
this.kendoAiPromptDialog.element.removeClass("trv-ai-prompt-dialog k-hidden");
this.kendoAiPromptDialog.wrapper.addClass("trv-ai-prompt-dialog");
}
_initAiPrompt(promptSuggestions) {
if (this.aiPromptInitialized) {
return;
}
const aiPromptElement = this.kendoAiPromptDialog?.element?.find("#trv-ai-prompt");
if (!aiPromptElement) {
console.warn('Failed to initialize AI prompt dialog due to missing element with id "trv-ai-prompt".');
return;
}
const that = this;
this.kendoAiPrompt = new kendo.ui.AIPrompt(aiPromptElement, {
activeView: 0,
promptRequest: function(event) {
if (!event.prompt) {
return;
}
that.controller.getAIResponse(event.prompt).then((response) => {
this.addPromptOutput(that.createPromptOutputFromResponse(response, event));
this.activeView(1);
}).catch((error) => {
this.addPromptOutput(that.createPromptOutputFromResponse(error?._responseJSON, event));
this.activeView(1);
});
},
toolbarItems: [
{ type: "spacer" },
{ type: "button", icon: "x", fillMode: "flat", themeColor: "primary", click: (e) => {
this.close();
} }
],
views: [
{
type: "prompt",
promptSuggestions,
messages: {
promptPlaceholder: "Enter your prompt"
}
},
{
type: "output"
}
]
});
this.disableAiPromptTextArea(promptSuggestions && promptSuggestions.length > 0);
const aiPromptToolbar = this.kendoAiPrompt.element.find(".k-prompt-header .k-toolbar").data("kendoToolBar");
aiPromptToolbar && aiPromptToolbar.bind("toggle", (e) => {
if (e.target.text() === "Ask AI") {
this.disableAiPromptTextArea(promptSuggestions && promptSuggestions.length > 0);
}
});
this.aiPromptInitialized = true;
}
disableAiPromptTextArea(hasPromptSuggestions) {
if (this.allowCustomPrompts) {
return;
}
let aiPromptTextAreaPlaceholder = stringResources.stringResources["aiPromptDialogTextAreaPlaceholder"];
const aiPromptTextArea = this.kendoAiPrompt.element.find(".k-prompt-content .k-prompt-view textarea");
if (!hasPromptSuggestions) {
const aiPromptGenerateButton = this.kendoAiPrompt.element.find(".k-prompt-footer .k-actions");
aiPromptGenerateButton && aiPromptGenerateButton.addClass("k-disabled");
aiPromptTextAreaPlaceholder = stringResources.stringResources["aiPromptDialogNoPredefinedAndCustomPromptsPlaceholder"] || "";
} else {
aiPromptTextAreaPlaceholder = stringResources.stringResources["aiPromptDialogNoCustomPromptsPlaceholder"] || "";
}
aiPromptTextArea && aiPromptTextArea.attr("placeholder", aiPromptTextAreaPlaceholder) && aiPromptTextArea.addClass("k-disabled");
}
storeDialogPosition() {
this.kendoAiPromtDialogLocation = this.kendoAiPromptDialog.wrapper.offset();
}
adjustDialogPosition(dialog) {
var windowWidth = $(window).innerWidth();
var windowHeight = $(window).innerHeight();
var width = dialog.wrapper.outerWidth(true);
var height = dialog.wrapper.outerHeight(true);
var padding = 10;
if (!this.kendoAiPromtDialogLocation) {
var reportViewerCoords = this.pagesAreaContainer[0].getBoundingClientRect();
dialog.setOptions({
position: {
top: reportViewerCoords.top + padding,
left: reportViewerCoords.right - width - padding
}
});
} else {
var left = this.kendoAiPromtDialogLocation.left;
var top = this.kendoAiPromtDialogLocation.top;
var right = left + width;
var bottom = top + height;
if (right > windowWidth - padding) {
left = Math.max(padding, windowWidth - width - padding);
dialog.setOptions({
position: {
left
}
});
}
if (bottom > windowHeight - padding) {
top = Math.max(padding, windowHeight - height - padding);
this.kendoAiPromptDialog.setOptions({
position: {
top
}
});
}
}
}
toggleAiPromptDialog(show) {
if (show) {
this.open();
} else {
this.close();
}
}
open() {
this.controller.createAIThread().then((data) => {
this.predefinedPrompts = data?.predefinedPrompts;
this.allowCustomPrompts = data?.allowCustomPrompts;
if (this.kendoAiConsentDialog && data.requireConsent && this.controller.loadFromSessionStorage("trvAiConsent") !== "true") {
$(".trv-ai-consent-content").html(data?.consentMessage);
this.kendoAiConsentDialog.open();
return;
}
if (this.kendoAiPromptDialog) {
this.controller.setAiPromptInitiated(true);
this._initAiPrompt(this.predefinedPrompts);
this.kendoAiPromptDialog.open();
}
});
}
close() {
this.controller.setAiPromptInitiated(false);
if (this.kendoAiConsentDialog) {
this.kendoAiConsentDialog.close();
}
if (this.kendoAiPromptDialog && this.kendoAiPromptDialog.options.visible) {
this.kendoAiPromptDialog.close();
}
}
createPromptOutputFromResponse(response, promptData) {
return {
id: kendo.guid(),
output: response,
prompt: promptData.prompt,
isRetry: promptData.isRetry
};
}
}
exports.AiPrompt = AiPrompt;