@kolkov/angular-editor 1.1.5 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../projects/angular-editor/src/lib/angular-editor.service.ts","../../../projects/angular-editor/src/lib/config.ts","../../../projects/angular-editor/src/lib/utils.ts","../../../projects/angular-editor/src/lib/angular-editor.component.ts","../../../node_modules/tslib/tslib.es6.js","../../../projects/angular-editor/src/lib/angular-editor-toolbar.component.ts","../../../projects/angular-editor/src/lib/ae-select/ae-select.component.ts","../../../projects/angular-editor/src/lib/angular-editor.module.ts"],"names":["AngularEditorService","http","doc","_this","this","saveSelection","getSelection","sel","getRangeAt","rangeCount","savedSelection","selectedText","toString","createRange","document","prototype","executeCommand","command","includes","execCommand","createLink","url","newUrl","insertHtml","insertColor","color","where","restoreSelection","setFontName","fontName","setFontSize","fontSize","html","Error","removeAllRanges","addRange","executeInNextQueueIteration","callbackFn","timeout","setTimeout","checkSelection","length","uploadImage","file","uploadData","FormData","append","name","post","uploadUrl","reportProgress","observe","withCredentials","uploadWithCredentials","insertImage","imageUrl","setDefaultParagraphSeparator","separator","createCustomClass","customClass","newTag","tagName","tag","class","insertVideo","videoUrl","match","insertYouTubeVideoTag","insertVimeoVideoTag","id","split","thumbnail","sub","get","subscribe","data","thumbnail_url_with_play_button","title","unsubscribe","nextNode","node","hasChildNodes","firstChild","nextSibling","parentNode","getRangeSelectedNodes","range","includePartiallySelectedContainers","startContainer","endNode","endContainer","rangeNodes","push","commonAncestorContainer","unshift","getSelectedNodes","nodes","i","len","apply","replaceWithOwnChildren","el","parent","insertBefore","removeChild","removeSelectedElements","tagNames","tagNamesArray","toLowerCase","forEach","nodeType","indexOf","Injectable","HttpClient","Inject","args","DOCUMENT","angularEditorConfig","editable","spellcheck","height","minHeight","maxHeight","width","minWidth","translate","enableToolbar","showToolbar","placeholder","defaultParagraphSeparator","defaultFontName","defaultFontSize","fonts","sanitize","toolbarPosition","outline","isDefined","value","AngularEditorComponent","r","editorService","sanitizer","cdRef","defaultTabIndex","autoFocus","modeVisual","showPlaceholder","disabled","focused","touched","changed","config","viewMode","EventEmitter","blurEvent","focusEvent","tabindex","parsedTabIndex","Number","tabIndex","onFocus","focus","ngOnInit","ngAfterViewInit","toggleEditorMode","getCustomTags","onContentChange","textArea","nativeElement","exec","onTextAreaFocus","event","stopPropagation","emit","configure","onTextAreaMouseOut","onTextAreaBlur","onTouched","relatedTarget","parentElement","classList","contains","getElementById","element","innerHTML","innerText","onChange","undefined","SecurityContext","HTML","togglePlaceholder","registerOnChange","fn","e","registerOnTouched","writeValue","refreshView","normalizedValue","setProperty","removeClass","editorWrapper","addClass","setDisabledState","isDisabled","div","action","bToSource","oContent","editableElement","createText","oPre","createElement","setStyle","oCode","appendChild","focusInstance","listen","blurInstance","querySelectorAll","selectNodeContents","editorToolbar","setEditorMode","userSelection","triggerButtons","a","focusNode","els","triggerBlocks","getFonts","map","x","label","tags","customClasses","join","ngOnDestroy","filterStyles","replace","Component","selector","template","providers","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","Renderer2","DomSanitizer","ChangeDetectorRef","Attribute","Input","Output","ViewChild","static","HostBinding","HostListener","Object","create","__values","o","s","Symbol","iterator","m","call","next","done","TypeError","AngularEditorToolbarComponent","er","htmlMode","linkSelected","block","headings","fontSizes","customClassId","customClassList","tagMap","BLOCKQUOTE","A","select","buttons","execute","defineProperty","classes","_customClasses","Boolean","triggerCommand","result","queryCommandState","elementById","findIndex","nodeName","found","y","find","index","Element","className","keys","foreColour","queryCommandValue","backColor","insertUrl","selection","href","prompt","foreColor","toggleEditorModeButton","onFileChanged","target","files","type","HttpResponse","body","srcElement","reader","FileReader","onload","fr","currentTarget","readAsDataURL","setCustomClass","classId","isButtonHidden","hiddenButtons","Array","_b","_c","arr","item","console","log","ElementRef","AeSelectComponent","elRef","options","optionId","opened","hidden","changeEvent","selectedOption","hasOwnProperty","isHidden","hide","optionSelect","option","setValue","toggleOpen","onClick","$event","close","selectedEl","labelButton","handleKeyDown","key","_handleArrowDown","_handleArrowUp","_handleSpace","_handleEnter","_handleTab","preventDefault","_handleBackspace","encapsulation","ViewEncapsulation","None","NgModule","imports","CommonModule","FormsModule","ReactiveFormsModule","declarations","exports"],"mappings":"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","sourcesContent":["import {Inject, Injectable} from '@angular/core';\r\nimport {HttpClient, HttpEvent} from '@angular/common/http';\r\nimport {Observable} from 'rxjs';\r\nimport {DOCUMENT} from '@angular/common';\r\nimport {CustomClass} from './config';\r\n\r\nexport interface UploadResponse {\r\n imageUrl: string;\r\n}\r\n\r\n@Injectable()\r\nexport class AngularEditorService {\r\n\r\n savedSelection: Range | null;\r\n selectedText: string;\r\n uploadUrl: string;\r\n uploadWithCredentials: boolean;\r\n\r\n constructor(\r\n private http: HttpClient,\r\n @Inject(DOCUMENT) private doc: any\r\n ) { }\r\n\r\n /**\r\n * Executed command from editor header buttons exclude toggleEditorMode\r\n * @param command string from triggerCommand\r\n */\r\n executeCommand(command: string) {\r\n const commands = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'pre'];\r\n if (commands.includes(command)) {\r\n this.doc.execCommand('formatBlock', false, command);\r\n return;\r\n }\r\n this.doc.execCommand(command, false, null);\r\n }\r\n\r\n /**\r\n * Create URL link\r\n * @param url string from UI prompt\r\n */\r\n createLink(url: string) {\r\n if (!url.includes('http')) {\r\n this.doc.execCommand('createlink', false, url);\r\n } else {\r\n const newUrl = '<a href=\"' + url + '\" target=\"_blank\">' + this.selectedText + '</a>';\r\n this.insertHtml(newUrl);\r\n }\r\n }\r\n\r\n /**\r\n * insert color either font or background\r\n *\r\n * @param color color to be inserted\r\n * @param where where the color has to be inserted either text/background\r\n */\r\n insertColor(color: string, where: string): void {\r\n const restored = this.restoreSelection();\r\n if (restored) {\r\n if (where === 'textColor') {\r\n this.doc.execCommand('foreColor', false, color);\r\n } else {\r\n this.doc.execCommand('hiliteColor', false, color);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set font name\r\n * @param fontName string\r\n */\r\n setFontName(fontName: string) {\r\n this.doc.execCommand('fontName', false, fontName);\r\n }\r\n\r\n /**\r\n * Set font size\r\n * @param fontSize string\r\n */\r\n setFontSize(fontSize: string) {\r\n this.doc.execCommand('fontSize', false, fontSize);\r\n }\r\n\r\n /**\r\n * Create raw HTML\r\n * @param html HTML string\r\n */\r\n insertHtml(html: string): void {\r\n\r\n const isHTMLInserted = this.doc.execCommand('insertHTML', false, html);\r\n\r\n if (!isHTMLInserted) {\r\n throw new Error('Unable to perform the operation');\r\n }\r\n }\r\n\r\n /**\r\n * save selection when the editor is focussed out\r\n */\r\n public saveSelection = (): void => {\r\n if (this.doc.getSelection) {\r\n const sel = this.doc.getSelection();\r\n if (sel.getRangeAt && sel.rangeCount) {\r\n this.savedSelection = sel.getRangeAt(0);\r\n this.selectedText = sel.toString();\r\n }\r\n } else if (this.doc.getSelection && this.doc.createRange) {\r\n this.savedSelection = document.createRange();\r\n } else {\r\n this.savedSelection = null;\r\n }\r\n }\r\n\r\n /**\r\n * restore selection when the editor is focused in\r\n *\r\n * saved selection when the editor is focused out\r\n */\r\n restoreSelection(): boolean {\r\n if (this.savedSelection) {\r\n if (this.doc.getSelection) {\r\n const sel = this.doc.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(this.savedSelection);\r\n return true;\r\n } else if (this.doc.getSelection /*&& this.savedSelection.select*/) {\r\n // this.savedSelection.select();\r\n return true;\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * setTimeout used for execute 'saveSelection' method in next event loop iteration\r\n */\r\n public executeInNextQueueIteration(callbackFn: (...args: any[]) => any, timeout = 1e2): void {\r\n setTimeout(callbackFn, timeout);\r\n }\r\n\r\n /** check any selection is made or not */\r\n private checkSelection(): any {\r\n\r\n const selectedText = this.savedSelection.toString();\r\n\r\n if (selectedText.length === 0) {\r\n throw new Error('No Selection Made');\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Upload file to uploadUrl\r\n * @param file The file\r\n */\r\n uploadImage(file: File): Observable<HttpEvent<UploadResponse>> {\r\n\r\n const uploadData: FormData = new FormData();\r\n\r\n uploadData.append('file', file, file.name);\r\n\r\n return this.http.post<UploadResponse>(this.uploadUrl, uploadData, {\r\n reportProgress: true,\r\n observe: 'events',\r\n withCredentials: this.uploadWithCredentials,\r\n });\r\n }\r\n\r\n /**\r\n * Insert image with Url\r\n * @param imageUrl The imageUrl.\r\n */\r\n insertImage(imageUrl: string) {\r\n this.doc.execCommand('insertImage', false, imageUrl);\r\n }\r\n\r\n setDefaultParagraphSeparator(separator: string) {\r\n this.doc.execCommand('defaultParagraphSeparator', false, separator);\r\n }\r\n\r\n createCustomClass(customClass: CustomClass) {\r\n let newTag = this.selectedText;\r\n if (customClass) {\r\n const tagName = customClass.tag ? customClass.tag : 'span';\r\n newTag = '<' + tagName + ' class=\"' + customClass.class + '\">' + this.selectedText + '</' + tagName + '>';\r\n }\r\n this.insertHtml(newTag);\r\n }\r\n\r\n insertVideo(videoUrl: string) {\r\n if (videoUrl.match('www.youtube.com')) {\r\n this.insertYouTubeVideoTag(videoUrl);\r\n }\r\n if (videoUrl.match('vimeo.com')) {\r\n this.insertVimeoVideoTag(videoUrl);\r\n }\r\n }\r\n\r\n private insertYouTubeVideoTag(videoUrl: string): void {\r\n const id = videoUrl.split('v=')[1];\r\n const imageUrl = `https://img.youtube.com/vi/${id}/0.jpg`;\r\n const thumbnail = `\r\n <div style='position: relative'>\r\n <img style='position: absolute; left:200px; top:140px'\r\n src=\"https://img.icons8.com/color/96/000000/youtube-play.png\"/>\r\n <a href='${videoUrl}' target='_blank'>\r\n <img src=\"${imageUrl}\" alt=\"click to watch\"/>\r\n </a>\r\n </div>`;\r\n this.insertHtml(thumbnail);\r\n }\r\n\r\n private insertVimeoVideoTag(videoUrl: string): void {\r\n const sub = this.http.get<any>(`https://vimeo.com/api/oembed.json?url=${videoUrl}`).subscribe(data => {\r\n const imageUrl = data.thumbnail_url_with_play_button;\r\n const thumbnail = `<div>\r\n <a href='${videoUrl}' target='_blank'>\r\n <img src=\"${imageUrl}\" alt=\"${data.title}\"/>\r\n </a>\r\n </div>`;\r\n this.insertHtml(thumbnail);\r\n sub.unsubscribe();\r\n });\r\n }\r\n\r\n nextNode(node) {\r\n if (node.hasChildNodes()) {\r\n return node.firstChild;\r\n } else {\r\n while (node && !node.nextSibling) {\r\n node = node.parentNode;\r\n }\r\n if (!node) {\r\n return null;\r\n }\r\n return node.nextSibling;\r\n }\r\n }\r\n\r\n getRangeSelectedNodes(range, includePartiallySelectedContainers) {\r\n let node = range.startContainer;\r\n const endNode = range.endContainer;\r\n let rangeNodes = [];\r\n\r\n // Special case for a range that is contained within a single node\r\n if (node === endNode) {\r\n rangeNodes = [node];\r\n } else {\r\n // Iterate nodes until we hit the end container\r\n while (node && node !== endNode) {\r\n rangeNodes.push( node = this.nextNode(node) );\r\n }\r\n\r\n // Add partially selected nodes at the start of the range\r\n node = range.startContainer;\r\n while (node && node !== range.commonAncestorContainer) {\r\n rangeNodes.unshift(node);\r\n node = node.parentNode;\r\n }\r\n }\r\n\r\n // Add ancestors of the range container, if required\r\n if (includePartiallySelectedContainers) {\r\n node = range.commonAncestorContainer;\r\n while (node) {\r\n rangeNodes.push(node);\r\n node = node.parentNode;\r\n }\r\n }\r\n\r\n return rangeNodes;\r\n }\r\n\r\n getSelectedNodes() {\r\n const nodes = [];\r\n if (this.doc.getSelection) {\r\n const sel = this.doc.getSelection();\r\n for (let i = 0, len = sel.rangeCount; i < len; ++i) {\r\n nodes.push.apply(nodes, this.getRangeSelectedNodes(sel.getRangeAt(i), true));\r\n }\r\n }\r\n return nodes;\r\n }\r\n\r\n replaceWithOwnChildren(el) {\r\n const parent = el.parentNode;\r\n while (el.hasChildNodes()) {\r\n parent.insertBefore(el.firstChild, el);\r\n }\r\n parent.removeChild(el);\r\n }\r\n\r\n removeSelectedElements(tagNames) {\r\n const tagNamesArray = tagNames.toLowerCase().split(',');\r\n this.getSelectedNodes().forEach((node) => {\r\n if (node.nodeType === 1 &&\r\n tagNamesArray.indexOf(node.tagName.toLowerCase()) > -1) {\r\n // Remove the node and replace it with its children\r\n this.replaceWithOwnChildren(node);\r\n }\r\n });\r\n }\r\n}\r\n","export interface CustomClass {\r\n name: string;\r\n class: string;\r\n tag?: string;\r\n}\r\n\r\nexport interface Font {\r\n name: string;\r\n class: string;\r\n}\r\n\r\nexport interface AngularEditorConfig {\r\n editable?: boolean;\r\n spellcheck?: boolean;\r\n height?: 'auto' | string;\r\n minHeight?: '0' | string;\r\n maxHeight?: 'auto' | string;\r\n width?: 'auto' | string;\r\n minWidth?: '0' | string;\r\n translate?: 'yes' | 'now' | string;\r\n enableToolbar?: boolean;\r\n showToolbar?: boolean;\r\n placeholder?: string;\r\n defaultParagraphSeparator?: string;\r\n defaultFontName?: string;\r\n defaultFontSize?: '1' | '2' | '3' | '4' | '5' | '6' | '7' | string;\r\n uploadUrl?: string;\r\n uploadWithCredentials?: boolean;\r\n fonts?: Font[];\r\n customClasses?: CustomClass[];\r\n sanitize?: boolean;\r\n toolbarPosition?: 'top' | 'bottom';\r\n outline?: boolean;\r\n toolbarHiddenButtons?: string[][];\r\n}\r\n\r\nexport const angularEditorConfig: AngularEditorConfig = {\r\n editable: true,\r\n spellcheck: true,\r\n height: 'auto',\r\n minHeight: '0',\r\n maxHeight: 'auto',\r\n width: 'auto',\r\n minWidth: '0',\r\n translate: 'yes',\r\n enableToolbar: true,\r\n showToolbar: true,\r\n placeholder: 'Enter text here...',\r\n defaultParagraphSeparator: '',\r\n defaultFontName: '',\r\n defaultFontSize: '',\r\n fonts: [\r\n {class: 'arial', name: 'Arial'},\r\n {class: 'times-new-roman', name: 'Times New Roman'},\r\n {class: 'calibri', name: 'Calibri'},\r\n {class: 'comic-sans-ms', name: 'Comic Sans MS'}\r\n ],\r\n uploadUrl: 'v1/image',\r\n uploadWithCredentials: false,\r\n sanitize: true,\r\n toolbarPosition: 'top',\r\n outline: true,\r\n /*toolbarHiddenButtons: [\r\n ['bold', 'italic', 'underline', 'strikeThrough', 'superscript', 'subscript'],\r\n ['heading', 'fontName', 'fontSize', 'color'],\r\n ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'indent', 'outdent'],\r\n ['cut', 'copy', 'delete', 'removeFormat', 'undo', 'redo'],\r\n ['paragraph', 'blockquote', 'removeBlockquote', 'horizontalLine', 'orderedList', 'unorderedList'],\r\n ['link', 'unlink', 'image', 'video']\r\n ]*/\r\n};\r\n","export function isDefined(value: any) {\r\n return value !== undefined && value !== null;\r\n}\r\n","import {\r\n AfterViewInit,\r\n Attribute,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n HostBinding,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n Renderer2,\r\n SecurityContext,\r\n ViewChild\r\n} from '@angular/core';\r\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\r\nimport {AngularEditorConfig, angularEditorConfig} from './config';\r\nimport {AngularEditorToolbarComponent} from './angular-editor-toolbar.component';\r\nimport {AngularEditorService} from './angular-editor.service';\r\nimport {DOCUMENT} from '@angular/common';\r\nimport {DomSanitizer} from '@angular/platform-browser';\r\nimport {isDefined} from './utils';\r\n\r\n@Component({\r\n selector: 'angular-editor',\r\n templateUrl: './angular-editor.component.html',\r\n styleUrls: ['./angular-editor.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AngularEditorComponent),\r\n multi: true\r\n },\r\n AngularEditorService\r\n ]\r\n})\r\nexport class AngularEditorComponent implements OnInit, ControlValueAccessor, AfterViewInit, OnDestroy {\r\n\r\n private onChange: (value: string) => void;\r\n private onTouched: () => void;\r\n\r\n modeVisual = true;\r\n showPlaceholder = false;\r\n disabled = false;\r\n focused = false;\r\n touched = false;\r\n changed = false;\r\n\r\n focusInstance: any;\r\n blurInstance: any;\r\n\r\n @Input() id = '';\r\n @Input() config: AngularEditorConfig = angularEditorConfig;\r\n @Input() placeholder = '';\r\n @Input() tabIndex: number | null;\r\n\r\n @Output() html;\r\n\r\n @ViewChild('editor', {static: true}) textArea: ElementRef;\r\n @ViewChild('editorWrapper', {static: true}) editorWrapper: ElementRef;\r\n @ViewChild('editorToolbar') editorToolbar: AngularEditorToolbarComponent;\r\n\r\n @Output() viewMode = new EventEmitter<boolean>();\r\n\r\n /** emits `blur` event when focused out from the textarea */\r\n // tslint:disable-next-line:no-output-native no-output-rename\r\n @Output('blur') blurEvent: EventEmitter<FocusEvent> = new EventEmitter<FocusEvent>();\r\n\r\n /** emits `focus` event when focused in to the textarea */\r\n // tslint:disable-next-line:no-output-rename no-output-native\r\n @Output('focus') focusEvent: EventEmitter<FocusEvent> = new EventEmitter<FocusEvent>();\r\n\r\n @HostBinding('attr.tabindex') tabindex = -1;\r\n\r\n @HostListener('focus')\r\n onFocus() {\r\n this.focus();\r\n }\r\n\r\n constructor(\r\n private r: Renderer2,\r\n private editorService: AngularEditorService,\r\n @Inject(DOCUMENT) private doc: any,\r\n private sanitizer: DomSanitizer,\r\n private cdRef: ChangeDetectorRef,\r\n @Attribute('tabindex') defaultTabIndex: string,\r\n @Attribute('autofocus') private autoFocus: any\r\n ) {\r\n const parsedTabIndex = Number(defaultTabIndex);\r\n this.tabIndex = (parsedTabIndex || parsedTabIndex === 0) ? parsedTabIndex : null;\r\n }\r\n\r\n ngOnInit() {\r\n this.config.toolbarPosition = this.config.toolbarPosition ? this.config.toolbarPosition : angularEditorConfig.toolbarPosition;\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (isDefined(this.autoFocus)) {\r\n this.focus();\r\n }\r\n }\r\n\r\n /**\r\n * Executed command from editor header buttons\r\n * @param command string from triggerCommand\r\n */\r\n executeCommand(command: string) {\r\n this.focus();\r\n if (command === 'focus') {\r\n return;\r\n }\r\n if (command === 'toggleEditorMode') {\r\n this.toggleEditorMode(this.modeVisual);\r\n } else if (command !== '') {\r\n if (command === 'clear') {\r\n this.editorService.removeSelectedElements(this.getCustomTags());\r\n this.onContentChange(this.textArea.nativeElement);\r\n } else if (command === 'default') {\r\n this.editorService.removeSelectedElements('h1,h2,h3,h4,h5,h6,p,pre');\r\n this.onContentChange(this.textArea.nativeElement);\r\n } else {\r\n this.editorService.executeCommand(command);\r\n }\r\n this.exec();\r\n }\r\n }\r\n\r\n /**\r\n * focus event\r\n */\r\n onTextAreaFocus(event: FocusEvent): void {\r\n if (this.focused) {\r\n event.stopPropagation();\r\n return;\r\n }\r\n this.focused = true;\r\n this.focusEvent.emit(event);\r\n if (!this.touched || !this.changed) {\r\n this.editorService.executeInNextQueueIteration(() => {\r\n this.configure();\r\n this.touched = true;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @description fires when cursor leaves textarea\r\n */\r\n public onTextAreaMouseOut(event: MouseEvent): void {\r\n this.editorService.saveSelection();\r\n }\r\n\r\n /**\r\n * blur event\r\n */\r\n onTextAreaBlur(event: FocusEvent) {\r\n /**\r\n * save selection if focussed out\r\n */\r\n this.editorService.executeInNextQueueIteration(this.editorService.saveSelection);\r\n\r\n if (typeof this.onTouched === 'function') {\r\n this.onTouched();\r\n }\r\n\r\n if (event.relatedTarget !== null) {\r\n const parent = (event.relatedTarget as HTMLElement).parentElement;\r\n if (!parent.classList.contains('angular-editor-toolbar-set') && !parent.classList.contains('ae-picker')) {\r\n this.blurEvent.emit(event);\r\n this.focused = false;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * focus the text area when the editor is focused\r\n */\r\n focus() {\r\n if (this.modeVisual) {\r\n this.textArea.nativeElement.focus();\r\n } else {\r\n const sourceText = this.doc.getElementById('sourceText' + this.id);\r\n sourceText.focus();\r\n this.focused = true;\r\n }\r\n }\r\n\r\n /**\r\n * Executed from the contenteditable section while the input property changes\r\n * @param element html element from contenteditable\r\n */\r\n onContentChange(element: HTMLElement): void {\r\n let html = '';\r\n if (this.modeVisual) {\r\n html = element.innerHTML;\r\n } else {\r\n html = element.innerText;\r\n }\r\n if ((!html || html === '<br>')) {\r\n html = '';\r\n }\r\n if (typeof this.onChange === 'function') {\r\n this.onChange(this.config.sanitize || this.config.sanitize === undefined ?\r\n this.sanitizer.sanitize(SecurityContext.HTML, html) : html);\r\n if ((!html) !== this.showPlaceholder) {\r\n this.togglePlaceholder(this.showPlaceholder);\r\n }\r\n }\r\n this.changed = true;\r\n }\r\n\r\n /**\r\n * Set the function to be called\r\n * when the control receives a change event.\r\n *\r\n * @param fn a function\r\n */\r\n registerOnChange(fn: any): void {\r\n this.onChange = e => (e === '<br>' ? fn('') : fn(e)) ;\r\n }\r\n\r\n /**\r\n * Set the function to be called\r\n * when the control receives a touch event.\r\n *\r\n * @param fn a function\r\n */\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n /**\r\n * Write a new value to the element.\r\n *\r\n * @param value value to be executed when there is a change in contenteditable\r\n */\r\n writeValue(value: any): void {\r\n\r\n if ((!value || value === '<br>' || value === '') !== this.showPlaceholder) {\r\n this.togglePlaceholder(this.showPlaceholder);\r\n }\r\n\r\n if (value === undefined || value === '' || value === '<br>') {\r\n value = null;\r\n }\r\n\r\n this.refreshView(value);\r\n }\r\n\r\n /**\r\n * refresh view/HTML of the editor\r\n *\r\n * @param value html string from the editor\r\n */\r\n refreshView(value: string): void {\r\n const normalizedValue = value === null ? '' : value;\r\n this.r.setProperty(this.textArea.nativeElement, 'innerHTML', normalizedValue);\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * toggles placeholder based on input string\r\n *\r\n * @param value A HTML string from the editor\r\n */\r\n togglePlaceholder(value: boolean): void {\r\n if (!value) {\r\n this.r.addClass(this.editorWrapper.nativeElement, 'show-placeholder');\r\n this.showPlaceholder = true;\r\n\r\n } else {\r\n this.r.removeClass(this.editorWrapper.nativeElement, 'show-placeholder');\r\n this.showPlaceholder = false;\r\n }\r\n }\r\n\r\n /**\r\n * Implements disabled state for this element\r\n *\r\n * @param isDisabled Disabled flag\r\n */\r\n setDisabledState(isDisabled: boolean): void {\r\n const div = this.textArea.nativeElement;\r\n const action = isDisabled ? 'addClass' : 'removeClass';\r\n this.r[action](div, 'disabled');\r\n this.disabled = isDisabled;\r\n }\r\n\r\n /**\r\n * toggles editor mode based on bToSource bool\r\n *\r\n * @param bToSource A boolean value from the editor\r\n */\r\n toggleEditorMode(bToSource: boolean) {\r\n let oContent: any;\r\n const editableElement = this.textArea.nativeElement;\r\n\r\n if (bToSource) {\r\n oContent = this.r.createText(editableElement.innerHTML);\r\n this.r.setProperty(editableElement, 'innerHTML', '');\r\n this.r.setProperty(editableElement, 'contentEditable', false);\r\n\r\n const oPre = this.r.createElement('pre');\r\n this.r.setStyle(oPre, 'margin', '0');\r\n this.r.setStyle(oPre, 'outline', 'none');\r\n\r\n const oCode = this.r.createElement('code');\r\n this.r.setProperty(oCode, 'id', 'sourceText' + this.id);\r\n this.r.setStyle(oCode, 'display', 'block');\r\n this.r.setStyle(oCode, 'white-space', 'pre-wrap');\r\n this.r.setStyle(oCode, 'word-break', 'keep-all');\r\n this.r.setStyle(oCode, 'outline', 'none');\r\n this.r.setStyle(oCode, 'margin', '0');\r\n this.r.setStyle(oCode, 'background-color', '#fff5b9');\r\n this.r.setProperty(oCode, 'contentEditable', true);\r\n this.r.appendChild(oCode, oContent);\r\n this.focusInstance = this.r.listen(oCode, 'focus', (event) => this.onTextAreaFocus(event));\r\n this.blurInstance = this.r.listen(oCode, 'blur', (event) => this.onTextAreaBlur(event));\r\n this.r.appendChild(oPre, oCode);\r\n this.r.appendChild(editableElement, oPre);\r\n\r\n // ToDo move to service\r\n this.doc.execCommand('defaultParagraphSeparator', false, 'div');\r\n\r\n this.modeVisual = false;\r\n this.viewMode.emit(false);\r\n oCode.focus();\r\n } else {\r\n if (this.doc.querySelectorAll) {\r\n this.r.setProperty(editableElement, 'innerHTML', editableElement.innerText);\r\n } else {\r\n oContent = this.doc.createRange();\r\n oContent.selectNodeContents(editableElement.firstChild);\r\n this.r.setProperty(editableElement, 'innerHTML', oContent.toString());\r\n }\r\n this.r.setProperty(editableElement, 'contentEditable', true);\r\n this.modeVisual = true;\r\n this.viewMode.emit(true);\r\n this.onContentChange(editableElement);\r\n editableElement.focus();\r\n }\r\n this.editorToolbar.setEditorMode(!this.modeVisual);\r\n }\r\n\r\n /**\r\n * toggles editor buttons when cursor moved or positioning\r\n *\r\n * Send a node array from the contentEditable of the editor\r\n */\r\n exec() {\r\n this.editorToolbar.triggerButtons();\r\n\r\n let userSelection;\r\n if (this.doc.getSelection) {\r\n userSelection = this.doc.getSelection();\r\n this.editorService.executeInNextQueueIteration(this.editorService.saveSelection);\r\n }\r\n\r\n let a = userSelection.focusNode;\r\n const els = [];\r\n while (a && a.id !== 'editor') {\r\n els.unshift(a);\r\n a = a.parentNode;\r\n }\r\n this.editorToolbar.triggerBlocks(els);\r\n }\r\n\r\n private configure() {\r\n this.editorService.uploadUrl = this.config.uploadUrl;\r\n this.editorService.uploadWithCredentials = this.config.uploadWithCredentials;\r\n if (this.config.defaultParagraphSeparator) {\r\n this.editorService.setDefaultParagraphSeparator(this.config.defaultParagraphSeparator);\r\n }\r\n if (this.config.defaultFontName) {\r\n this.editorService.setFontName(this.config.defaultFontName);\r\n }\r\n if (this.config.defaultFontSize) {\r\n this.editorService.setFontSize(this.config.defaultFontSize);\r\n }\r\n }\r\n\r\n getFonts() {\r\n const fonts = this.config.fonts ? this.config.fonts : angularEditorConfig.fonts;\r\n return fonts.map(x => {\r\n return {label: x.name, value: x.name};\r\n });\r\n }\r\n\r\n getCustomTags() {\r\n const tags = ['span'];\r\n this.config.customClasses.forEach(x => {\r\n if (x.tag !== undefined) {\r\n if (!tags.includes(x.tag)) {\r\n tags.push(x.tag);\r\n }\r\n }\r\n });\r\n return tags.join(',');\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.blurInstance) {\r\n this.blurInstance();\r\n }\r\n if (this.focusInstance) {\r\n this.focusInstance();\r\n }\r\n }\r\n\r\n filterStyles(html: string): string {\r\n html = html.replace('position: fixed;', '');\r\n return html;\r\n }\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import {Component, ElementRef, EventEmitter, Inject, Input, Output, Renderer2, ViewChild} from '@angular/core';\r\nimport {AngularEditorService} from './angular-editor.service';\r\nimport {HttpResponse} from '@angular/common/http';\r\nimport {DOCUMENT} from '@angular/common';\r\nimport {CustomClass} from './config';\r\nimport {SelectOption} from './ae-select/ae-select.component';\r\n\r\n@Component({\r\n selector: 'angular-editor-toolbar',\r\n templateUrl: './angular-editor-toolbar.component.html',\r\n styleUrls: ['./angular-editor-toolbar.component.scss'],\r\n})\r\n\r\nexport class AngularEditorToolbarComponent {\r\n htmlMode = false;\r\n linkSelected = false;\r\n block = 'default';\r\n fontName = 'Times New Roman';\r\n fontSize = '3';\r\n foreColour;\r\n backColor;\r\n\r\n headings: SelectOption[] = [\r\n {\r\n label: 'Heading 1',\r\n value: 'h1',\r\n },\r\n {\r\n label: 'Heading 2',\r\n value: 'h2',\r\n },\r\n {\r\n label: 'Heading 3',\r\n value: 'h3',\r\n },\r\n {\r\n label: 'Heading 4',\r\n value: 'h4',\r\n },\r\n {\r\n label: 'Heading 5',\r\n value: 'h5',\r\n },\r\n {\r\n label: 'Heading 6',\r\n value: 'h6',\r\n },\r\n {\r\n label: 'Heading 7',\r\n value: 'h7',\r\n },\r\n {\r\n label: 'Paragraph',\r\n value: 'p',\r\n },\r\n {\r\n label: 'Predefined',\r\n value: 'pre'\r\n },\r\n {\r\n label: 'Standard',\r\n value: 'div'\r\n },\r\n {\r\n label: 'default',\r\n value: 'default'\r\n }\r\n ];\r\n\r\n fontSizes: SelectOption[] = [\r\n {\r\n label: '1',\r\n value: '1',\r\n },\r\n {\r\n label: '2',\r\n value: '2',\r\n },\r\n {\r\n label: '3',\r\n value: '3',\r\n },\r\n {\r\n label: '4',\r\n value: '4',\r\n },\r\n {\r\n label: '5',\r\n value: '5',\r\n },\r\n {\r\n label: '6',\r\n value: '6',\r\n },\r\n {\r\n label: '7',\r\n value: '7',\r\n }\r\n ];\r\n\r\n customClassId = '-1';\r\n // tslint:disable-next-line:variable-name\r\n _customClasses: CustomClass[];\r\n customClassList: SelectOption[] = [{label: '', value: ''}];\r\n // uploadUrl: string;\r\n\r\n tagMap = {\r\n BLOCKQUOTE: 'indent',\r\n A: 'link'\r\n };\r\n\r\n select = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P', 'PRE', 'DIV'];\r\n\r\n buttons = ['bold', 'italic', 'underline', 'strikeThrough', 'subscript', 'superscript', 'justifyLeft', 'justifyCenter',\r\n 'justifyRight', 'justifyFull', 'indent', 'outdent', 'insertUnorderedList', 'insertOrderedList', 'link'];\r\n\r\n @Input() id: string;\r\n @Input() uploadUrl: string;\r\n @Input() showToolbar: boolean;\r\n @Input() fonts: SelectOption[] = [{label: '', value: ''}];\r\n\r\n @Input()\r\n set customClasses(classes: CustomClass[]) {\r\n if (classes) {\r\n this._customClasses = classes;\r\n this.customClassList = this._customClasses.map((x, i) => ({label: x.name, value: i.toString()}));\r\n this.customClassList.unshift({label: 'Clear Class', value: '-1'});\r\n }\r\n }\r\n\r\n @Input()\r\n set defaultFontName(value: string) {\r\n if (value) {\r\n this.fontName = value;\r\n }\r\n }\r\n\r\n @Input()\r\n set defaultFontSize(value: string) {\r\n if (value) {\r\n this.fontSize = value;\r\n }\r\n }\r\n\r\n @Input() hiddenButtons: string[][];\r\n\r\n @Output() execute: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n @ViewChild('fileInput', {static: true}) myInputFile: ElementRef;\r\n\r\n public get isLinkButtonDisabled(): boolean {\r\n return this.htmlMode || !Boolean(this.editorService.selectedText);\r\n }\r\n\r\n constructor(\r\n private r: Renderer2,\r\n private editorService: AngularEditorService,\r\n private er: ElementRef,\r\n @Inject(DOCUMENT) private doc: any\r\n ) {\r\n }\r\n\r\n /**\r\n * Trigger command from editor header buttons\r\n * @param command string from toolbar buttons\r\n */\r\n triggerCommand(command: string) {\r\n this.execute.emit(command);\r\n }\r\n\r\n /**\r\n * highlight editor buttons when cursor moved or positioning\r\n */\r\n triggerButtons() {\r\n if (!this.showToolbar) {\r\n return;\r\n }\r\n this.buttons.forEach(e => {\r\n const result = this.doc.queryCommandState(e);\r\n const elementById = this.doc.getElementById(e + '-' + this.id);\r\n if (result) {\r\n this.r.addClass(elementById, 'active');\r\n } else {\r\n this.r.removeClass(elementById, 'active');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * trigger highlight editor buttons when cursor moved or positioning in block\r\n */\r\n triggerBlocks(nodes: Node[]) {\r\n if (!this.showToolbar) {\r\n return;\r\n }\r\n this.linkSelected = nodes.findIndex(x => x.nodeName === 'A') > -1;\r\n let found = false;\r\n this.select.forEach(y => {\r\n const node = nodes.find(x => x.nodeName === y);\r\n if (node !== undefined && y === node.nodeName) {\r\n if (found === false) {\r\n this.block = node.nodeName.toLowerCase();\r\n found = true;\r\n }\r\n } else if (found === false) {\r\n this.block = 'default';\r\n }\r\n });\r\n\r\n found = false;\r\n if (this._customClasses) {\r\n this._customClasses.forEach((y, index) => {\r\n const node = nodes.find(x => {\r\n if (x instanceof Element) {\r\n return x.className === y.class;\r\n }\r\n });\r\n if (node !== undefined) {\r\n if (found === false) {\r\n this.customClassId = index.toString();\r\n found = true;\r\n }\r\n } else if (found === false) {\r\n this.customClassId = '-1';\r\n }\r\n });\r\n }\r\n\r\n Object.keys(this.tagMap).map(e => {\r\n const elementById = this.doc.getElementById(this.tagMap[e] + '-' + this.id);\r\n const node = nodes.find(x => x.nodeName === e);\r\n if (node !== undefined && e === node.nodeName) {\r\n this.r.addClass(elementById, 'active');\r\n } else {\r\n this.r.removeClass(elementById, 'active');\r\n }\r\n });\r\n\r\n this.foreColour = this.doc.queryCommandValue('ForeColor');\r\n this.fontSize = this.doc.queryCommandValue('FontSize');\r\n this.fontName = this.doc.queryCommandValue('FontName').replace(/\"/g, '');\r\n this.backColor = this.doc.queryCommandValue('backColor');\r\n }\r\n\r\n /**\r\n * insert URL link\r\n */\r\n insertUrl() {\r\n let url = 'https:\\/\\/';\r\n const selection = this.editorService.savedSelection;\r\n if (selection && selection.commonAncestorContainer.parentElement.nodeName === 'A') {\r\n const parent = selection.commonAncestorContainer.parentElement as HTMLAnchorElement;\r\n if (parent.href !== '') {\r\n url = parent.href;\r\n }\r\n }\r\n url = prompt('Insert URL link', url);\r\n if (url && url !== '' && url !== 'https://') {\r\n this.editorService.createLink(url);\r\n }\r\n }\r\n\r\n /**\r\n * insert Video link\r\n */\r\n insertVideo() {\r\n this.execute.emit('');\r\n const url = prompt('Insert Video link', `https://`);\r\n if (url && url !== '' && url !== `https://`) {\r\n this.editorService.insertVideo(url);\r\n }\r\n }\r\n\r\n /** insert color */\r\n insertColor(color: string, where: string) {\r\n this.editorService.insertColor(color, where);\r\n this.execute.emit('');\r\n }\r\n\r\n /**\r\n * set font Name/family\r\n * @param foreColor string\r\n */\r\n setFontName(foreColor: string): void {\r\n this.editorService.setFontName(foreColor);\r\n this.execute.emit('');\r\n }\r\n\r\n /**\r\n * set font Size\r\n * @param fontSize string\r\n */\r\n setFontSize(fontSize: string): void {\r\n this.editorService.setFontSize(fontSize);\r\n this.execute.emit('');\r\n }\r\n\r\n /**\r\n * toggle editor mode (WYSIWYG or SOURCE)\r\n * @param m boolean\r\n */\r\n setEditorMode(m: boolean) {\r\n const toggleEditorModeButton = this.doc.getElementById('toggleEditorMode' + '-' + this.id);\r\n if (m) {\r\n this.r.addClass(toggleEditorModeButton, 'active');\r\n } else {\r\n this.r.removeClass(toggleEditorModeButton, 'active');\r\n }\r\n this.htmlMode = m;\r\n }\r\n\r\n /**\r\n * Upload image when file is selected\r\n */\r\n onFileChanged(event) {\r\n const file = event.target.files[0];\r\n if (file.type.includes('image/')) {\r\n if (this.uploadUrl) {\r\n this.editorService.uploadImage(file).subscribe(e => {\r\n if (e instanceof HttpResponse) {\r\n this.editorService.insertImage(e.body.imageUrl);\r\n event.srcElement.value = null;\r\n }\r\n });\r\n } else {\r\n const reader = new FileReader();\r\n reader.onload = (e: ProgressEvent) => {\r\n const fr = e.currentTarget as FileReader;\r\n this.editorService.insertImage(fr.result.toString());\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set custom class\r\n */\r\n setCustomClass(classId: string) {\r\n if (classId === '-1') {\r\n this.execute.emit('clear');\r\n } else {\r\n this.editorService.createCustomClass(this._customClasses[+classId]);\r\n }\r\n }\r\n\r\n isButtonHidden(name: string): boolean {\r\n if (!name) {\r\n return false;\r\n }\r\n if (!(this.hiddenButtons instanceof Array)) {\r\n return false;\r\n }\r\n let result: any;\r\n for (const arr of this.hiddenButtons) {\r\n if (arr instanceof Array) {\r\n result = arr.find(item => item === name);\r\n }\r\n if (result) {\r\n break;\r\n }\r\n }\r\n return result !== undefined;\r\n }\r\n\r\n focus() {\r\n this.execute.emit('focus');\r\n console.log('focused');\r\n }\r\n}\r\n","import {\r\n Attribute,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef, HostBinding,\r\n HostListener,\r\n Input,\r\n OnInit,\r\n Output,\r\n Renderer2,\r\n ViewChild,\r\n ViewEncapsulation\r\n} from '@angular/core';\r\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\r\nimport {isDefined} from '../utils';\r\n\r\nexport interface SelectOption {\r\n label: string;\r\n value: string;\r\n}\r\n\r\n@Component({\r\n selector: 'ae-select',\r\n templateUrl: './ae-select.component.html',\r\n styleUrls: ['./ae-select.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AeSelectComponent),\r\n multi: true,\r\n }\r\n ]\r\n})\r\nexport class AeSelectComponent implements OnInit, ControlValueAccessor {\r\n @Input() options: SelectOption[] = [];\r\n // tslint:disable-next-line:no-input-rename\r\n @Input('hidden') isHidden: boolean;\r\n\r\n selectedOption: SelectOption;\r\n disabled = false;\r\n optionId = 0;\r\n\r\n get label(): string {\r\n return this.selectedOption && this.selectedOption.hasOwnProperty('label') ? this.selectedOption.label : 'Select';\r\n }\r\n\r\n opened = false;\r\n\r\n get value(): string {\r\n return this.selectedOption.value;\r\n }\r\n\r\n @HostBinding('style.display') hidden = 'inline-block';\r\n\r\n // tslint:disable-next-line:no-output-native no-output-rename\r\n @Output('change') changeEvent = new EventEmitter();\r\n\r\n @ViewChild('labelButton', {static: true}) labelButton: ElementRef;\r\n\r\n constructor(private elRef: ElementRef,\r\n private r: Renderer2,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.selectedOption = this.options[0];\r\n if (isDefined(this.isHidden) && this.isHidden) {\r\n this.hide();\r\n }\r\n }\r\n\r\n hide() {\r\n this.hidden = 'none';\r\n }\r\n\r\n optionSelect(option: SelectOption, event: MouseEvent) {\r\n event.stopPropagation();\r\n this.setValue(option.value);\r\n this.onChange(this.selectedOption.value);\r\n this.changeEvent.emit(this.selectedOption.value);\r\n this.onTouched();\r\n this.opened = false;\r\n }\r\n\r\n toggleOpen(event: MouseEvent) {\r\n // event.stopPropagation();\r\n if (this.disabled) {\r\n return;\r\n }\r\n this.opened = !this.opened;\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClick($event: MouseEvent) {\r\n if (!this.elRef.nativeElement.contains($event.target)) {\r\n this.close();\r\n }\r\n }\r\n\r\n close() {\r\n this.opened = false;\r\n }\r\n\r\n get isOpen(): boolean {\r\n return this.opened;\r\n }\r\n\r\n writeValue(value) {\r\n if (!value || typeof value !== 'string') {\r\n return;\r\n }\r\n this.setValue(value);\r\n }\r\n\r\n setValue(value) {\r\n let index = 0;\r\n const selectedEl = this.options.find((el, i) => {\r\n index = i;\r\n return el.value === value;\r\n });\r\n if (selectedEl) {\r\n this.selectedOption = selectedEl;\r\n this.optionId = index;\r\n }\r\n }\r\n\r\n onChange: any = () => {\r\n }\r\n onTouched: any = () => {\r\n }\r\n\r\n registerOnChange(fn) {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn) {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.labelButton.nativeElement.disabled = isDisabled;\r\n const div = this.labelButton.nativeElement;\r\n const action = isDisabled ? 'addClass' : 'removeClass';\r\n this.r[action](div, 'disabled');\r\n this.disabled = isDisabled;\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n handleKeyDown($event: KeyboardEvent) {\r\n if (!this.opened) {\r\n return;\r\n }\r\n // console.log($event.key);\r\n // if (KeyCode[$event.key]) {\r\n switch ($event.key) {\r\n case 'ArrowDown':\r\n this._handleArrowDown($event);\r\n break;\r\n case 'ArrowUp':\r\n this._handleArrowUp($event);\r\n break;\r\n case 'Space':\r\n this._handleSpace($event);\r\n break;\r\n case 'Enter':\r\n this._handleEnter($event);\r\n break;\r\n case 'Tab':\r\n this._handleTab($event);\r\n break;\r\n case 'Escape':\r\n this.close();\r\n $event.preventDefault();\r\n break;\r\n case 'Backspace':\r\n this._handleBackspace();\r\n break;\r\n }\r\n // } else if ($event.key && $event.key.length === 1) {\r\n // this._keyPress$.next($event.key.toLocaleLowerCase());\r\n // }\r\n }\r\n\r\n _handleArrowDown($event) {\r\n if (this.optionId < this.options.length - 1) {\r\n this.optionId++;\r\n }\r\n }\r\n\r\n _handleArrowUp($event) {\r\n if (this.optionId >= 1) {\r\n this.optionId--;\r\n }\r\n }\r\n\r\n _handleSpace($event) {\r\n\r\n }\r\n\r\n _handleEnter($event) {\r\n this.optionSelect(this.options[this.optionId], $event);\r\n }\r\n\r\n _handleTab($event) {\r\n\r\n }\r\n\r\n _handleBackspace() {\r\n\r\n }\r\n}\r\n","import {NgModule} from '@angular/core';\r\nimport {AngularEditorComponent} from './angular-editor.component';\r\nimport {AngularEditorToolbarComponent} from './angular-editor-toolbar.component';\r\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\r\nimport {CommonModule} from '@angular/common';\r\nimport { AeSelectComponent } from './ae-select/ae-select.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule, FormsModule, ReactiveFormsModule\r\n ],\r\n declarations: [AngularEditorComponent, AngularEditorToolbarComponent, AeSelectComponent],\r\n exports: [AngularEditorComponent, AngularEditorToolbarComponent]\r\n})\r\nexport class AngularEditorModule {\r\n}\r\n"]}