import { Component, OnInit } from '@angular/core'; import { ViewChild, Output, EventEmitter } from '@angular/core'; import { DataSource } from '@angular/cdk'; import { MdPaginator, MdSort } from '@angular/material'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/operator/startWith'; import 'rxjs/add/observable/merge'; import 'rxjs/add/operator/map'; import { SharedService } from "app/services/shared.service"; @Component({ selector: 'app-rtable', styleUrls: ['./rtable.component.css'], templateUrl: './rtable.component.html', }) export class RtableComponent { displayedColumns = ['userId', 'userName', 'progress', 'color', 'url']; exampleDatabase = new ExampleDatabase(); dataSource: ExampleDataSource | null; @ViewChild(MdPaginator) paginator: MdPaginator; @ViewChild(MdSort) sort: MdSort; @Output() playAudioPlayer: EventEmitter<string> = new EventEmitter(); constructor(private _sharedService: SharedService) { } ngOnInit() { } } const COLORS = ['maroon', 'red', 'orange', 'yellow', 'olive', 'green', 'purple', 'fuchsia', 'lime', 'teal', 'aqua', 'blue', 'navy', 'black', 'gray']; const NAMES = ['Maia', 'Asher', 'Olivia', 'Atticus', 'Amelia', 'Jack', 'Charlotte', 'Theodore', 'Isla', 'Oliver', 'Isabella', 'Jasper', 'Cora', 'Levi', 'Violet', 'Arthur', 'Mia', 'Thomas', 'Elizabeth']; const URLS = ['http://localhost/ragnar1.mp3', 'http://localhost/ragnar1.mp3', 'http://localhost/ragnar1.mp3', 'http://localhost/ragnar1.mp3', 'http://localhost/ragnar2.mp3', 'http://localhost/ragnar2.mp3', 'http://localhost/ragnar3.mp3', 'http://localhost/ragnar3.mp3', 'http://localhost/ragnar1.mp3', 'http://localhost/ragnar1.mp3', 'http://localhost/ragnar2.mp3', 'http://localhost/ragnar2.mp3', 'http://localhost/ragnar3.mp3', 'http://localhost/ragnar3.mp3', 'http://localhost/ragnar1.mp3', 'http://localhost/ragnar1.mp3', 'http://localhost/ragnar2.mp3', 'http://localhost/ragnar2.mp3', 'http://localhost/ragnar3.mp3']; export interface UserData { id: string; name: string; progress: string; color: string; url: string; } export class ExampleDatabase { dataChange: BehaviorSubject<UserData[]> = new BehaviorSubject<UserData[]>([]); get data(): UserData[] { return this.dataChange.value; } constructor() { // Fill up the database with 100 users. for (let i = 0; i < 100; i++) { this.addUser(); } } /** Adds a new user to the database. */ addUser() { const copiedData = this.data.slice(); copiedData.push(this.createNewUser()); this.dataChange.next(copiedData); } /** Builds and returns a new User. */ private createNewUser() { const name = NAMES[Math.round(Math.random() * (NAMES.length - 1))] + ' ' + NAMES[Math.round(Math.random() * (NAMES.length - 1))].charAt(0) + '.'; return { id: (this.data.length + 1).toString(), name: name, progress: Math.round(Math.random() * 100).toString(), color: COLORS[Math.round(Math.random() * (COLORS.length - 1))], url: URLS[Math.round(Math.random() * (URLS.length - 1))] }; } } export class ExampleDataSource extends DataSource<any> { constructor(private _exampleDatabase: ExampleDatabase, private _paginator: MdPaginator, private _sort: MdSort) { super(); } /** Connect function called by the table to retrieve one stream containing the data to render. */ connect(): Observable<UserData[]> { const displayDataChanges = [ this._exampleDatabase.dataChange, this._paginator.page, this._sort.mdSortChange ]; return Observable.merge(...displayDataChanges).map(() => { const data = this.getSortedData();
.example-container { display: flex; flex-direction: column; max-height: 500px; min-width: 300px; } .example-header { min-height: 64px; display: flex; align-items: center; padding-left: 24px; font-size: 20px; } .mat-table { overflow: auto; } md-row:hover{ background-color: #f3f3f3; }
<div class="example-container mat-elevation-z8"> <md-table #table mdSort [dataSource]="dataSource"> <md-header-row *cdkHeaderRowDef="displayedColumns"></md-header-row> <md-row *cdkRowDef="let row; columns: displayedColumns;"></md-row> <ng-container cdkColumnDef="userId"> <md-header-cell *cdkHeaderCellDef md-sort-header> ID </md-header-cell> <md-cell *cdkCellDef="let row"> {{row.id}} </md-cell> </ng-container> <ng-container cdkColumnDef="progress"> <md-header-cell *cdkHeaderCellDef md-sort-header> Progress </md-header-cell> <md-cell *cdkCellDef="let row"> {{row.progress}}% </md-cell> </ng-container> <ng-container cdkColumnDef="userName"> <md-header-cell *cdkHeaderCellDef md-sort-header> Name </md-header-cell> <md-cell *cdkCellDef="let row"> {{row.name}} </md-cell> </ng-container> <ng-container cdkColumnDef="color"> <md-header-cell *cdkHeaderCellDef md-sort-header> Color </md-header-cell> <md-cell *cdkCellDef="let row" [style.color]="row.color"> {{row.color}} </md-cell> </ng-container> <ng-container cdkColumnDef="url"> <md-header-cell *cdkHeaderCellDef md-sort-header> Audio </md-header-cell> <md-cell *cdkCellDef="let row" > <button md-button (click)="callAudioEvent(row.url)" [style.color]="row.color">Listen..</button> </md-cell> </ng-container> </md-table> <md-paginator #paginator [length]="exampleDatabase.data.length" [pageIndex]="0" [pageSize]="5" [pageSizeOptions]="[5, 10, 25,50, 100]"> </md-paginator> </div>