novo-elements
Version:
1 lines • 49.4 kB
Source Map (JSON)
{"version":3,"file":"novo-elements-elements-quick-note.mjs","sources":["../../../projects/novo-elements/src/elements/quick-note/extras/quick-note-results/QuickNoteResults.ts","../../../projects/novo-elements/src/elements/quick-note/QuickNote.ts","../../../projects/novo-elements/src/elements/quick-note/QuickNote.module.ts","../../../projects/novo-elements/src/elements/quick-note/novo-elements-elements-quick-note.ts"],"sourcesContent":["// NG2\nimport { ChangeDetectorRef, Component, ElementRef } from '@angular/core';\n// Vendor\nimport { from, Observable } from 'rxjs';\n// APP\nimport { NovoLabelService } from 'novo-elements/services';\nimport { Helpers } from 'novo-elements/utils';\nimport { PickerResults } from 'novo-elements/elements/picker';\n\n@Component({\n selector: 'quick-note-results',\n host: {\n class: 'active',\n },\n template: `\n <novo-loading theme=\"line\" *ngIf=\"isLoading && !matches.length\"></novo-loading>\n <novo-list *ngIf=\"matches.length > 0\">\n <novo-list-item\n *ngFor=\"let match of matches\"\n (click)=\"selectMatch($event)\"\n [class.active]=\"match === activeMatch\"\n (mouseenter)=\"selectActive(match)\"\n >\n <item-content>\n <p [innerHtml]=\"match.label | highlight:term\"></p>\n </item-content>\n </novo-list-item>\n </novo-list>\n <p class=\"picker-error\" *ngIf=\"hasError\">{{ labels.quickNoteError }}</p>\n <p class=\"picker-null\" *ngIf=\"!isLoading && !matches.length && !hasError\">{{ labels.quickNoteEmpty }}</p>\n `,\n styleUrls: ['./QuickNoteResults.scss'],\n standalone: false,\n})\nexport class QuickNoteResults extends PickerResults {\n // Mode that the quick note is in for tagging\n taggingMode: string = '';\n\n constructor(element: ElementRef, public labels: NovoLabelService, ref: ChangeDetectorRef) {\n super(element, labels, ref);\n }\n\n get term() {\n return this._term;\n }\n\n set term(value: any) {\n this._term = value.searchTerm;\n this.taggingMode = value.taggingMode;\n this.hasError = false;\n this.isLoading = true;\n this.search(value, this.taggingMode).subscribe(\n (results) => {\n this.matches = this.isStatic ? this.filterData(results) : results;\n this.isLoading = false;\n },\n () => {\n this.hasError = true;\n this.isLoading = false;\n },\n );\n }\n\n search(term: string, taggingMode): Observable<any> {\n const searchCall = this.config.options[taggingMode];\n return from(\n new Promise((resolve, reject) => {\n // Check if there is match data\n if (searchCall) {\n // Resolve the data\n if (Array.isArray(searchCall)) {\n this.isStatic = true;\n // Arrays are returned immediately\n resolve(this.structureArray(searchCall));\n } else if (\n (searchCall.hasOwnProperty('reject') && searchCall.hasOwnProperty('resolve')) ||\n Object.getPrototypeOf(searchCall).hasOwnProperty('then')\n ) {\n this.isStatic = false;\n // Promises (ES6 or Deferred) are resolved whenever they resolve\n searchCall.then(this.structureArray.bind(this)).then(resolve, reject);\n } else if (typeof searchCall === 'function') {\n this.isStatic = false;\n // Promises (ES6 or Deferred) are resolved whenever they resolve\n searchCall(term).then(this.structureArray.bind(this)).then(resolve, reject);\n } else {\n // All other kinds of data are rejected\n reject('The data provided is not an array or a promise');\n throw new Error('The data provided is not an array or a promise');\n }\n } else {\n // No data gets rejected\n reject('error');\n }\n }),\n );\n }\n\n /**\n * @name structureArray\n * @param collection - the data once getData resolves it\n *\n * @description This function structures an array of nodes into an array of objects with a\n * 'name' field by default.\n */\n structureArray(collection: Array<any>) {\n if (collection && (typeof collection[0] === 'string' || typeof collection[0] === 'number')) {\n return collection.map((item) => {\n return {\n value: item,\n label: item,\n };\n });\n }\n return collection.map((data) => {\n const value = this.config.field ? data[this.config.field[this.taggingMode]] : data.value || data;\n const label = this.config.format ? Helpers.interpolate(this.config.format[this.taggingMode], data) : data.label || String(value);\n return { value, label, data };\n });\n }\n\n /**\n * @name selectMatch\n * @param event\n *\n * @description\n */\n selectMatch(event: KeyboardEvent) {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n\n const selected = this.activeMatch;\n if (selected) {\n this.parent.onSelected(this.taggingMode, selected);\n this.parent.hideResults();\n }\n return false;\n }\n}\n","// NG2\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n NgZone,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ComponentUtils } from 'novo-elements/services';\nimport { Key, OutsideClick, fixCkEditorInputEvent } from 'novo-elements/utils';\n// APP\nimport { QuickNoteResults } from './extras/quick-note-results/QuickNoteResults';\n\n// Value accessor for the component (supports ngModel)\nconst QUICK_NOTE_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => QuickNoteElement),\n multi: true,\n};\n\ndeclare const CKEDITOR: any;\n\n@Component({\n selector: 'novo-quick-note',\n providers: [QUICK_NOTE_VALUE_ACCESSOR],\n template: ' <div class=\"quick-note-wrapper\" #wrapper><textarea #host></textarea> <span #results></span></div> ',\n styleUrls: ['./QuickNote.scss'],\n standalone: false,\n})\nexport class QuickNoteElement extends OutsideClick implements OnInit, OnDestroy, AfterViewInit {\n @ViewChild('wrapper', { static: true })\n public wrapper: ElementRef;\n @ViewChild('host', { static: true })\n public host: ElementRef;\n @ViewChild('results', { read: ViewContainerRef, static: true })\n results: ViewContainerRef;\n\n @Input()\n config: any;\n @Input()\n startupFocus: boolean = false;\n @Input()\n placeholder: string;\n\n // Emitter for selects\n @Output()\n focus: EventEmitter<any> = new EventEmitter();\n @Output()\n blur: EventEmitter<any> = new EventEmitter();\n @Output()\n change: EventEmitter<any> = new EventEmitter();\n\n // The characters that the user enters in order to search for a person/thing to tag\n private resultsComponent: any;\n private quickNoteResults: any;\n private isTagging: boolean;\n private taggingMode: string;\n private model: any;\n private ckeInstance: any;\n private debounceTimeout: any;\n private placeholderVisible: boolean = false;\n private _placeholderElement: any = null;\n private _ckEditorFixRemoveListener?: () => void;\n\n private static TOOLBAR_HEIGHT = 40; // in pixels - configured by stylesheet\n\n private onModelChange: Function = () => {};\n private onModelTouched: Function = () => {};\n\n constructor(private zone: NgZone, element: ElementRef, private componentUtils: ComponentUtils) {\n super(element);\n // Bind to the active change event from the OutsideClick\n this.onActiveChange.subscribe((active) => {\n if (!active) {\n setTimeout(() => {\n this.hideResults();\n });\n }\n });\n }\n\n public ngOnInit(): void {\n // Make sure we have a proper config\n if (!this.config) {\n throw new Error('No config set for QuickNote!');\n }\n // Make sure that we have triggers\n if (!this.config.triggers) {\n throw new Error('QuickNote config must supply triggers!');\n }\n // Make sure that we have options\n if (!this.config.options) {\n throw new Error('QuickNote config must supply options!');\n }\n // Allow for callers to use a custom results template class in the config\n this.resultsComponent = this.config.resultsTemplate || QuickNoteResults;\n }\n\n public ngOnDestroy(): void {\n // Tear down the CKEditor instance\n if (this.ckeInstance) {\n this._ckEditorFixRemoveListener?.();\n this.ckeInstance.focusManager.blur(true); // Remove focus from editor\n setTimeout(() => {\n this.ckeInstance.removeAllListeners();\n CKEDITOR.instances[this.ckeInstance.name].destroy();\n this.ckeInstance.destroy();\n this.ckeInstance = null;\n });\n }\n }\n\n /**\n * Connect to key/mouse events from CKEditor after the editor has been initialized\n */\n public ngAfterViewInit(): void {\n if (!CKEDITOR) {\n console.error('Make sure to include CKEditor sources in your dependencies!');\n return;\n }\n\n // Replace the textarea with an instance of CKEditor\n this.ckeInstance = CKEDITOR.replace(this.host.nativeElement, this.getCKEditorConfig());\n fixCkEditorInputEvent(this.ckeInstance);\n\n // Set initial value of the note in the editor\n this.writeValue(this.model);\n\n // Connect to the key event in CKEditor for showing results dropdown\n this.ckeInstance.on('key', (event: any) => {\n if (!this.onKey(event.data.domEvent.$)) {\n event.cancel();\n }\n });\n\n // Connect to the change event in CKEditor for debouncing user modifications\n this.ckeInstance.on('change', () => {\n // Debounce update\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n this.debounceTimeout = setTimeout(() => {\n // Run within the context of this angular element since we don't need to cancel event\n this.zone.run(() => {\n this.onValueChange();\n });\n this.debounceTimeout = null;\n }, 250);\n });\n\n // Propagate blur events from CKEditor to the Element's listeners\n this.ckeInstance.on('blur', (event: any) => {\n this.showPlaceholder();\n this.blur.emit(event);\n });\n\n // Propagate blur events from CKEditor to the Element's listeners\n this.ckeInstance.on('focus', (event: any) => {\n this.hidePlaceholder();\n this.focus.emit(event);\n });\n\n // Show placeholder if the note is empty, after the editor is instantiated\n this.ckeInstance.on('instanceReady', (event: any) => {\n this.showPlaceholder();\n // Set editor to readOnly\n if (this.config.readOnly) {\n this.ckeInstance.setReadOnly(this.config.readOnly);\n }\n });\n }\n\n // Set touched on blur\n public onTouched(event?: any) {\n this.onModelTouched();\n }\n\n /**\n * Handles setting the model and the view from the outside caller or the user's typing\n *\n * @param model A model that has a note (html content) and references (array of objects)\n */\n public writeValue(model: any): void {\n // Set value of the model\n if (model && (model.references || model.note)) {\n this.model = {\n note: model.note || '',\n references: model.references || {},\n };\n } else {\n this.model = {\n note: model,\n references: {},\n };\n }\n\n // Set the note html value in the editor\n if (this.ckeInstance) {\n this.ckeInstance.setData(this.model.note);\n }\n }\n\n public registerOnChange(fn: Function): void {\n this.onModelChange = fn;\n }\n\n public registerOnTouched(fn: Function): void {\n this.onModelTouched = fn;\n }\n\n /**\n * If a renderer is not provided, the QuickNote will default to using this one, an anchor tag with no href\n */\n private static defaultRenderer(symbol: string, item: any): string {\n return `<a>${symbol}${item.label}</a>`;\n }\n\n /**\n * Returns the renderer for a given tagging mode if it exists in the config, otherwise the default.\n */\n private getRenderer(taggingMode: string): any {\n return this.config.renderer ? this.config.renderer[taggingMode] : QuickNoteElement.defaultRenderer;\n }\n\n /**\n * Called every time a keystroke is made in the editor. Listens for particular keys (e.g. UP arrow, ESC, etc.)\n * to handle certain behaviors of the picker.\n *\n * Runs within the context of the CKEditor, so actions that affect the view have to be run back inside of the\n * Angular zone of this class.\n *\n * @param event The key press event\n * @return true to allow the event to occur, false to cancel the event\n */\n private onKey(event: KeyboardEvent): boolean {\n if (event.key) {\n if (this.quickNoteResults) {\n // Hide results on escape key\n if (event.key === Key.Escape) {\n this.zone.run(() => {\n this.hideResults();\n });\n return false;\n }\n\n // Navigation inside the results\n if (event.key === Key.ArrowUp) {\n this.zone.run(() => {\n this.quickNoteResults.instance.prevActiveMatch();\n });\n return false;\n }\n\n if (event.key === Key.ArrowDown) {\n this.zone.run(() => {\n this.quickNoteResults.instance.nextActiveMatch();\n });\n return false;\n }\n\n if (event.key === Key.Enter) {\n this.zone.run(() => {\n this.quickNoteResults.instance.selectActiveMatch();\n });\n return false;\n }\n } else {\n // Loop through all triggers and turn on tagging mode if the user just pressed a trigger character\n const triggers = this.config.triggers || {};\n Object.keys(triggers).forEach((key) => {\n const trigger = triggers[key] || {};\n if (event.key === trigger) {\n this.isTagging = true;\n this.taggingMode = key;\n }\n });\n }\n }\n return true;\n }\n\n /**\n * Debounced method that is run in the proper Angular context when the user has modified the CKEditor.\n * After the value has been updated in CKEditor, this will propagate that change to the model and listeners.\n */\n private onValueChange(): void {\n // Get the html text in CKEditor\n let value = this.ckeInstance.getData();\n\n // Remove empty 'ZERO WIDTH SPACE' characters that can get added erroneously by the editor\n const regex = new RegExp(String.fromCharCode(8203), 'g');\n value = value.replace(regex, '');\n\n // Make sure that any references in the model are still valid\n this.validateReferences();\n\n // Possibly show results if the user has entered a search term\n this.showResults();\n\n // Propagate change to ngModel for form validation, and send null if the note is empty\n let newModel = null;\n if (value) {\n newModel = {\n note: value,\n references: this.model.references,\n };\n }\n\n // Inform listeners to the ngModel change event that something has changed\n this.onModelChange(newModel);\n\n // Inform listeners of the `@Output() change` event that the model has been updated\n this.change.emit(newModel);\n\n // Inform listeners to the ngModel touched event that something has changed\n this.onTouched();\n }\n\n /**\n * Creates an instance of the results (called popup) and adds all the bindings to that instance.\n */\n private showResults(): void {\n if (this.isTagging) {\n const searchTerm = this.getSearchTerm();\n if (searchTerm.length) {\n // Update Matches\n if (this.quickNoteResults) {\n // Update existing list\n this.quickNoteResults.instance.term = {\n searchTerm,\n taggingMode: this.taggingMode,\n };\n } else {\n // Create the results DOM element\n this.quickNoteResults = this.componentUtils.append(this.resultsComponent, this.results);\n this.quickNoteResults.instance.parent = this;\n this.quickNoteResults.instance.config = this.config;\n this.quickNoteResults.instance.term = {\n searchTerm,\n taggingMode: this.taggingMode,\n };\n this.positionResultsDropdown();\n }\n } else if (this.quickNoteResults) {\n this.quickNoteResults.destroy();\n this.quickNoteResults = null;\n }\n\n // Tell the OutsideClick base class to start listening for an outside clicks\n this.toggleActive(null, true);\n }\n }\n\n /**\n * Deletes the picker results from the DOM.\n */\n private hideResults(): void {\n this.isTagging = false;\n if (this.quickNoteResults) {\n this.quickNoteResults.destroy();\n this.quickNoteResults = null;\n }\n }\n\n /**\n * Handles the selection from the QuickNoteResults Component. Called by the QuickNoteResults component on it's\n * parent (this element).\n *\n * @param taggingMode - type of tags we are looking for\n * @param selected - selected object from the picker that has a label and value\n */\n private onSelected(taggingMode: string, selected: any): void {\n // Turn off tagging\n this.isTagging = false;\n\n // Replace searchTerm with link\n const symbol = this.config.triggers[taggingMode];\n const renderer = this.getRenderer(taggingMode);\n const renderedText = renderer(symbol, selected);\n\n this.replaceWordAtCursor(renderedText);\n\n // Add the new reference, if it doesn't already exist\n this.model.references = this.model.references || {};\n this.model.references[taggingMode] = this.model.references[taggingMode] || [];\n const matchingItems = this.model.references[taggingMode].filter((item) => JSON.stringify(item) === JSON.stringify(selected));\n if (matchingItems.length === 0) {\n this.model.references[taggingMode].push(selected);\n }\n\n // Update the quick note with the changes due to the user's selection of an item in the dropdown\n this.onValueChange();\n }\n\n /**\n * Convenience method that gets the current word that the cursor is on, minus the tag.\n * Also, trims any whitespace before/after the term to aid in searching.\n */\n private getSearchTerm(): string {\n let word = this.getWordAtCursor().trim();\n if (this.isTagging) {\n const symbol = this.config.triggers[this.taggingMode];\n if (!word.includes(symbol)) {\n this.hideResults();\n return '';\n }\n word = word.slice(word.indexOf(symbol) + symbol.length);\n }\n return word;\n }\n\n /**\n * Gets the current word that the cursor is on CKEditor. Current word starts at the beginning of the line or a\n * tag character if we are in tagging mode. Current word ends at the end of the line or an empty space.\n *\n * @returns plain text string (removes all html formatting)\n */\n private getWordAtCursor(): string {\n const range = this.ckeInstance.getSelection().getRanges()[0];\n const start = range.startContainer;\n\n if (start.type === CKEDITOR.NODE_TEXT && range.startOffset) {\n const text = start.getText();\n const symbol = this.config.triggers[this.taggingMode];\n let wordStart = text.lastIndexOf(symbol, range.startOffset - 1);\n\n if (wordStart > 0) {\n const beforeSymbol: string = text.charAt(wordStart - 1);\n // We don't want to trigger the lookup call unless the symbol was preceded by whitespace\n if (beforeSymbol !== '\\u200B' && /\\S/.test(beforeSymbol)) {\n return '';\n }\n } else if (start.hasPrevious() && /\\S$/.test(start.getPrevious().getText())) {\n // When wordStart is <= 0, we need to check the previous node's text to see if it ended with whitespace or not\n return '';\n }\n\n let wordEnd = text.indexOf(' ', range.startOffset + 1);\n if (wordStart === -1) {\n wordStart = 0;\n }\n if (wordEnd === -1) {\n wordEnd = text.length;\n }\n\n return text.substring(wordStart, wordEnd);\n }\n\n // Selection starts at the 0 index of the text node or there's no previous text node in contents\n return '';\n }\n\n /**\n * Replaces the word that the user is on with the given html.\n *\n * CKEditor gives us access to the current line of html in the editor, so we replace the content of\n * the line, replacing only the current word.\n */\n private replaceWordAtCursor(newWord: string): void {\n const originalWord = this.getWordAtCursor().trim();\n const range = this.ckeInstance.getSelection().getRanges()[0];\n const start = range.startContainer;\n const parentNode = start.getParent();\n\n if (start.type === CKEDITOR.NODE_TEXT && parentNode) {\n const line = parentNode.getHtml();\n const index = line.lastIndexOf(originalWord);\n\n if (index >= 0) {\n // Add a space after the replaced word so that multiple references can be added back to back\n const newLine = line.substring(0, index) + newWord + ' ' + line.substring(index + originalWord.length);\n parentNode.setHtml(newLine);\n\n // Place selection at the end of the line\n range.moveToPosition(parentNode, CKEDITOR.POSITION_BEFORE_END);\n this.ckeInstance.getSelection().selectRanges([range]);\n }\n }\n }\n\n /**\n * Returns current references, minus any from the model that have been removed from the editor.\n */\n private validateReferences(): void {\n let html = this.ckeInstance.document.getBody().getHtml();\n\n // CKEditor stopped supporting the config.forceSimpleAmpersand setting, so we have to convert '&' to '&'\n // when we pull html from the editor - see: https://dev.ckeditor.com/ticket/13723\n const ampRegex = new RegExp('&', 'g');\n html = html.replace(ampRegex, '&');\n\n Object.keys(this.model.references).forEach((taggingMode) => {\n const array = this.model.references[taggingMode] || [];\n const symbol = this.config.triggers[taggingMode];\n const renderer = this.getRenderer(taggingMode);\n\n this.model.references[taggingMode] = array.filter((item) => {\n const renderedText = renderer(symbol, item);\n return html.includes(renderedText);\n });\n\n // If no references, then delete the key\n if (this.model.references[taggingMode].length === 0) {\n delete this.model.references[taggingMode];\n }\n });\n }\n\n /**\n * Configures the CKEditor for QuickNote functionality.\n *\n * Sets the height of the CKEditor dynamically to the height of the wrapper upon initialization.\n * Removes the toolbar on the bottom and configures a slimmed down version of the toolbar.\n * Removes plugins and turns off setting to allow browser based spell checking.\n */\n private getCKEditorConfig(): any {\n // Use the height of the wrapper element to set the initial height of the editor, then\n // set it to 100% to allow the editor to resize using the grippy.\n const editorHeight = this.wrapper.nativeElement.clientHeight - QuickNoteElement.TOOLBAR_HEIGHT;\n this.wrapper.nativeElement.style.setProperty('height', '100%');\n\n return {\n enterMode: CKEDITOR.ENTER_BR,\n shiftEnterMode: CKEDITOR.ENTER_P,\n disableNativeSpellChecker: false,\n height: editorHeight,\n startupFocus: this.startupFocus,\n removePlugins: 'liststyle,tabletools,contextmenu,tableselection', // allows browser based spell checking\n toolbar: [\n {\n name: 'basicstyles',\n items: [\n 'Styles',\n 'FontSize',\n 'Bold',\n 'Italic',\n 'Underline',\n 'TextColor',\n '-',\n 'NumberedList',\n 'BulletedList',\n 'Outdent',\n 'Indent',\n 'Link',\n ],\n },\n ],\n };\n }\n\n /**\n * Returns the current screen position of the cursor in CKEditor, accounting for any scrolling in the editor.\n */\n private getCursorPosition(): any {\n const range = this.ckeInstance.getSelection().getRanges()[0];\n const parentElement = range.startContainer.$.parentElement;\n const editorElement = this.ckeInstance.editable().$;\n\n // Since the editor is a text node in the DOM that does not know about it's position, a temporary element has to\n // be inserted in order to locate the cursor position.\n const cursorElement = document.createElement('img');\n cursorElement.setAttribute('src', 'null');\n cursorElement.setAttribute('width', '0');\n cursorElement.setAttribute('height', '0');\n\n parentElement.appendChild(cursorElement);\n const cursorPosition = {\n top: cursorElement.offsetTop - editorElement.scrollTop,\n left: cursorElement.offsetLeft - editorElement.scrollLeft,\n };\n cursorElement.remove();\n\n return cursorPosition;\n }\n\n /**\n * Positions the results dropdown based on the location of the cursor in the text field\n */\n private positionResultsDropdown(): void {\n const MIN_MARGIN_TOP: number = QuickNoteElement.TOOLBAR_HEIGHT * 2;\n const MAX_MARGIN_TOP: number = this.getContentHeight() + QuickNoteElement.TOOLBAR_HEIGHT;\n\n const cursorPosition = this.getCursorPosition();\n let marginTop: number = cursorPosition.top + QuickNoteElement.TOOLBAR_HEIGHT;\n\n // Check that the margin is within the visible bounds\n marginTop = Math.max(marginTop, MIN_MARGIN_TOP);\n marginTop = Math.min(marginTop, MAX_MARGIN_TOP);\n\n // Set the margin-top of the dropdown\n this.quickNoteResults.instance.element.nativeElement.style.setProperty('margin-top', marginTop + 'px');\n }\n\n /**\n * Returns the height in pixels of the content area - the text that the user has entered.\n */\n private getContentHeight(): number {\n let contentHeight: number = 0;\n if (\n this.ckeInstance.ui &&\n this.ckeInstance.ui.contentsElement &&\n this.ckeInstance.ui.contentsElement.$ &&\n this.ckeInstance.ui.contentsElement.$.style\n ) {\n const cssText: string = this.ckeInstance.ui.contentsElement.$.style.cssText;\n if (cssText.indexOf('height: ') !== -1) {\n let height: string = cssText.split('height: ')[1];\n height = height.split('px')[0];\n contentHeight = parseInt(height, 10);\n }\n }\n return contentHeight;\n }\n\n /**\n * Show the placeholder text if the editor is empty\n */\n private showPlaceholder(): void {\n if (!this.ckeInstance.getData() && !this.startupFocus) {\n this.ckeInstance.editable().getParent().$.appendChild(this.placeholderElement);\n this.placeholderVisible = true;\n }\n }\n\n /**\n * Hide the placeholder text by removing the placeholder element from the DOM\n */\n private hidePlaceholder(): void {\n if (this.placeholderVisible) {\n this.ckeInstance.editable().getParent().$.removeChild(this.placeholderElement);\n this.placeholderVisible = false;\n }\n }\n\n /**\n * Get or create the single placeholder object that is constructed only when needed.\n */\n private get placeholderElement(): any {\n if (!this._placeholderElement) {\n this._placeholderElement = document.createElement('div');\n this._placeholderElement.className = 'placeholder';\n this._placeholderElement.style.cssText =\n 'margin: 20px; color: #AAAAAA; font-family: sans-serif; font-size: 13px; line-height: 20px; position: absolute; top: 0; pointer-events: none';\n this._placeholderElement.textContent = this.placeholder;\n }\n return this._placeholderElement;\n }\n}\n","// NG2\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n// APP\nimport { NovoListModule } from 'novo-elements/elements/list';\nimport { NovoPipesModule } from 'novo-elements/pipes';\nimport { NovoLoadingModule } from 'novo-elements/elements/loading';\nimport { QuickNoteResults } from './extras/quick-note-results/QuickNoteResults';\nimport { QuickNoteElement } from './QuickNote';\n\n@NgModule({\n imports: [CommonModule, FormsModule, NovoLoadingModule, NovoListModule, NovoPipesModule],\n declarations: [QuickNoteElement, QuickNoteResults],\n exports: [QuickNoteElement, QuickNoteResults],\n})\nexport class NovoQuickNoteModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}