@devlukaszmichalak/mat-select-filter
Version:
A filter for mat-select
1 lines • 15.3 kB
Source Map (JSON)
{"version":3,"file":"devlukaszmichalak-mat-select-filter.mjs","sources":["../../../projects/lib/src/lib/mat-select-filter.component.ts","../../../projects/lib/src/lib/mat-select-filter.component.html","../../../projects/lib/src/lib/mat-select-filter.module.ts","../../../projects/lib/src/public_api.ts","../../../projects/lib/src/devlukaszmichalak-mat-select-filter.ts"],"sourcesContent":["import {Component, DestroyRef, ElementRef, inject, input, OnInit, output, signal, viewChild} from '@angular/core';\r\nimport {FormBuilder, FormsModule, ReactiveFormsModule} from '@angular/forms';\r\nimport {debounceTime, finalize, fromEvent, map, merge, takeUntil, tap, throttleTime, timer} from 'rxjs';\r\nimport {MatProgressSpinnerModule} from '@angular/material/progress-spinner';\r\nimport {CommonModule} from '@angular/common';\r\nimport {MatInputModule} from '@angular/material/input';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n@Component({\r\n selector: 'mat-select-filter',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatProgressSpinnerModule,\r\n MatInputModule\r\n ],\r\n templateUrl: './mat-select-filter.component.html',\r\n styleUrls: ['./mat-select-filter.component.scss']\r\n})\r\nexport class MatSelectFilterComponent<T = any> implements OnInit {\r\n\r\n #fb = inject(FormBuilder);\r\n #destroyRef = inject(DestroyRef);\r\n\r\n readonly input = viewChild<ElementRef<HTMLInputElement>>('input');\r\n\r\n readonly array = input.required<T[]>();\r\n readonly placeholder = input<string>('Search...');\r\n readonly color = input<string>('white');\r\n readonly displayMember = input<string>();\r\n readonly showSpinner = input(true);\r\n readonly noResultsMessage = input('No results');\r\n readonly hasGroup = input<string>();\r\n readonly groupArrayName = input<string>();\r\n readonly filterDebounceTime = input(0);\r\n\r\n readonly filteredReturn = output<T[]>();\r\n\r\n readonly noResults = signal(false);\r\n readonly localSpinner = signal(false);\r\n\r\n #shouldFocus = signal(true);\r\n\r\n filteredItems: T[] = [];\r\n\r\n searchForm = this.#fb.group({\r\n filterValue: ''\r\n });\r\n\r\n ngOnInit(): void {\r\n // since the component is not destroyed, we want to reset the filter\r\n // when no options would show and mat-select-filter is not visible\r\n // this also sets item to be focused on the next time it will be opened\r\n merge(\r\n fromEvent(document, 'scroll'),\r\n fromEvent(document, 'keyup'),\r\n fromEvent(document, 'mousemove'),\r\n fromEvent(document, 'click')\r\n ).pipe(\r\n throttleTime(100),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe(() => {\r\n const filters = document.querySelectorAll('mat-select-filter');\r\n if (filters.length === 0) {\r\n this.#shouldFocus.set(true)\r\n\r\n if (this.filteredItems.length === 0) {\r\n this.searchForm.controls.filterValue.setValue('')\r\n this.filteredReturn.emit(this.array())\r\n }\r\n }\r\n\r\n if (filters.length > 0 && this.#shouldFocus()) {\r\n this.input()?.nativeElement.focus()\r\n this.#shouldFocus.set(false)\r\n }\r\n })\r\n\r\n this.searchForm.valueChanges\r\n .pipe(\r\n debounceTime(this.filterDebounceTime()),\r\n tap(() => this.localSpinner.set(true)),\r\n map(changes => changes.filterValue?.toLowerCase()),\r\n takeUntilDestroyed(this.#destroyRef),\r\n finalize(() => this.filteredReturn.emit(this.array())),\r\n )\r\n .subscribe(userInputLowerCase => {\r\n\r\n if (userInputLowerCase) {\r\n this.#filterArray(userInputLowerCase);\r\n\r\n // NO RESULTS VALIDATION\r\n this.noResults.set(!this.filteredItems == null || this.filteredItems.length === 0);\r\n\r\n } else {\r\n this.filteredItems = this.array().slice();\r\n this.noResults.set(false);\r\n }\r\n\r\n this.filteredReturn.emit(this.filteredItems);\r\n timer(2000)\r\n .pipe(takeUntil(this.searchForm.valueChanges))\r\n .subscribe(() => this.localSpinner.set(false))\r\n });\r\n }\r\n\r\n #filterArray(userInputLowerCase: string): void {\r\n // IF THE DISPLAY MEMBER INPUT IS SET, WE CHECK THE SPECIFIC PROPERTY\r\n if (!this.displayMember()) {\r\n this.filteredItems = this.array().filter((name: any) => name.toLowerCase().includes(userInputLowerCase));\r\n return;\r\n }\r\n\r\n if (this.hasGroup() && this.groupArrayName() && this.displayMember()) {\r\n this.filteredItems = this.array()\r\n .map((element: any) => {\r\n const objCopy = {...element};\r\n objCopy[this.groupArrayName()!] = objCopy[this.groupArrayName()!]\r\n .filter((groupItem: any) => groupItem[this.displayMember()!].toLowerCase().includes(userInputLowerCase));\r\n return objCopy;\r\n })\r\n .filter((element: any) => element[this.groupArrayName()!].length > 0);\r\n return;\r\n }\r\n\r\n // OTHERWISE, WE CHECK THE ENTIRE STRING\r\n this.filteredItems = this.array().filter((item: any) => item[this.displayMember()!].toLowerCase().includes(userInputLowerCase));\r\n }\r\n\r\n handleKeydown(event: KeyboardEvent): void {\r\n // PREVENT PROPAGATION FOR ALL ALPHANUMERIC CHARACTERS TO AVOID SELECTION ISSUES\r\n if (this.#isAlphanumeric(event)) {\r\n event.stopPropagation();\r\n }\r\n }\r\n\r\n #isAlphanumeric(event: KeyboardEvent): boolean {\r\n const key = event.key;\r\n return !!key && key.length === 1 && /^[a-zA-Z0-9 ]$/.test(key);\r\n };\r\n}\r\n","<form [formGroup]=\"searchForm\" class=\"mat-filter\"\r\n [ngStyle]=\"{'background-color': color()}\">\r\n <div>\r\n <input #input\r\n class=\"mat-filter-input\"\r\n matInput\r\n placeholder=\"{{placeholder()}}\"\r\n formControlName=\"filterValue\"\r\n (keydown)=\"handleKeydown($event)\">\r\n @if (localSpinner() && showSpinner()) {\r\n <mat-spinner class=\"spinner\" diameter=\"16\"></mat-spinner>\r\n }\r\n </div>\r\n @if (noResults()) {\r\n <div class=\"noResultsMessage no-results-message\">\r\n {{ noResultsMessage() }}\r\n </div>\r\n }\r\n</form>","import { MatSelectFilterComponent } from './mat-select-filter.component';\r\nimport { NgModule } from '@angular/core';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [MatSelectFilterComponent],\r\n exports: [MatSelectFilterComponent]\r\n})\r\nexport class MatSelectFilterModule {\r\n}\r\n","/*\r\n * Public API Surface of mat-select-filter\r\n */\r\n\r\nexport * from './lib/mat-select-filter.component';\r\nexport * from './lib/mat-select-filter.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}