import {
Component, Input, Output, EventEmitter, ChangeDetectionStrategy
} from '@angular/core';
@Component({
selector: 'datatable-pager',
template: `
`,
host: {
class: 'datatable-pager'
},
changeDetection: ChangeDetectionStrategy.OnPush
})
export class DataTablePagerComponent {
@Input() pagerLeftArrowIcon: string;
@Input() pagerRightArrowIcon: string;
@Input() pagerPreviousIcon: string;
@Input() pagerNextIcon: string;
@Input()
set size(val: number) {
this._size = val;
this.pages = this.calcPages();
}
get size(): number {
return this._size;
}
@Input()
set count(val: number) {
this._count = val;
this.pages = this.calcPages();
}
get count(): number {
return this._count;
}
@Input()
set page(val: number) {
this._page = val;
this.pages = this.calcPages();
}
get page(): number {
return this._page;
}
get totalPages(): number {
const count = this.size < 1 ? 1 : Math.ceil(this.count / this.size);
return Math.max(count || 0, 1);
}
@Output() change: EventEmitter = new EventEmitter();
_count: number = 0;
_page: number = 1;
_size: number = 0;
pages: any;
canPrevious(): boolean {
return this.page > 1;
}
canNext(): boolean {
return this.page < this.totalPages;
}
prevPage(): void {
this.selectPage(this.page - 1);
}
nextPage(): void {
this.selectPage(this.page + 1);
}
selectPage(page: number): void {
if (page > 0 && page <= this.totalPages && page !== this.page) {
this.page = page;
this.change.emit({
page
});
}
}
calcPages(page?: number): any[] {
const pages = [];
let startPage = 1;
let endPage = this.totalPages;
const maxSize = 5;
const isMaxSized = maxSize < this.totalPages;
page = page || this.page;
if (isMaxSized) {
startPage = page - Math.floor(maxSize / 2);
endPage = page + Math.floor(maxSize / 2);
if (startPage < 1) {
startPage = 1;
endPage = Math.min(startPage + maxSize - 1, this.totalPages);
} else if (endPage > this.totalPages) {
startPage = Math.max(this.totalPages - maxSize + 1, 1);
endPage = this.totalPages;
}
}
for (let num = startPage; num <= endPage; num++) {
pages.push({
number: num,
text: num
});
}
return pages;
}
}