novo-elements 12.1.0-next.2 → 12.1.0-next.4

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.
@@ -28,6 +28,7 @@ declare class NovoCKEditorElement implements OnDestroy, AfterViewInit, ControlVa
28
28
  _value: string;
29
29
  instance: any;
30
30
  debounceTimeout: any;
31
+ private _ckEditorFixRemoveListener?;
31
32
  constructor(zone: NgZone);
32
33
  get value(): string;
33
34
  set value(v: string);
@@ -60,6 +60,7 @@ declare class QuickNoteElement extends OutsideClick implements OnInit, OnDestroy
60
60
  private debounceTimeout;
61
61
  private placeholderVisible;
62
62
  private _placeholderElement;
63
+ private _ckEditorFixRemoveListener?;
63
64
  private static TOOLBAR_HEIGHT;
64
65
  private onModelChange;
65
66
  private onModelTouched;
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { forwardRef, EventEmitter, Input, ViewChild, Output, Component, NgModule } from '@angular/core';
3
3
  import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
4
+ import { fixCkEditorInputEvent } from 'novo-elements/utils';
4
5
  import { CommonModule } from '@angular/common';
5
6
 
6
7
  // NG2
@@ -48,6 +49,7 @@ class NovoCKEditorElement {
48
49
  ngOnDestroy() {
49
50
  if (this.instance) {
50
51
  this.instance.focusManager.blur(true); // Remove focus from editor
52
+ this._ckEditorFixRemoveListener?.();
51
53
  setTimeout(() => {
52
54
  this.instance.removeAllListeners();
53
55
  const aInstance = CKEDITOR.instances[this.instance.name];
@@ -84,6 +86,7 @@ class NovoCKEditorElement {
84
86
  }
85
87
  // CKEditor replace textarea
86
88
  this.instance = CKEDITOR.replace(this.host.nativeElement, config);
89
+ this._ckEditorFixRemoveListener = fixCkEditorInputEvent(this.instance);
87
90
  // Set initial value
88
91
  this.instance.setData(this.value);
89
92
  // listen for instanceReady event
@@ -1 +1 @@
1
- {"version":3,"file":"novo-elements-addons-ckeditor.mjs","sources":["../../../projects/novo-elements/src/addons/ckeditor/CKEditor.ts","../../../projects/novo-elements/src/addons/ckeditor/CKEditor.module.ts","../../../projects/novo-elements/src/addons/ckeditor/novo-elements-addons-ckeditor.ts"],"sourcesContent":["// NG2\nimport { AfterViewInit, Component, EventEmitter, forwardRef, Input, NgZone, OnDestroy, Output, ViewChild } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n// Value accessor for the component (supports ngModel)\nconst CKEDITOR_CONTROL_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NovoCKEditorElement),\n multi: true,\n};\n\ndeclare const CKEDITOR: any;\n\n// Prevents CKEDITOR from querying the page for all [contenteditable] elements (fixes a conflict against Codemirror Editor)\ntry {\n CKEDITOR.disableAutoInline = true;\n} catch (err) {\n // may be running in a context without CKEDITOR - ignore\n}\n\n/**\n * CKEditor component\n * Usage :\n * <novo-editor [(ngModel)]=\"data\" [config]=\"{...}\" debounce=\"500\"></novo-editor>\n */\n@Component({\n selector: 'novo-editor',\n providers: [CKEDITOR_CONTROL_VALUE_ACCESSOR],\n template: '<textarea [name]=\"name\" [id]=\"name\" #host></textarea>',\n styleUrls: ['./CKEditor.scss'],\n standalone: false,\n})\nexport class NovoCKEditorElement implements OnDestroy, AfterViewInit, ControlValueAccessor {\n @Input()\n config;\n @Input()\n debounce;\n @Input()\n name;\n @Input()\n minimal;\n @Input()\n startupFocus: boolean = false;\n @Input()\n fileBrowserImageUploadUrl: string = '';\n @Input()\n disabled: boolean = false;\n\n @Output()\n change = new EventEmitter();\n @Output()\n ready = new EventEmitter();\n @Output()\n blur = new EventEmitter();\n @Output()\n focus = new EventEmitter();\n @Output()\n paste = new EventEmitter();\n @Output()\n loaded = new EventEmitter();\n @ViewChild('host')\n host;\n\n _value: string = '';\n instance;\n debounceTimeout;\n\n constructor(private zone: NgZone) {}\n\n get value() {\n return this._value;\n }\n\n @Input()\n set value(v) {\n if (v !== this._value) {\n this._value = v;\n this.onChange(v);\n }\n }\n\n ngOnDestroy() {\n if (this.instance) {\n this.instance.focusManager.blur(true); // Remove focus from editor\n setTimeout(() => {\n this.instance.removeAllListeners();\n const aInstance = CKEDITOR.instances[this.instance.name];\n if (aInstance) {\n aInstance.destroy();\n }\n this.instance.destroy();\n this.instance = null;\n });\n }\n }\n\n ngAfterViewInit() {\n const config = Object.assign(this.getBaseConfig(), this.config);\n if (this.startupFocus) {\n config.startupFocus = true;\n }\n if (this.disabled) {\n config.readOnly = true;\n }\n this.ckeditorInit(config);\n }\n\n updateValue(value) {\n this.zone.run(() => {\n this.value = value;\n this.onChange(value);\n this.onTouched();\n this.change.emit(value);\n });\n }\n\n private ckeditorInit(config) {\n if (!CKEDITOR) {\n console.error('Make sure to include CKEditor sources in your dependencies!');\n return;\n }\n\n // CKEditor replace textarea\n this.instance = CKEDITOR.replace(this.host.nativeElement, config);\n\n // Set initial value\n this.instance.setData(this.value);\n\n // listen for instanceReady event\n this.instance.on('instanceReady', (evt) => {\n // send the evt to the EventEmitter\n this.ready.emit(evt);\n });\n\n // CKEditor change event\n this.instance.on('change', () => {\n this.onTouched();\n const value = this.instance.getData();\n\n // Debounce update\n if (this.debounce) {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n this.debounceTimeout = setTimeout(() => {\n this.updateValue(value);\n this.debounceTimeout = null;\n }, parseInt(this.debounce, 10));\n } else {\n this.updateValue(value);\n }\n });\n this.instance.on('blur', (event) => {\n this.blur.emit(event);\n });\n this.instance.on('focus', (event) => {\n this.focus.emit(event);\n });\n this.instance.on('paste', (event) => {\n this.paste.emit(event);\n });\n this.instance.on('loaded', (event) => {\n this.loaded.emit(event);\n });\n }\n\n getBaseConfig(): { [key: string]: any } {\n const baseConfig = {\n enterMode: CKEDITOR.ENTER_BR,\n entities: false,\n shiftEnterMode: CKEDITOR.ENTER_P,\n disableNativeSpellChecker: false,\n removePlugins: 'liststyle,tabletools,contextmenu,tableselection', // allows browser based spell checking\n extraAllowedContent: '*(*){*};table tbody tr td th[*];', // allows class names (*) and inline styles {*} for all and attributes [*] on tables\n font_names:\n 'Arial/Arial, Helvetica, sans-serif;' +\n 'Calibri/Calibri, Verdana, Geneva, sans-serif;' +\n 'Comic Sans MS/Comic Sans MS, cursive;' +\n 'Courier New/Courier New, Courier, monospace;' +\n 'Georgia/Georgia, serif;' +\n 'Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;' +\n 'Tahoma/Tahoma, Geneva, sans-serif;' +\n 'Times New Roman/Times New Roman, Times, serif;' +\n 'Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;' +\n 'Verdana/Verdana, Geneva, sans-serif',\n };\n\n const minimalConfig = {\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 const extendedConfig = {\n toolbar: [\n { name: 'clipboard', items: ['Paste', 'PasteText', 'PasteFromWord', 'Undo', 'Redo'] },\n {\n name: 'paragraph',\n items: [\n 'NumberedList',\n 'BulletedList',\n 'Outdent',\n 'Indent',\n 'Blockquote',\n 'JustifyLeft',\n 'JustifyCenter',\n 'JustifyRight',\n 'JustifyBlock',\n 'BidiLtr',\n 'BidiRtl',\n ],\n },\n { name: 'links', items: ['Link'] },\n { name: 'insert', items: ['Image', 'Table', 'HorizontalRule'] },\n { name: 'tools', items: ['Maximize', 'Source'] },\n '/', // line break\n { name: 'basicstyles', items: ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript'] },\n { name: 'styles', items: ['Styles', 'Format', 'Font', 'FontSize'] },\n { name: 'colors', items: ['TextColor', 'BGColor'] },\n ],\n filebrowserImageUploadUrl: this.fileBrowserImageUploadUrl,\n };\n\n return Object.assign(baseConfig, this.minimal ? minimalConfig : extendedConfig);\n }\n\n writeValue(value) {\n this._value = value;\n if (this.instance) {\n this.instance.setData(value);\n }\n }\n\n onChange(value?: any) {}\n\n onTouched(event?) {}\n\n registerOnChange(fn) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled = disabled;\n if (this.instance) {\n CKEDITOR.instances[this.instance.name].setReadOnly(disabled);\n }\n }\n\n insertText(text) {\n const trimmedText = text.trim();\n this.instance.insertText(trimmedText);\n }\n}\n","// NG2\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n// APP\nimport { NovoCKEditorElement } from './CKEditor';\n\n@NgModule({\n imports: [CommonModule, FormsModule],\n declarations: [NovoCKEditorElement],\n exports: [NovoCKEditorElement],\n})\nexport class NovoNovoCKEditorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"novo-elements-addons-ckeditor.mjs","sources":["../../../projects/novo-elements/src/addons/ckeditor/CKEditor.ts","../../../projects/novo-elements/src/addons/ckeditor/CKEditor.module.ts","../../../projects/novo-elements/src/addons/ckeditor/novo-elements-addons-ckeditor.ts"],"sourcesContent":["// NG2\nimport { AfterViewInit, Component, EventEmitter, forwardRef, Input, NgZone, OnDestroy, Output, ViewChild } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { fixCkEditorInputEvent } from 'novo-elements/utils';\n\n// Value accessor for the component (supports ngModel)\nconst CKEDITOR_CONTROL_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NovoCKEditorElement),\n multi: true,\n};\n\ndeclare const CKEDITOR: any;\n\n// Prevents CKEDITOR from querying the page for all [contenteditable] elements (fixes a conflict against Codemirror Editor)\ntry {\n CKEDITOR.disableAutoInline = true;\n} catch (err) {\n // may be running in a context without CKEDITOR - ignore\n}\n\n/**\n * CKEditor component\n * Usage :\n * <novo-editor [(ngModel)]=\"data\" [config]=\"{...}\" debounce=\"500\"></novo-editor>\n */\n@Component({\n selector: 'novo-editor',\n providers: [CKEDITOR_CONTROL_VALUE_ACCESSOR],\n template: '<textarea [name]=\"name\" [id]=\"name\" #host></textarea>',\n styleUrls: ['./CKEditor.scss'],\n standalone: false,\n})\nexport class NovoCKEditorElement implements OnDestroy, AfterViewInit, ControlValueAccessor {\n @Input()\n config;\n @Input()\n debounce;\n @Input()\n name;\n @Input()\n minimal;\n @Input()\n startupFocus: boolean = false;\n @Input()\n fileBrowserImageUploadUrl: string = '';\n @Input()\n disabled: boolean = false;\n\n @Output()\n change = new EventEmitter();\n @Output()\n ready = new EventEmitter();\n @Output()\n blur = new EventEmitter();\n @Output()\n focus = new EventEmitter();\n @Output()\n paste = new EventEmitter();\n @Output()\n loaded = new EventEmitter();\n @ViewChild('host')\n host;\n\n _value: string = '';\n instance;\n debounceTimeout;\n private _ckEditorFixRemoveListener?: () => void;\n\n constructor(private zone: NgZone) {}\n\n get value() {\n return this._value;\n }\n\n @Input()\n set value(v) {\n if (v !== this._value) {\n this._value = v;\n this.onChange(v);\n }\n }\n\n ngOnDestroy() {\n if (this.instance) {\n this.instance.focusManager.blur(true); // Remove focus from editor\n this._ckEditorFixRemoveListener?.();\n setTimeout(() => {\n this.instance.removeAllListeners();\n const aInstance = CKEDITOR.instances[this.instance.name];\n if (aInstance) {\n aInstance.destroy();\n }\n this.instance.destroy();\n this.instance = null;\n });\n }\n }\n\n ngAfterViewInit() {\n const config = Object.assign(this.getBaseConfig(), this.config);\n if (this.startupFocus) {\n config.startupFocus = true;\n }\n if (this.disabled) {\n config.readOnly = true;\n }\n this.ckeditorInit(config);\n }\n\n updateValue(value) {\n this.zone.run(() => {\n this.value = value;\n this.onChange(value);\n this.onTouched();\n this.change.emit(value);\n });\n }\n\n private ckeditorInit(config) {\n if (!CKEDITOR) {\n console.error('Make sure to include CKEditor sources in your dependencies!');\n return;\n }\n\n // CKEditor replace textarea\n this.instance = CKEDITOR.replace(this.host.nativeElement, config);\n this._ckEditorFixRemoveListener = fixCkEditorInputEvent(this.instance);\n\n // Set initial value\n this.instance.setData(this.value);\n\n // listen for instanceReady event\n this.instance.on('instanceReady', (evt) => {\n // send the evt to the EventEmitter\n this.ready.emit(evt);\n });\n\n // CKEditor change event\n this.instance.on('change', () => {\n this.onTouched();\n const value = this.instance.getData();\n\n // Debounce update\n if (this.debounce) {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n this.debounceTimeout = setTimeout(() => {\n this.updateValue(value);\n this.debounceTimeout = null;\n }, parseInt(this.debounce, 10));\n } else {\n this.updateValue(value);\n }\n });\n this.instance.on('blur', (event) => {\n this.blur.emit(event);\n });\n this.instance.on('focus', (event) => {\n this.focus.emit(event);\n });\n this.instance.on('paste', (event) => {\n this.paste.emit(event);\n });\n this.instance.on('loaded', (event) => {\n this.loaded.emit(event);\n });\n }\n\n getBaseConfig(): { [key: string]: any } {\n const baseConfig = {\n enterMode: CKEDITOR.ENTER_BR,\n entities: false,\n shiftEnterMode: CKEDITOR.ENTER_P,\n disableNativeSpellChecker: false,\n removePlugins: 'liststyle,tabletools,contextmenu,tableselection', // allows browser based spell checking\n extraAllowedContent: '*(*){*};table tbody tr td th[*];', // allows class names (*) and inline styles {*} for all and attributes [*] on tables\n font_names:\n 'Arial/Arial, Helvetica, sans-serif;' +\n 'Calibri/Calibri, Verdana, Geneva, sans-serif;' +\n 'Comic Sans MS/Comic Sans MS, cursive;' +\n 'Courier New/Courier New, Courier, monospace;' +\n 'Georgia/Georgia, serif;' +\n 'Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;' +\n 'Tahoma/Tahoma, Geneva, sans-serif;' +\n 'Times New Roman/Times New Roman, Times, serif;' +\n 'Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;' +\n 'Verdana/Verdana, Geneva, sans-serif',\n };\n\n const minimalConfig = {\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 const extendedConfig = {\n toolbar: [\n { name: 'clipboard', items: ['Paste', 'PasteText', 'PasteFromWord', 'Undo', 'Redo'] },\n {\n name: 'paragraph',\n items: [\n 'NumberedList',\n 'BulletedList',\n 'Outdent',\n 'Indent',\n 'Blockquote',\n 'JustifyLeft',\n 'JustifyCenter',\n 'JustifyRight',\n 'JustifyBlock',\n 'BidiLtr',\n 'BidiRtl',\n ],\n },\n { name: 'links', items: ['Link'] },\n { name: 'insert', items: ['Image', 'Table', 'HorizontalRule'] },\n { name: 'tools', items: ['Maximize', 'Source'] },\n '/', // line break\n { name: 'basicstyles', items: ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript'] },\n { name: 'styles', items: ['Styles', 'Format', 'Font', 'FontSize'] },\n { name: 'colors', items: ['TextColor', 'BGColor'] },\n ],\n filebrowserImageUploadUrl: this.fileBrowserImageUploadUrl,\n };\n\n return Object.assign(baseConfig, this.minimal ? minimalConfig : extendedConfig);\n }\n\n writeValue(value) {\n this._value = value;\n if (this.instance) {\n this.instance.setData(value);\n }\n }\n\n onChange(value?: any) {}\n\n onTouched(event?) {}\n\n registerOnChange(fn) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled = disabled;\n if (this.instance) {\n CKEDITOR.instances[this.instance.name].setReadOnly(disabled);\n }\n }\n\n insertText(text) {\n const trimmedText = text.trim();\n this.instance.insertText(trimmedText);\n }\n}\n","// NG2\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n// APP\nimport { NovoCKEditorElement } from './CKEditor';\n\n@NgModule({\n imports: [CommonModule, FormsModule],\n declarations: [NovoCKEditorElement],\n exports: [NovoCKEditorElement],\n})\nexport class NovoNovoCKEditorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { Component, forwardRef, EventEmitter, ViewContainerRef, Output, Input, ViewChild, NgModule } from '@angular/core';
3
3
  import { from } from 'rxjs';
4
4
  import * as i1 from 'novo-elements/services';
5
- import { Helpers, OutsideClick } from 'novo-elements/utils';
5
+ import { Helpers, OutsideClick, fixCkEditorInputEvent } from 'novo-elements/utils';
6
6
  import { PickerResults } from 'novo-elements/elements/picker';
7
7
  import * as i2 from '@angular/common';
8
8
  import { CommonModule } from '@angular/common';
@@ -204,6 +204,7 @@ class QuickNoteElement extends OutsideClick {
204
204
  ngOnDestroy() {
205
205
  // Tear down the CKEditor instance
206
206
  if (this.ckeInstance) {
207
+ this._ckEditorFixRemoveListener?.();
207
208
  this.ckeInstance.focusManager.blur(true); // Remove focus from editor
208
209
  setTimeout(() => {
209
210
  this.ckeInstance.removeAllListeners();
@@ -223,6 +224,7 @@ class QuickNoteElement extends OutsideClick {
223
224
  }
224
225
  // Replace the textarea with an instance of CKEditor
225
226
  this.ckeInstance = CKEDITOR.replace(this.host.nativeElement, this.getCKEditorConfig());
227
+ fixCkEditorInputEvent(this.ckeInstance);
226
228
  // Set initial value of the note in the editor
227
229
  this.writeValue(this.model);
228
230
  // Connect to the key event in CKEditor for showing results dropdown
@@ -1 +1 @@
1
- {"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 } 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\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.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\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 '&amp;' to '&'\n // when we pull html from the editor - see: https://dev.ckeditor.com/ticket/13723\n const ampRegex = new RegExp('&amp;', '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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"}
1
+ {"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 '&amp;' to '&'\n // when we pull html from the editor - see: https://dev.ckeditor.com/ticket/13723\n const ampRegex = new RegExp('&amp;', '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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"}
@@ -1787,6 +1787,26 @@ function getDayViewHourGrid({ viewDate, hourSegments, dayStart, dayEnd, }) {
1787
1787
  return hours;
1788
1788
  }
1789
1789
 
1790
+ function fixCkEditorInputEvent(ckEditorInstance) {
1791
+ let debounceInputTimeout;
1792
+ const onCkBodyInput = (event) => {
1793
+ if (debounceInputTimeout) {
1794
+ clearTimeout(debounceInputTimeout);
1795
+ }
1796
+ debounceInputTimeout = setTimeout(() => {
1797
+ // change event did not process this input event (first known from spellcheck menu options)
1798
+ ckEditorInstance.fire('change');
1799
+ debounceInputTimeout = null;
1800
+ }, 250);
1801
+ };
1802
+ ckEditorInstance.on('instanceReady', (event) => {
1803
+ ckEditorInstance.document.$.body.addEventListener('input', onCkBodyInput);
1804
+ });
1805
+ return () => {
1806
+ ckEditorInstance.document.$.body.removeEventListener('input', onCkBodyInput);
1807
+ };
1808
+ }
1809
+
1790
1810
  class Color {
1791
1811
  constructor(value) {
1792
1812
  this.isValid = true;
@@ -22281,5 +22301,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
22281
22301
  * Generated bundle index. Do not edit.
22282
22302
  */
22283
22303
 
22284
- export { AppBridge, AppBridgeHandler, AppBridgeService, BaseRenderer, BooleanInput, COUNTRIES, CalendarEventResponse, Can, Color, DateRange, DateUtil, Deferred, DevAppBridge, DevAppBridgeService, HTTP_VERBS, Helpers, KeyCodes, MESSAGE_TYPES, OutsideClick, binarySearch, can, convertTokens, findByCountryCode, findByCountryId, findByCountryName, formatZonedTime, getCountries, getDayView, getDayViewHourGrid, getMonthView, getStateObjects, getStates, getWeekView, getWeekViewEventOffset, getWeekViewHeader, isAlphaNumeric, legacyParse, notify, splitDateString };
22304
+ export { AppBridge, AppBridgeHandler, AppBridgeService, BaseRenderer, BooleanInput, COUNTRIES, CalendarEventResponse, Can, Color, DateRange, DateUtil, Deferred, DevAppBridge, DevAppBridgeService, HTTP_VERBS, Helpers, KeyCodes, MESSAGE_TYPES, OutsideClick, binarySearch, can, convertTokens, findByCountryCode, findByCountryId, findByCountryName, fixCkEditorInputEvent, formatZonedTime, getCountries, getDayView, getDayViewHourGrid, getMonthView, getStateObjects, getStates, getWeekView, getWeekViewEventOffset, getWeekViewHeader, isAlphaNumeric, legacyParse, notify, splitDateString };
22285
22305
  //# sourceMappingURL=novo-elements-utils.mjs.map