Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// <reference path="../_ref.d.ts" />
- class PagerViewModel {
- constructor(skip: number, take: number, total: number) {
- this.skip = skip;
- this.take = take;
- this.total = total;
- this.UpdateState();
- }
- skip: number;
- take: number;
- total: number;
- hasNext: boolean;
- hasPrev: boolean;
- totalPages: number;
- currentPage: number;
- displayPages: Array<any>;
- screenPageLimitPerSide: number = 4;
- screenPageLimitTotal: number = this.screenPageLimitPerSide * 2 + 1;
- public next() {
- if (!this.hasNext)
- return;
- this.skip = this.skip + this.take;
- this.UpdateState();
- }
- public prev() {
- if (!this.hasPrev)
- return;
- this.skip = this.skip - this.take;
- this.UpdateState();
- }
- public changeTotal(total: number) {
- this.total = total;
- this.UpdateState();
- }
- public goToPage(page: number) {
- var newSkip = page * this.take - this.take;
- if (newSkip >= 0 && newSkip <= this.total && page != this.currentPage) {
- this.skip = newSkip;
- this.UpdateState();
- }
- }
- private UpdateState() {
- console.log("Skip:", this.skip, " Take:", this.take);
- this.totalPages = this.calculateNumberOfPages();
- this.currentPage = this.calculateCurrentPage();
- this.hasNext = this.calculateHasNext();
- this.hasPrev = this.calculateHasPrev();
- this.buildPagerNavigation();
- }
- buildPagerNavigation() {
- var top = this;
- this.displayPages = [];
- this.displayPages.push({ text: "<", goToPage: () => { this.prev() }, isDisabled: this.hasPrev == false });
- var addPefix = true;
- var addSufix = true;
- var from = this.currentPage - this.screenPageLimitPerSide;
- var to = this.currentPage + this.screenPageLimitPerSide;
- if (this.currentPage - this.screenPageLimitPerSide <= 2) {
- var curr = 1 + this.screenPageLimitPerSide;
- from = curr - this.screenPageLimitPerSide;
- to = curr + this.screenPageLimitPerSide;
- addPefix = false;
- } else if (this.currentPage + this.screenPageLimitPerSide > this.totalPages - 2) {
- var curr = this.totalPages - this.screenPageLimitPerSide;
- from = curr - this.screenPageLimitPerSide;
- to = curr + this.screenPageLimitPerSide;
- addSufix = false;
- }
- if (this.totalPages <= this.screenPageLimitTotal) {
- addPefix = false;
- addSufix = false;
- }
- from = Math.max(from, 1);
- to = Math.min(to, this.totalPages);
- if (addPefix) {
- this.displayPages.push({ text: "1", goToPage: () => { this.goToPage(1) } });
- this.displayPages.push({ text: "...", goToPage: () => { this.goToCustomPage() } });
- }
- for (var i = from; i <= to; i++) {
- (function (i, t) { t.displayPages.push({ text: i, goToPage: () => { t.goToPage(i) } }); })(i, top);
- }
- if (addSufix) {
- this.displayPages.push({ text: "...", goToPage: () => { this.goToCustomPage() } });
- this.displayPages.push({ text: this.totalPages, goToPage: () => { this.goToPage(this.totalPages) } });
- }
- this.displayPages.push({ text: ">", goToPage: () => { this.next() }, isDisabled: this.hasNext == false });
- }
- calculateHasNext(): boolean {
- return (this.skip + this.take <= this.total) && this.total - this.take !== this.skip;
- }
- calculateHasPrev(): boolean {
- return this.skip - this.take >= 0 && this.totalPages > 1;
- }
- calculateNumberOfPages(): number {
- if (this.total > 0 && this.take > 0)
- return Math.ceil(this.total / this.take);
- return 0;
- }
- calculateCurrentPage(): number {
- if (this.skip > 0) {
- return Math.ceil(this.skip / this.take) + 1;
- }
- return 1;
- }
- goToCustomPage() {
- var num = parseInt(prompt('Enter page number'));
- if (!(1 <= num && num <= this.totalPages))
- return;
- this.goToPage(num);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement