{"version":3,"file":"yuuvis-client-framework-simple-search.mjs","sources":["../../../../../libs/yuuvis/client-framework/simple-search/src/lib/simple-search/simple-search.component.ts","../../../../../libs/yuuvis/client-framework/simple-search/src/lib/simple-search/simple-search.component.html","../../../../../libs/yuuvis/client-framework/simple-search/src/yuuvis-client-framework-simple-search.ts"],"sourcesContent":["import { AfterViewInit, Component, DestroyRef, ElementRef, Input, inject, output, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormField } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport {\n  AggregateResult,\n  BaseObjectTypeField,\n  SearchQuery,\n  SearchService,\n  SystemService,\n  TranslatePipe,\n  TranslateService,\n  Utils\n} from '@yuuvis/client-core';\nimport { YmtIconButtonDirective } from '@yuuvis/material';\nimport { debounceTime, tap } from 'rxjs';\nimport { ObjectTypeAggregation } from '../models';\n\n@Component({\n  selector: 'yuv-simple-search',\n  standalone: true,\n  imports: [\n    ReactiveFormsModule,\n    TranslatePipe,\n    MatIconModule,\n    MatButtonModule,\n    MatFormField,\n    MatInputModule,\n    YmtIconButtonDirective\n  ],\n  templateUrl: './simple-search.component.html',\n  styleUrls: ['./simple-search.component.scss'],\n  providers: [\n    {\n      provide: MAT_FORM_FIELD_DEFAULT_OPTIONS,\n      useValue: {\n        subscriptSizing: 'dynamic'\n      }\n    }\n  ]\n})\nexport class SimpleSearchComponent implements AfterViewInit {\n  //#region Dependencies\n\n  #fb = inject(FormBuilder);\n  #destroyRef = inject(DestroyRef);\n  readonly translate = inject(TranslateService);\n  #searchService = inject(SearchService);\n  #systemService = inject(SystemService);\n\n  //#endregion\n\n  //#region Angular stuff\n\n  /**\n   * The search query\n   */\n  @Input() set query(q: SearchQuery | null) {\n    this._query = structuredClone(q) || {};\n    if (this._query.term) {\n      this.form.patchValue({ term: this._query.term });\n      // this.aggregate();\n    } else this.form.reset();\n  }\n\n  get query() {\n    return this._query;\n  }\n\n  /**\n   * Emitted once the user submits the search\n   */\n  readonly querySubmit = output<SearchQuery>();\n\n  /**\n   * Emitted once the user hits clear input button\n   */\n  readonly clearInput = output<void>();\n  /**\n   * Emitted once selected targets change\n   */\n  readonly targetSelectionChanged = output<(string | number)[]>();\n  readonly queryChange = output<SearchQuery>();\n  readonly typeAggregation = output<ObjectTypeAggregation[]>();\n\n  readonly searchInput = viewChild.required<ElementRef<HTMLInputElement>>('searchInput');\n\n  //#endregion\n\n  //#region Properties\n\n  public form: FormGroup = this.#fb.group({\n    term: [''],\n    targets: []\n  });\n\n  private _query: SearchQuery = {};\n\n  //#endregion\n\n  //#region Lifecycle Hooks\n\n  public ngAfterViewInit(): void {\n    this.subscribeToTargetsChanges();\n    this.subscribeToSearchFormChanges();\n  }\n\n  //#endregion\n\n  //#region Subscription\n\n  private subscribeToTargetsChanges(): void {\n    this.form.controls['targets'].valueChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((value) => {\n      this._query.types = value;\n      this.targetSelectionChanged.emit(value);\n    });\n  }\n\n  private subscribeToSearchFormChanges(): void {\n    this.form.valueChanges\n      .pipe(\n        debounceTime(500),\n        takeUntilDestroyed(this.#destroyRef),\n        tap((value: any) => {\n          this._query.term = value.term;\n          this.queryChange.emit(this._query);\n          // TODO: decide if we want to trigger aggregation on search term change, if yes uncomment the following line\n          // and Find out why `observed` is removed from type aggregations.\n          // if (this.typeAggregation.observed) this.aggregate();\n        })\n      )\n      .subscribe();\n  }\n\n  //#endregion\n\n  //#region Utilities\n\n  private aggregate(all?: boolean): void {\n    if (all || this._query.term) {\n      this.#searchService\n        .aggregate(structuredClone(this._query), [BaseObjectTypeField.OBJECT_TYPE_ID])\n        .subscribe(this.handleAggregateResult);\n    }\n  }\n\n  //#endregion\n\n  //#region UI Methods\n\n  public onSearch(): void {\n    if (this.form.valid) {\n      this._query.term = this.form.value.term;\n      this.querySubmit.emit(this._query);\n    }\n  }\n\n  public onClear($event: Event): void {\n    if (this.form.value.term) {\n      this._query = { ...this._query, term: undefined };\n      this.form.controls['term'].setValue(null, { emitEvent: false });\n      this.queryChange.emit(this._query);\n      this.clearInput.emit();\n      setTimeout(() => {\n        this.searchInput().nativeElement.focus();\n      });\n    }\n    $event.stopPropagation();\n  }\n\n  //#endregion\n\n  //#region Handlers\n\n  private handleAggregateResult = (result: AggregateResult) => {\n    if (result.aggregations && result.aggregations.length) {\n      this.typeAggregation.emit(\n        result.aggregations[0].entries\n          .map((result) => ({\n            objectTypeId: result.key,\n            label: this.#systemService.getLocalizedLabel(result.key) || result.key,\n            count: result.count\n          }))\n          .sort(Utils.sortValues('label'))\n      );\n    } else {\n      this.typeAggregation.emit([]);\n    }\n  };\n\n  //#endregion\n}\n","<form role=\"search\" class=\"search-form\" [formGroup]=\"form\" (ngSubmit)=\"onSearch()\">\n  <!-- Todo: String Translations-->\n  <mat-form-field appearance=\"outline\">\n    <label>\n      <span class=\"ymt-hide-sr\">{{ 'yuv.simple-search.label' | translate }}</span>\n      <input\n        #searchInput\n        matInput\n        type=\"text\"\n        autocomplete=\"off\"\n        name=\"{{ 'yuv.simple-search.label' | translate }}\"\n        formControlName=\"term\"\n        [placeholder]=\"'yuv.simple-search.label' | translate\"\n      />\n    </label>\n\n    <button\n      ymtIconButton\n      matSuffix\n      type=\"button\"\n      [attr.aria-label]=\"'yuv.simple-search.clear' | translate\"\n      [attr.title]=\"'yuv.simple-search.clear' | translate\"\n      [attr.inert]=\"form.get('term')?.value ? null : true\"\n      (click)=\"onClear($event)\"\n    >\n      <mat-icon aria-hidden=\"true\">close</mat-icon>\n    </button>\n\n    <button ymtIconButton matSuffix type=\"submit\" [attr.aria-label]=\"'yuv.simple-search.submit' | translate\" [disabled]=\"form.invalid\">\n      <mat-icon aria-hidden=\"true\">search</mat-icon>\n    </button>\n  </mat-form-field>\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}