import { Component, Input, Output, EventEmitter, OnChanges } from '@angular/core'; import { ClientSidePagingProxy } from '../../base/serviceCall'; import { ServiceProviderPagingBase, IProviderContent } from './serviceProviderPagingBase'; @Component({ selector: 'rd-service-provider:[rd-client-side-paging]', template: "" }) export class ServiceProviderClientSide extends ServiceProviderPagingBase implements OnChanges { @Input("rd-service-proxy") serviceProxy: ClientSidePagingProxy; @Input("rd-page-size") pageSize = 10; @Output("rd-success") successEvent: EventEmitter = new EventEmitter(); @Output("rd-error") errorEvent: EventEmitter = new EventEmitter(); ngOnChanges(changes) { if (changes.serviceProxy) { if (!(this.serviceProxy instanceof ClientSidePagingProxy)) this.error("rd-service-proxy is not an instance of ClientSidePagingProxy"); } if (changes.pageSize) { this.pageSize = changes.pageSize.currentValue; if (this.content.state.serviceCalled) this.gotoPage(1); } } private responseListener; call(params) { if (this.content.state.waitingForResponse) return; this.callState(params, ClientSidePagingProxy); this.serviceProxy.call(params, (response) => { if (this.responseListener) this.responseListener(); this.successState(response); this.gotoPage(this.content.paging.currentPage ? this.content.paging.currentPage : 1); this.successEvent.emit(this.content); }, () => { if (this.responseListener) this.responseListener(); this.errorState(); this.errorEvent.emit(this.content); }); } gotoPage(pageNumber) { var allItems = this.content.response.allItems; if (!allItems) return; this.content.items = allItems.slice((pageNumber - 1) * this.pageSize, pageNumber * this.pageSize); this.content.paging = { currentPage: pageNumber, totalPageCount: Math.ceil(allItems.length / this.pageSize), pageSize: this.pageSize, totalItemCount: allItems.length }; }; refresh() { this.call(this.content.params); } getAllItems(progressCallback = (currentIteration, totalIterationCount) => { }): Promise { return new Promise((resolve, reject) => { if (this.content.state.responseIsRecieved) { if (!this.content.state.serviceCallFailed) resolve(this.content.response.allItems); else reject(); } else { this.responseListener = function () { this.responseListener = undefined; if (!this.content.state.serviceCallFailed) resolve(this.content.response.allItems); else reject(); } } }); } }