11import {
22 Component ,
3- Input ,
43 Output ,
54 EventEmitter ,
65 inject ,
76 input ,
87 computed ,
8+ Signal ,
9+ signal ,
10+ viewChild ,
11+ ElementRef ,
912} from '@angular/core' ;
1013
1114import * as models from '@models' ;
1215import { ScreenSizeService } from '@services' ;
1316import { MatMenuTrigger , MatMenu , MatMenuItem } from '@angular/material/menu' ;
1417import { AsyncPipe } from '@angular/common' ;
15- import { MatLabel } from '@angular/material/input' ;
16- import { MatButton } from '@angular/material/button' ;
17- import { TranslateModule } from '@ngx-translate/core' ;
18+ import { MatLabel , MatInputModule } from '@angular/material/input' ;
19+ import { MatButton , MatIconButton } from '@angular/material/button' ;
20+ import { TranslateModule , TranslateService } from '@ngx-translate/core' ;
1821import { DatasetComponent } from './dataset/dataset.component' ;
22+ import { MatFormFieldModule } from '@angular/material/form-field' ;
23+ import { FormsModule } from '@angular/forms' ;
24+ import { MatIconModule } from '@angular/material/icon' ;
1925
2026// Declare GTM dataLayer array.
2127declare global {
@@ -37,29 +43,59 @@ declare global {
3743 AsyncPipe ,
3844 TranslateModule ,
3945 DatasetComponent ,
46+ MatFormFieldModule ,
47+ MatInputModule ,
48+ FormsModule ,
49+ MatIconModule ,
50+ MatIconButton ,
4051 ] ,
4152} )
4253export class DatasetSelectorComponent {
4354 private screenSize = inject ( ScreenSizeService ) ;
44-
45- @Input ( ) datasets : models . Dataset [ ] ;
46-
55+ private translate = inject ( TranslateService ) ;
4756 @Output ( ) selectedChange = new EventEmitter < string > ( ) ;
4857
58+ public datasets = input < models . Dataset [ ] > ( ) ;
4959 public selected = input < string > ( ) ;
60+
61+ public datasetFilter = signal < string > ( null ) ;
5062 public breakpoint$ = this . screenSize . breakpoint$ ;
5163 public breakpoints = models . Breakpoints ;
5264 public isReadMore = true ;
5365
66+ public searchElement = viewChild < ElementRef > ( 'datasetOptions' ) ;
67+
5468 public datasetName = computed ( ( ) => {
5569 let datasetName = '' ;
56- this . datasets . forEach ( ( dataset ) => {
70+ this . datasets ( ) . forEach ( ( dataset ) => {
5771 if ( dataset . id === this . selected ( ) ) {
5872 datasetName = dataset . name ;
5973 }
6074 } ) ;
6175 return datasetName ;
6276 } ) ;
77+
78+ public filteredDatasets : Signal < models . Dataset [ ] > = computed ( ( ) => {
79+ if ( ! this . datasetFilter ( ) ) {
80+ return this . datasets ( ) ;
81+ }
82+ const userInput = this . datasetFilter ( ) . toUpperCase ( ) ;
83+ return this . datasets ( ) . filter ( ( dataset ) => {
84+ return (
85+ dataset . name . toUpperCase ( ) . includes ( userInput ) ||
86+ this . translate
87+ . instant ( dataset . platformDesc )
88+ . toUpperCase ( )
89+ . includes ( userInput ) ||
90+ dataset . source . name . includes ( userInput )
91+ ) ;
92+ } ) ;
93+ } ) ;
94+
95+ public menuOpen ( ) {
96+ this . searchElement ( ) . nativeElement . focus ( ) ;
97+ }
98+
6399 public onSelectionChange ( dataset : string ) : void {
64100 window . dataLayer = window . dataLayer || [ ] ;
65101 window . dataLayer . push ( {
0 commit comments