+import {EventEmitter} from '@angular/core';
import {Observable} from 'rxjs/Rx';
import {Pager} from '@eg/share/util/pager';
export class EgGridDataSource {
data: any[];
- sortSpec: any[];
-
- // Do we know how many items we have in total?
- indeterminate: boolean
+ pager: Pager;
+ allRowsRetrieved: boolean;
+ getRows: (pager: Pager) => Observable<any>;
constructor() {
this.data = [];
- this.sortSpec = [];
+ this.allRowsRetrieved = false;
}
- applySort() {
+ setAllRetrieved() {
+ this.allRowsRetrieved = true;
+ this.pager.resultCount = this.data.length;
}
- getPage(pager: Pager): Observable<Array<any>> {
+ // called from the template -- no data fetching
+ getPageOfRows(pager: Pager): any[] {
+ if (this && this.data) {
+ return this.data.slice(
+ pager.offset, pager.limit + pager.offset);
+ }
+ return [];
+ }
+
+ // called on initial component load and user action (e.g. paging, sorting).
+ requestPage(pager: Pager) {
+
+ // see if the page of data is already present in the data
+ if (this.getPageOfRows(pager).length > 0) return;
+
+ if (this.allRowsRetrieved) return;
+
+ if (!this.getRows) return;
+
+ let idx = pager.offset;
+ this.getRows(pager).subscribe(
+ row => this.data[idx++] = row,
+ err => console.error(`grid getRows() error ${err}`),
+ () => this.checkAllRetrieved(pager, idx)
+ );
+ }
- if (!this.data) return Observable.from([]);
+ // See if the last getRows() call resulted in the final set of data.
+ checkAllRetrieved(pager: Pager, idx: number) {
+ if (this.allRowsRetrieved) return;
- if (this.data[pager.offset] !== undefined) {
- return Observable.of(
- this.data.slice(pager.offset, pager.limit + pager.offset));
+ if (idx == 0 || idx < (pager.limit + pager.offset)) {
+ // last query returned nothing or less than one page.
+ // confirm we have all of the preceding pages.
+ if (!this.data.includes(undefined)) {
+ this.allRowsRetrieved = true;
+ pager.resultCount = this.data.length;
+ }
}
}
}
import {EgGridDataSource} from '@eg/share/grid/grid-data-source';
import {EgIdlService, EgIdlObject} from '@eg/core/idl.service';
import {EgPcrudService} from '@eg/core/pcrud.service';
+import {Pager} from '@eg/share/util/pager';
@Component({
templateUrl: 'sandbox.component.html'
btSource: EgGridDataSource = new EgGridDataSource();
-
testStr: string;
@Input() set testString(str: string) {
this.testStr = str;
{name: 'The Tick', state: 'TX'}
];
- this.pcrud.retrieveAll('cbt').subscribe(
- bt => this.btSource.data.push(bt));
+ this.btSource.getRows = (pager: Pager) => {
+ return this.pcrud.retrieveAll('cbt', {
+ offset: pager.offset,
+ limit: pager.limit,
+ order_by: {cbt: 'name'}
+ });
+ }
}
showProgress() {