/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import {Component, OnInit, ViewChild} from '@angular/core'; import {DataSource} from '@angular/cdk/table'; import {MatSort} from '@angular/material/sort'; import {MatPaginator} from '@angular/material/paginator'; import {BehaviorSubject, merge, Observable} from 'rxjs'; import {map} from 'rxjs/operators'; export interface UserData { name: string; color: string; age: number; } const exampleData = [ {name: 'Austin', color: 'blue', age: 30}, {name: 'Jeremy', color: 'green', age: 33}, {name: 'Kara', color: 'purple', age: 29}, {name: 'Tina', color: 'yellow', age: 35}, {name: 'Brad', color: 'pink', age: 40}, {name: 'Jules', color: 'red', age: 21}, ]; @Component({ moduleId: module.id, selector: 'table-a11y', templateUrl: 'table-a11y.html', styleUrls: ['table-a11y.css'], }) export class TableAccessibilityDemo implements OnInit { @ViewChild(MatSort, {static: true}) sort: MatSort; @ViewChild(MatPaginator, {static: true}) pager: MatPaginator; displayedColumns = ['name', 'color', 'age']; basicDataSource: BasicDataSource; sortDataSource: SortDataSource; paginatedDataSource: PaginatedDataSource; ngOnInit(): void { this.basicDataSource = new BasicDataSource(); this.sortDataSource = new SortDataSource(this.sort); this.paginatedDataSource = new PaginatedDataSource(this.pager); } } export class BasicDataSource extends DataSource { dataChange: BehaviorSubject = new BehaviorSubject([]); constructor() { super(); this.dataChange.next(exampleData); } connect(): Observable { return this.dataChange; } disconnect() {} } export class SortDataSource extends DataSource { dataChange: BehaviorSubject = new BehaviorSubject([]); constructor(private _sort: MatSort) { super(); this.dataChange.next(exampleData); } connect(): Observable { const displayDataChanges = [ this.dataChange, this._sort.sortChange, ]; return merge(...displayDataChanges).pipe(map(() => this.getSortedData())); } disconnect() {} getSortedData(): UserData[] { const data = [...exampleData]; if (!this._sort.active || this._sort.direction === '') { return data; } return data.sort((a: UserData, b: UserData) => { return (a.age < b.age ? -1 : 1) * (this._sort.direction === 'asc' ? 1 : -1); }); } } export class PaginatedDataSource extends DataSource { dataChange: BehaviorSubject = new BehaviorSubject([]); constructor(private _paginator: MatPaginator) { super(); this.dataChange.next(exampleData); } connect(): Observable { const displayDataChanges = [ this.dataChange, this._paginator.page, ]; return merge(...displayDataChanges) .pipe( map(() => { const data = [...exampleData]; const startIndex = this._paginator.pageIndex * this._paginator.pageSize; return data.splice(startIndex, this._paginator.pageSize); }) ); } disconnect() {} }