]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/eg2/src/app/share/util/pager.ts
Docs: merge 3.2 release notes
[working/Evergreen.git] / Open-ILS / src / eg2 / src / app / share / util / pager.ts
1 import {EventEmitter} from '@angular/core';
2
3 /**
4  * Utility class for manage paged information.
5  */
6 export class Pager {
7     offset = 0;
8     limit: number = null;
9     resultCount: number;
10     onChange$: EventEmitter<number>;
11
12     constructor() {
13         this.resultCount = null;
14         this.onChange$ = new EventEmitter<number>();
15     }
16
17     reset() {
18         this.resultCount = null;
19         this.offset = 0;
20     }
21
22     setLimit(l: number) {
23         if (l !== this.limit) {
24             this.limit = l;
25             this.setPage(1);
26         }
27     }
28
29     isFirstPage(): boolean {
30         return this.offset === 0;
31     }
32
33     isLastPage(): boolean {
34         return this.currentPage() === this.pageCount();
35     }
36
37     currentPage(): number {
38         return Math.floor(this.offset / this.limit) + 1;
39     }
40
41     increment(): void {
42         this.setPage(this.currentPage() + 1);
43     }
44
45     decrement(): void {
46         this.setPage(this.currentPage() - 1);
47     }
48
49     toFirst() {
50         if (!this.isFirstPage()) {
51             this.setPage(1);
52         }
53     }
54
55     toLast() {
56         if (!this.isLastPage()) {
57             this.setPage(this.pageCount());
58         }
59     }
60
61     setPage(page: number): void {
62         this.offset = (this.limit * (page - 1));
63         this.onChange$.emit(this.offset);
64     }
65
66     pageCount(): number {
67         if (this.resultCount === null) { return -1; }
68         let pages = this.resultCount / this.limit;
69         if (Math.floor(pages) < pages) {
70             pages = Math.floor(pages) + 1;
71         }
72         return pages;
73     }
74
75     // Returns a list of pages numbers with @pivot at the center
76     // or as close to center as possible.
77     // @pivot is 1-based for consistency with page numbers.
78     // pageRange(25, 10) => [21,22,...29,30]
79     pageRange(pivot: number, size: number): number[] {
80
81         const diff = Math.floor(size / 2);
82         let start = pivot <= diff ? 1 : pivot - diff + 1;
83
84         const pcount = this.pageCount();
85
86         if (start + size > pcount) {
87             start = pcount - size + 1;
88             if (start < 1) { start = 1; }
89         }
90
91         if (start + size > pcount) {
92             size = pcount;
93         }
94
95         return this.pageList().slice(start - 1, start - 1 + size);
96     }
97
98     pageList(): number[] {
99         const list = [];
100         for (let i = 1; i <= this.pageCount(); i++) {
101             list.push(i);
102         }
103         return list;
104     }
105
106     // Given a zero-based page-specific offset, return the where in the
107     // entire data set the row lives, 1-based for UI friendliness.
108     rowNumber(offset: number): number {
109         return this.offset + offset + 1;
110     }
111 }