{"version":3,"file":"tft-crispr-forms-index-WIb0_UHp.mjs","sources":["../../../../libs/crispr-forms/src/lib/ui/autocomplete-chiplist-field/autocomplete-chiplist-field.component.ts","../../../../libs/crispr-forms/src/lib/ui/autocomplete-chiplist-field/autocomplete-chiplist-field.component.html"],"sourcesContent":["/* eslint-disable @nx/enforce-module-boundaries */\nimport {\n  Component,\n  OnInit,\n  ChangeDetectionStrategy,\n  ViewChild,\n  ElementRef,\n  signal,\n} from '@angular/core';\nimport { map, take, tap } from 'rxjs/operators';\nimport {\n  MatAutocompleteModule,\n  MatAutocompleteSelectedEvent,\n  MatAutocompleteTrigger,\n} from '@angular/material/autocomplete';\nimport { Observable, BehaviorSubject, combineLatest } from 'rxjs';\nimport { ENTER } from '@angular/cdk/keycodes';\nimport { FormGroup } from '@angular/forms';\nimport { ConnectionPositionPair, CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\n\nimport { MatChipInputEvent, MatChipsModule } from '@angular/material/chips';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { OptionComponent } from '../option';\nimport { MatIconModule } from '@angular/material/icon';\nimport {\n  AutocompleteChiplistFieldConfig,\n  AbstractAutocompleteComponent,\n  DEFAULT_EMPTY_OPTIONS_MESSAGE,\n  SelectOption,\n  buildFormGroupFromConfig,\n} from '../../utils';\nimport { FieldContainerComponent } from '../field-container';\nimport { InfoComponent } from '../info';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport { CrisprFieldDirective } from '../../field.directive';\n\nconst defaultConfig: Partial<AutocompleteChiplistFieldConfig> = {\n  chipsSelectable: true,\n  areChipsRemovable: true,\n  tabToSelect: true,\n  autoActiveFirstOption: true,\n  imageUrlParam: 'image',\n  typeDebounceTime: 500,\n  allowDuplicates: false,\n  duplicateCompareFunction: (chip, option) => chip.value === option.value,\n  separatorKeyCodes: [ENTER],\n  emptyOptionsMessage: DEFAULT_EMPTY_OPTIONS_MESSAGE,\n};\n\n/** Sentinel used to detect \"Create New\" selection — never matches a real SelectOption */\nconst CREATE_NEW_SENTINEL: unique symbol = Symbol('CREATE_NEW');\n\n@Component({\n    selector: 'crispr-autocomplete-chiplist-field',\n    templateUrl: './autocomplete-chiplist-field.component.html',\n    styleUrls: ['./autocomplete-chiplist-field.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    imports: [\n        CommonModule,\n        InfoComponent,\n        OptionComponent,\n        ReactiveFormsModule,\n        FieldContainerComponent,\n        MatAutocompleteModule,\n        MatInputModule,\n        MatOptionModule,\n        MatChipsModule,\n        MatIconModule,\n        MatButtonModule,\n        FormValidationHandlerModule,\n        CdkConnectedOverlay,\n        CdkOverlayOrigin,\n        CrisprFieldDirective,\n    ],\n    standalone: true\n})\nexport class AutocompleteChiplistFieldComponent\n  extends AbstractAutocompleteComponent<AutocompleteChiplistFieldConfig>\n  implements OnInit\n{\n  defaultConfig = defaultConfig;\n  chips$ = new BehaviorSubject<SelectOption[]>([]);\n  remainingOptions$: Observable<SelectOption[]>;\n  selectedChip: SelectOption = null;\n  controlValue$ = this.chips$.pipe(\n    tap((chips) => {\n      this.control().setValue(chips.map((chip) => chip.value));\n    })\n  );\n\n  // We need use ViewChild twice on the same template ref to access as different types\n  // - the MatAutocompleteTrigger is used to for selecting value on tab\n  // - the ElementRef<HTMLInputElement> is used to clear the value from input element on selection\n  @ViewChild('autoInput', { read: MatAutocompleteTrigger })\n  chipInput: MatAutocompleteTrigger;\n  @ViewChild('autoInput') chipInputRef: ElementRef<HTMLInputElement>;\n  @ViewChild(CdkOverlayOrigin) overlayOrigin: CdkOverlayOrigin;\n\n  readonly createNewSentinel = CREATE_NEW_SENTINEL;\n  showCreateForm = signal(false);\n  createFormGroup = new FormGroup({});\n\n  readonly createFormPositions: ConnectionPositionPair[] = [\n    { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n    { originX: 'start', originY: 'top',    overlayX: 'start', overlayY: 'bottom' },\n  ];\n\n  get overlayWidth(): number {\n    return this.overlayOrigin?.elementRef.nativeElement.offsetWidth ?? 0;\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n    this.remainingOptions$ = combineLatest([this.chips$, this.options$]).pipe(\n      map(([chips, options]) => {\n        return this.config().allowDuplicates\n          ? options\n          : options?.filter((option) => {\n              const compare = this.config().duplicateCompareFunction\n                ?? ((chip: SelectOption, opt: SelectOption) => chip.value === opt.value);\n              return !chips.some((chip) => compare(chip, option));\n            });\n      })\n    );\n  }\n\n  setControlValue(value: SelectOption[]) {\n    if (value) {\n      this.chips$.next(value);\n    }\n  }\n\n  handleSelect(event: MatAutocompleteSelectedEvent) {\n    if ((event.option.value as unknown) === CREATE_NEW_SENTINEL) {\n      this.openCreateForm();\n      return;\n    }\n    const selectedOption: SelectOption = event.option.value as SelectOption;\n    this.chips$.next([...this.chips$.value, selectedOption]);\n    this.chipInputRef.nativeElement.value = '';\n    this.autocompleteInputControl.setValue('');\n    // setTimeout needed because the panel thinks it's still open at this point\n    setTimeout(() => this.chipInput.openPanel());\n  }\n\n  openCreateForm() {\n    this.createFormGroup = buildFormGroupFromConfig({ fields: this.config().createChip!.fields });\n    this.chipInputRef.nativeElement.value = '';\n    this.autocompleteInputControl.setValue('');\n    setTimeout(() => this.showCreateForm.set(true));\n  }\n\n  submitNewChip() {\n    this.config().createChip!.submitChip(this.createFormGroup)\n      .pipe(take(1))\n      .subscribe((newChip) => {\n        this.chips$.next([...this.chips$.value, newChip]);\n        this.showCreateForm.set(false);\n      });\n  }\n\n  closeCreateForm() {\n    this.showCreateForm.set(false);\n  }\n\n  /**\n   * To follow ARIA standards we want to select the active option on blur.\n   * matChipInputAddOnBlur should do this but it causes buggy behaviour\n   * @param event blur event that triggers the handle blur\n   */\n  handleTab(_event: FocusEvent) {\n    if (\n      this.chipInput.activeOption &&\n      (this.config().tabToSelect || this.config().addChipOnBlur)\n    ) {\n      const chip = this.chipInput.activeOption.value;\n      this.chips$.next([...this.chips$.value, chip]);\n    }\n  }\n\n  /**\n   * Handles selection via key tokens passed through separatorKeyCodes property\n   * NOTE: If TAB is used focus does not move on to next component\n   * @param event\n   */\n  handleTokenEnd(event: MatChipInputEvent) {\n    if (this.chipInput.activeOption) {\n      this.chipInput.activeOption.select();\n    }\n    event.chipInput?.clear();\n  }\n\n  mapToLabel(option: SelectOption) {\n    if (!option || (option as unknown) === CREATE_NEW_SENTINEL) return '';\n    return option.label ?? '';\n  }\n\n  removeChip(removedChip: SelectOption) {\n    const remainingChips: SelectOption[] = this.chips$.value.filter(\n      (chip) => chip !== removedChip\n    );\n    this.chips$.next(remainingChips);\n  }\n\n  highlightChip(chip: SelectOption) {\n    if(this.config().chipsSelectable) {\n      this.selectedChip = chip\n    }\n  }\n\n  blurField() {\n    this.selectedChip = null;\n  }\n}\n","<crispr-field-container [config]=\"config()\" [group]=\"group()\">\n\n  <mat-form-field cdkOverlayOrigin [attr.data-testid]=\"testId()\" [color]=\"config().color\" [appearance]=\"config().appearance\" [formGroup]=\"group()\">\n    @if (config().label) {<mat-label>{{config().label}}</mat-label>}\n\n    <mat-chip-grid #chipList>\n      <!-- [selectable]=\"config().chipsSelectable\" -->\n      @for (chip of controlValue$ | async; track chip; let i = $index) {\n      <mat-chip-row class=\"refinement-chip\" [removable]=\"config().areChipsRemovable\"\n        [highlighted]=\"chip?.value === selectedChip?.value\" (click)=\"highlightChip(chip)\" (removed)=\"removeChip(chip)\">\n        @if (chip.imageUrl) {<img [src]=\"chip.imageUrl\" matChipAvatar alt=\"image of {{chip.label}}\">}\n        {{chip.label}}\n        @if (config().areChipsRemovable) {<mat-icon matChipRemove>cancel</mat-icon>}\n      </mat-chip-row>\n      }\n      <input class=\"hidden-error-directive-anchor\" (blur)=\"blurField()\" [formControlName]=\"config().controlName\"\n        type=\"text\" />\n\n      <input matInput [formControl]=\"autocompleteInputControl\" [placeholder]=\"config().placeholder\"\n        [matChipInputFor]=\"chipList\" [matAutocomplete]=\"auto\" (keydown.tab)=\"handleTab($event)\"\n        [matChipInputSeparatorKeyCodes]=\"config().separatorKeyCodes\" (matChipInputTokenEnd)=\"handleTokenEnd($event)\"\n        role=\"searchbox\" type=\"text\" autocapitalize=\"off\" autocorrect=\"off\" spellcheck=\"false\" (blur)=\"blurField()\"\n        #autoInput />\n      @if (config().fieldSuffix) {<span matSuffix>{{config().fieldSuffix}}</span>}\n      @if (config().info) {<crispr-info matSuffix [info]=\"config().info \"></crispr-info>}\n\n    </mat-chip-grid>\n    <mat-autocomplete #auto=\"matAutocomplete\" [autoActiveFirstOption]=\"this.config().autoActiveFirstOption\"\n      (optionSelected)=\"handleSelect($event)\" [displayWith]=\"mapToLabel\">\n      @if (remainingOptions$ | async; as remainingOptions) {\n      @if (remainingOptions.length > 0) {\n      @for (option of remainingOptions$ | async; track option.value) {\n      <mat-option [value]=\"option\">\n        <crispr-option [option]=\"option\"></crispr-option>\n      </mat-option>\n      }\n      } @else {\n      <mat-option disabled=\"true\">\n        {{config().emptyOptionsMessage}}\n      </mat-option>\n      }\n      } @else {\n      <mat-option disabled=\"true\">\n        {{config().emptyOptionsMessage}}\n      </mat-option>\n      }\n      @if (config().createChip) {\n      <mat-option [value]=\"createNewSentinel\" class=\"create-new-option\">\n        {{ config().createChip?.createLabel ?? '+ Create New' }}\n      </mat-option>\n      }\n    </mat-autocomplete>\n\n    @if (config().hint && (control().valid || !control().touched)) {<mat-hint>{{config().hint}}</mat-hint>}\n\n  </mat-form-field>\n\n  <ng-template\n    cdkConnectedOverlay\n    [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n    [cdkConnectedOverlayOpen]=\"showCreateForm()\"\n    [cdkConnectedOverlayWidth]=\"overlayWidth\"\n    [cdkConnectedOverlayPositions]=\"createFormPositions\"\n    (overlayOutsideClick)=\"closeCreateForm()\">\n    <div class=\"create-chip-panel mat-elevation-z4\">\n      @for (field of config().createChip?.fields ?? []; track field) {\n      <ng-container crisprField [config]=\"field\" [group]=\"createFormGroup\"></ng-container>\n      }\n      <div class=\"create-chip-actions\">\n        <button mat-stroked-button type=\"button\" (click)=\"closeCreateForm()\">Cancel</button>\n        <button mat-raised-button color=\"primary\" type=\"button\" (click)=\"submitNewChip()\">\n          {{ config().createChip?.submitLabel ?? 'Add' }}\n        </button>\n      </div>\n    </div>\n  </ng-template>\n\n</crispr-field-container>\n"],"names":["i4","i6","i7","i8","i9"],"mappings":"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"}