mirror of
https://github.com/richard-loafle/fuse-angular.git
synced 2025-12-22 05:27:10 +00:00
+ Http changed with HttpClient, + Angular Material Element examples added, + angular2-markdown Library added
122 lines
3.8 KiB
TypeScript
122 lines
3.8 KiB
TypeScript
import {Component, OnInit, ViewChild} from '@angular/core';
|
|
import {Http} from '@angular/http';
|
|
import {DataSource} from '@angular/cdk/collections';
|
|
import {MdPaginator, MdSort} from '@angular/material';
|
|
import {Observable} from 'rxjs/Observable';
|
|
import 'rxjs/add/observable/merge';
|
|
import 'rxjs/add/observable/of';
|
|
import 'rxjs/add/operator/catch';
|
|
import 'rxjs/add/operator/map';
|
|
import 'rxjs/add/operator/startWith';
|
|
import 'rxjs/add/operator/switchMap';
|
|
|
|
/**
|
|
* @title Table retrieving data through HTTP
|
|
*/
|
|
@Component({
|
|
selector: 'table-http-example',
|
|
styleUrls: ['table-http-example.css'],
|
|
templateUrl: 'table-http-example.html',
|
|
})
|
|
export class TableHttpExample implements OnInit {
|
|
displayedColumns = ['created_at', 'state', 'number', 'title'];
|
|
exampleDatabase: ExampleHttpDao | null;
|
|
dataSource: ExampleDataSource | null;
|
|
|
|
@ViewChild(MdPaginator) paginator: MdPaginator;
|
|
@ViewChild(MdSort) sort: MdSort;
|
|
|
|
constructor(private http: Http) {}
|
|
|
|
ngOnInit() {
|
|
this.exampleDatabase = new ExampleHttpDao(this.http);
|
|
this.dataSource = new ExampleDataSource(
|
|
this.exampleDatabase!, this.paginator, this.sort);
|
|
}
|
|
}
|
|
|
|
export interface GithubApi {
|
|
items: GithubIssue[];
|
|
total_count: number;
|
|
}
|
|
|
|
export interface GithubIssue {
|
|
created_at: string;
|
|
number: string;
|
|
state: string;
|
|
title: string;
|
|
}
|
|
|
|
/** An example database that the data source uses to retrieve data for the table. */
|
|
export class ExampleHttpDao {
|
|
constructor(private http: Http) {}
|
|
|
|
getRepoIssues(sort: string, order: string, page: number): Observable<GithubApi> {
|
|
const href = 'https://api.github.com/search/issues';
|
|
const requestUrl =
|
|
`${href}?q=repo:angular/material2&sort=${sort}&order=${order}&page=${page + 1}`;
|
|
|
|
return this.http.get(requestUrl)
|
|
.map(response => response.json() as GithubApi);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Data source to provide what data should be rendered in the table. Note that the data source
|
|
* can retrieve its data in any way. In this case, the data source is provided a reference
|
|
* to a common data base, ExampleHttpDao. It is not the data source's responsibility to manage
|
|
* the underlying data. Instead, it only needs to take the data and send the table exactly what
|
|
* should be rendered.
|
|
*/
|
|
export class ExampleDataSource extends DataSource<GithubIssue> {
|
|
// The number of issues returned by github matching the query.
|
|
resultsLength = 0;
|
|
isLoadingResults = false;
|
|
isRateLimitReached = false;
|
|
|
|
constructor(private exampleDatabase: ExampleHttpDao,
|
|
private paginator: MdPaginator,
|
|
private sort: MdSort) {
|
|
super();
|
|
}
|
|
|
|
/** Connect function called by the table to retrieve one stream containing the data to render. */
|
|
connect(): Observable<GithubIssue[]> {
|
|
const displayDataChanges = [
|
|
this.sort.sortChange,
|
|
this.paginator.page
|
|
];
|
|
|
|
// If the user changes the sort order, reset back to the first page.
|
|
this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0);
|
|
|
|
return Observable.merge(...displayDataChanges)
|
|
.startWith(null)
|
|
.switchMap(() => {
|
|
setTimeout(() => {
|
|
this.isLoadingResults = true;
|
|
});
|
|
return this.exampleDatabase.getRepoIssues(
|
|
this.sort.active, this.sort.direction, this.paginator.pageIndex);
|
|
})
|
|
.map(data => {
|
|
// Flip flag to show that loading has finished.
|
|
this.isLoadingResults = false;
|
|
this.isRateLimitReached = false;
|
|
this.resultsLength = data.total_count;
|
|
|
|
return data.items;
|
|
})
|
|
.catch(() => {
|
|
// Catch if the GitHub API has reached its rate limit. Return empty data.
|
|
setTimeout(() => {
|
|
this.isLoadingResults = false;
|
|
this.isRateLimitReached = true;
|
|
});
|
|
return Observable.of([]);
|
|
});
|
|
}
|
|
|
|
disconnect() {}
|
|
}
|