UNPKG

@syncfusion/ej2-richtexteditor

Version:
427 lines (423 loc) 18.8 kB
import { createElement, isNullOrUndefined as isNOU, detach, closest, addClass, removeClass, select, Browser, formatUnit } from '@syncfusion/ej2-base'; import * as CONSTANT from './../base/constant'; import * as classes from './../base/classes'; import { InsertHtml } from './inserthtml'; import * as EVENTS from './../../common/constant'; import { scrollToCursor } from '../../common/util'; /** * Link internal component * * @hidden */ var ImageCommand = /** @class */ (function () { /** * Constructor for creating the Formats plugin * * @param {IEditorModel} parent - specifies the parent element * @hidden */ function ImageCommand(parent) { this.parent = parent; this.addEventListener(); } ImageCommand.prototype.addEventListener = function () { this.parent.observer.on(CONSTANT.IMAGE, this.imageCommand, this); this.parent.observer.on(EVENTS.INTERNAL_DESTROY, this.destroy, this); }; ImageCommand.prototype.removeEventListener = function () { this.parent.observer.off(CONSTANT.IMAGE, this.imageCommand); this.parent.observer.off(EVENTS.INTERNAL_DESTROY, this.destroy); }; /** * imageCommand method * * @param {IHtmlItem} e - specifies the element * @returns {void} * @hidden */ ImageCommand.prototype.imageCommand = function (e) { switch (e.value.toString().toLowerCase()) { case 'image': case 'replace': this.createImage(e); break; case 'insertlink': this.insertImageLink(e); break; case 'openimagelink': this.openImageLink(e); break; case 'editimagelink': this.editImageLink(e); break; case 'removeimagelink': this.removeImageLink(e); break; case 'remove': this.removeImage(e); break; case 'alttext': this.insertAltTextImage(e); break; case 'dimension': this.imageDimension(e); break; case 'caption': this.imageCaption(e); break; case 'justifyleft': this.imageJustifyLeft(e); break; case 'justifycenter': this.imageJustifyCenter(e); break; case 'justifyright': this.imageJustifyRight(e); break; case 'inline': this.imageInline(e); break; case 'break': this.imageBreak(e); break; } }; ImageCommand.prototype.createImage = function (e) { var _this = this; var isReplaced = false; e.item.url = isNOU(e.item.url) || e.item.url === 'undefined' ? e.item.src : e.item.url; if (!isNOU(e.item.selectParent) && e.item.selectParent[0].tagName === 'IMG') { var imgEle = e.item.selectParent[0]; isReplaced = true; this.setStyle(imgEle, e, isReplaced); } else { var imgElement = createElement('img'); this.setStyle(imgElement, e); if (!isNOU(e.item.selection)) { e.item.selection.restore(); } if (!isNOU(e.selector) && e.selector === 'pasteCleanupModule') { if (!isNOU(this.parent.currentDocument)) { e.callBack({ requestType: 'Images', editorMode: 'HTML', event: e.event, range: this.parent.nodeSelection.getRange(this.parent.currentDocument), elements: [imgElement] }); } } else { InsertHtml.Insert(this.parent.currentDocument, imgElement, this.parent.editableElement); } } if (e.callBack && (isNOU(e.selector) || !isNOU(e.selector) && e.selector !== 'pasteCleanupModule')) { var selectedNode = this.parent.nodeSelection.getSelectedNodes(this.parent.currentDocument)[0]; var imgElm_1 = (e.value === 'Replace' || isReplaced) ? e.item.selectParent[0] : (Browser.isIE ? selectedNode.previousSibling : selectedNode.previousElementSibling); var onImageLoadEvent_1 = function () { if (!isNOU(_this.parent.currentDocument)) { if (_this.parent.userAgentData.isSafari()) { scrollToCursor(_this.parent.currentDocument, _this.parent.editableElement); } var imgWidth = imgElm_1.getAttribute('width'); var imgHeight = imgElm_1.getAttribute('height'); if (isNOU(imgWidth) || imgWidth === 'auto') { imgElm_1.setAttribute('width', imgElm_1.offsetWidth.toString()); } if (isNOU(imgHeight) || imgHeight === 'auto') { imgElm_1.setAttribute('height', imgElm_1.offsetHeight.toString()); } e.callBack({ requestType: (e.value === 'Replace') ? (e.item.subCommand = 'Replace', 'Replace') : 'Images', editorMode: 'HTML', event: e.event, range: _this.parent.nodeSelection.getRange(_this.parent.currentDocument), elements: [imgElm_1] }); } imgElm_1.removeEventListener('load', onImageLoadEvent_1); }; imgElm_1.addEventListener('load', onImageLoadEvent_1); } }; ImageCommand.prototype.setStyle = function (imgElement, e, imgReplace) { if (!isNOU(e.item.url)) { imgElement.setAttribute('src', e.item.url); } var alignClassName; if (imgReplace) { var alignClass = { 'e-imgcenter': 'e-imgcenter', 'e-imgright': 'e-imgright', 'e-imgleft': 'e-imgleft' }; var imgClassList = imgElement.classList; for (var i = 0; i < imgClassList.length; i++) { if (!isNOU(alignClass[imgClassList[i]])) { alignClassName = alignClass[imgClassList[i]]; } } } imgElement.setAttribute('class', 'e-rte-image' + (isNOU(e.item.cssClass) ? '' : ' ' + e.item.cssClass) + (isNOU(alignClassName) ? '' : ' ' + alignClassName)); if (!isNOU(e.item.altText)) { imgElement.setAttribute('alt', e.item.altText.replace(/\.[a-zA-Z0-9]+$/, '')); } if (!isNOU(e.item.width) && !isNOU(e.item.width.width)) { imgElement.setAttribute('width', this.calculateStyleValue(e.item.width.width)); } if (!isNOU(e.item.height) && !isNOU(e.item.height.height)) { imgElement.setAttribute('height', this.calculateStyleValue(e.item.height.height)); } if (!isNOU(e.item.width) && !isNOU(e.item.width.minWidth)) { imgElement.style.minWidth = this.calculateStyleValue(e.item.width.minWidth); } if (!isNOU(e.item.width) && !isNOU(e.item.width.maxWidth)) { imgElement.style.maxWidth = this.calculateStyleValue(e.item.width.maxWidth); } if (!isNOU(e.item.height) && !isNOU(e.item.height.minHeight)) { imgElement.style.minHeight = this.calculateStyleValue(e.item.height.minHeight); } if (!isNOU(e.item.height) && !isNOU(e.item.height.maxHeight)) { imgElement.style.maxHeight = this.calculateStyleValue(e.item.height.maxHeight); } }; ImageCommand.prototype.calculateStyleValue = function (value) { var styleValue; if (typeof (value) === 'string') { if (value.indexOf('px') || value.indexOf('%') || value.indexOf('auto')) { styleValue = value; } else { styleValue = value + 'px'; } } else { styleValue = value + 'px'; } return styleValue; }; ImageCommand.prototype.insertImageLink = function (e) { var anchor = createElement('a', { attrs: { href: e.item.url } }); if (e.item.selectNode[0].parentElement.classList.contains('e-img-wrap')) { e.item.selection.restore(); anchor.setAttribute('contenteditable', 'true'); } anchor.appendChild(e.item.selectNode[0]); if (!isNOU(e.item.target)) { anchor.setAttribute('target', e.item.target); } if (!isNOU(e.item.ariaLabel)) { anchor.setAttribute('aria-label', e.item.ariaLabel); } InsertHtml.Insert(this.parent.currentDocument, anchor, this.parent.editableElement); this.callBack(e); }; ImageCommand.prototype.openImageLink = function (e) { document.defaultView.open(e.item.url, e.item.target); this.callBack(e); }; ImageCommand.prototype.removeImageLink = function (e) { var selectParent = e.item.selectParent[0]; if (selectParent.classList.contains('e-img-caption')) { var capImgWrap = select('.e-img-wrap', selectParent); var textEle = select('.e-img-inner', selectParent); var newTextEle = textEle.cloneNode(true); detach(select('a', selectParent)); detach(textEle); capImgWrap.appendChild(e.item.insertElement); capImgWrap.appendChild(newTextEle); } else { detach(selectParent); if (Browser.isIE && e.item.selection) { e.item.selection.restore(); } InsertHtml.Insert(this.parent.currentDocument, e.item.insertElement, this.parent.editableElement); } this.callBack(e); }; ImageCommand.prototype.editImageLink = function (e) { e.item.selectNode[0].parentElement.href = e.item.url; if (isNOU(e.item.target)) { e.item.selectNode[0].parentElement.removeAttribute('target'); e.item.selectNode[0].parentElement.removeAttribute('aria-label'); } else { e.item.selectNode[0].parentElement.target = e.item.target; e.item.selectNode[0].parentElement.setAttribute('aria-label', e.item.ariaLabel); } this.callBack(e); }; ImageCommand.prototype.removeImage = function (e) { if (closest(e.item.selectNode[0], 'a')) { if (e.item.selectNode[0].parentElement.nodeName === 'A' && !isNOU(e.item.selectNode[0].parentElement.innerText)) { if (!isNOU(closest(e.item.selectNode[0], '.' + classes.CLASS_CAPTION))) { detach(closest(e.item.selectNode[0], '.' + classes.CLASS_CAPTION)); } else { detach(e.item.selectNode[0]); } } else { detach(closest(e.item.selectNode[0], 'a')); } } else if (!isNOU(closest(e.item.selectNode[0], '.' + classes.CLASS_CAPTION))) { detach(closest(e.item.selectNode[0], '.' + classes.CLASS_CAPTION)); } else { var imgParentElem = e.item.selectNode[0].parentElement; detach(e.item.selectNode[0]); if (imgParentElem.childNodes.length === 0) { imgParentElem.appendChild(document.createElement('br')); } } this.callBack(e); }; ImageCommand.prototype.insertAltTextImage = function (e) { e.item.selectNode[0].setAttribute('alt', e.item.altText); this.callBack(e); }; ImageCommand.prototype.imageDimension = function (e) { var selectNode = e.item.selectNode[0]; selectNode.style.height = ''; selectNode.style.width = ''; if (e.item.width !== 'auto') { selectNode.style.width = formatUnit(e.item.width); } else { selectNode.removeAttribute('width'); } if (e.item.height !== 'auto') { selectNode.style.height = formatUnit(e.item.height); } else { selectNode.removeAttribute('height'); } this.callBack(e); }; ImageCommand.prototype.imageCaption = function (e) { InsertHtml.Insert(this.parent.currentDocument, e.item.insertElement, this.parent.editableElement); this.callBack(e); }; ImageCommand.prototype.imageJustifyLeft = function (e) { var selectNode = e.item.selectNode[0]; if (!isNOU(selectNode)) { selectNode.removeAttribute('class'); addClass([selectNode], 'e-rte-image'); if (!isNOU(closest(selectNode, '.' + classes.CLASS_CAPTION))) { removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_RIGHT); addClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_LEFT); } if (selectNode.parentElement.nodeName === 'A') { removeClass([selectNode.parentElement], classes.CLASS_IMAGE_RIGHT); addClass([selectNode.parentElement], classes.CLASS_IMAGE_LEFT); addClass([selectNode], classes.CLASS_IMAGE_LEFT); } else if (selectNode.parentElement.nextElementSibling != null) { addClass([selectNode], classes.CLASS_IMAGE_LEFT); selectNode.parentElement.nextElementSibling.style.clear = 'left'; } else { addClass([selectNode], classes.CLASS_IMAGE_LEFT); } this.callBack(e); } }; ImageCommand.prototype.imageJustifyCenter = function (e) { var selectNode = e.item.selectNode[0]; if (!isNOU(selectNode)) { selectNode.removeAttribute('class'); addClass([selectNode], 'e-rte-image'); if (!isNOU(closest(selectNode, '.' + classes.CLASS_CAPTION))) { removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_LEFT); removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_RIGHT); addClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_CENTER); } if (selectNode.parentElement.nodeName === 'A') { removeClass([selectNode.parentElement], classes.CLASS_IMAGE_LEFT); removeClass([selectNode.parentElement], classes.CLASS_IMAGE_RIGHT); addClass([selectNode.parentElement], classes.CLASS_IMAGE_CENTER); addClass([selectNode], classes.CLASS_IMAGE_CENTER); } else { addClass([selectNode], classes.CLASS_IMAGE_CENTER); } this.callBack(e); } }; ImageCommand.prototype.imageJustifyRight = function (e) { var selectNode = e.item.selectNode[0]; if (!isNOU(selectNode)) { selectNode.removeAttribute('class'); addClass([selectNode], 'e-rte-image'); if (!isNOU(closest(selectNode, '.' + classes.CLASS_CAPTION))) { removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_LEFT); addClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_RIGHT); } if (selectNode.parentElement.nodeName === 'A') { removeClass([selectNode.parentElement], classes.CLASS_IMAGE_LEFT); addClass([selectNode.parentElement], classes.CLASS_IMAGE_RIGHT); addClass([selectNode], classes.CLASS_IMAGE_RIGHT); } else if (selectNode.parentElement.nextElementSibling != null) { addClass([selectNode], classes.CLASS_IMAGE_RIGHT); selectNode.parentElement.nextElementSibling.style.clear = 'right'; } else { addClass([selectNode], classes.CLASS_IMAGE_RIGHT); } this.callBack(e); } }; ImageCommand.prototype.imageInline = function (e) { var selectNode = e.item.selectNode[0]; selectNode.removeAttribute('class'); addClass([selectNode], 'e-rte-image'); addClass([selectNode], classes.CLASS_IMAGE_INLINE); if (!isNOU(closest(selectNode, '.' + classes.CLASS_CAPTION))) { removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_BREAK); removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_CENTER); removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_LEFT); removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_RIGHT); addClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_CAPTION_INLINE); } this.callBack(e); }; ImageCommand.prototype.imageBreak = function (e) { var selectNode = e.item.selectNode[0]; selectNode.removeAttribute('class'); addClass([selectNode], classes.CLASS_IMAGE_BREAK); addClass([selectNode], 'e-rte-image'); if (!isNOU(closest(selectNode, '.' + classes.CLASS_CAPTION))) { removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_CAPTION_INLINE); removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_CENTER); removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_LEFT); removeClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_RIGHT); addClass([closest(selectNode, '.' + classes.CLASS_CAPTION)], classes.CLASS_IMAGE_BREAK); } this.callBack(e); }; ImageCommand.prototype.callBack = function (e) { if (e.callBack) { e.callBack({ requestType: e.item.subCommand, editorMode: 'HTML', event: e.event, range: this.parent.nodeSelection.getRange(this.parent.currentDocument), elements: this.parent.nodeSelection.getSelectedNodes(this.parent.currentDocument) }); } }; ImageCommand.prototype.destroy = function () { this.removeEventListener(); }; return ImageCommand; }()); export { ImageCommand };