]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/blob
5080f05c4d1e4aa3f89243c3d041a4e77e12bd95
[ceph.git] /
1 import { Component, EventEmitter, Input, Output } from '@angular/core';
2
3 @Component({
4   selector: 'cd-table-pagination',
5   templateUrl: './table-pagination.component.html',
6   styleUrls: ['./table-pagination.component.scss']
7 })
8 export class TablePaginationComponent {
9   private _size = 0;
10   private _count = 0;
11   private _page = 1;
12   pages: any;
13
14   @Input()
15   set size(value: number) {
16     this._size = value;
17     this.pages = this.calcPages();
18   }
19
20   get size(): number {
21     return this._size;
22   }
23
24   @Input()
25   set page(value: number) {
26     this._page = value;
27   }
28
29   get page(): number {
30     return this._page;
31   }
32
33   @Input()
34   set count(value: number) {
35     this._count = value;
36   }
37
38   get count(): number {
39     return this._count;
40   }
41
42   get totalPages(): number {
43     const count = this.size < 1 ? 1 : Math.ceil(this._count / this._size);
44     return Math.max(count || 0, 1);
45   }
46
47   @Output() pageChange: EventEmitter<any> = new EventEmitter();
48
49   canPrevious(): boolean {
50     return this._page > 1;
51   }
52
53   canNext(): boolean {
54     return this._page < this.totalPages;
55   }
56
57   prevPage(): void {
58     this.selectPage(this._page - 1);
59   }
60
61   nextPage(): void {
62     this.selectPage(this._page + 1);
63   }
64
65   selectPage(page: number): void {
66     if (page > 0 && page <= this.totalPages && page !== this.page) {
67       this._page = page;
68       this.pageChange.emit({
69         page
70       });
71     } else if (page > 0 && page >= this.totalPages) {
72       this._page = this.totalPages;
73       this.pageChange.emit({
74         page: this.totalPages
75       });
76     }
77   }
78
79   calcPages(page?: number): any[] {
80     const pages = [];
81     let startPage = 1;
82     let endPage = this.totalPages;
83     const maxSize = 5;
84     const isMaxSized = maxSize < this.totalPages;
85
86     page = page || this.page;
87
88     if (isMaxSized) {
89       startPage = page - Math.floor(maxSize / 2);
90       endPage = page + Math.floor(maxSize / 2);
91
92       if (startPage < 1) {
93         startPage = 1;
94         endPage = Math.min(startPage + maxSize - 1, this.totalPages);
95       } else if (endPage > this.totalPages) {
96         startPage = Math.max(this.totalPages - maxSize + 1, 1);
97         endPage = this.totalPages;
98       }
99     }
100
101     for (let num = startPage; num <= endPage; num++) {
102       pages.push({
103         number: num,
104         text: <string>(<any>num)
105       });
106     }
107
108     return pages;
109   }
110 }