{ "version": 3, "sources": ["libs/galaxy/tags/src/tags.component.ts", "libs/galaxy/tags/src/tags.component.html", "libs/galaxy/tags/src/tags.module.ts"], "sourcesContent": ["// we don't want to re-order the fields here because it's easier to read with the interfaces separated\n/* eslint @typescript-eslint/member-ordering: 0 */\n\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport {\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n Self,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormControl, NgControl } from '@angular/forms';\nimport { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';\nimport { MatChipInputEvent } from '@angular/material/chips';\nimport { MatFormFieldControl } from '@angular/material/form-field';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Observable, Subject, map } from 'rxjs';\n\n@Component({\n selector: 'glxy-tags-input',\n styleUrls: ['./tags.component.scss'],\n templateUrl: './tags.component.html',\n})\nexport class TagsComponent implements OnInit, OnDestroy, MatFormFieldControl, ControlValueAccessor {\n @ViewChild('searchInput') searchInput?: ElementRef;\n\n private static nextId = 0;\n\n @Output() searchText = new EventEmitter();\n @Input() maxTagLength = 50;\n @Input() maxTags: number | null = null;\n\n _availableTags: string[] = [];\n @Input() set availableTags(tags: string[]) {\n this._availableTags = tags;\n }\n get availableTags(): string[] {\n if (this.uniqueTags) {\n return this._availableTags.filter((tag) => !this.chosenTagsControl.value.includes(tag));\n }\n return this._availableTags;\n }\n\n @Input() uniqueTags = true;\n @Input() autocompleteOnly = false;\n\n chosenTagsControl: FormControl = new FormControl([], { nonNullable: true });\n searchControl: FormControl = new FormControl('', { nonNullable: true });\n separatorKeysCodes: number[] = [ENTER, COMMA];\n\n maxTagLengthReached$: Observable = this.searchControl.valueChanges.pipe(\n map((searchTerm) => searchTerm.length >= this.maxTagLength),\n );\n maxTagLengthReachedMessage: string;\n\n constructor(\n @Optional() @Self() public ngControl: NgControl,\n private _elementRef: ElementRef,\n private readonly translate: TranslateService,\n ) {\n if (this.ngControl != null) {\n // Setting the value accessor directly (instead of using\n // the providers) to avoid running into a circular import.\n this.ngControl.valueAccessor = this;\n }\n\n this.maxTagLengthReachedMessage = this.translate.instant('GALAXY.TAGS.STRING_LIMIT_HINT', {\n maxLength: this.maxTagLength || 0,\n });\n }\n\n ngOnInit(): void {\n this.searchControl.valueChanges.subscribe((searchTerm) => {\n this.searchText.emit(searchTerm);\n });\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n\n /**\n * TagsComponent-specific fields\n */\n private addTag(tag: string): void {\n if (this.uniqueTags && this.chosenTagsControl.value.includes(tag)) {\n return;\n }\n\n if (this.autocompleteOnly && !this._availableTags.includes(tag)) {\n return;\n }\n\n const tags = this.chosenTagsControl.value || [];\n this.value = [...tags, tag];\n }\n\n private touchControls(): void {\n this.chosenTagsControl.markAsDirty();\n this.chosenTagsControl.markAsTouched();\n this.chosenTagsControl.updateValueAndValidity();\n this.searchControl.setValue('');\n this.searchControl.updateValueAndValidity();\n this.onTouched();\n }\n\n addNewTagByTokenEnd(event: MatChipInputEvent): void {\n const value = (event.value || '').trim();\n if (value) {\n this.addTag(value);\n }\n event?.chipInput?.clear();\n this.touchControls();\n }\n\n removeTag(tagIndex: number): void {\n if (tagIndex >= 0) {\n const tags = [...this.chosenTagsControl.value];\n tags.splice(tagIndex, 1);\n this.value = tags;\n }\n this.touchControls();\n }\n\n selectExistingTagFromAutocomplete(event: MatAutocompleteSelectedEvent): void {\n if (this.searchInput) this.searchInput.nativeElement.value = '';\n this.searchControl.setValue('');\n\n const tag = event?.option?.viewValue;\n if (tag) {\n this.addTag(tag);\n }\n this.touchControls();\n }\n\n /**\n * Implement MatFormFieldControl interface\n */\n @Input()\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value: BooleanInput) {\n this._disabled = coerceBooleanProperty(value);\n this.stateChanges.next();\n }\n protected _disabled = false;\n\n @Input()\n get required(): boolean {\n return this._required;\n }\n set required(value: BooleanInput) {\n this._required = coerceBooleanProperty(value);\n this.stateChanges.next();\n }\n protected _required = false;\n\n @Input()\n get value(): string[] | null {\n return this.chosenTagsControl.value;\n }\n set value(tags: string[] | null) {\n this.chosenTagsControl.setValue(tags ?? []);\n this.onChange(tags);\n this.stateChanges.next();\n }\n\n @Input()\n get placeholder() {\n return this._placeholder;\n }\n set placeholder(plh) {\n this._placeholder = plh;\n this.stateChanges.next();\n }\n protected _placeholder = 'GALAXY.TAGS.PLACEHOLDER';\n\n get empty(): boolean {\n return this.value?.length === 0;\n }\n\n get errorState(): boolean {\n return this.ngControl.errors !== null && !!this.ngControl.touched;\n }\n\n @HostBinding('[id]') id = `tags-control-${TagsComponent.nextId++}`;\n @HostBinding('[class.floating]') get shouldLabelFloat(): boolean {\n return false;\n }\n\n readonly stateChanges = new Subject();\n focused = false;\n readonly controlType = 'tags-input';\n autofilled?: boolean;\n userAriaDescribedBy?: string;\n onChange: (value: string[] | null) => void = () => ({});\n onTouched: () => void = () => ({});\n\n setDescribedByIds(ids: string[]): void {\n this._elementRef.nativeElement.setAttribute('aria-describedby', ids.join(' '));\n }\n onContainerClick(): void {\n this._elementRef.nativeElement.focus();\n }\n\n /**\n * Implement ControlValueAccessor interface\n */\n writeValue(value: string[]): void {\n this.value = value;\n }\n registerOnChange(fn: (v: string[] | null) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n}\n", "\n \n \n \n {{ tag || '-' }}\n cancel\n \n \n = maxTags\"\n [placeholder]=\"_placeholder | translate\"\n maxlength=\"{{ maxTagLength }}\"\n [formControl]=\"searchControl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputAddOnBlur]=\"false\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"addNewTagByTokenEnd($event)\"\n />\n \n \n {{ tag }}\n \n\n", "import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatInputModule } from '@angular/material/input';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { GalaxyBadgeModule } from '@vendasta/galaxy/badge';\nimport { GalaxyFormFieldModule } from '@vendasta/galaxy/form-field';\nimport { GalaxyTooltipModule } from '@vendasta/galaxy/tooltip';\nimport { TagsComponent } from './tags.component';\n\nexport const MODULE_IMPORTS = [\n CommonModule,\n MatAutocompleteModule,\n MatChipsModule,\n MatIconModule,\n MatInputModule,\n ReactiveFormsModule,\n TranslateModule,\n\n GalaxyBadgeModule,\n GalaxyFormFieldModule,\n GalaxyTooltipModule,\n];\n\nexport const MODULE_DECLARATIONS = [TagsComponent];\n\n@NgModule({\n declarations: MODULE_DECLARATIONS,\n exports: MODULE_DECLARATIONS,\n imports: MODULE_IMPORTS,\n})\nexport class GalaxyTagsModule {}\n"], "mappings": "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", "names": ["\u0275\u0275elementContainerStart", "\u0275\u0275elementStart", "\u0275\u0275listener", "tagIndex_r3", "\u0275\u0275restoreView", "_r2", "index", "ctx_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "removeTag", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "tag_r5", "\u0275\u0275property", "tag_r6", "\u0275\u0275textInterpolate", "TagsComponent", "availableTags", "tags", "_availableTags", "uniqueTags", "filter", "tag", "chosenTagsControl", "value", "includes", "constructor", "ngControl", "_elementRef", "translate", "searchText", "EventEmitter", "maxTagLength", "maxTags", "autocompleteOnly", "FormControl", "nonNullable", "searchControl", "separatorKeysCodes", "ENTER", "COMMA", "maxTagLengthReached$", "valueChanges", "pipe", "map", "searchTerm", "length", "_disabled", "_required", "_placeholder", "id", "nextId", "stateChanges", "Subject", "focused", "controlType", "onChange", "onTouched", "valueAccessor", "maxTagLengthReachedMessage", "instant", "maxLength", "ngOnInit", "subscribe", "emit", "ngOnDestroy", "complete", "addTag", "touchControls", "markAsDirty", "markAsTouched", "updateValueAndValidity", "setValue", "addNewTagByTokenEnd", "event", "trim", "chipInput", "clear", "tagIndex", "splice", "selectExistingTagFromAutocomplete", "searchInput", "nativeElement", "option", "viewValue", "disabled", "coerceBooleanProperty", "next", "required", "placeholder", "plh", "empty", "errorState", "errors", "touched", "shouldLabelFloat", "setDescribedByIds", "ids", "setAttribute", "join", "onContainerClick", "focus", "writeValue", "registerOnChange", "fn", "registerOnTouched", "setDisabledState", "isDisabled", "_TagsComponent", "\u0275\u0275directiveInject", "NgControl", "ElementRef", "TranslateService", "selectors", "viewQuery", "rf", "ctx", "\u0275\u0275hostProperty", "\u0275\u0275template", "TagsComponent_ng_container_3_Template", "$event", "i0", "_r1", "TagsComponent_mat_option_9_Template", "\u0275\u0275propertyInterpolate", "\u0275\u0275pipeBind1", "auto_r8", "chipGrid_r7", "MODULE_IMPORTS", "CommonModule", "MatAutocompleteModule", "MatChipsModule", "MatIconModule", "MatInputModule", "ReactiveFormsModule", "TranslateModule", "GalaxyBadgeModule", "GalaxyFormFieldModule", "GalaxyTooltipModule", "GalaxyTagsModule", "MODULE_IMPORTS", "_GalaxyTagsModule"] }