import { AfterViewInit, Component, ElementRef, inject, OnInit, ViewChild } from '@angular/core'; import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; import { MatAnchor } from '@angular/material/button'; import { MatCard, MatCardContent, MatCardHeader, MatCardTitle, MatCardTitleGroup } from '@angular/material/card'; import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field'; import { MatIcon } from '@angular/material/icon'; import { MatInput } from '@angular/material/input'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort, MatSortHeader } from '@angular/material/sort'; import { MatCell, MatCellDef, MatColumnDef, MatHeaderCell, MatHeaderCellDef, MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatTable, } from '@angular/material/table'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; import { Account } from '../../core/account'; import { AccountType } from '../../core/account-type'; import { AccountListDataSource } from './account-list-datasource'; @Component({ selector: 'app-account-list', templateUrl: './account-list.component.html', styleUrls: ['./account-list.component.css'], imports: [ MatCard, MatCardHeader, MatCardTitleGroup, MatCardTitle, MatAnchor, RouterLink, MatIcon, MatCardContent, ReactiveFormsModule, MatFormField, MatLabel, MatInput, MatTable, MatSort, MatColumnDef, MatHeaderCellDef, MatHeaderCell, MatSortHeader, MatCellDef, MatCell, MatSuffix, MatHeaderRowDef, MatHeaderRow, MatRowDef, MatRow, MatPaginator, ], }) export class AccountListComponent implements OnInit, AfterViewInit { private route = inject(ActivatedRoute); @ViewChild('filterElement', { static: true }) filterElement!: ElementRef; @ViewChild(MatPaginator, { static: true }) paginator!: MatPaginator; @ViewChild(MatSort, { static: true }) sort!: MatSort; dataSource: AccountListDataSource; filter: Observable; form: FormGroup<{ filter: FormControl; }>; list: Account[] = []; accountTypes: AccountType[] = []; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['name', 'type', 'isActive', 'isReconcilable', 'costCentre']; constructor() { this.form = new FormGroup({ filter: new FormControl('', { nonNullable: true }), }); // Listen to Filter Change this.filter = this.form.controls.filter.valueChanges.pipe(debounceTime(150), distinctUntilChanged()); this.dataSource = new AccountListDataSource(this.list, this.filter, this.paginator, this.sort); } ngOnInit() { this.route.data.subscribe((value) => { const data = value as { list: Account[]; accountTypes: AccountType[] }; this.accountTypes = data.accountTypes; data.list.forEach((x) => (x.typeName = this.accountTypes.find((y) => y.id === x.type)?.name ?? '')); this.list = data.list; }); this.dataSource = new AccountListDataSource(this.list, this.filter, this.paginator, this.sort); } ngAfterViewInit() { setTimeout(() => { this.filterElement.nativeElement.focus(); }, 0); } }