{ "version": 3, "sources": ["src/app/typeahead/_components/typeahead.component.ts", "src/app/typeahead/_components/typeahead.component.html"], "sourcesContent": ["import { trigger, state, style, transition, animate } from '@angular/animations';\nimport {CommonModule, DOCUMENT} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild, DestroyRef,\n ElementRef,\n EventEmitter,\n HostListener,\n inject,\n Inject,\n Input,\n OnInit,\n Output,\n Renderer2,\n RendererStyleFlags2,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport {FormControl, FormGroup, ReactiveFormsModule} from '@angular/forms';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { auditTime, filter, map, shareReplay, switchMap, take, tap } from 'rxjs/operators';\nimport { KEY_CODES } from 'src/app/shared/_services/utility.service';\nimport { TypeaheadSettings } from '../_models/typeahead-settings';\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\nimport {TagBadgeComponent} from \"../../shared/tag-badge/tag-badge.component\";\nimport {TranslocoDirective} from \"@jsverse/transloco\";\nimport {SelectionModel} from \"../_models/selection-model\";\n\n\nconst ANIMATION_SPEED = 200;\n\n@Component({\n selector: 'app-typeahead',\n standalone: true,\n imports: [CommonModule, TagBadgeComponent, ReactiveFormsModule, TranslocoDirective],\n templateUrl: './typeahead.component.html',\n styleUrls: ['./typeahead.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('slideFromTop', [\n state('in', style({ height: '0px'})),\n transition('void => *', [\n style({ height: '100%', overflow: 'auto' }),\n animate(ANIMATION_SPEED)\n ]),\n transition('* => void', [\n animate(ANIMATION_SPEED, style({ height: '0px' })),\n ])\n ])\n ]\n})\nexport class TypeaheadComponent implements OnInit {\n /**\n * Settings for the typeahead\n */\n @Input({required: true}) settings!: TypeaheadSettings;\n /**\n * When true, will reset field to no selections. When false, will reset to saved data\n */\n @Input() reset: ReplaySubject = new ReplaySubject(1);\n /**\n * When a field is locked, we render custom css to indicate to the user. Does not affect functionality.\n */\n @Input() locked: boolean = false;\n /**\n * If disabled, a user will not be able to interact with the typeahead\n */\n @Input() disabled: boolean = false;\n /**\n * When triggered, will focus the input if the passed string matches the id\n */\n @Input() focus: EventEmitter | undefined;\n @Output() selectedData = new EventEmitter();\n @Output() newItemAdded = new EventEmitter();\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output() onUnlock = new EventEmitter();\n @Output() lockedChange = new EventEmitter();\n private readonly destroyRef = inject(DestroyRef);\n\n\n @ViewChild('input') inputElem!: ElementRef;\n @ContentChild('optionItem') optionTemplate!: TemplateRef;\n @ContentChild('badgeItem') badgeTemplate!: TemplateRef;\n\n optionSelection!: SelectionModel;\n\n hasFocus = false; // Whether input has active focus\n focusedIndex: number = 0;\n showAddItem: boolean = false;\n filteredOptions!: Observable;\n isLoadingOptions: boolean = false;\n typeaheadControl!: FormControl;\n typeaheadForm!: FormGroup;\n\n constructor(private renderer2: Renderer2, @Inject(DOCUMENT) private document: Document, private readonly cdRef: ChangeDetectorRef) { }\n\n ngOnInit() {\n this.reset.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((resetToEmpty: boolean) => {\n this.clearSelections(resetToEmpty);\n this.init();\n });\n\n if (this.focus) {\n this.focus.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((id: string) => {\n if (this.settings.id !== id) return;\n this.onInputFocus();\n });\n }\n\n this.init();\n }\n\n init() {\n if (this.settings.compareFn === undefined && this.settings.multiple) {\n console.error('A compare function must be defined');\n return;\n }\n\n if (this.settings.trackByIdentityFn === undefined) {\n this.settings.trackByIdentityFn = (index, value) => value;\n }\n\n if (this.settings.hasOwnProperty('formControl') && this.settings.formControl) {\n this.typeaheadControl = this.settings.formControl;\n } else {\n this.typeaheadControl = new FormControl('');\n }\n this.typeaheadForm = new FormGroup({\n 'typeahead': this.typeaheadControl\n });\n\n this.filteredOptions = this.typeaheadForm.get('typeahead')!.valueChanges\n .pipe(\n // Adjust input box to grow\n tap((val: string) => {\n if (this.inputElem != null && this.inputElem.nativeElement != null) {\n this.renderer2.setStyle(this.inputElem.nativeElement, 'width', 15 * (val.trim().length + 1) + 'px');\n this.focusedIndex = 0;\n }\n }),\n map((val: string) => val.trim()),\n auditTime(this.settings.debounce),\n //distinctUntilChanged(), // ?!: BUG Doesn't trigger the search to run when filtered array changes\n filter((val: string) => {\n // If minimum filter characters not met, do not filter\n if (this.settings.minCharacters === 0) return true;\n\n if (!val || val.length < this.settings.minCharacters) {\n return false;\n }\n\n return true;\n }),\n\n switchMap((val: string) => {\n this.isLoadingOptions = true;\n return this.settings.fetchFn(val.trim()).pipe(takeUntilDestroyed(this.destroyRef), map((items: any[]) => items.filter(item => this.filterSelected(item))));\n }),\n tap((filteredOptions: any[]) => {\n this.isLoadingOptions = false;\n this.focusedIndex = 0;\n this.cdRef.markForCheck();\n setTimeout(() => {\n this.updateShowAddItem(filteredOptions);\n this.updateHighlight();\n }, 10);\n setTimeout(() => this.updateHighlight(), 20);\n\n }),\n shareReplay(),\n takeUntilDestroyed(this.destroyRef)\n );\n\n\n if (this.settings.savedData) {\n if (this.settings.multiple) {\n this.optionSelection = new SelectionModel(true, this.settings.savedData);\n }\n else {\n const isArray = this.settings.savedData.hasOwnProperty('length');\n if (isArray) {\n this.optionSelection = new SelectionModel(true, this.settings.savedData);\n } else {\n this.optionSelection = new SelectionModel(true, [this.settings.savedData]);\n }\n }\n } else {\n this.optionSelection = new SelectionModel();\n }\n }\n\n\n @HostListener('body:click', ['$event'])\n handleDocumentClick(event: any) {\n // Don't close the typeahead when we select an item from it\n if (event.target && (event.target as HTMLElement).classList.contains('list-group-item')) {\n return;\n }\n this.hasFocus = false;\n }\n\n @HostListener('window:keydown', ['$event'])\n handleKeyPress(event: KeyboardEvent) {\n if (!this.hasFocus) { return; }\n if (this.disabled) return;\n\n switch(event.key) {\n case KEY_CODES.DOWN_ARROW:\n case KEY_CODES.RIGHT_ARROW:\n {\n this.focusedIndex = Math.min(this.focusedIndex + 1, this.document.querySelectorAll('.list-group-item').length - 1);\n this.updateHighlight();\n break;\n }\n case KEY_CODES.UP_ARROW:\n case KEY_CODES.LEFT_ARROW:\n {\n this.focusedIndex = Math.max(this.focusedIndex - 1, 0);\n this.updateHighlight();\n break;\n }\n case KEY_CODES.ENTER:\n {\n this.document.querySelectorAll('.list-group-item').forEach((item, index) => {\n if (item.classList.contains('active')) {\n this.filteredOptions.pipe(take(1)).subscribe((opts: any[]) => {\n // This isn't giving back the filtered array, but everything\n event.preventDefault();\n event.stopPropagation();\n\n (item as HTMLElement).click();\n this.focusedIndex = 0;\n });\n }\n });\n break;\n }\n case KEY_CODES.BACKSPACE:\n case KEY_CODES.DELETE:\n {\n if (this.typeaheadControl.value !== null && this.typeaheadControl.value !== undefined && this.typeaheadControl.value.trim() !== '') {\n break;\n }\n const selected = this.optionSelection.selected();\n if (selected.length > 0) {\n this.removeSelectedOption(selected.pop());\n }\n break;\n }\n case KEY_CODES.ESC_KEY:\n this.hasFocus = false;\n event.stopPropagation();\n event.preventDefault();\n break;\n default:\n break;\n }\n }\n\n toggleSelection(opt: any): void {\n this.optionSelection.toggle(opt, undefined, this.settings.selectionCompareFn);\n this.selectedData.emit(this.optionSelection.selected());\n }\n\n removeSelectedOption(opt: any) {\n this.optionSelection.toggle(opt, undefined, this.settings.selectionCompareFn);\n this.selectedData.emit(this.optionSelection.selected());\n this.resetField();\n }\n\n clearSelections(untoggleAll: boolean = false) {\n if (this.optionSelection) {\n if (!untoggleAll && this.settings.savedData) {\n const isArray = this.settings.savedData.hasOwnProperty('length');\n if (isArray) {\n this.optionSelection = new SelectionModel(true, this.settings.savedData); // NOTE: Library-detail will break the 'x' button due to how savedData is being set to avoid state reset\n } else {\n this.optionSelection = new SelectionModel(true, [this.settings.savedData]);\n }\n this.cdRef.markForCheck();\n } else {\n this.optionSelection.selected().forEach(item => this.optionSelection.toggle(item, false));\n this.cdRef.markForCheck();\n }\n\n this.selectedData.emit(this.optionSelection.selected());\n this.resetField();\n }\n }\n\n handleOptionClick(opt: any) {\n if (this.disabled) return;\n if (!this.settings.multiple && this.optionSelection.selected().length > 0) {\n return;\n }\n\n this.toggleSelection(opt);\n\n this.resetField();\n this.onInputFocus();\n }\n\n addNewItem(title: string) {\n if (this.settings.addTransformFn == undefined || !this.settings.addIfNonExisting) {\n return;\n }\n const newItem = this.settings.addTransformFn(title);\n this.newItemAdded.emit(newItem);\n this.toggleSelection(newItem);\n\n this.resetField();\n this.onInputFocus();\n }\n\n /**\n *\n * @param item\n * @returns True if the item is NOT selected already\n */\n filterSelected(item: any) {\n if (this.settings.unique && this.settings.multiple) {\n return !this.optionSelection.isSelected(item, this.settings.selectionCompareFn);\n }\n\n return true;\n }\n\n openDropdown() {\n setTimeout(() => {\n this.typeaheadControl.setValue(this.typeaheadControl.value);\n this.hasFocus = true;\n });\n }\n\n onInputFocus(event?: any) {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n if (this.disabled) return;\n\n if (!this.settings.multiple && this.optionSelection.selected().length > 0) {\n return;\n }\n\n if (this.inputElem) {\n // hack: To prevent multiple typeaheads from being open at once, click document then trigger the focus\n this.document.body.click();\n\n this.inputElem.nativeElement.focus();\n this.hasFocus = true;\n }\n\n\n this.openDropdown();\n }\n\n\n resetField() {\n if (this.inputElem && this.inputElem.nativeElement) {\n this.renderer2.setStyle(this.inputElem.nativeElement, 'width', 4, RendererStyleFlags2.Important);\n }\n this.typeaheadControl.setValue('');\n this.focusedIndex = 0;\n }\n\n // Updates the highlight to focus on the selected item\n updateHighlight() {\n this.document.querySelectorAll('.list-group-item').forEach((item, index) => {\n if (index === this.focusedIndex && !item.classList.contains('no-hover')) {\n // apply active class\n this.renderer2.addClass(item, 'active');\n } else {\n // remove active class\n this.renderer2.removeClass(item, 'active');\n }\n });\n }\n\n updateShowAddItem(options: any[]) {\n // ?! BUG This will still technicially allow you to add the same thing as a previously added item. (Code will just toggle it though)\n this.showAddItem = false;\n this.cdRef.markForCheck();\n if (!this.settings.addIfNonExisting) return;\n\n const inputText = this.typeaheadControl.value.trim();\n if (inputText.length < Math.max(this.settings.minCharacters, 1)) return;\n if (!this.typeaheadControl.dirty) return; // Do we need this?\n\n // Check if this new option will interfere with any existing ones not shown\n\n if (typeof this.settings.compareFnForAdd == 'function') {\n const willDuplicateExist = this.settings.compareFnForAdd(this.optionSelection.selected(), inputText);\n if (willDuplicateExist.length > 0) {\n return;\n }\n }\n\n if (typeof this.settings.compareFn == 'function') {\n // The problem here is that compareFn can report that duplicate will exist as it does contains not match\n const matches = this.settings.compareFn(options, inputText);\n if (matches.length > 0 && matches.includes(this.settings.addTransformFn(inputText))) {\n return;\n }\n }\n\n this.showAddItem = true;\n\n if (this.showAddItem) {\n this.hasFocus = true;\n }\n this.cdRef.markForCheck();\n }\n\n toggleLock(event: any) {\n if (this.disabled) return;\n this.locked = !this.locked;\n this.lockedChange.emit(this.locked);\n\n if (!this.locked) {\n this.onUnlock.emit();\n }\n }\n\n}\n", "\n
\n
\n \n \n {{t('locked-field')}}\n \n \n
\n \n \n \n \n \n
\n {{t('loading')}}\n
\n \n \n \n
\n
\n\n \n
\n
    \n
  • \n {{t('add-item', {item: typeaheadControl.value})}}\n
  • \n
  • \n \n
  • \n
  • \n {{t('no-data')}}{{this.settings.addIfNonExisting ? t('add-custom-item') : ''}}\n
  • \n
\n
\n
\n
\n\n
\n"], "mappings": "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", "names": ["\u0275\u0275elementContainerStart", "\u0275\u0275elementStart", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "toggleLock", "\u0275\u0275element", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "t_r4", "_r5", "option_r6", "$implicit", "toggleSelection", "\u0275\u0275elementContainer", "\u0275\u0275template", "TypeaheadComponent_ng_container_0_app_tag_badge_5_i_2_Template", "\u0275\u0275property", "badgeTemplate", "\u0275\u0275pureFunction2", "_c4", "i_r7", "disabled", "settings", "id", "\u0275\u0275classMapInterpolate1", "multiple", "i0", "_r8", "clearSelections", "stopPropagation", "TypeaheadComponent_ng_container_0_ng_container_8_button_1_Template", "selected_r9", "length", "_r10", "focusedIndex", "updateHighlight", "addNewItem", "typeaheadControl", "value", "\u0275\u0275textInterpolate1", "\u0275\u0275pureFunction1", "_c5", "option_r12", "_r11", "handleOptionClick", "index_r13", "index", "showAddItem", "optionTemplate", "\u0275\u0275textInterpolate2", "addIfNonExisting", "TypeaheadComponent_ng_container_0_ng_container_10_div_1_li_3_Template", "TypeaheadComponent_ng_container_0_ng_container_10_div_1_li_4_Template", "TypeaheadComponent_ng_container_0_ng_container_10_div_1_li_5_Template", "hasFocus", "options_r14", "trackByIdentityFn", "TypeaheadComponent_ng_container_0_ng_container_10_div_1_Template", "TypeaheadComponent_ng_container_0_ng_container_3_Template", "_r1", "onInputFocus", "TypeaheadComponent_ng_container_0_app_tag_badge_5_Template", "TypeaheadComponent_ng_container_0_input_6_Template", "TypeaheadComponent_ng_container_0_div_7_Template", "TypeaheadComponent_ng_container_0_ng_container_8_Template", "TypeaheadComponent_ng_container_0_ng_container_10_Template", "typeaheadForm", "\u0275\u0275classMapInterpolate2", "locked", "showLocked", "_c3", "optionSelection", "selected", "isLoadingOptions", "\u0275\u0275pipeBind1", "selectedData", "filteredOptions", "ANIMATION_SPEED", "TypeaheadComponent", "constructor", "renderer2", "document", "cdRef", "reset", "ReplaySubject", "EventEmitter", "newItemAdded", "onUnlock", "lockedChange", "destroyRef", "inject", "DestroyRef", "ngOnInit", "pipe", "takeUntilDestroyed", "subscribe", "resetToEmpty", "init", "focus", "compareFn", "undefined", "console", "error", "hasOwnProperty", "formControl", "FormControl", "FormGroup", "get", "valueChanges", "tap", "val", "inputElem", "nativeElement", "setStyle", "trim", "map", "auditTime", "debounce", "filter", "minCharacters", "switchMap", "fetchFn", "items", "item", "filterSelected", "markForCheck", "setTimeout", "updateShowAddItem", "shareReplay", "savedData", "SelectionModel", "handleDocumentClick", "event", "target", "classList", "contains", "handleKeyPress", "key", "KEY_CODES", "DOWN_ARROW", "RIGHT_ARROW", "Math", "min", "querySelectorAll", "UP_ARROW", "LEFT_ARROW", "max", "ENTER", "forEach", "take", "opts", "preventDefault", "click", "BACKSPACE", "DELETE", "removeSelectedOption", "pop", "ESC_KEY", "opt", "toggle", "selectionCompareFn", "emit", "resetField", "untoggleAll", "title", "addTransformFn", "newItem", "unique", "isSelected", "openDropdown", "setValue", "body", "RendererStyleFlags2", "Important", "addClass", "removeClass", "options", "inputText", "dirty", "compareFnForAdd", "matches", "includes", "\u0275\u0275directiveInject", "Renderer2", "DOCUMENT", "ChangeDetectorRef", "selectors", "contentQueries", "rf", "ctx", "dirIndex", "\u0275\u0275resolveBody", "\u0275\u0275resolveWindow", "TypeaheadComponent_ng_container_0_Template", "CommonModule", "NgClass", "NgForOf", "NgIf", "NgTemplateOutlet", "AsyncPipe", "TagBadgeComponent", "ReactiveFormsModule", "\u0275NgNoValidate", "DefaultValueAccessor", "NgControlStatus", "NgControlStatusGroup", "FormGroupDirective", "FormControlName", "TranslocoDirective", "styles", "data", "animation", "trigger", "state", "style", "height", "transition", "overflow", "animate", "changeDetection"] }