import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged, startWith } from 'rxjs/operators'; import { Account } from '../../core/account'; import { AccountListDataSource } from './account-list-datasource'; @Component({ selector: 'app-account-list', templateUrl: './account-list.component.html', styleUrls: ['./account-list.component.css'], }) export class AccountListComponent implements OnInit, AfterViewInit { @ViewChild('filterElement', { static: true }) filterElement?: ElementRef; @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; @ViewChild(MatSort, { static: true }) sort?: MatSort; dataSource: AccountListDataSource; filter: Observable; form: FormGroup; list: Account[] = []; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['name', 'type', 'isActive', 'isReconcilable', 'costCentre']; constructor(private route: ActivatedRoute, private fb: FormBuilder) { this.form = this.fb.group({ filter: '', }); // Listen to Filter Change this.filter = (this.form.get('filter') as FormControl).valueChanges.pipe( startWith(''), debounceTime(150), distinctUntilChanged(), ); this.dataSource = new AccountListDataSource(this.list, this.filter); } ngOnInit() { this.route.data.subscribe((value) => { const data = value as { list: Account[] }; this.list = data.list; }); this.dataSource = new AccountListDataSource(this.list, this.filter, this.paginator, this.sort); } ngAfterViewInit() { setTimeout(() => { if (this.filterElement) this.filterElement.nativeElement.focus(); }, 0); } }