angular2-pagination
Version:
Angular 2.0 pagination with support for Mongo Cursor to use with Meteor
96 lines (79 loc) • 2.71 kB
text/typescript
import {Pipe} from '@angular/core';
import {PaginationService} from './pagination-service';
import {IPaginationInstance} from './pagination-service';
export class PaginatePipe {
private _pagination: IPaginationInstance;
constructor(private service: PaginationService) {}
public transform(collection: any, args: any[]): any {
if (!collection)
return;
let pagination = this._createFromConfig(collection, args);
if (!this._pagination) {
this._pagination = pagination;
this.service.register(this._pagination);
} else {
/**
* Update itemsPerPage and/or totalItems.
* currentPage is not allowed to be changed in the config,
* it can be set only via service API itself.
*/
let itemsPerPage = pagination.itemsPerPage;
let totalItems = pagination.totalItems;
this.service.update(this._pagination.id, { itemsPerPage, totalItems });
}
if (collection instanceof Array) {
let itemsPerPage = this.service.getItemsPerPage(this._pagination.id);
let start = (this.service.getCurrentPage(this._pagination.id) - 1) * itemsPerPage;
let end = start + itemsPerPage;
return collection.slice(start, end);
}
return collection;
}
private _createFromConfig(collection: any, config: any): IPaginationInstance {
let instance: IPaginationInstance;
if (_.isString(config) || _.isNumber(config)) {
instance = {
id: this.service.defaultId,
itemsPerPage: this._parseValue(config, 1),
currentPage: 1,
totalItems: this._parseTotalItems(collection)
};
}
if (_.isObject(config)) {
instance = {
id: config.id || this.service.defaultId,
itemsPerPage: this._parseValue(config.itemsPerPage, 10),
currentPage: this._parseValue(config.currentPage, 1),
totalItems: this._parseTotalItems(collection, config.totalItems)
};
}
if (!instance) {
throw new Error(`PaginatePipe: Argument must be a string,
number or an object. Got ${typeof args[0]}`);
}
return instance;
}
private _parseTotalItems(collection: any,
totalItems?: string | number): number {
if (!_.isUndefined(totalItems)) {
return this._parseValue(totalItems);
}
if (collection instanceof Array) {
return collection.length;
}
return undefined;
}
private _parseValue(value: string | number, dfault?: number): number {
if (!_.isUndefined(value)) {
let parsed = parseInt(<string>value);
if (_.isNumber(parsed)) {
return parsed;
}
}
return dfault;
}
}