UNPKG

@wiris/mathtype-html-integration-devkit

Version:

Allows to integrate MathType Web into any JavaScript HTML WYSIWYG rich text editor.

183 lines (165 loc) 6.81 kB
import IntegrationModel from "./integrationmodel"; /** */ export default class PopUpMessage { /** * @classdesc * This class represents a dialog message overlaying a DOM element in order to * accept / cancel discard changes. The dialog can be closed i.e the overlay disappears * o canceled. In this last case a callback function should be called. * @constructs * @param {Object} popupMessageAttributes - Object containing popup properties. * @param {HTMLElement} popupMessageAttributes.overlayElement - Element to overlay. * @param {Object} popupMessageAttributes.callbacks - Contains callback * methods for close and cancel actions. * @param {Object} popupMessageAttributes.strings - Contains all the strings needed. */ constructor(popupMessageAttributes) { /** * Element to be overlaid when the popup appears. */ this.overlayElement = popupMessageAttributes.overlayElement; this.callbacks = popupMessageAttributes.callbacks; /** * HTMLElement element to wrap all HTML elements inside the popupMessage. */ this.overlayWrapper = this.overlayElement.appendChild(document.createElement("div")); this.overlayWrapper.setAttribute("class", "wrs_popupmessage_overlay_envolture"); /** * HTMLElement to display the popup message, close button and cancel button. */ this.message = this.overlayWrapper.appendChild(document.createElement("div")); this.message.id = "wrs_popupmessage"; this.message.setAttribute("class", "wrs_popupmessage_panel"); this.message.setAttribute("role", "dialog"); this.message.setAttribute("aria-describedby", "description_txt"); const paragraph = document.createElement("p"); const text = document.createTextNode(popupMessageAttributes.strings.message); paragraph.appendChild(text); paragraph.id = "description_txt"; this.message.appendChild(paragraph); /** * HTML element overlaying the overlayElement. */ const overlay = this.overlayWrapper.appendChild(document.createElement("div")); overlay.setAttribute("class", "wrs_popupmessage_overlay"); // We create a overlay that close popup message on click in there overlay.addEventListener("click", this.cancelAction.bind(this)); /** * HTML element containing cancel and close buttons. */ this.buttonArea = this.message.appendChild(document.createElement("div")); this.buttonArea.setAttribute("class", "wrs_popupmessage_button_area"); this.buttonArea.id = "wrs_popup_button_area"; // Close button arguments. const buttonSubmitArguments = { class: "wrs_button_accept", innerHTML: popupMessageAttributes.strings.submitString, id: "wrs_popup_accept_button", // To identifiy the element in automated testing "data-testid": "mtcteditor-cd-close-button", }; /** * Close button arguments. */ this.closeButton = this.createButton(buttonSubmitArguments, this.closeAction.bind(this)); this.buttonArea.appendChild(this.closeButton); // Cancel button arguments. const buttonCancelArguments = { class: "wrs_button_cancel", innerHTML: popupMessageAttributes.strings.cancelString, id: "wrs_popup_cancel_button", // To identifiy the element in automated testing "data-testid": "mtcteditor-cd-cancel-button", }; /** * Cancel button. */ this.cancelButton = this.createButton(buttonCancelArguments, this.cancelAction.bind(this)); this.buttonArea.appendChild(this.cancelButton); } /** * This method create a button with arguments and return button dom object * @param {Object} parameters - An object containing id, class and innerHTML button text. * @param {String} parameters.id - Button id. * @param {String} parameters.class - Button class name. * @param {String} parameters.innerHTML - Button innerHTML text. * @param {Object} callback- Callback method to call on click event. * @returns {HTMLElement} HTML button. */ // eslint-disable-next-line class-methods-use-this createButton(parameters, callback) { let element = {}; element = document.createElement("button"); element.setAttribute("id", parameters.id); element.setAttribute("class", parameters.class); element.innerHTML = parameters.innerHTML; element.addEventListener("click", callback); if (parameters["data-testid"]) { element.setAttribute("data-testid", parameters["data-testid"]); } return element; } /** * Shows the popupmessage containing a message, and two buttons * to cancel the action or close the modal dialog. */ show() { if (this.overlayWrapper.style.display !== "block") { // Clear focus with blur for prevent press any key. document.activeElement.blur(); this.overlayWrapper.style.display = "block"; this.closeButton.focus(); } else { this.overlayWrapper.style.display = "none"; // _wrs_modalWindow.focus(); This throws an error of not existing _wrs_modalWindow } } /** * This method cancels the popupMessage: the dialog disappears revealing the overlaid element. * A callback method is called (if defined). For example a method to focus the overlaid element. */ cancelAction() { this.overlayWrapper.style.display = "none"; if (typeof this.callbacks.cancelCallback !== "undefined") { this.callbacks.cancelCallback(); // Set temporal image to null to prevent loading // an existent formula when starting one from scratch. Make focus come back too. // IntegrationModel.setActionsOnCancelButtons(); } } /** * This method closes the popupMessage: the dialog disappears and the close callback is called. * For example to close the overlaid element. */ closeAction() { this.cancelAction(); if (typeof this.callbacks.closeCallback !== "undefined") { this.callbacks.closeCallback(); } IntegrationModel.setActionsOnCancelButtons(); } /** * Handle keyboard events detected in modal when elements of this class intervene. * @param {KeyboardEvent} keyboardEvent - The keyboard event. */ onKeyDown(keyboardEvent) { if (keyboardEvent.key !== undefined) { // Code to detect Esc event. if (keyboardEvent.key === "Escape" || keyboardEvent.key === "Esc") { this.cancelAction(); keyboardEvent.stopPropagation(); keyboardEvent.preventDefault(); } else if (keyboardEvent.key === "Tab") { // Code to detect Tab event. if (document.activeElement === this.closeButton) { this.cancelButton.focus(); } else { this.closeButton.focus(); } keyboardEvent.stopPropagation(); keyboardEvent.preventDefault(); } } } }