UNPKG

@syncfusion/ej2-richtexteditor

Version:
946 lines (944 loc) 51.1 kB
import * as events from '../base/constant'; import { detach, addClass, isNullOrUndefined as isNOU, removeClass, closest, createElement, EventHandler, getComponent } from '@syncfusion/ej2-base'; import { Popup } from '@syncfusion/ej2-popups'; import { Toolbar } from '@syncfusion/ej2-navigations'; import { TextBox } from '@syncfusion/ej2-inputs'; import { EmojiPickerAction } from '../../editor-manager/plugin/emoji-picker-action'; var EmojiPicker = /** @class */ (function () { function EmojiPicker(parent, serviceLocator) { this.noResultsFoundCount = 0; this.parent = parent; this.locator = serviceLocator; this.i10n = serviceLocator.getService('rteLocale'); this.renderFactory = this.locator.getService('rendererFactory'); this.addEventListener(); this.isDestroyed = false; this.isPopupDestroyed = false; } /** * Destroys the Count. * * @function destroy * @returns {void} * @hidden */ EmojiPicker.prototype.destroy = function () { if (this.isDestroyed) { return; } this.removeEventListener(); this.isDestroyed = true; }; EmojiPicker.prototype.childDestroy = function () { if (this.isPopupDestroyed) { return; } if (this.popupObj && !this.popupObj.isDestroyed) { if (this.popupObj.element && this.popupObj.element.querySelector('.e-rte-emoji-search')) { var textBox = getComponent(this.popupObj.element.querySelector('.e-rte-emoji-search'), 'textbox'); if (textBox && !textBox.isDestroyed) { textBox.destroy(); } } if (this.popupObj.element && this.popupObj.element.querySelector('.e-rte-emojipicker-toolbar')) { var toolbar_1 = getComponent(this.popupObj.element.querySelector('.e-rte-emojipicker-toolbar'), 'toolbar'); if (toolbar_1 && !toolbar_1.isDestroyed) { toolbar_1.destroy(); } } var closeIcon = this.popupObj.element.querySelector('.e-clear-icon'); if (!isNOU(closeIcon)) { EventHandler.remove(closeIcon, 'mousedown', this.searchFilter); } this.popupObj.destroy(); this.isPopupDestroyed = true; } if (this.popDiv) { EventHandler.remove(this.popDiv, 'keydown', this.onKeyDown); EventHandler.remove(this.popDiv, 'keyup', this.searchFilter); if (this.popDiv.querySelector('.e-rte-emojipicker-btn')) { var btn = this.popDiv.querySelector('.e-rte-emojipicker-btn'); EventHandler.remove(btn, 'scroll', this.scrollEvent); EventHandler.remove(btn, 'click', this.emojiBtnClick); } } }; EmojiPicker.prototype.addEventListener = function () { this.parent.on(events.emojiPicker, this.toolbarClick, this); this.parent.on(events.docClick, this.docClick, this); this.parent.on(events.iframeMouseDown, this.onIframeMouseDown, this); this.parent.on(events.keyDown, this.onkeyPress, this); this.parent.on(events.keyUp, this.onkeyUp, this); this.parent.on(events.contentscroll, this.contentscroll, this); this.parent.on(events.scroll, this.contentscroll, this); this.parent.on(events.destroy, this.destroy, this); this.parent.on(events.bindOnEnd, this.bindOnEnd, this); }; EmojiPicker.prototype.bindOnEnd = function () { if (!this.parent.formatter.editorManager.emojiPickerObj) { this.parent.formatter.editorManager.emojiPickerObj = new EmojiPickerAction(this.parent.formatter.editorManager); } }; // eslint-disable-next-line EmojiPicker.prototype.toolbarClick = function (args) { var _this = this; var _a, _b; this.noResultsFoundCount = 0; var spanElement; if (!isNOU(this.parent.element.querySelector('.e-emoji'))) { spanElement = this.parent.element.querySelector('.e-emoji'); } else if (this.parent.inlineMode.enable) { spanElement = this.parent.element.ownerDocument.querySelector('.e-emoji'); } if (!isNOU(spanElement)) { this.divElement = spanElement.closest('div'); } if (!(this.parent.inputElement.contains(this.parent.formatter.editorManager.nodeSelection. getRange(this.parent.contentModule.getDocument()).startContainer))) { this.parent.contentModule.getEditPanel().focus(); } var range = this.parent.formatter.editorManager.nodeSelection.getRange(this.parent.contentModule.getDocument()); this.save = this.parent.formatter.editorManager.nodeSelection.save(range, this.parent.contentModule.getDocument()); this.clickEvent = args.args; var emojiPicker = this.parent.emojiPickerSettings.iconsSet; if (this.popupObj) { this.removeActiveClass(); if (this.popupObj.element.querySelector('.e-rte-emoji-search') || !this.parent.emojiPickerSettings.showSearchBox) { this.popupObj.hide(); return; } this.popupObj.hide(); } this.popDiv = this.parent.createElement('div', { className: 'e-rte-emojipicker-popup', id: this.parent.getID() + '_emojiPicker' }); var actualTarget = args.args ? args.args.originalEvent.target : this.parent.inputElement; if (!isNOU(this.parent.getToolbar()) && !this.parent.inlineMode.enable && (this.parent.toolbarSettings.position !== 'Bottom' || actualTarget !== this.parent.inputElement)) { this.parent.getToolbar().parentElement.appendChild(this.popDiv); } else if (this.parent.inlineMode.enable || (this.parent.toolbarSettings.position === 'Bottom' || actualTarget === this.parent.inputElement)) { this.parent.rootContainer.appendChild(this.popDiv); } EventHandler.add(this.popDiv, 'keydown', this.onKeyDown, this); EventHandler.add(this.popDiv, 'keyup', this.searchFilter, this); var extendEle = this.parent.element.querySelector('.e-toolbar-extended'); var zIndex; if (!isNOU(extendEle)) { var computedStyle = window.getComputedStyle(extendEle); zIndex = computedStyle.getPropertyValue('z-index'); } else { zIndex = '10001'; } var target; var xValue; var yValue; if (this.parent.toolbarSettings.position === 'Bottom') { args.y = args.y - this.parent.getToolbar().getBoundingClientRect().height; } if (!isNOU(args.args) && !this.parent.inlineMode.enable && (isNOU(this.parent.quickToolbarSettings.text) || (!isNOU(this.parent.quickToolbarSettings.text) && isNOU(this.parent.element.querySelector('.e-rte-quick-toolbar'))))) { target = args.args.originalEvent.target; target = target.classList.contains('e-toolbar-item') ? target.firstChild : target.parentElement; xValue = 'left'; yValue = 'bottom'; } else if (isNOU(args.x) && isNOU(args.y) && !this.parent.inlineMode.enable && isNOU(this.parent.quickToolbarSettings.text)) { target = this.parent.inputElement; if (this.parent.contentModule.getDocument().getSelection().rangeCount > 0) { var coordinates = this.getCoordinates(); xValue = coordinates.left; yValue = coordinates.top; } } else if (isNOU(args.x) && isNOU(args.y) && (this.parent.inlineMode.enable || !isNOU(this.parent.quickToolbarSettings.text))) { this.parent.notify(events.hidePopup, {}); if (this.parent.contentModule.getDocument().getSelection().rangeCount > 0) { var coordinates = this.getCoordinates(); xValue = coordinates.left; yValue = coordinates.top; } } else { target = this.parent.inputElement; xValue = args.x; yValue = args.y; } this.popupObj = new Popup(this.popDiv, { targetType: 'relative', relateTo: target, collision: { X: 'fit', Y: 'none' }, offsetY: 8, viewPortElement: this.parent.element, position: { X: xValue, Y: yValue }, enableRtl: this.parent.enableRtl, zIndex: parseInt(zIndex, 10) + 1, actionOnScroll: 'hide', close: function () { _this.parent.isBlur = false; _this.childDestroy(); _this.popupObj.element.parentElement.style.zIndex = ''; detach(_this.popupObj.element); _this.popupObj = null; if (_this.divElement) { var activeElement = _this.divElement.firstChild; activeElement.focus(); } } }); this.isPopupDestroyed = false; addClass([this.popupObj.element], 'e-popup-open'); this.popupObj.element.parentElement.style.zIndex = '11'; this.popupObj.refreshPosition(target); this.positionDialogue(target, spanElement); // header search element if ((!isNOU(args.args) || (isNOU(args.x) && isNOU(args.y))) && this.parent.emojiPickerSettings.showSearchBox) { var inputEle = createElement('input', { id: 'e-rte-emoji-search', className: 'e-rte-emoji-search' }); this.popDiv.append(inputEle); var inputobj = new TextBox({ placeholder: this.i10n.getConstant('emojiPickerTypeToFind'), showClearButton: true }); inputobj.appendTo(inputEle); if (this.parent.userAgentData.isSafari() && this.parent.inputElement.contains(this.parent.getRange().startContainer)) { this.parent.notify(events.selectionSave, {}); } inputEle.focus(); } var closeIcon = this.popupObj.element.querySelector('.e-clear-icon'); if (!isNOU(closeIcon)) { EventHandler.add(closeIcon, 'mousedown', this.searchFilter, this); } // Header emoji toolbar div var emojiToolBar = this.parent.createElement('div', { className: 'e-rte-emojipicker-toolbar' }); this.popDiv.appendChild(emojiToolBar); var pushToolBar = []; for (var i = 0; i < this.parent.emojiPickerSettings.iconsSet.length; i++) { if (!isNOU(this.parent.emojiPickerSettings.iconsSet[i].iconCss)) { pushToolBar.push({ prefixIcon: this.parent.emojiPickerSettings.iconsSet[i].iconCss, htmlAttributes: (_a = {}, _a['title'] = this.parent.emojiPickerSettings.iconsSet[i].name, _a) }); } else { pushToolBar.push({ text: '&#x' + this.parent.emojiPickerSettings.iconsSet[i].code + ';', htmlAttributes: (_b = {}, _b['title'] = this.parent.emojiPickerSettings.iconsSet[i].name, _b) }); } } var toolbarObj = new Toolbar({ items: pushToolBar, clicked: this.emojiToolbarClick.bind(this) }); toolbarObj.appendTo(emojiToolBar); // emoji btn div var emojiBtnDiv = this.parent.createElement('div', { className: 'e-rte-emojipicker-btn' }); this.popDiv.appendChild(emojiBtnDiv); var height; var popupBorder = window.getComputedStyle(this.popDiv); if ((isNOU(args.args) && !(isNOU(args.x) && isNOU(args.y))) || !this.parent.emojiPickerSettings.showSearchBox) { height = (this.popDiv.getBoundingClientRect().height - emojiToolBar.getBoundingClientRect().height - (2 * parseFloat(popupBorder.borderWidth))) + 'px'; emojiBtnDiv.style.setProperty('height', height, 'important'); } else { var inputELe = this.parent.element.querySelector('.e-rte-emoji-search').parentElement; var getComputedStyle_1 = window.getComputedStyle(inputELe); height = (this.popDiv.getBoundingClientRect().height - emojiToolBar.getBoundingClientRect().height - inputELe.getBoundingClientRect().height - parseFloat(getComputedStyle_1.marginTop) - parseFloat(getComputedStyle_1.marginBottom) - (2 * parseFloat(popupBorder.borderWidth))) + 'px'; emojiBtnDiv.style.setProperty('height', height, 'important'); } for (var i = 0; i < emojiPicker.length; i++) { var emojiGroupDiv = this.parent.createElement('div', { className: 'e-rte-emojipicker-group' }); emojiBtnDiv.appendChild(emojiGroupDiv); var emojiName = this.parent.createElement('div', { className: 'e-rte-emojipicker-name' }); emojiName.innerText = this.parent.emojiPickerSettings.iconsSet[i].name; emojiName.setAttribute('aria-label', this.parent.emojiPickerSettings.iconsSet[i].name); emojiGroupDiv.appendChild(emojiName); var emojiBtn = this.parent.createElement('div', { className: 'e-rte-emojipickerbtn-group' }); emojiGroupDiv.appendChild(emojiBtn); for (var j = 0; j < emojiPicker[i].icons.length; j++) { var button = this.parent.createElement('button', { className: 'e-btn ' + ' ' + 'e-control' }); button.innerHTML = this.buttoncode(this.parent.emojiPickerSettings.iconsSet[i].icons[j].code); button.setAttribute('aria-label', (this.parent.emojiPickerSettings.iconsSet[i].icons[j].desc)); button.setAttribute('title', (this.parent.emojiPickerSettings.iconsSet[i].icons[j].desc)); emojiBtn.appendChild(button); if (button.innerHTML.length > 2) { button.style.fontSize = '17px'; } } } EventHandler.add(emojiBtnDiv, 'scroll', this.scrollEvent, this); EventHandler.add(emojiBtnDiv, 'click', this.emojiBtnClick, this); var emojiButtons = this.parent.element.querySelectorAll('.e-rte-emojipicker-btn button'); if (isNOU(this.parent.element.querySelector('.e-rte-emoji-search')) && !isNOU(args.args)) { emojiButtons[0].focus(); addClass([emojiButtons[0]], 'e-focus'); } var popup = this.parent.element.querySelector('.e-rte-emojipicker-btn'); var toolbarName = this.parent.element.querySelectorAll('.e-rte-emojipicker-toolbar button'); var scrollTop; if (!isNOU(popup)) { scrollTop = Math.round(popup.scrollTop); } if (scrollTop < toolbarName[0].offsetHeight) { addClass([toolbarName[0]], 'e-selected'); } if (this.popupObj && this.divElement) { addClass([this.divElement], 'e-active'); } }; EmojiPicker.prototype.removeActiveClass = function () { if (this.divElement) { removeClass([this.divElement], 'e-active'); } }; /** * Positions the emoji picker dialog based on available screen space * This method calculates the optimal position for the emoji picker popup * considering available space below the trigger button. If insufficient space exists * below, it positions the popup above the button instead. * * @param {HTMLElement} target - The target element relative to which the dialog should be positioned * @param {HTMLElement} spanElement - The trigger element (emoji button) that activated the dialog * @returns {void} * @private */ EmojiPicker.prototype.positionDialogue = function (target, spanElement) { var editContentElement = this.parent.inputElement; if (isNOU(spanElement) || editContentElement === target) { return; } var windowHeight = window.innerHeight; var popupHeight = this.popDiv.getBoundingClientRect().height; var spaceBelow = windowHeight - spanElement.getBoundingClientRect().top; var buttonRowHeight; var toolbarButton = spanElement.closest('.e-toolbar-item'); var isPopup = this.parent.toolbarSettings.type === 'Popup'; var toolbarWrapper = this.parent.toolbarModule.getToolbarElement(); var expandedToolbar = toolbarWrapper ? toolbarWrapper.querySelector('.e-toolbar-extended') : toolbarWrapper; if (toolbarButton) { if (isPopup) { buttonRowHeight = toolbarButton.getBoundingClientRect().height; if (toolbarButton.parentElement.getBoundingClientRect().top < toolbarWrapper.getBoundingClientRect().top) { buttonRowHeight = toolbarWrapper.getBoundingClientRect().height + toolbarButton.parentElement.getBoundingClientRect().height; } } else { buttonRowHeight = toolbarButton.parentElement.getBoundingClientRect().height; } } else { var toolbarItem = this.parent.element.querySelector('.e-toolbar-item'); if (toolbarItem) { buttonRowHeight = toolbarItem.parentElement.getBoundingClientRect().height; } } if (expandedToolbar && toolbarButton.parentElement !== expandedToolbar) { buttonRowHeight += expandedToolbar.getBoundingClientRect().height; } if (spaceBelow < popupHeight && spanElement.getBoundingClientRect().top > popupHeight) { this.popupObj.element.style.setProperty('top', 'auto'); this.popupObj.element.style.setProperty('bottom', buttonRowHeight + "px"); } }; EmojiPicker.prototype.onIframeMouseDown = function () { if (this.popupObj) { this.removeActiveClass(); this.popupObj.hide(); } }; EmojiPicker.prototype.buttoncode = function (value) { var valueLength = value.split('-'); // eslint-disable-next-line var joinedEmoji = valueLength.map(function (cp) { return String.fromCodePoint(parseInt(cp, 16)); }).join('\u200D'); return joinedEmoji; }; EmojiPicker.prototype.docClick = function (e) { var target = e.args.target; if (target && target.classList && ((this.popupObj && !closest(target, '[id=' + '\'' + this.popupObj.element.id + '\'' + ']'))) && (!target.classList.contains('e-emoji') && !target.classList.contains('e-toolbar-item'))) { if (this.popupObj) { this.removeActiveClass(); this.popupObj.hide(); } } }; EmojiPicker.prototype.scrollEvent = function () { var popup = this.parent.element.querySelector('.e-rte-emojipicker-btn'); var emojiSet = this.parent.element.querySelectorAll('.e-rte-emojipicker-group'); var toolbarName = this.parent.element.querySelectorAll('.e-rte-emojipicker-toolbar button'); var scrollTop; if (!isNOU(popup)) { scrollTop = Math.round(popup.scrollTop); } var firstSetWidth = 0; for (var j = 0; j < toolbarName.length; j++) { if (scrollTop < toolbarName[0].offsetHeight) { if (!isNOU(toolbarName[j + 1])) { removeClass([toolbarName[j + 1]], 'e-selected'); } addClass([toolbarName[0]], 'e-selected'); } } for (var i = 0; i < emojiSet.length; i++) { firstSetWidth += Math.round(emojiSet[i].offsetHeight); if (scrollTop >= firstSetWidth) { for (var k = 0; k < toolbarName.length; k++) { if (toolbarName[k].classList.contains('e-selected')) { removeClass([toolbarName[k]], 'e-selected'); } /* eslint-enable */ } if (!isNOU(toolbarName[i + 1])) { addClass([toolbarName[i + 1]], 'e-selected'); } } } }; EmojiPicker.prototype.contentscroll = function () { if (isNOU(this.clickEvent) && this.popupObj) { this.removeActiveClass(); this.popupObj.hide(); return; } }; EmojiPicker.prototype.emojiToolbarClick = function (e) { var args = { // eslint-disable-next-line text: e.item.htmlAttributes.title, }; var currentEleName = args.text; var emojiGroups = this.parent.element.querySelectorAll('.e-rte-emojipicker-group'); var emojiButtons = this.parent.element.querySelectorAll('.e-rte-emojipicker-btn button'); var toolbarName = this.parent.element.querySelectorAll('.e-rte-emojipicker-toolbar button'); for (var i = 0; i < toolbarName.length; i++) { if (toolbarName[i].classList.contains('e-selected')) { removeClass([toolbarName[i]], 'e-selected'); } /* eslint-enable */ } for (var i = 0; i < emojiButtons.length; i++) { if (emojiButtons[i].classList.contains('e-focus')) { removeClass([emojiButtons[i]], 'e-focus'); } } // Loop through the selected elements and perform the same operation on each element var emojiGroupsheight = this.parent.element.querySelector('.e-rte-emojipicker-btn'); var emojiHeight = 0; // eslint-disable-next-line emojiGroups.forEach(function (group) { var childNodes = group.childNodes[0]; var focusBtn = group.childNodes[1].childNodes[0]; var ariaLabel = childNodes.getAttribute('aria-label'); if (currentEleName === ariaLabel) { if (childNodes) { emojiGroupsheight.scrollTop = emojiHeight + 10; addClass([focusBtn], 'e-focus'); focusBtn.focus(); } } else { emojiHeight += group.scrollHeight; removeClass([focusBtn], 'e-focus'); } }); }; EmojiPicker.prototype.onKeyDown = function (e) { // Select all emoji buttons var emojiButtons = this.parent.element.querySelectorAll('.e-rte-emojipicker-btn button'); var emojiGroups = this.parent.element.querySelectorAll('.e-rte-emojipickerbtn-group'); var searchKeyHandler = this.parent.element.querySelector('.e-rte-emojisearch-btn button'); if (e.keyCode === 27) { if (this.popupObj) { this.removeActiveClass(); this.popupObj.hide(); } } if (e.keyCode === 13) { var activeEle = document.activeElement; if (activeEle.classList.contains('e-btn')) { this.emojiBtnClick(e); e.preventDefault(); } } var srcElement = e.srcElement; if (!isNOU(srcElement)) { if (srcElement.classList.contains('e-rte-emoji-search') && e.keyCode === 40) { for (var i = 0; i < emojiButtons.length; i++) { if (emojiButtons[i].classList.contains('e-focus')) { removeClass([emojiButtons[i]], 'e-focus'); } } } } if (!isNOU(searchKeyHandler)) { this.filterKeyHandler(e); } else { for (var i = 0; i < emojiButtons.length; i++) { var focusIndex = i; if (emojiButtons[i].classList.contains('e-focus')) { if (e.keyCode === 40) { // Move focus to next row if there is one if (emojiButtons.length - 4 > i) { var count = 0; for (var j = 0; j < emojiGroups.length; j++) { for (var k = 0; k < emojiGroups[j].childNodes.length; k++) { // eslint-disable-next-line var childNodes = emojiGroups[j].childNodes[k]; if (childNodes.classList.contains('e-focus') && count !== 1) { var currentIndex = k; var lastChild = emojiGroups[j].lastChild; var lastRowIndex = Math.floor((k) % 6); var lastEleLength = emojiGroups[j].childNodes.length - 1; var lastEleIndex = Math.floor((lastEleLength) % 6); if (currentIndex !== -1) { var nextRowIndex = currentIndex + 6; if (!isNOU(emojiGroups[j].childNodes[nextRowIndex])) { // next row has six buttons // handle focus change here var firstFocusEle = emojiButtons[i]; removeClass([firstFocusEle], 'e-focus'); var focusEle = emojiButtons[focusIndex += 6]; addClass([focusEle], 'e-focus'); focusEle.focus(); break; } else if (isNOU(emojiGroups[j].childNodes[nextRowIndex]) && !lastChild.classList.contains('e-focus') && lastEleIndex < lastRowIndex) { var firstFocusEle = emojiButtons[i]; removeClass([firstFocusEle], 'e-focus'); var focusEle = emojiGroups[j].lastChild; addClass([focusEle], 'e-focus'); focusEle.focus(); count = 1; break; } else { var firstFocusEle = emojiButtons[i]; removeClass([firstFocusEle], 'e-focus'); var focusEle = emojiGroups[j + 1] .childNodes[lastRowIndex]; addClass([focusEle], 'e-focus'); focusEle.focus(); count = 1; break; } } } } } break; } } else if (e.keyCode === 38) { // Move focus to previous row if there is one if (i >= 6) { var count = 0; for (var j = 0; j < emojiGroups.length; j++) { for (var k = 0; k < emojiGroups[j].childNodes.length; k++) { var childNodes = emojiGroups[j].childNodes[k]; if (childNodes.classList.contains('e-focus') && count !== 1) { // eslint-disable-next-line var currentIndex = k; var previousRowLength = isNOU(emojiGroups[j - 1]) ? null : emojiGroups[j - 1].childNodes.length % 6 || 6; if (currentIndex !== -1) { var previousRowIndex = currentIndex - 6; if (!isNOU(emojiGroups[j].childNodes[previousRowIndex])) { // previous row has six buttons // handle focus change here var firstFocusEle = emojiButtons[i]; removeClass([firstFocusEle], 'e-focus'); var focusEle = emojiButtons[focusIndex -= 6]; addClass([focusEle], 'e-focus'); focusEle.focus(); break; } else if (isNOU(emojiGroups[j - 1].childNodes[emojiGroups[j - 1] .childNodes.length - (previousRowLength - k)])) { var firstFocusEle = emojiButtons[i]; removeClass([firstFocusEle], 'e-focus'); var focusEle = emojiGroups[j - 1].lastChild; addClass([focusEle], 'e-focus'); focusEle.focus(); count = 1; break; } else { // previous row has less than six buttons // handle focus change here var firstFocusEle = emojiButtons[i]; removeClass([firstFocusEle], 'e-focus'); var focusEle = emojiGroups[j - 1].childNodes[emojiGroups[j - 1]. childNodes.length - (previousRowLength - k)]; addClass([focusEle], 'e-focus'); focusEle.focus(); count = 1; break; } } } } } } else { var firstFocusEle = emojiButtons[i]; removeClass([firstFocusEle], 'e-focus'); var focusEle = emojiButtons[focusIndex -= 1]; var inputELe = this.popupObj.element.querySelector('.e-rte-emoji-search'); if (isNOU(focusEle) && !isNOU(inputELe)) { inputELe.focus(); break; } addClass([focusEle], 'e-focus'); focusEle.focus(); } break; } else if (e.keyCode === 39) { // Move focus to next button in current row if (emojiButtons.length !== i + 1) { var firstFocusEle = emojiButtons[i]; removeClass([firstFocusEle], 'e-focus'); var focusEle = emojiButtons[focusIndex += 1]; addClass([focusEle], 'e-focus'); emojiButtons[focusIndex].focus(); } break; } else if (e.keyCode === 37) { // Move focus to previous button in current row if (i > 0) { var firstFocusEle = emojiButtons[i]; removeClass([firstFocusEle], 'e-focus'); var focusEle = emojiButtons[focusIndex -= 1]; addClass([focusEle], 'e-focus'); emojiButtons[focusIndex].focus(); } break; } } } } if (e.keyCode === 40) { var firstFocusEle = this.parent.element.querySelector('.e-focus'); if (isNOU(firstFocusEle)) { var focusEle = emojiButtons[0]; addClass([focusEle], 'e-focus'); if (this.parent.userAgentData.isSafari() && this.parent.inputElement.contains(this.parent.getRange().startContainer)) { this.parent.notify(events.selectionSave, {}); } emojiButtons[0].focus(); } } }; EmojiPicker.prototype.filterKeyHandler = function (e) { var emojiButtons = this.parent.element.querySelectorAll('.e-rte-emojisearch-btn button'); var firstFocusEle = this.parent.element.querySelector('.e-focus'); if (isNOU(firstFocusEle) && e.keyCode === 40) { var focusEle = emojiButtons[0]; addClass([focusEle], 'e-focus'); if (this.parent.userAgentData.isSafari()) { this.parent.notify(events.selectionSave, {}); } emojiButtons[0].focus(); } else { for (var i = 0; i < emojiButtons.length; i++) { var focusIndex = i; var childNodes = emojiButtons[i]; if (childNodes.classList.contains('e-focus')) { if (e.keyCode === 38) { if (i >= 6) { var firstFocusEle_1 = emojiButtons[i]; removeClass([firstFocusEle_1], 'e-focus'); var focusEle = emojiButtons[focusIndex -= 6]; addClass([focusEle], 'e-focus'); focusEle.focus(); break; } else { var firstFocusEle_2 = emojiButtons[i]; removeClass([firstFocusEle_2], 'e-focus'); var focusEle = emojiButtons[focusIndex -= 1]; var inputELe = this.popupObj.element.querySelector('.e-rte-emoji-search'); if (isNOU(focusEle) && !isNOU(inputELe)) { inputELe.focus(); break; } addClass([focusEle], 'e-focus'); focusEle.focus(); } } else if (e.keyCode === 40) { if (emojiButtons.length - 6 > i) { var firstFocusEle_3 = emojiButtons[i]; removeClass([firstFocusEle_3], 'e-focus'); var focusEle = emojiButtons[focusIndex += 6]; addClass([focusEle], 'e-focus'); focusEle.focus(); break; } } else if (e.keyCode === 39) { if (emojiButtons.length !== i + 1) { var firstFocusEle_4 = emojiButtons[i]; removeClass([firstFocusEle_4], 'e-focus'); var focusEle = emojiButtons[focusIndex += 1]; addClass([focusEle], 'e-focus'); emojiButtons[focusIndex].focus(); } break; } else if (e.keyCode === 37) { if (i > 0) { var firstFocusEle_5 = emojiButtons[i]; removeClass([firstFocusEle_5], 'e-focus'); var focusEle = emojiButtons[focusIndex -= 1]; addClass([focusEle], 'e-focus'); emojiButtons[focusIndex].focus(); break; } } } } } }; EmojiPicker.prototype.searchFilter = function (e, value, hasInternalCall) { if (hasInternalCall === void 0) { hasInternalCall = false; } var inputElement = this.parent.element.querySelector('.e-rte-emoji-search'); var contentELe = this.parent.iframeSettings.enable ? this.parent.contentModule.getPanel() : this.parent.element.querySelector('.e-content'); if (document.activeElement === inputElement || document.activeElement === contentELe) { var trimmedStr = void 0; if (value !== ':' && !isNOU(value)) { trimmedStr = value.replace(/^:/, ''); } else if (!isNOU(value)) { trimmedStr = value; } var inputValue = isNOU(inputElement) ? trimmedStr : inputElement.value; var emojiButtons = this.parent.element.querySelectorAll('.e-rte-emojipicker-btn button'); var emojipickerAll = this.parent.element.querySelector('.e-rte-emojipicker-btn'); var emojiGroups = this.parent.element.querySelectorAll('.e-rte-emojipicker-group'); var toolbarGroup = this.parent.element.querySelector('.e-rte-emojipicker-toolbar'); var excludedDiv_1 = this.parent.element.querySelector('.e-rte-emojisearch-btn'); var firstChild = this.popDiv.childNodes[0]; var getComputedStyle_2 = window.getComputedStyle(firstChild); var inputHeight = firstChild.nodeName === 'SPAN' ? (firstChild.getBoundingClientRect().height + parseFloat(getComputedStyle_2.marginTop) + parseFloat(getComputedStyle_2.marginBottom)) : 0; var popupBorder = window.getComputedStyle(this.popDiv); // eslint-disable-next-line @typescript-eslint/tslint/config var filteredButtons = isNOU(excludedDiv_1) ? emojiButtons : // eslint-disable-next-line @typescript-eslint/tslint/config Array.from(emojiButtons).filter(function (button) { return !excludedDiv_1.contains(button); }); if (!isNOU(toolbarGroup) && !isNOU(emojipickerAll) && !isNOU(inputValue)) { if (inputValue === '' || value === ':') { toolbarGroup.style.display = ''; emojipickerAll.style.height = (this.popDiv.getBoundingClientRect().height - toolbarGroup.getBoundingClientRect().height - inputHeight - (2 * parseFloat(popupBorder.borderWidth))) + 'px'; // eslint-disable-next-line @typescript-eslint/tslint/config emojiGroups.forEach(function (element) { element.style.display = ''; }); } else { // eslint-disable-next-line @typescript-eslint/tslint/config emojiGroups.forEach(function (element) { element.style.display = 'none'; }); toolbarGroup.style.display = 'none'; emojipickerAll.style.height = (this.popDiv.getBoundingClientRect().height - inputHeight - (2 * parseFloat(popupBorder.borderWidth))) + 'px'; } var emojiBtnDiv = this.parent.createElement('div', { className: 'e-rte-emojisearch-btn' }); var emojis = this.parent.element.querySelector('.e-rte-emojisearch-btn'); if (emojis) { emojis.remove(); } var noEMoji = true; for (var i = 0; i < filteredButtons.length; i++) { if (!isNOU(filteredButtons[i].getAttribute('title'))) { var title = filteredButtons[i].getAttribute('title').toLowerCase(); var titleLength = title.split(' '); for (var j = 0; j < titleLength.length; j++) { if (titleLength[j].startsWith(inputValue.toLowerCase()) && inputValue !== '') { var emoji = filteredButtons[i].cloneNode(true); emojiBtnDiv.appendChild(emoji); noEMoji = false; break; } } } } var noEmojiObj = this.parent.createElement('div', { className: 'e-rte-emojiSearch-noEmoji' }); if (noEMoji && !this.parent.element.querySelector('.e-rte-emojiSearch-noEmoji') && (inputValue !== '' && value !== ':' && value !== ': :')) { if (!isNOU(noEmojiObj)) { noEmojiObj.innerHTML = '<span style="color: rgba(0, 0, 0, 0.75); font-weight: 500; font-size: 16px;">' + this.i10n.getConstant('emojiPickerNoResultFound') + ' 😥 </span>' + '<br>' + '<span style="color: rgba(0, 0, 0, 0.75);"> ' + this.i10n.getConstant('emojiPickerTrySomethingElse') + ' ? </span>'; noEmojiObj.style.margin = '55px'; emojipickerAll.appendChild(noEmojiObj); } } else if (!noEMoji && this.parent.element.querySelector('.e-rte-emojiSearch-noEmoji') || (inputValue === '' && value === ':') || (inputValue === '' && this.parent.element.querySelector('.e-rte-emojiSearch-noEmoji'))) { emojipickerAll.removeChild(this.parent.element.querySelector('.e-rte-emojiSearch-noEmoji')); } emojipickerAll.appendChild(emojiBtnDiv); if (hasInternalCall) { if (noEMoji && value !== ':') { this.noResultsFoundCount += 1; } else { this.noResultsFoundCount = 0; } if (this.noResultsFoundCount >= 9) { if (!isNOU(this.popupObj)) { this.removeActiveClass(); this.popupObj.hide(); this.noResultsFoundCount = 0; return; } } } } else { return; } } else { return; } }; EmojiPicker.prototype.emojiBtnClick = function (e) { var event = new MouseEvent('mouseleave', { bubbles: true, cancelable: true }); // Includes the emote button element tooltip and toolbar tooltip var emotePickerTooltips = this.parent.element.querySelectorAll('.e-rte-emojipicker-popup [data-tooltip-id]'); for (var i = 0; i < emotePickerTooltips.length; i++) { emotePickerTooltips[i].dispatchEvent(event); } var targetEle = e.target; if (targetEle.tagName !== 'BUTTON') { return; } targetEle.focus(); var startOffset = this.save.startOffset; var textContent = this.save.range.startContainer.textContent; var previousText = textContent.substring(startOffset, startOffset + 1); // When toolbar action is clicked then only restore the range. if (!isNOU(this.clickEvent) || previousText !== ':') { this.save.restore(); } if (this.popupObj) { this.removeActiveClass(); this.popupObj.hide(); } if (this.parent.userAgentData.isSafari() && e.type === 'keydown') { this.parent.notify(events.selectionRestore, {}); } var originalEvent = e; this.parent.formatter.process(this.parent, { item: { 'command': 'EmojiPicker', 'subCommand': 'EmojiPicker', value: targetEle.innerHTML }, originalEvent: originalEvent }, e, originalEvent); }; EmojiPicker.prototype.onkeyPress = function (e) { var originalEvent = e.args; var selection = (this.parent.iframeSettings.enable) ? this.parent.contentModule.getPanel().contentWindow.getSelection() : this.parent.contentModule.getDocument().getSelection(); if (selection.rangeCount <= 0) { return; } var range = selection.getRangeAt(0); var cursorPos = range.startOffset; var prevChar = selection.focusNode.textContent.substring(cursorPos - 1, cursorPos); var isPrevSpace = /\s/.test(prevChar); var isPrevColon = selection.focusNode.textContent.substring(cursorPos - 1, cursorPos) === ':'; var colon = selection.focusNode.textContent.charAt(cursorPos - 1) === ':'; if (originalEvent.keyCode === 186 && originalEvent.shiftKey && (isPrevSpace || selection.focusOffset === 0)) { var coordinates = this.getCoordinates(); this.parent.showEmojiPicker(coordinates.left, coordinates.top); } if (originalEvent.keyCode === 8 && colon && this.popupObj) { this.removeActiveClass(); this.popupObj.hide(); } if (originalEvent.keyCode === 32 && isPrevColon && this.popupObj) { this.removeActiveClass(); var currentDocument = this.parent.iframeSettings.enable ? this.parent.contentModule.getPanel().ownerDocument : this.parent.contentModule.getDocument(); if (this.parent.showTooltip && !isNOU(currentDocument.querySelector('.e-tooltip-wrap'))) { this.parent.notify(events.destroyTooltip, { args: event }); } this.popupObj.hide(); } if (this.popupObj && (originalEvent.keyCode === 37 || originalEvent.keyCode === 38 || originalEvent.keyCode === 39 || originalEvent.keyCode === 27 || originalEvent.keyCode === 40)) { this.onKeyDown(originalEvent); originalEvent.preventDefault(); } }; EmojiPicker.prototype.onkeyUp = function (e) { var originalEvent = e.args; var selection = (this.parent.iframeSettings.enable) ? this.parent.contentModule.getPanel().contentWindow.getSelection() : this.parent.contentModule.getDocument().getSelection(); if (selection.rangeCount <= 0) { return; } if (!this.parent.isSelectionInRTE()) { return; } var range = selection.getRangeAt(0); var cursorPos = range.startOffset; // eslint-disable-next-line var selectedValue; var count = 0; for (var i = cursorPos - 1; i >= (cursorPos - selection.focusNode.textContent.length); i--) { var prevChar = selection.focusNode.textContent.substring(i - 1, i); var isPrevSpace = /:$/.test(prevChar); if (isPrevSpace && !isNOU(this.popDiv) && count === 0) { selectedValue = range.startContainer.textContent.substring(i - 1, cursorPos); this.searchFilter(originalEvent, selectedValue, true); count = 1; } } var colon = selection.focusNode.textContent.substring(cursorPos - 1, cursorPos); if (colon === ':' && !isNOU(this.popupObj)) { selectedValue = colon; this.searchFilter(originalEvent, selectedValue, true); } }; EmojiPicker.prototype.getCoordinates = function () { var coordinates; var selection = (this.parent.iframeSettings.enable) ? this.parent.contentModule.getPanel().contentWindow.getSelection() : window.getSelection(); var range = selection.getRangeAt(0); var firstChild; if (range.startContainer.nodeName === 'P' || range.startContainer.nodeName === 'DIV') { if (range.startContainer.childNodes[0].nodeName !== '#text') { firstChild = range.startContainer.childNodes[0]; } } // eslint-disable-next-line var rect = isNOU(firstChild) ? range.getBoundingClientRect() : firstChild.getBoundingClientRect(); var rteContent = this.parent.element.querySelector('.e-rte-content'); var rteEle = this.parent.element; var toolbarHeight = rteEle.offsetHeight - rteContent.offsetHeight; var cursorTop = rect.top - this.parent.inputElement.getBoundingClientRect().top; var cursorLeft = rect.left - this.parent.inputElement.getBoundingClientRect().left; var screenHeight = window.innerHeight; var popupHeight = 330; var popupTop = cursorTop; var popupLeft = cursorLeft + rect.width; if (rteEle.getBoundingClientRect().top < 0 && !this.parent.inlineMode.enable) { popupTop = popupTop + rteContent.getBoundingClientRect().top - toolbarHeight; } if (rect.top < popupHeight) { // eslint-disable-next-line popupTop = popupTop; } else if (rect.top + popupHeight > screenHeight) { popupTop -= popupHeight + 20;