Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.70 KB | None | 0 0
  1. /// <reference path="../_ref.d.ts" />
  2.  
  3. class PagerViewModel {
  4. constructor(skip: number, take: number, total: number) {
  5. this.skip = skip;
  6. this.take = take;
  7. this.total = total;
  8. this.UpdateState();
  9. }
  10. skip: number;
  11. take: number;
  12. total: number;
  13. hasNext: boolean;
  14. hasPrev: boolean;
  15. totalPages: number;
  16. currentPage: number;
  17.  
  18. displayPages: Array<any>;
  19.  
  20. screenPageLimitPerSide: number = 4;
  21. screenPageLimitTotal: number = this.screenPageLimitPerSide * 2 + 1;
  22.  
  23. public next() {
  24. if (!this.hasNext)
  25. return;
  26. this.skip = this.skip + this.take;
  27. this.UpdateState();
  28. }
  29.  
  30. public prev() {
  31. if (!this.hasPrev)
  32. return;
  33. this.skip = this.skip - this.take;
  34. this.UpdateState();
  35. }
  36. public changeTotal(total: number) {
  37. this.total = total;
  38. this.UpdateState();
  39. }
  40.  
  41. public goToPage(page: number) {
  42. var newSkip = page * this.take - this.take;
  43. if (newSkip >= 0 && newSkip <= this.total && page != this.currentPage) {
  44. this.skip = newSkip;
  45. this.UpdateState();
  46. }
  47. }
  48.  
  49. private UpdateState() {
  50. console.log("Skip:", this.skip, " Take:", this.take);
  51. this.totalPages = this.calculateNumberOfPages();
  52. this.currentPage = this.calculateCurrentPage();
  53. this.hasNext = this.calculateHasNext();
  54. this.hasPrev = this.calculateHasPrev();
  55. this.buildPagerNavigation();
  56. }
  57.  
  58. buildPagerNavigation() {
  59. var top = this;
  60. this.displayPages = [];
  61. this.displayPages.push({ text: "<", goToPage: () => { this.prev() }, isDisabled: this.hasPrev == false });
  62. var addPefix = true;
  63. var addSufix = true;
  64. var from = this.currentPage - this.screenPageLimitPerSide;
  65. var to = this.currentPage + this.screenPageLimitPerSide;
  66.  
  67. if (this.currentPage - this.screenPageLimitPerSide <= 2) {
  68. var curr = 1 + this.screenPageLimitPerSide;
  69. from = curr - this.screenPageLimitPerSide;
  70. to = curr + this.screenPageLimitPerSide;
  71. addPefix = false;
  72. } else if (this.currentPage + this.screenPageLimitPerSide > this.totalPages - 2) {
  73. var curr = this.totalPages - this.screenPageLimitPerSide;
  74. from = curr - this.screenPageLimitPerSide;
  75. to = curr + this.screenPageLimitPerSide;
  76. addSufix = false;
  77. }
  78.  
  79. if (this.totalPages <= this.screenPageLimitTotal) {
  80. addPefix = false;
  81. addSufix = false;
  82. }
  83.  
  84. from = Math.max(from, 1);
  85. to = Math.min(to, this.totalPages);
  86.  
  87. if (addPefix) {
  88. this.displayPages.push({ text: "1", goToPage: () => { this.goToPage(1) } });
  89. this.displayPages.push({ text: "...", goToPage: () => { this.goToCustomPage() } });
  90. }
  91.  
  92.  
  93. for (var i = from; i <= to; i++) {
  94. (function (i, t) { t.displayPages.push({ text: i, goToPage: () => { t.goToPage(i) } }); })(i, top);
  95. }
  96.  
  97. if (addSufix) {
  98. this.displayPages.push({ text: "...", goToPage: () => { this.goToCustomPage() } });
  99. this.displayPages.push({ text: this.totalPages, goToPage: () => { this.goToPage(this.totalPages) } });
  100. }
  101.  
  102. this.displayPages.push({ text: ">", goToPage: () => { this.next() }, isDisabled: this.hasNext == false });
  103. }
  104.  
  105. calculateHasNext(): boolean {
  106. return (this.skip + this.take <= this.total) && this.total - this.take !== this.skip;
  107. }
  108. calculateHasPrev(): boolean {
  109. return this.skip - this.take >= 0 && this.totalPages > 1;
  110. }
  111.  
  112. calculateNumberOfPages(): number {
  113. if (this.total > 0 && this.take > 0)
  114. return Math.ceil(this.total / this.take);
  115.  
  116. return 0;
  117. }
  118.  
  119. calculateCurrentPage(): number {
  120. if (this.skip > 0) {
  121. return Math.ceil(this.skip / this.take) + 1;
  122. }
  123. return 1;
  124. }
  125.  
  126. goToCustomPage() {
  127. var num = parseInt(prompt('Enter page number'));
  128. if (!(1 <= num && num <= this.totalPages))
  129. return;
  130.  
  131. this.goToPage(num);
  132. }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement