novo-elements
Version:
Bullhorn's NOVO Element Repository for Angular 2
80 lines (68 loc) • 2.25 kB
text/typescript
import { PagedArrayCollection, CollectionEvent } from './../../../../index';
export class MovieDataProvider extends PagedArrayCollection<any> {
// http://www.omdbapi.com/?s=Star&y=2016&plot=short&r=json&page=2
totalResults = 0;
pagesLoaded = 0;
loading: boolean = false;
constructor(source: Array<any> = []) {
super(source);
this.refresh();
}
isLoading(): boolean {
return this.loading;
}
get total() {
return this.totalResults;
}
get filter(): any {
return this._filter;
}
set filter(value: any) {
this._filter = value;
this.pagesLoaded = 0;
this.removeAll();
this.refresh();
}
get sort(): Array<any> {
return this._sort;
}
set sort(value: Array<any>) {
this._sort = value;
this.pagesLoaded = 0;
this.removeAll();
this.refresh();
}
loadMore() {
if (this.filter && this.needMore()) {
this.pagesLoaded++;
let year = this.filter.Year || '';
let search = this.filter.Title || 'Star';
let type = (this.filter.Type) ? this.filter.Type : '';
return fetch(`http://www.omdbapi.com/?s=${search}&y=${year}&type=${type}&plot=short&r=json&page=${this.pagesLoaded}`)
.then(response => response.json())
.then((r: any) => {
this.addItems(r.Search);
this.totalResults = r.totalResults;
return this.loadMore();
});
}
let start = (this.page - 1) * this.pageSize;
let end = start + this.pageSize;
let result = this.source.slice(start, end);
this.loading = false;
return Promise.resolve(result);
}
needMore(): boolean {
let recordsNeeded = this.page * this.pageSize;
return (this.source.length < recordsNeeded);
}
refresh() {
this.loading = true;
this.filterData = this.source.slice();
setTimeout(() => {
this.loadMore().then((results: Array<any>) => {
this.onDataChange(new CollectionEvent(CollectionEvent.CHANGE, results));
});
}, 1000);
}
}