novo-elements
Version:
Bullhorn's NOVO Element Repository for Angular 2
140 lines (122 loc) • 4.85 kB
text/typescript
// NG2
import { Component, EventEmitter, Input, Output, OnInit, OnChanges, SimpleChanges } from '@angular/core';
import { coerceBooleanProperty } from '@angular/cdk/coercion';
// APP
import { NovoLabelService } from '../../../../services/novo-label-service';
export class Pagination implements OnInit, OnChanges {
page: number;
totalItems: number;
itemsPerPage: number = 10;
rowOptions: any;
label: string;
get disablePageSelection(): boolean { return this.pageSelectDisabled; }
set disablePageSelection(val: boolean) {
this.pageSelectDisabled = coerceBooleanProperty(val);
}
pageChange: EventEmitter<any> = new EventEmitter();
itemsPerPageChange: EventEmitter<any> = new EventEmitter();
onPageChange: EventEmitter<any> = new EventEmitter();
public pageSelectDisabled: boolean;
maxPagesDisplayed: number = 5;
totalPages: number;
pages: Array<any>;
constructor(public labels: NovoLabelService) {
}
ngOnInit() {
this.label = this.label || this.labels.itemsPerPage;
this.rowOptions = this.rowOptions || this.getDefaultRowOptions();
}
ngOnChanges(changes?: SimpleChanges) {
this.page = this.page || 1;
this.totalPages = this.calculateTotalPages();
this.pages = this.getPages(this.page, this.totalPages);
}
getDefaultRowOptions() {
return [
{ value: 10, label: '10' },
{ value: 25, label: '25' },
{ value: 50, label: '50' },
{ value: 100, label: '100' }
];
}
onPageSizeChanged(event) {
this.page = 1;
this.itemsPerPage = event.selected;
this.totalPages = this.calculateTotalPages();
this.pages = this.getPages(this.page, this.totalPages);
this.pageChange.emit(this.page);
this.itemsPerPageChange.emit(this.itemsPerPage);
this.onPageChange.emit({
page: this.page,
itemsPerPage: this.itemsPerPage
});
}
selectPage(page, event?: any) {
if (event) {
event.preventDefault();
}
this.page = page;
this.pages = this.getPages(this.page, this.totalPages);
this.pageChange.emit(this.page);
this.onPageChange.emit({
page: this.page,
itemsPerPage: this.itemsPerPage
});
}
noPrevious() {
return this.page === 1;
}
noNext() {
return this.page === this.totalPages;
}
// Create page object used in template
makePage(number, text, isActive) {
return {
number: number,
text: text,
active: isActive
};
}
getPages(currentPage, totalPages) {
let pages = [];
// Default page limits
let startPage = 1;
let endPage = totalPages;
const isMaxSized = this.maxPagesDisplayed < totalPages;
// recompute if maxPagesDisplayed
if (isMaxSized) {
// Current page is displayed in the middle of the visible ones
startPage = Math.max(currentPage - Math.floor(this.maxPagesDisplayed / 2), 1);
endPage = startPage + this.maxPagesDisplayed - 1;
// Adjust if limit is exceeded
if (endPage > totalPages) {
endPage = totalPages;
startPage = endPage - this.maxPagesDisplayed + 1;
}
}
// Add page number links
for (let number = startPage; number <= endPage; number++) {
const page = this.makePage(number, number.toString(), number === currentPage);
pages.push(page);
}
return pages;
}
calculateTotalPages() {
const totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil(this.totalItems / this.itemsPerPage);
return Math.max(totalPages || 0, 1);
}
}