UNPKG

ribs-wysiwyg

Version:
225 lines (191 loc) 6.56 kB
import RibsWysiwygUtils from "../RibsWysiwygUtils"; import RibsPopup from "ribs-popup/source/js/ribs-popup"; import RibsPopupCss from 'ribs-popup/dist/css/style.min.css'; class Link { /** * method to initialize Link plugin * @param toolbarDiv * @param editableDiv * @param options */ constructor(toolbarDiv, editableDiv, options) { this.toolbarDiv = toolbarDiv; this.editableDiv = editableDiv; this.ribsPopup = new RibsPopup(); this.addButtonToToolbar(); const head = document.getElementsByTagName('head')[0]; const style = document.createElement('style'); style.innerText = RibsPopupCss.toString(); head.appendChild(style); } /** * method to add link button to toolbar */ addButtonToToolbar() { const div = document.createElement('div'); const linkMenu = document.createElement('button'); linkMenu.id = 'ribs-wysiwyg-toolbar-link'; linkMenu.innerHTML = '<span>Link</span>'; linkMenu.addEventListener('click', () => this.showPopup()); div.append(linkMenu); this.toolbarDiv.append(div); } /** * method to create div for inputs of popup * @param id * @param label * @returns {HTMLDivElement} */ createInputPopup(id, label) { const inputDiv = document.createElement('div'); const labelElement = document.createElement('label'); labelElement.innerText = label; labelElement.for = id; const input = document.createElement('input'); input.id = id; input.name = id; if (id === 'ribs-wysiwyg-link-text') { input.value = RibsWysiwygUtils.getSelectionText(); } inputDiv.appendChild(labelElement); inputDiv.appendChild(input); return inputDiv; } /** * method to create set content div * @returns {HTMLDivElement} */ createContentDivPopup() { const setContentDiv = document.createElement('div'); setContentDiv.id = 'set-content'; const urlDiv = this.createInputPopup('ribs-wysiwyg-link-url', 'URL'); const DisplayTextDiv = this.createInputPopup('ribs-wysiwyg-link-text', 'Text to display'); const TitleDiv = this.createInputPopup('ribs-wysiwyg-link-title', 'Title'); setContentDiv.appendChild(urlDiv); setContentDiv.appendChild(DisplayTextDiv); setContentDiv.appendChild(TitleDiv); return setContentDiv; } /** * method to create links div * @returns {HTMLDivElement} */ createLinksDivPopup() { const linkDiv = document.createElement('div'); linkDiv.classList.add('link'); const cancelLink = document.createElement('a'); cancelLink.classList.add('cancel'); cancelLink.dataset.close = ''; cancelLink.innerText = 'Close'; linkDiv.appendChild(cancelLink); const validateLink = document.createElement('a'); validateLink.classList.add('validate'); validateLink.dataset.linkValidate = ''; validateLink.innerText = 'Validate'; linkDiv.appendChild(validateLink); return linkDiv; } /** * method to create popup element and append it to the dom */ createPopup() { const popupDiv = document.createElement('div'); popupDiv.id = 'ribs-wysiwyg-link-popup'; popupDiv.classList.add('ribs-popup'); const contentDiv = document.createElement('div'); contentDiv.classList.add('content'); const setContentDiv = this.createContentDivPopup(); const linkDiv = this.createLinksDivPopup(); const clearDiv = document.createElement('div'); clearDiv.classList.add('clear'); contentDiv.appendChild(setContentDiv); contentDiv.appendChild(linkDiv); contentDiv.appendChild(clearDiv); popupDiv.appendChild(contentDiv); const container = document.getElementById('ribs-wysiwyg-container') ? document.getElementById('ribs-wysiwyg-container') : document.getElementById('ribs-wysiwyg-editableDiv-current').parentElement ; container.appendChild(popupDiv); this.popup = document.getElementById('ribs-wysiwyg-link-popup'); this.addEventsOnInputs(); } /** * method to show popup */ showPopup() { this.selection = RibsWysiwygUtils.saveSelection(); this.createPopup(); this.ribsPopup.openJsPopup('ribs-wysiwyg-link-popup'); const dataValidate = this.popup.querySelectorAll('.ribs-popup [data-link-validate]'); if (dataValidate.length > 0) { Array.from(dataValidate).forEach((element) => { element.addEventListener('click', (event) => this.addEventValidate()); }); } } /** * add event on input for url and text. If enter text in url * it is duplicated in text input if empty */ addEventsOnInputs() { const inputUrl = document.getElementById('ribs-wysiwyg-link-url'); const inputText = document.getElementById('ribs-wysiwyg-link-text'); let nullText = false; inputUrl.addEventListener('keyup', (event) => { if (inputText.value === '') { nullText = true } if (nullText) { inputText.value = inputUrl.value; } }); inputText.addEventListener('keyup', (event) => { if (inputText.value !== inputUrl.value) { nullText = false; } }); } /** * method to put text in link */ addEventValidate() { const url = document.getElementById('ribs-wysiwyg-link-url').value; const text = document.getElementById('ribs-wysiwyg-link-text').value; const title = document.getElementById('ribs-wysiwyg-link-title').value; if (!url) { this.ribsPopup.closePopup(event); } else { RibsWysiwygUtils.restoreSelection(this.selection); document.execCommand('createLink', false, url); this.ribsPopup.closePopup(event); } this.editableDiv.focus(); RibsWysiwygUtils.refreshCaretLocationDiv(); document.getElementById(this.popup.id).remove(); this.changeValuesOfLink(text, title); } /** * add method to define text, id and title of link * @param text * @param title */ changeValuesOfLink(text, title) { const id = 'ribs-wysiwyg-a-number-'; let number = this.editableDiv.querySelectorAll('a').length + 1; this.editableDiv.querySelectorAll('a').forEach((element) => { if (element.id === undefined || element.id === '') { element.id = `${id}${number}`; element.innerText = text; element.title = title; } }); } } /** * function to load Link class * @param toolbarDiv * @param editableDiv * @param options */ function launchClass(toolbarDiv, editableDiv, options) { const link = new Link(toolbarDiv, editableDiv, options); } export default {launchClass};