pager.component.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
  6. export class DataTablePagerComponent {
  7. constructor() {
  8. this.change = new EventEmitter();
  9. this._count = 0;
  10. this._page = 1;
  11. this._size = 0;
  12. }
  13. /**
  14. * @param {?} val
  15. * @return {?}
  16. */
  17. set size(val) {
  18. this._size = val;
  19. this.pages = this.calcPages();
  20. }
  21. /**
  22. * @return {?}
  23. */
  24. get size() {
  25. return this._size;
  26. }
  27. /**
  28. * @param {?} val
  29. * @return {?}
  30. */
  31. set count(val) {
  32. this._count = val;
  33. this.pages = this.calcPages();
  34. }
  35. /**
  36. * @return {?}
  37. */
  38. get count() {
  39. return this._count;
  40. }
  41. /**
  42. * @param {?} val
  43. * @return {?}
  44. */
  45. set page(val) {
  46. this._page = val;
  47. this.pages = this.calcPages();
  48. }
  49. /**
  50. * @return {?}
  51. */
  52. get page() {
  53. return this._page;
  54. }
  55. /**
  56. * @return {?}
  57. */
  58. get totalPages() {
  59. /** @type {?} */
  60. const count = this.size < 1 ? 1 : Math.ceil(this.count / this.size);
  61. return Math.max(count || 0, 1);
  62. }
  63. /**
  64. * @return {?}
  65. */
  66. canPrevious() {
  67. return this.page > 1;
  68. }
  69. /**
  70. * @return {?}
  71. */
  72. canNext() {
  73. return this.page < this.totalPages;
  74. }
  75. /**
  76. * @return {?}
  77. */
  78. prevPage() {
  79. this.selectPage(this.page - 1);
  80. }
  81. /**
  82. * @return {?}
  83. */
  84. nextPage() {
  85. this.selectPage(this.page + 1);
  86. }
  87. /**
  88. * @param {?} page
  89. * @return {?}
  90. */
  91. selectPage(page) {
  92. if (page > 0 && page <= this.totalPages && page !== this.page) {
  93. this.page = page;
  94. this.change.emit({
  95. page
  96. });
  97. }
  98. }
  99. /**
  100. * @param {?=} page
  101. * @return {?}
  102. */
  103. calcPages(page) {
  104. /** @type {?} */
  105. const pages = [];
  106. /** @type {?} */
  107. let startPage = 1;
  108. /** @type {?} */
  109. let endPage = this.totalPages;
  110. /** @type {?} */
  111. const maxSize = 5;
  112. /** @type {?} */
  113. const isMaxSized = maxSize < this.totalPages;
  114. page = page || this.page;
  115. if (isMaxSized) {
  116. startPage = page - Math.floor(maxSize / 2);
  117. endPage = page + Math.floor(maxSize / 2);
  118. if (startPage < 1) {
  119. startPage = 1;
  120. endPage = Math.min(startPage + maxSize - 1, this.totalPages);
  121. }
  122. else if (endPage > this.totalPages) {
  123. startPage = Math.max(this.totalPages - maxSize + 1, 1);
  124. endPage = this.totalPages;
  125. }
  126. }
  127. for (let num = startPage; num <= endPage; num++) {
  128. pages.push({
  129. number: num,
  130. text: (/** @type {?} */ (((/** @type {?} */ (num)))))
  131. });
  132. }
  133. return pages;
  134. }
  135. }
  136. DataTablePagerComponent.decorators = [
  137. { type: Component, args: [{
  138. selector: 'datatable-pager',
  139. template: `
  140. <ul class="pager">
  141. <li [class.disabled]="!canPrevious()">
  142. <a role="button" aria-label="go to first page" href="javascript:void(0)" (click)="selectPage(1)">
  143. <i class="{{ pagerPreviousIcon }}"></i>
  144. </a>
  145. </li>
  146. <li [class.disabled]="!canPrevious()">
  147. <a role="button" aria-label="go to previous page" href="javascript:void(0)" (click)="prevPage()">
  148. <i class="{{ pagerLeftArrowIcon }}"></i>
  149. </a>
  150. </li>
  151. <li
  152. role="button"
  153. [attr.aria-label]="'page ' + pg.number"
  154. class="pages"
  155. *ngFor="let pg of pages"
  156. [class.active]="pg.number === page"
  157. >
  158. <a href="javascript:void(0)" (click)="selectPage(pg.number)">
  159. {{ pg.text }}
  160. </a>
  161. </li>
  162. <li [class.disabled]="!canNext()">
  163. <a role="button" aria-label="go to next page" href="javascript:void(0)" (click)="nextPage()">
  164. <i class="{{ pagerRightArrowIcon }}"></i>
  165. </a>
  166. </li>
  167. <li [class.disabled]="!canNext()">
  168. <a role="button" aria-label="go to last page" href="javascript:void(0)" (click)="selectPage(totalPages)">
  169. <i class="{{ pagerNextIcon }}"></i>
  170. </a>
  171. </li>
  172. </ul>
  173. `,
  174. host: {
  175. class: 'datatable-pager'
  176. },
  177. changeDetection: ChangeDetectionStrategy.OnPush
  178. }] }
  179. ];
  180. DataTablePagerComponent.propDecorators = {
  181. pagerLeftArrowIcon: [{ type: Input }],
  182. pagerRightArrowIcon: [{ type: Input }],
  183. pagerPreviousIcon: [{ type: Input }],
  184. pagerNextIcon: [{ type: Input }],
  185. size: [{ type: Input }],
  186. count: [{ type: Input }],
  187. page: [{ type: Input }],
  188. change: [{ type: Output }]
  189. };
  190. if (false) {
  191. /** @type {?} */
  192. DataTablePagerComponent.prototype.pagerLeftArrowIcon;
  193. /** @type {?} */
  194. DataTablePagerComponent.prototype.pagerRightArrowIcon;
  195. /** @type {?} */
  196. DataTablePagerComponent.prototype.pagerPreviousIcon;
  197. /** @type {?} */
  198. DataTablePagerComponent.prototype.pagerNextIcon;
  199. /** @type {?} */
  200. DataTablePagerComponent.prototype.change;
  201. /** @type {?} */
  202. DataTablePagerComponent.prototype._count;
  203. /** @type {?} */
  204. DataTablePagerComponent.prototype._page;
  205. /** @type {?} */
  206. DataTablePagerComponent.prototype._size;
  207. /** @type {?} */
  208. DataTablePagerComponent.prototype.pages;
  209. }
  210. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN3aW1sYW5lL25neC1kYXRhdGFibGUvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9mb290ZXIvcGFnZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBNENoRyxNQUFNLE9BQU8sdUJBQXVCO0lBMUNwQztRQW1GWSxXQUFNLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFekQsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixVQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQ2xCLFVBQUssR0FBVyxDQUFDLENBQUM7SUE0RHBCLENBQUM7Ozs7O0lBbkdDLElBQ0ksSUFBSSxDQUFDLEdBQVc7UUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDaEMsQ0FBQzs7OztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDOzs7OztJQUVELElBQ0ksS0FBSyxDQUFDLEdBQVc7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDaEMsQ0FBQzs7OztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOzs7OztJQUVELElBQ0ksSUFBSSxDQUFDLEdBQVc7UUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFD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QUMzQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ1Q7Z0JBQ0QsSUFBSSxFQUFFO29CQUNKLEtBQUssRUFBRSxpQkFBaUI7aUJBQ3pCO2dCQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEOzs7aUNBRUUsS0FBSztrQ0FDTCxLQUFLO2dDQUNMLEtBQUs7NEJBQ0wsS0FBSzttQkFFTCxLQUFLO29CQVVMLEtBQUs7bUJBVUwsS0FBSztxQkFlTCxNQUFNOzs7O0lBeENQLHFEQUFvQzs7SUFDcEMsc0RBQXFDOztJQUNyQyxvREFBbUM7O0lBQ25DLGdEQUErQjs7SUFxQy9CLHlDQUF5RDs7SUFFekQseUNBQW1COztJQUNuQix3Q0FBa0I7O0lBQ2xCLHdDQUFrQjs7SUFDbEIsd0NBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0YXRhYmxlLXBhZ2VyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8dWwgY2xhc3M9XCJwYWdlclwiPlxuICAgICAgPGxpIFtjbGFzcy5kaXNhYmxlZF09XCIhY2FuUHJldmlvdXMoKVwiPlxuICAgICAgICA8YSByb2xlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cImdvIHRvIGZpcnN0IHBhZ2VcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cInNlbGVjdFBhZ2UoMSlcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cInt7IHBhZ2VyUHJldmlvdXNJY29uIH19XCI+PC9pPlxuICAgICAgICA8L2E+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIFtjbGFzcy5kaXNhYmxlZF09XCIhY2FuUHJldmlvdXMoKVwiPlxuICAgICAgICA8YSByb2xlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cImdvIHRvIHByZXZpb3VzIHBhZ2VcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cInByZXZQYWdlKClcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cInt7IHBhZ2VyTGVmdEFycm93SWNvbiB9fVwiPjwvaT5cbiAgICAgICAgPC9hPlxuICAgICAgPC9saT5cbiAgICAgIDxsaVxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGFnZSAnICsgcGcubnVtYmVyXCJcbiAgICAgICAgY2xhc3M9XCJwYWdlc1wiXG4gICAgICAgICpuZ0Zvcj1cImxldCBwZyBvZiBwYWdlc1wiXG4gICAgICAgIFtjbGFzcy5hY3RpdmVdPVwicGcubnVtYmVyID09PSBwYWdlXCJcbiAgICAgID5cbiAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIChjbGljayk9XCJzZWxlY3RQYWdlKHBnLm51bWJlcilcIj5cbiAgICAgICAgICB7eyBwZy50ZXh0IH19XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+XG4gICAgICA8bGkgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5OZXh0KClcIj5cbiAgICAgICAgPGEgcm9sZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJnbyB0byBuZXh0IHBhZ2VcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cIm5leHRQYWdlKClcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cInt7IHBhZ2VyUmlnaHRBcnJvd0ljb24gfX1cIj48L2k+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+XG4gICAgICA8bGkgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5OZXh0KClcIj5cbiAgICAgICAgPGEgcm9sZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJnbyB0byBsYXN0IHBhZ2VcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cInNlbGVjdFBhZ2UodG90YWxQYWdlcylcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cInt7IHBhZ2VyTmV4dEljb24gfX1cIj48L2k+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgYCxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZGF0YXRhYmxlLXBhZ2VyJ1xuICB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVQYWdlckNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHBhZ2VyTGVmdEFycm93SWNvbjogc3RyaW5nO1xuICBASW5wdXQoKSBwYWdlclJpZ2h0QXJyb3dJY29uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhZ2VyUHJldmlvdXNJY29uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhZ2VyTmV4dEljb246IHN0cmluZztcblxuICBASW5wdXQoKVxuICBzZXQgc2l6ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX3NpemUgPSB2YWw7XG4gICAgdGhpcy5wYWdlcyA9IHRoaXMuY2FsY1BhZ2VzKCk7XG4gIH1cblxuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGNvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fY291bnQgPSB2YWw7XG4gICAgdGhpcy5wYWdlcyA9IHRoaXMuY2FsY1BhZ2VzKCk7XG4gIH1cblxuICBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY291bnQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgcGFnZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX3BhZ2UgPSB2YWw7XG4gICAgdGhpcy5wYWdlcyA9IHRoaXMuY2FsY1BhZ2VzKCk7XG4gIH1cblxuICBnZXQgcGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9wYWdlO1xuICB9XG5cbiAgZ2V0IHRvdGFsUGFnZXMoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuc2l6ZSA8IDEgPyAxIDogTWF0aC5jZWlsKHRoaXMuY291bnQgLyB0aGlzLnNpemUpO1xuICAgIHJldHVybiBNYXRoLm1heChjb3VudCB8fCAwLCAxKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIF9jb3VudDogbnVtYmVyID0gMDtcbiAgX3BhZ2U6IG51bWJlciA9IDE7XG4gIF9zaXplOiBudW1iZXIgPSAwO1xuICBwYWdlczogYW55O1xuXG4gIGNhblByZXZpb3VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhZ2UgPiAxO1xuICB9XG5cbiAgY2FuTmV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlIDwgdGhpcy50b3RhbFBhZ2VzO1xuICB9XG5cbiAgcHJldlBhZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RQYWdlKHRoaXMucGFnZSAtIDEpO1xuICB9XG5cbiAgbmV4dFBhZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RQYWdlKHRoaXMucGFnZSArIDEpO1xuICB9XG5cbiAgc2VsZWN0UGFnZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAocGFnZSA+IDAgJiYgcGFnZSA8PSB0aGlzLnRvdGFsUGFnZXMgJiYgcGFnZSAhPT0gdGhpcy5wYWdlKSB7XG4gICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuXG4gICAgICB0aGlzLmNoYW5nZS5lbWl0KHtcbiAgICAgICAgcGFnZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY2FsY1BhZ2VzKHBhZ2U/OiBudW1iZXIpOiBhbnlbXSB7XG4gICAgY29uc3QgcGFnZXMgPSBbXTtcbiAgICBsZXQgc3RhcnRQYWdlID0gMTtcbiAgICBsZXQgZW5kUGFnZSA9IHRoaXMudG90YWxQYWdlcztcbiAgICBjb25zdCBtYXhTaXplID0gNTtcbiAgICBjb25zdCBpc01heFNpemVkID0gbWF4U2l6ZSA8IHRoaXMudG90YWxQYWdlcztcblxuICAgIHBhZ2UgPSBwYWdlIHx8IHRoaXMucGFnZTtcblxuICAgIGlmIChpc01heFNpemVkKSB7XG4gICAgICBzdGFydFBhZ2UgPSBwYWdlIC0gTWF0aC5mbG9vcihtYXhTaXplIC8gMik7XG4gICAgICBlbmRQYWdlID0gcGFnZSArIE1hdGguZmxvb3IobWF4U2l6ZSAvIDIpO1xuXG4gICAgICBpZiAoc3RhcnRQYWdlIDwgMSkge1xuICAgICAgICBzdGFydFBhZ2UgPSAxO1xuICAgICAgICBlbmRQYWdlID0gTWF0aC5taW4oc3RhcnRQYWdlICsgbWF4U2l6ZSAtIDEsIHRoaXMudG90YWxQYWdlcyk7XG4gICAgICB9IGVsc2UgaWYgKGVuZFBhZ2UgPiB0aGlzLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgc3RhcnRQYWdlID0gTWF0aC5tYXgodGhpcy50b3RhbFBhZ2VzIC0gbWF4U2l6ZSArIDEsIDEpO1xuICAgICAgICBlbmRQYWdlID0gdGhpcy50b3RhbFBhZ2VzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IG51bSA9IHN0YXJ0UGFnZTsgbnVtIDw9IGVuZFBhZ2U7IG51bSsrKSB7XG4gICAgICBwYWdlcy5wdXNoKHtcbiAgICAgICAgbnVtYmVyOiBudW0sXG4gICAgICAgIHRleHQ6IDxzdHJpbmc+KDxhbnk+bnVtKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhZ2VzO1xuICB9XG59XG4iXX0=