truly-ui
Version:
Web Components for Desktop Applications.
526 lines (524 loc) • 81.5 kB
JavaScript
/*
MIT License
Copyright (c) 2019 Temainfo Software
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
import { Component, ElementRef, EventEmitter, Input, Optional, Output, Self, ViewChild, } from '@angular/core';
import { trigger, transition, style, animate } from '@angular/animations';
import { ToolbarConfigModel } from './model/toolbar-config.model';
import { Subscription } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "../i18n/i18n.service";
import * as i2 from "./services/editor.service";
import * as i3 from "@angular/platform-browser";
import * as i4 from "@angular/forms";
import * as i5 from "@angular/common";
import * as i6 from "../internals/components/label/label";
import * as i7 from "./parts/editor-link-box/editor-link-box";
import * as i8 from "./parts/editor-image-box/editor-image-box";
import * as i9 from "./parts/editor-header/editor-header";
export class TlEditor {
constructor(i18n, renderer, editorService, sanitizer, cd, ngControl) {
this.i18n = i18n;
this.renderer = renderer;
this.editorService = editorService;
this.sanitizer = sanitizer;
this.cd = cd;
this.ngControl = ngControl;
this.color = 'basic';
this.tags = [];
this.fields = [];
this.height = '300px';
this.labelPlacement = 'top';
this.labelSize = '100px';
this.label = '';
this.editable = true;
this.disabled = false;
this.saveContent = new EventEmitter();
this.fontCollection = [];
this.fontSizeCollection = [];
this.font = 'Arial';
this.fontSize = '3pt';
this.toggleLink = false;
this.toggleImage = false;
this.saved = false;
this.descriptionLink = '';
this.linkItself = '';
this.colorSelected = '#000000';
this.cursorHighlight = false;
this.selectedContent = false;
this.activeTools = {
bold: false,
italic: false,
underline: false,
listUnordered: false,
listOrdered: false,
alignLeft: false,
alignCenter: false,
alignRight: false,
alignJustify: false,
blockQuote: false
};
this.image = { imageUrl: '' };
this.selection = { start: 0, end: 0, baseNode: null, extentNode: null };
this.listenerRegistered = false;
this.subscription = new Subscription();
this.labelAddField = this.i18n.getLocale().Editor.labelAddField;
this.onChange = () => { };
this.onTouched = () => { };
this.setControl();
this.fontCollection = [
{ description: 'Arial', value: 'Arial' },
{ description: 'Verdana', value: 'Verdana' },
{ description: 'Calibri', value: 'Calibri' },
{ description: 'Courier New', value: 'Courier New' },
{ description: 'Georgia', value: 'Georgia' },
{ description: 'Trebuchet MS', value: 'Trebuchet MS' },
{ description: 'Bookman', value: 'Bookman' }
];
this.fontSizeCollection = [
{ description: '10', value: '1pt' },
{ description: '20', value: '2pt' },
{ description: '30', value: '3pt' },
{ description: '40', value: '4pt' },
{ description: '50', value: '5pt' },
{ description: '60', value: '6pt' },
{ description: '70', value: '7pt' }
];
}
get control() {
return this.ngControl?.control;
}
setControl() {
if (this.ngControl) {
this.ngControl.valueAccessor = this;
}
}
ngAfterContentInit() {
this.setContentFocus();
this.toolbarConfig = Object.assign(new ToolbarConfigModel(this.i18n), this.toolbarConfig);
}
handleFieldsPropagation() {
setTimeout(() => {
const fields = this.contentEditor.nativeElement.querySelectorAll('.ui-field');
for (const item of fields) {
this.preventPropagation(item);
}
}, 100);
}
alignContent(align) {
this.setContentFocus();
const element = this.cursorSelection.baseNode.parentNode;
const alignment = align === 'justifyFull' ? 'justify' : align.replace('justify', '').toLocaleLowerCase();
this.renderer.setStyle(element, 'text-align', alignment);
this.setCursorSelection();
}
setBold() {
this.setContentFocus();
document.execCommand('bold', false, null);
this.setCursorSelection();
}
setQuote() {
this.setContentFocus();
this.activeTools.blockQuote = !this.activeTools.blockQuote;
document.execCommand('formatBlock', false, this.activeTools.blockQuote ? 'blockquote' : 'div');
this.setCursorSelection();
}
setItalic() {
this.setContentFocus();
document.execCommand('italic', false, null);
this.setCursorSelection();
}
setUnorderedList() {
this.setContentFocus();
document.execCommand('insertUnorderedList', false, null);
this.setCursorSelection();
}
setOrderedList() {
this.setContentFocus();
document.execCommand('insertOrderedList', false, null);
this.setCursorSelection();
}
setImage($event) {
this.setContentFocus();
this.image.imageUrl = $event.imageUrl;
this.cursorSelection.getRangeAt(0).insertNode(this.createImageElement());
this.toggleImageBox();
}
setDescriptionLink() {
if (this.selectedContent) {
this.descriptionLink = this.anchorNodeCursor.baseNode.nodeValue.substring(this.selection.start, this.selection.end);
return;
}
this.descriptionLink = '';
}
addField(idField) {
this.recoverSelection();
this.setContentFocus();
this.cursorSelection.getRangeAt(0).insertNode(this.createFieldText(idField).nativeElement);
window.getSelection().collapseToEnd();
this.change();
}
addTag(value) {
this.setContentFocus();
this.cursorSelection.getRangeAt(0).insertNode(this.createHashTag(value).nativeElement);
window.getSelection().collapseToEnd();
this.change();
}
setLink($event) {
this.linkItself = $event.link;
this.descriptionLink = $event.description;
this.setContentFocus();
this.recoverSelection();
this.createElementLink();
this.toggleLinkBox();
}
setUnderline() {
this.setContentFocus();
document.execCommand('underline', false, null);
this.setCursorSelection();
}
setHighlight() {
this.wrapper.nativeElement.style.cursor = 'grabbing';
this.cursorHighlight = true;
}
onChangeColor($event) {
document.execCommand('foreColor', false, $event.hex);
}
onChangeFontSize($event) {
this.recoverSelection();
this.setContentFocus();
this.fontSize = $event;
document.execCommand('fontSize', null, this.fontSize);
}
onChangeFont($event) {
this.recoverSelection();
this.setContentFocus();
this.font = $event;
document.execCommand('fontName', false, this.font);
}
onMouseUp() {
this.toggleLink = false;
this.touch();
this.setAnchorNode();
if (this.cursorHighlight) {
document.execCommand('hiliteColor', false, '#f0ef99');
this.cursorHighlight = false;
this.resetCursor();
}
}
onKeyDownSave(event) {
if (this.contentEditor.nativeElement.innerHTML.length === 0 || this.contentEditor.nativeElement.innerHTML === '<br>') {
this.writeValue('<div><br></div>');
}
if ((event.ctrlKey || event.metaKey) && event.which === 83) {
event.preventDefault();
this.save();
return false;
}
}
toggleLinkBox() {
this.toggleLink = !this.toggleLink;
}
toggleImageBox() {
this.toggleImage = !this.toggleImage;
}
save() {
this.saveContent.emit(this.contentEditor.nativeElement.innerHTML);
this.showSavedMessage();
}
setCursorSelection() {
this.cursorSelection = window.getSelection();
if (this.cursorSelection.baseNode) {
this.handleActiveTools();
}
}
showSavedMessage() {
this.saved = true;
clearInterval(this.interval);
this.interval = setInterval(() => {
this.saved = false;
}, 1000);
}
handleActiveTools() {
this.handleClosestBold();
this.handleClosestItalic();
this.handleClosestUnderline();
this.handleColorParent();
this.handleListUnordered();
this.handleListOrdered();
this.handleAlignLeft();
this.handleAlignCenter();
this.handleAlignRight();
this.handleAlignJustify();
this.handleFontSize();
this.handleFontName();
this.handleBlockQuote();
}
handleFontName() {
this.isClosestParentElement('font') && this.hasFontFace()
? this.setFontNodeSelected() : this.setDefaultFont();
}
hasFontFace() {
return this.cursorSelection.baseNode.parentNode.closest('font').getAttribute('face');
}
hasFontSize() {
return this.cursorSelection.baseNode.parentNode.closest('font').getAttribute('size');
}
setFontNodeSelected() {
this.font = this.cursorSelection.baseNode.parentNode.closest('font').getAttribute('face');
}
setDefaultFont() {
this.font = 'Arial';
}
setFontSizeNodeSelected() {
this.fontSize = this.cursorSelection.baseNode.parentNode.closest('font').getAttribute('size') + 'pt';
}
setDefaultFontSize() {
this.fontSize = '3pt';
}
setAnchorNode() {
this.anchorNodeCursor = document.getSelection();
this.selection['start'] = this.anchorNodeCursor.baseOffset;
this.selection['end'] = this.anchorNodeCursor.extentOffset;
this.selection['baseNode'] = this.anchorNodeCursor.baseNode;
this.selection['extentNode'] = this.anchorNodeCursor.extentNode;
this.handleNoSelection();
}
handleNoSelection() {
this.selectedContent = this.hasSelection();
}
hasSelection() {
return (this.selection.end > 0) && (this.selection.end > this.selection.start);
}
handleFontSize() {
this.isClosestParentElement('font') && this.hasFontSize()
? this.setFontSizeNodeSelected() : this.setDefaultFontSize();
}
handleAlignLeft() {
this.activeTools.alignLeft = this.hasStyleParentElement('left');
}
handleAlignCenter() {
this.activeTools.alignCenter = this.hasStyleParentElement('center');
}
handleAlignRight() {
this.activeTools.alignRight = this.hasStyleParentElement('right');
}
handleAlignJustify() {
this.activeTools.alignJustify = this.hasStyleParentElement('justify');
}
handleListOrdered() {
this.activeTools.listOrdered = this.isClosestParentElement('ol');
}
handleListUnordered() {
this.activeTools.listUnordered = this.isClosestParentElement('ul');
}
handleColorParent() {
const getElementFont = this.cursorSelection.baseNode.parentNode.closest('font');
getElementFont ? this.setColorWithColorElement(getElementFont) : this.colorSelected = '#000000';
}
setColorWithColorElement(getElementFont) {
this.colorSelected = getElementFont.getAttribute('color');
}
handleClosestBold() {
this.activeTools.bold = this.isClosestParentElement('b');
}
handleClosestUnderline() {
this.activeTools.underline = this.isClosestParentElement('u');
}
handleClosestItalic() {
this.activeTools.italic = this.isClosestParentElement('i');
}
handleBlockQuote() {
this.activeTools.blockQuote = this.isClosestParentElement('blockquote');
}
hasStyleParentElement(alignment) {
const element = this.cursorSelection.baseNode.parentNode;
if (element.attributes.length > 0) {
return element.attributes[0].value.includes(alignment);
}
return false;
}
isClosestParentElement(element) {
return !!this.cursorSelection.baseNode.parentNode.closest(element);
}
preventPropagation(fieldText) {
this.listenerRegistered = true;
fieldText.addEventListener('input', (e) => {
e.target.setAttribute('value', e.target.value);
});
fieldText.addEventListener('keydown', (e) => {
e.stopPropagation();
});
}
createFieldText(idField) {
const fieldText = new ElementRef(this.renderer.createElement('input'));
this.renderer.addClass(fieldText.nativeElement, 'ui-field');
this.preventPropagation(fieldText.nativeElement);
fieldText.nativeElement.setAttribute('id', idField);
fieldText.nativeElement.placeholder = '';
return fieldText;
}
createHashTag(value) {
const hashTag = new ElementRef(this.renderer.createElement('span'));
this.renderer.addClass(hashTag.nativeElement, 'ui-hashtag');
hashTag.nativeElement.innerText = value;
hashTag.nativeElement.setAttribute('id', value);
hashTag.nativeElement.setAttribute('contenteditable', false);
return hashTag;
}
createImageElement() {
const imageHTML = new ElementRef(this.renderer.createElement('img'));
this.renderer.addClass(imageHTML.nativeElement, 'ui-image-editor');
imageHTML.nativeElement.setAttribute('src', this.image.imageUrl);
return imageHTML.nativeElement;
}
createElementLink() {
const link = new ElementRef(this.renderer.createElement('a'));
this.renderer.addClass(link.nativeElement, 'ui-link');
link.nativeElement.setAttribute('src', this.linkItself);
link.nativeElement.setAttribute('text', this.descriptionLink);
link.nativeElement.setAttribute('target', '_blank');
this.handleAddElementRange(link);
}
handleAddElementRange(link) {
this.selectedContent ? window.getSelection().getRangeAt(0).surroundContents(link.nativeElement) :
window.getSelection().getRangeAt(0).insertNode(link.nativeElement);
}
recoverSelection() {
const selection = document.getSelection();
const range = document.createRange();
if (this.selection.baseNode) {
range.setStart(this.selection.baseNode, this.selection.start);
range.setEnd(this.selection.extentNode, this.selection.end);
selection.removeAllRanges();
selection.addRange(range);
}
}
recoverCursorPosition() {
setTimeout(() => {
const sel = document.getSelection();
const range = new Range();
if (this.selection.baseNode) {
range.selectNodeContents(this.contentEditor.nativeElement);
range.collapse(false);
sel.removeAllRanges();
sel.addRange(range);
}
}, 1);
}
resetCursor() {
this.wrapper.nativeElement.style.cursor = 'auto';
}
setContentFocus() {
this.contentEditor.nativeElement.focus();
}
clearContent() {
this.writeValue('');
this.save();
}
writeValue(value) {
this.content = this.sanitizer.bypassSecurityTrustHtml(value);
this.handleFieldsPropagation();
this.recoverCursorPosition();
this.cd.detectChanges();
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
touch() {
this.onTouched(this.contentEditor.nativeElement.innerHTML);
}
change() {
this.setCursorSelection();
this.onChange(this.contentEditor.nativeElement.innerHTML);
}
ngOnChanges(data) {
}
}
/** @nocollapse */ TlEditor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlEditor, deps: [{ token: i1.I18nService }, { token: i0.Renderer2 }, { token: i2.EditorService }, { token: i3.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: i4.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TlEditor.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlEditor, selector: "tl-editor", inputs: { content: "content", color: "color", tags: "tags", fields: "fields", toolbarConfig: "toolbarConfig", height: "height", labelPlacement: "labelPlacement", labelSize: "labelSize", label: "label", editable: "editable", disabled: "disabled" }, outputs: { saveContent: "saveContent" }, viewQueries: [{ propertyName: "contentEditor", first: true, predicate: ["contentEditor"], descendants: true, static: true }, { propertyName: "linkBox", first: true, predicate: ["linkBox"], descendants: true, static: true }, { propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, static: true }, { propertyName: "fieldTemplate", first: true, predicate: ["fieldTemplate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ui-editor\">\n <tl-label *ngIf=\"label\" [labelTitle]=\"label\" [labelSize]=\"labelSize\" [labelPlacement]=\"labelPlacement\"></tl-label>\n <div [class]=\"'ui-editor-wrapper ' + color\" #wrapper>\n <tl-editor-header [toolbarConfig]=\"toolbarConfig\"\n [activeTools]=\"activeTools\"\n [cursorHighlight]=\"cursorHighlight\"\n [labelAddField]=\"labelAddField\"\n [fields]=\"fields\"\n [color]=\"color\"\n [colorSelected]=\"colorSelected\"\n [fontSelected]=\"font\"\n [fontSizeSelected]=\"fontSize\"\n [fontCollection]=\"fontCollection\"\n [fontSizeCollection]=\"fontSizeCollection\"\n (changeColor)=\"onChangeColor($event)\"\n (changeFont)=\"onChangeFont($event)\"\n (changeFontSize)=\"onChangeFontSize($event)\"\n (clickBold)=\"setBold()\"\n (clickItalic)=\"setItalic()\"\n (clickHighlight)=\"setHighlight()\"\n (clickOrderedList)=\"setOrderedList()\"\n (clickAlignContent)=\"alignContent($event)\"\n (clickLink)=\"toggleLinkBox(); setDescriptionLink()\"\n (clickUnorderedList)=\"setUnorderedList()\"\n (clickUnderline)=\"setUnderline()\"\n (clickImage)=\"toggleImageBox()\"\n (clickField)=\"addField($event)\"\n (clickQuote)=\"setQuote()\"\n (clickSave)=\"save()\"\n (clickClear)=\"clearContent()\">\n </tl-editor-header>\n <div #contentEditor\n class=\"ui-editor-content\"\n [class.disabled]=\"disabled\"\n [style.height]=\"height\"\n (input)=\"change()\"\n (focusout)=\"setAnchorNode()\"\n (click)=\"setCursorSelection()\"\n (focus)=\"setCursorSelection()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.ArrowUp)=\"$event.stopPropagation()\"\n (keydown.ArrowDown)=\"$event.stopPropagation()\"\n (mouseup)=\"onMouseUp()\"\n [attr.contenteditable]=\"editable || !disabled\"\n [innerHTML]=\"content\">\n </div>\n <div class=\"ui-saved-content-message\" [@enterAnimation]=\"saved\" *ngIf=\"saved\">\n <i class=\"ion-ios-checkmark-outline\"></i>\n <span>Saved !</span>\n </div>\n <tl-editor-link-box [descriptionLink]=\"descriptionLink\"\n *ngIf=\"toggleLink && !toggleImage\"\n (onSetLink)=\"setLink($event)\"\n (onToggleLink)=\"toggleLinkBox()\">\n </tl-editor-link-box>\n <tl-editor-image-box *ngIf=\"toggleImage && !toggleLink\"\n [imageUrl]=\"image.imageUrl\"\n (onSetImage)=\"setImage($event)\"\n (onToggleImage)=\"toggleImageBox()\">\n </tl-editor-image-box>\n <div class=\"ui-editor-footer\" *ngIf=\"tags.length > 0\">\n <div *ngFor=\"let item of tags\" (click)=\"addTag(item)\" class=\"ui-hashtag\">{{ item }}</div>\n </div>\n </div>\n</div>\n", styles: ["*{box-sizing:border-box}:host{width:100%}.ui-editor-footer{display:flex;align-items:flex-start;height:auto;width:100%;background:#e9e9e9;overflow:auto}.ui-editor-footer::-webkit-scrollbar{height:4px;width:0}.ui-editor{width:100%}.ui-link{text-decoration:underline}.ui-editor-wrapper{width:100%;height:100%;position:relative;overflow:hidden}.ui-image-editor{padding:10px;box-sizing:border-box}.ui-image-editor:hover{cursor:pointer}.ui-saved-content-message{position:absolute;top:0;right:0;background:#333;padding:10px;box-sizing:border-box;-webkit-user-select:none;user-select:none;display:grid;grid-template-columns:25px 1fr;text-align:center;border-top-left-radius:0;border-bottom-left-radius:20px}.ui-color-component{position:absolute;height:12px;border:0;top:25px}.ui-editor-content{height:300px;overflow:auto;padding:10px;box-sizing:border-box;outline:none;word-break:break-word;cursor:text}.ui-editor-content.disabled{pointer-events:none;opacity:.5}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.TlLabel, selector: "tl-label", inputs: ["labelPlacement", "required", "labelSize", "labelTitle"] }, { kind: "component", type: i7.TlEditorLinkBox, selector: "tl-editor-link-box", inputs: ["descriptionLink"], outputs: ["onSetLink", "onToggleLink"] }, { kind: "component", type: i8.TlEditorImageBox, selector: "tl-editor-image-box", inputs: ["imageUrl"], outputs: ["onSetImage", "onToggleImage"] }, { kind: "component", type: i9.TlEditorHeader, selector: "tl-editor-header", inputs: ["toolbarConfig", "cursorHighlight", "fontSizeCollection", "fontCollection", "fields", "color", "activeTools", "colorSelected", "fontSelected", "fontSizeSelected", "labelAddField"], outputs: ["changeColor", "changeFont", "changeFontSize", "clickUnderline", "clickItalic", "clickBold", "clickHighlight", "clickAlignContent", "clickUnorderedList", "clickOrderedList", "clickLink", "clickImage", "clickQuote", "clickClear", "clickSave", "clickField"] }], animations: [
trigger('enterAnimation', [
transition(':enter', [
style({ transform: 'translateX(100%)', opacity: 0 }),
animate('250ms', style({ transform: 'translateX(0)', opacity: 1 }))
]),
transition(':leave', [
style({ transform: 'translateX(0)', opacity: 1 }),
animate('250ms', style({ transform: 'translateX(100%)', opacity: 0 }))
])
])
] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlEditor, decorators: [{
type: Component,
args: [{ selector: 'tl-editor', animations: [
trigger('enterAnimation', [
transition(':enter', [
style({ transform: 'translateX(100%)', opacity: 0 }),
animate('250ms', style({ transform: 'translateX(0)', opacity: 1 }))
]),
transition(':leave', [
style({ transform: 'translateX(0)', opacity: 1 }),
animate('250ms', style({ transform: 'translateX(100%)', opacity: 0 }))
])
])
], template: "<div class=\"ui-editor\">\n <tl-label *ngIf=\"label\" [labelTitle]=\"label\" [labelSize]=\"labelSize\" [labelPlacement]=\"labelPlacement\"></tl-label>\n <div [class]=\"'ui-editor-wrapper ' + color\" #wrapper>\n <tl-editor-header [toolbarConfig]=\"toolbarConfig\"\n [activeTools]=\"activeTools\"\n [cursorHighlight]=\"cursorHighlight\"\n [labelAddField]=\"labelAddField\"\n [fields]=\"fields\"\n [color]=\"color\"\n [colorSelected]=\"colorSelected\"\n [fontSelected]=\"font\"\n [fontSizeSelected]=\"fontSize\"\n [fontCollection]=\"fontCollection\"\n [fontSizeCollection]=\"fontSizeCollection\"\n (changeColor)=\"onChangeColor($event)\"\n (changeFont)=\"onChangeFont($event)\"\n (changeFontSize)=\"onChangeFontSize($event)\"\n (clickBold)=\"setBold()\"\n (clickItalic)=\"setItalic()\"\n (clickHighlight)=\"setHighlight()\"\n (clickOrderedList)=\"setOrderedList()\"\n (clickAlignContent)=\"alignContent($event)\"\n (clickLink)=\"toggleLinkBox(); setDescriptionLink()\"\n (clickUnorderedList)=\"setUnorderedList()\"\n (clickUnderline)=\"setUnderline()\"\n (clickImage)=\"toggleImageBox()\"\n (clickField)=\"addField($event)\"\n (clickQuote)=\"setQuote()\"\n (clickSave)=\"save()\"\n (clickClear)=\"clearContent()\">\n </tl-editor-header>\n <div #contentEditor\n class=\"ui-editor-content\"\n [class.disabled]=\"disabled\"\n [style.height]=\"height\"\n (input)=\"change()\"\n (focusout)=\"setAnchorNode()\"\n (click)=\"setCursorSelection()\"\n (focus)=\"setCursorSelection()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.ArrowUp)=\"$event.stopPropagation()\"\n (keydown.ArrowDown)=\"$event.stopPropagation()\"\n (mouseup)=\"onMouseUp()\"\n [attr.contenteditable]=\"editable || !disabled\"\n [innerHTML]=\"content\">\n </div>\n <div class=\"ui-saved-content-message\" [@enterAnimation]=\"saved\" *ngIf=\"saved\">\n <i class=\"ion-ios-checkmark-outline\"></i>\n <span>Saved !</span>\n </div>\n <tl-editor-link-box [descriptionLink]=\"descriptionLink\"\n *ngIf=\"toggleLink && !toggleImage\"\n (onSetLink)=\"setLink($event)\"\n (onToggleLink)=\"toggleLinkBox()\">\n </tl-editor-link-box>\n <tl-editor-image-box *ngIf=\"toggleImage && !toggleLink\"\n [imageUrl]=\"image.imageUrl\"\n (onSetImage)=\"setImage($event)\"\n (onToggleImage)=\"toggleImageBox()\">\n </tl-editor-image-box>\n <div class=\"ui-editor-footer\" *ngIf=\"tags.length > 0\">\n <div *ngFor=\"let item of tags\" (click)=\"addTag(item)\" class=\"ui-hashtag\">{{ item }}</div>\n </div>\n </div>\n</div>\n", styles: ["*{box-sizing:border-box}:host{width:100%}.ui-editor-footer{display:flex;align-items:flex-start;height:auto;width:100%;background:#e9e9e9;overflow:auto}.ui-editor-footer::-webkit-scrollbar{height:4px;width:0}.ui-editor{width:100%}.ui-link{text-decoration:underline}.ui-editor-wrapper{width:100%;height:100%;position:relative;overflow:hidden}.ui-image-editor{padding:10px;box-sizing:border-box}.ui-image-editor:hover{cursor:pointer}.ui-saved-content-message{position:absolute;top:0;right:0;background:#333;padding:10px;box-sizing:border-box;-webkit-user-select:none;user-select:none;display:grid;grid-template-columns:25px 1fr;text-align:center;border-top-left-radius:0;border-bottom-left-radius:20px}.ui-color-component{position:absolute;height:12px;border:0;top:25px}.ui-editor-content{height:300px;overflow:auto;padding:10px;box-sizing:border-box;outline:none;word-break:break-word;cursor:text}.ui-editor-content.disabled{pointer-events:none;opacity:.5}\n"] }]
}], ctorParameters: function () { return [{ type: i1.I18nService }, { type: i0.Renderer2 }, { type: i2.EditorService }, { type: i3.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: i4.NgControl, decorators: [{
type: Optional
}, {
type: Self
}] }]; }, propDecorators: { content: [{
type: Input
}], color: [{
type: Input
}], tags: [{
type: Input
}], fields: [{
type: Input
}], toolbarConfig: [{
type: Input
}], height: [{
type: Input
}], labelPlacement: [{
type: Input
}], labelSize: [{
type: Input
}], label: [{
type: Input
}], editable: [{
type: Input
}], disabled: [{
type: Input
}], contentEditor: [{
type: ViewChild,
args: ['contentEditor', { static: true }]
}], linkBox: [{
type: ViewChild,
args: ['linkBox', { static: true }]
}], wrapper: [{
type: ViewChild,
args: ['wrapper', { static: true }]
}], fieldTemplate: [{
type: ViewChild,
args: ['fieldTemplate', { static: true }]
}], saveContent: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvZWRpdG9yL2VkaXRvci50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2VkaXRvci9lZGl0b3IuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNNLFFBQVEsRUFDbkIsTUFBTSxFQUNLLElBQUksRUFFZixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBS2hFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7O0FBdUJsQyxNQUFNLE9BQU8sUUFBUTtJQTJGbkIsWUFBb0IsSUFBaUIsRUFDakIsUUFBbUIsRUFDbkIsYUFBNEIsRUFDNUIsU0FBdUIsRUFDdkIsRUFBcUIsRUFDRixTQUFvQjtRQUx2QyxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUN2QixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNGLGNBQVMsR0FBVCxTQUFTLENBQVc7UUE1RmxELFVBQUssR0FBRyxPQUFPLENBQUM7UUFFaEIsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUVWLFdBQU0sR0FBbUIsRUFBRSxDQUFDO1FBSTVCLFdBQU0sR0FBRyxPQUFPLENBQUM7UUFFakIsbUJBQWMsR0FB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