@libs-ui/components-pagination 0.2.356-9 → 0.2.357-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +262 -59
- package/esm2022/index.mjs +2 -1
- package/esm2022/pagination.component.mjs +54 -33
- package/esm2022/pagination.type.mjs +2 -0
- package/fesm2022/libs-ui-components-pagination.mjs +53 -32
- package/fesm2022/libs-ui-components-pagination.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/package.json +7 -2
- package/pagination.component.d.ts +11 -5
- package/pagination.type.d.ts +18 -0
package/README.md
CHANGED
|
@@ -1,33 +1,35 @@
|
|
|
1
1
|
# @libs-ui/components-pagination
|
|
2
2
|
|
|
3
|
-
> Component phân trang
|
|
3
|
+
> Component phân trang Angular standalone, hỗ trợ two-way binding, nhảy trang nhanh và debounce input.
|
|
4
4
|
|
|
5
5
|
## Giới thiệu
|
|
6
6
|
|
|
7
|
-
`LibsUiComponentsPaginationComponent` là
|
|
7
|
+
`LibsUiComponentsPaginationComponent` là standalone Angular component giúp chia nhỏ dữ liệu thành các trang và cung cấp trải nghiệm điều hướng mượt mà. Component hỗ trợ two-way binding qua `model()`, tự động tính toán cửa sổ trang hiển thị theo trang hiện tại, và tích hợp ô nhập nhảy trang với debounce 1500ms. Phù hợp dùng với mọi bảng dữ liệu hoặc danh sách lớn cần phân trang phía client hoặc server-side.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Tính năng
|
|
10
10
|
|
|
11
|
-
- ✅ **
|
|
12
|
-
- ✅ **
|
|
13
|
-
- ✅ **
|
|
14
|
-
- ✅ **
|
|
15
|
-
- ✅ **
|
|
11
|
+
- ✅ **Two-way binding** qua `[(currentPage)]` — đồng bộ trang hiện tại hai chiều
|
|
12
|
+
- ✅ **Hiển thị tổng trang** — tùy chọn `[showTotalPage]` hiển thị nhãn "X trang"
|
|
13
|
+
- ✅ **Nhảy trang nhanh** — ô input "Go to page" với debounce 1500ms, nhấn Enter nhảy ngay
|
|
14
|
+
- ✅ **Bố cục linh hoạt** — vùng tổng trang & nhảy trang đặt được ở top / bottom / left / right
|
|
15
|
+
- ✅ **Sliding window** — danh sách số trang hiển thị trượt theo trang hiện tại, tự điều chỉnh số lượng
|
|
16
|
+
- ✅ **Boundary protection** — tự kéo `currentPage` về trang cuối khi dữ liệu thay đổi làm số trang giảm
|
|
17
|
+
- ✅ **Disable state** — vô hiệu hóa toàn bộ điều hướng qua `[disable]`
|
|
18
|
+
- ✅ **Custom class** — tùy chỉnh class cho container, từng nút trang và vùng thông tin phụ
|
|
19
|
+
- ✅ **Angular Signals + OnPush** — hiệu năng cao, không re-render thừa
|
|
20
|
+
- ✅ **firstPageStartNumber** — hỗ trợ quy ước trang bắt đầu từ 0 hoặc 1
|
|
16
21
|
|
|
17
22
|
## Khi nào sử dụng
|
|
18
23
|
|
|
19
|
-
- Khi
|
|
20
|
-
- Khi cần cung cấp
|
|
21
|
-
-
|
|
24
|
+
- Khi có danh sách hoặc bảng dữ liệu lớn cần chia thành nhiều trang để tối ưu hiệu suất
|
|
25
|
+
- Khi cần cung cấp điều hướng rõ ràng (Previous / Next / số trang) cho người dùng
|
|
26
|
+
- Khi người dùng cần nhảy nhanh đến một trang cụ thể bằng cách nhập số trang
|
|
27
|
+
- Khi cần tích hợp phân trang server-side (gọi API mới mỗi khi `outPageSelect` emit)
|
|
22
28
|
|
|
23
29
|
## Cài đặt
|
|
24
30
|
|
|
25
31
|
```bash
|
|
26
|
-
# npm
|
|
27
32
|
npm install @libs-ui/components-pagination
|
|
28
|
-
|
|
29
|
-
# yarn
|
|
30
|
-
yarn add @libs-ui/components-pagination
|
|
31
33
|
```
|
|
32
34
|
|
|
33
35
|
## Import
|
|
@@ -43,83 +45,284 @@ import { LibsUiComponentsPaginationComponent } from '@libs-ui/components-paginat
|
|
|
43
45
|
export class YourComponent {}
|
|
44
46
|
```
|
|
45
47
|
|
|
46
|
-
|
|
48
|
+
### Types & Interfaces
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import {
|
|
52
|
+
IPaginationConfig,
|
|
53
|
+
IPaginationFunctionsControl,
|
|
54
|
+
} from '@libs-ui/components-pagination';
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Ví dụ sử dụng
|
|
47
58
|
|
|
48
|
-
###
|
|
59
|
+
### 1. Phân trang cơ bản
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// your.component.ts
|
|
63
|
+
import { Component, signal } from '@angular/core';
|
|
64
|
+
import { LibsUiComponentsPaginationComponent } from '@libs-ui/components-pagination';
|
|
65
|
+
|
|
66
|
+
@Component({
|
|
67
|
+
selector: 'app-your',
|
|
68
|
+
standalone: true,
|
|
69
|
+
imports: [LibsUiComponentsPaginationComponent],
|
|
70
|
+
templateUrl: './your.component.html',
|
|
71
|
+
})
|
|
72
|
+
export class YourComponent {
|
|
73
|
+
protected currentPage = signal<number>(1);
|
|
74
|
+
|
|
75
|
+
protected handlerPageSelect(page: number): void {
|
|
76
|
+
event?.stopPropagation?.();
|
|
77
|
+
console.log('Chuyển sang trang:', page);
|
|
78
|
+
// Gọi API để load dữ liệu trang mới
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
49
82
|
|
|
50
83
|
```html
|
|
84
|
+
<!-- your.component.html -->
|
|
51
85
|
<libs_ui-components-pagination
|
|
52
86
|
[totalItems]="100"
|
|
53
87
|
[perPage]="10"
|
|
54
88
|
[(currentPage)]="currentPage"
|
|
55
|
-
(outPageSelect)="
|
|
89
|
+
(outPageSelect)="handlerPageSelect($event)" />
|
|
56
90
|
```
|
|
57
91
|
|
|
58
|
-
###
|
|
92
|
+
### 2. Hiển thị tổng trang và nhảy trang nhanh (bên phải)
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
// your.component.ts
|
|
96
|
+
import { Component, signal } from '@angular/core';
|
|
97
|
+
import { LibsUiComponentsPaginationComponent } from '@libs-ui/components-pagination';
|
|
98
|
+
|
|
99
|
+
@Component({
|
|
100
|
+
selector: 'app-your',
|
|
101
|
+
standalone: true,
|
|
102
|
+
imports: [LibsUiComponentsPaginationComponent],
|
|
103
|
+
templateUrl: './your.component.html',
|
|
104
|
+
})
|
|
105
|
+
export class YourComponent {
|
|
106
|
+
protected currentPage = signal<number>(1);
|
|
107
|
+
protected totalItems = signal<number>(500);
|
|
108
|
+
|
|
109
|
+
protected handlerPageSelect(page: number): void {
|
|
110
|
+
event?.stopPropagation?.();
|
|
111
|
+
// Load dữ liệu trang mới từ API
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|
|
59
115
|
|
|
60
116
|
```html
|
|
117
|
+
<!-- your.component.html -->
|
|
61
118
|
<libs_ui-components-pagination
|
|
62
|
-
[totalItems]="
|
|
119
|
+
[totalItems]="totalItems()"
|
|
63
120
|
[perPage]="20"
|
|
64
121
|
[(currentPage)]="currentPage"
|
|
65
122
|
[showTotalPage]="true"
|
|
66
123
|
[showInputGotoPage]="true"
|
|
67
|
-
[modeDisplayTotalPageAndGotoPage]="'right'"
|
|
124
|
+
[modeDisplayTotalPageAndGotoPage]="'right'"
|
|
125
|
+
(outPageSelect)="handlerPageSelect($event)" />
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 3. Trang bắt đầu từ 0 (zero-based) với vùng thông tin phụ ở trên
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
// your.component.ts
|
|
132
|
+
import { Component, signal } from '@angular/core';
|
|
133
|
+
import { LibsUiComponentsPaginationComponent } from '@libs-ui/components-pagination';
|
|
134
|
+
|
|
135
|
+
@Component({
|
|
136
|
+
selector: 'app-your',
|
|
137
|
+
standalone: true,
|
|
138
|
+
imports: [LibsUiComponentsPaginationComponent],
|
|
139
|
+
templateUrl: './your.component.html',
|
|
140
|
+
})
|
|
141
|
+
export class YourComponent {
|
|
142
|
+
protected currentPage = signal<number>(0);
|
|
143
|
+
|
|
144
|
+
protected handlerPageSelect(page: number): void {
|
|
145
|
+
event?.stopPropagation?.();
|
|
146
|
+
// page = 0, 1, 2, ... (zero-based)
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
```html
|
|
152
|
+
<!-- your.component.html -->
|
|
153
|
+
<libs_ui-components-pagination
|
|
154
|
+
[totalItems]="200"
|
|
155
|
+
[perPage]="10"
|
|
156
|
+
[(currentPage)]="currentPage"
|
|
157
|
+
[firstPageStartNumber]="0"
|
|
158
|
+
[showTotalPage]="true"
|
|
159
|
+
[showInputGotoPage]="true"
|
|
160
|
+
[modeDisplayTotalPageAndGotoPage]="'top'"
|
|
161
|
+
(outPageSelect)="handlerPageSelect($event)" />
|
|
68
162
|
```
|
|
69
163
|
|
|
70
|
-
|
|
164
|
+
### 4. Disabled state
|
|
71
165
|
|
|
72
|
-
|
|
166
|
+
```html
|
|
167
|
+
<libs_ui-components-pagination
|
|
168
|
+
[totalItems]="100"
|
|
169
|
+
[perPage]="10"
|
|
170
|
+
[(currentPage)]="currentPage"
|
|
171
|
+
[disable]="isLoading()" />
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 5. Tùy chỉnh class container và nút trang
|
|
175
|
+
|
|
176
|
+
```html
|
|
177
|
+
<libs_ui-components-pagination
|
|
178
|
+
[totalItems]="100"
|
|
179
|
+
[perPage]="10"
|
|
180
|
+
[(currentPage)]="currentPage"
|
|
181
|
+
[numberPageDisplay]="7"
|
|
182
|
+
classIncludeContainer="mt-4"
|
|
183
|
+
classIncludeItem="w-[36px] h-[36px]"
|
|
184
|
+
[showTotalPage]="true"
|
|
185
|
+
classDisplayTotalPageAndGotoPage="gap-2"
|
|
186
|
+
(outPageSelect)="handlerPageSelect($event)" />
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 6. Dùng FunctionsControl qua ViewChild
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
// parent.component.ts
|
|
193
|
+
import { Component, viewChild } from '@angular/core';
|
|
194
|
+
import {
|
|
195
|
+
LibsUiComponentsPaginationComponent,
|
|
196
|
+
IPaginationFunctionsControl,
|
|
197
|
+
} from '@libs-ui/components-pagination';
|
|
198
|
+
|
|
199
|
+
@Component({
|
|
200
|
+
selector: 'app-parent',
|
|
201
|
+
standalone: true,
|
|
202
|
+
imports: [LibsUiComponentsPaginationComponent],
|
|
203
|
+
template: `
|
|
204
|
+
<libs_ui-components-pagination
|
|
205
|
+
#paginationRef
|
|
206
|
+
[totalItems]="totalItems()"
|
|
207
|
+
[perPage]="20"
|
|
208
|
+
[(currentPage)]="currentPage" />
|
|
209
|
+
<button (click)="handlerResetPage()">Reset trang</button>
|
|
210
|
+
`,
|
|
211
|
+
})
|
|
212
|
+
export class ParentComponent {
|
|
213
|
+
private readonly paginationRef = viewChild<LibsUiComponentsPaginationComponent>('paginationRef');
|
|
214
|
+
protected currentPage = signal<number>(1);
|
|
215
|
+
protected totalItems = signal<number>(200);
|
|
216
|
+
|
|
217
|
+
protected handlerResetPage(): void {
|
|
218
|
+
event?.stopPropagation?.();
|
|
219
|
+
this.paginationRef()?.FunctionsControl.changePage(1);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## @Input()
|
|
225
|
+
|
|
226
|
+
| Input | Type | Default | Mô tả | Ví dụ |
|
|
227
|
+
|---|---|---|---|---|
|
|
228
|
+
| `[totalItems]` | `number` | **Bắt buộc** | Tổng số bản ghi cần phân trang | `[totalItems]="500"` |
|
|
229
|
+
| `[perPage]` | `number` | **Bắt buộc** | Số bản ghi hiển thị trên mỗi trang | `[perPage]="20"` |
|
|
230
|
+
| `[(currentPage)]` | `number` | **Bắt buộc** | Trang hiện tại — two-way binding qua `model()` | `[(currentPage)]="currentPage"` |
|
|
231
|
+
| `[numberPageDisplay]` | `number` | `5` | Số lượng nút số trang tối đa hiển thị trên thanh điều hướng | `[numberPageDisplay]="7"` |
|
|
232
|
+
| `[showTotalPage]` | `boolean` | `undefined` | Hiển thị nhãn tổng số trang (vd: "10 trang") | `[showTotalPage]="true"` |
|
|
233
|
+
| `[showInputGotoPage]` | `boolean` | `undefined` | Hiển thị ô input để nhảy nhanh đến trang bất kỳ | `[showInputGotoPage]="true"` |
|
|
234
|
+
| `[modeDisplayTotalPageAndGotoPage]` | `'top' \| 'bottom' \| 'left' \| 'right'` | `'bottom'` | Vị trí hiển thị vùng tổng trang và nhảy trang so với thanh số trang | `[modeDisplayTotalPageAndGotoPage]="'right'"` |
|
|
235
|
+
| `[classDisplayTotalPageAndGotoPage]` | `string` | `undefined` | Class CSS tùy chỉnh cho vùng chứa thông tin tổng trang và nhảy trang | `classDisplayTotalPageAndGotoPage="gap-4"` |
|
|
236
|
+
| `[classIncludeContainer]` | `string` | `undefined` | Class CSS tùy chỉnh cho wrapper ngoài cùng của component | `classIncludeContainer="mt-4 justify-end"` |
|
|
237
|
+
| `[classIncludeItem]` | `string` | `undefined` | Class CSS tùy chỉnh cho từng nút số trang | `classIncludeItem="w-[40px] h-[40px]"` |
|
|
238
|
+
| `[disable]` | `boolean` | `undefined` | Vô hiệu hóa toàn bộ điều hướng (click, nhập số trang) | `[disable]="isLoading()"` |
|
|
239
|
+
| `[firstPageStartNumber]` | `0 \| 1` | `1` | Quy ước số trang bắt đầu: `1` = one-based (mặc định), `0` = zero-based | `[firstPageStartNumber]="0"` |
|
|
240
|
+
|
|
241
|
+
## @Output()
|
|
242
|
+
|
|
243
|
+
| Output | Type | Mô tả | Handler TS | Binding HTML |
|
|
244
|
+
|---|---|---|---|---|
|
|
245
|
+
| `(outPageSelect)` | `number` | Emit số trang mới mỗi khi người dùng chuyển trang (click số trang, Previous, Next, hoặc Go to page) | `handlerPageSelect(page: number): void { event?.stopPropagation?.(); /* gọi API */ }` | `(outPageSelect)="handlerPageSelect($event)"` |
|
|
246
|
+
|
|
247
|
+
## FunctionsControl (ViewChild API)
|
|
248
|
+
|
|
249
|
+
Truy cập qua `viewChild` để điều khiển component từ bên ngoài:
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
private readonly paginationRef = viewChild<LibsUiComponentsPaginationComponent>('paginationRef');
|
|
253
|
+
|
|
254
|
+
// Gọi changePage với số trang cụ thể
|
|
255
|
+
this.paginationRef()?.FunctionsControl.changePage(3);
|
|
256
|
+
|
|
257
|
+
// Gọi changePage không có tham số → re-render trang hiện tại
|
|
258
|
+
this.paginationRef()?.FunctionsControl.changePage();
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
| Method | Signature | Mô tả |
|
|
262
|
+
|---|---|---|
|
|
263
|
+
| `changePage` | `(page?: number) => Promise<void>` | Chuyển đến trang `page`. Nếu không truyền `page`, re-render trang hiện tại |
|
|
264
|
+
|
|
265
|
+
## Types & Interfaces
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
import {
|
|
269
|
+
IPaginationConfig,
|
|
270
|
+
IPaginationFunctionsControl,
|
|
271
|
+
} from '@libs-ui/components-pagination';
|
|
272
|
+
|
|
273
|
+
// IPaginationConfig — dùng để định nghĩa config tập trung
|
|
274
|
+
type IPaginationConfig = {
|
|
275
|
+
position?: 'top' | 'bottom';
|
|
276
|
+
classIncludeContainer?: string;
|
|
277
|
+
classIncludeItem?: string;
|
|
278
|
+
disable?: boolean;
|
|
279
|
+
numberPageDisplay?: number;
|
|
280
|
+
showTotalPage?: boolean;
|
|
281
|
+
firstPageStartNumber?: 0 | 1;
|
|
282
|
+
showInputGotoPage?: boolean;
|
|
283
|
+
modeDisplayTotalPageAndGotoPage?: 'top' | 'bottom' | 'left' | 'right';
|
|
284
|
+
classDisplayTotalPageAndGotoPage?: string;
|
|
285
|
+
perPage?: number;
|
|
286
|
+
totalItems?: number;
|
|
287
|
+
currentPage?: number;
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
// IPaginationFunctionsControl — interface của FunctionsControl getter
|
|
291
|
+
interface IPaginationFunctionsControl {
|
|
292
|
+
changePage: (page?: number) => Promise<void>;
|
|
293
|
+
}
|
|
294
|
+
```
|
|
73
295
|
|
|
74
|
-
|
|
296
|
+
## Logic ẩn quan trọng
|
|
75
297
|
|
|
76
|
-
|
|
77
|
-
| ------------------------------------ | ---------------------------------------- | ------------ | --------------------------------------------------------------- |
|
|
78
|
-
| `[classIncludeContainer]` | `string` | `undefined` | Custom class cho container chính. |
|
|
79
|
-
| `[classIncludeItem]` | `string` | `undefined` | Custom class cho từng nút phân trang. |
|
|
80
|
-
| `[classDisplayTotalPageAndGotoPage]` | `string` | `undefined` | Custom class cho vùng tổng trang & nhảy trang. |
|
|
81
|
-
| `[disable]` | `boolean` | `false` | Vô hiệu hóa tương tác phân trang. |
|
|
82
|
-
| `[modeDisplayTotalPageAndGotoPage]` | `'top' \| 'bottom' \| 'left' \| 'right'` | `'bottom'` | Vị trí của vùng thông tin bổ trợ (Tổng trang & Nhảy trang). |
|
|
83
|
-
| `[numberPageDisplay]` | `number` | `5` | Số lượng các nút trang (con số) hiển thị trên thanh điều hướng. |
|
|
84
|
-
| `[perPage]` | `number` | **Bắt buộc** | Số lượng phần tử hiển thị trên mỗi trang. |
|
|
85
|
-
| `[showInputGotoPage]` | `boolean` | `false` | Hiển thị ô nhập để nhảy nhanh đến trang bất kỳ. |
|
|
86
|
-
| `[showTotalPage]` | `boolean` | `false` | Hiển thị thông báo tổng số trang. |
|
|
87
|
-
| `[totalItems]` | `number` | **Bắt buộc** | Tổng số lượng phần tử cần phân trang. |
|
|
298
|
+
### Debounced Navigation (1500ms)
|
|
88
299
|
|
|
89
|
-
|
|
300
|
+
Khi người dùng nhập số vào ô "Go to page", component đợi 1500ms sau lần gõ cuối mới thực hiện chuyển trang, tránh spam API. Nhấn **Enter** sẽ bỏ qua thời gian chờ và chuyển trang ngay lập tức.
|
|
90
301
|
|
|
91
|
-
|
|
92
|
-
| ----------------- | -------- | ----------------------------------------- |
|
|
93
|
-
| `[(currentPage)]` | `number` | Trang hiện tại đang được chọn (bắt buộc). |
|
|
302
|
+
### Sliding Window (cửa sổ trang trượt)
|
|
94
303
|
|
|
95
|
-
|
|
304
|
+
Danh sách các nút số trang hiển thị được tính động, luôn bao quanh `currentPage` trong phạm vi `numberPageDisplay`. Khi `currentPage` thay đổi, cửa sổ trang trượt theo để trang hiện tại luôn nằm ở giữa (hoặc gần giữa).
|
|
96
305
|
|
|
97
|
-
|
|
98
|
-
| ----------------- | -------- | ------------------------------------------------- |
|
|
99
|
-
| `(outPageSelect)` | `number` | Phát ra số trang mới khi người dùng chuyển trang. |
|
|
306
|
+
### Boundary Protection (giới hạn biên)
|
|
100
307
|
|
|
101
|
-
|
|
308
|
+
Nếu `totalItems` thay đổi làm giảm tổng số trang xuống thấp hơn `currentPage` hiện tại, component tự động kéo `currentPage` về trang cuối hợp lệ và emit `outPageSelect`.
|
|
102
309
|
|
|
103
|
-
###
|
|
310
|
+
### firstPageStartNumber
|
|
104
311
|
|
|
105
|
-
|
|
312
|
+
- `firstPageStartNumber="1"` (mặc định): `currentPage` nhận giá trị `1, 2, 3, ...`, emit `1, 2, 3, ...`
|
|
313
|
+
- `firstPageStartNumber="0"`: `currentPage` nhận giá trị `0, 1, 2, ...`, emit `0, 1, 2, ...`
|
|
106
314
|
|
|
107
|
-
|
|
315
|
+
Dùng `firstPageStartNumber="0"` khi API backend dùng quy ước zero-based pagination.
|
|
108
316
|
|
|
109
|
-
|
|
317
|
+
## Lưu ý quan trọng
|
|
110
318
|
|
|
111
|
-
|
|
319
|
+
⚠️ **Two-way binding bắt buộc**: Luôn dùng `[(currentPage)]` thay vì `[currentPage]` một chiều. Nếu chỉ dùng một chiều, component không thể cập nhật lại số trang hiển thị khi người dùng điều hướng.
|
|
112
320
|
|
|
113
|
-
|
|
321
|
+
⚠️ **Required inputs**: `totalItems`, `perPage` và `currentPage` là bắt buộc. Thiếu bất kỳ input nào sẽ khiến component không thể tính toán số trang và không render được gì.
|
|
114
322
|
|
|
115
|
-
|
|
323
|
+
⚠️ **Debounce 1500ms**: Ô "Go to page" có delay 1500ms. Nếu UX yêu cầu chuyển trang ngay lập tức khi nhập, hướng dẫn người dùng nhấn Enter sau khi nhập.
|
|
116
324
|
|
|
117
|
-
|
|
118
|
-
| --------------- | ------- | ----------------- |
|
|
119
|
-
| Angular | 18+ | Framework |
|
|
120
|
-
| Angular Signals | - | State management |
|
|
121
|
-
| RxJS | 7.x | Debounce handling |
|
|
122
|
-
| OnPush | - | Performance |
|
|
325
|
+
⚠️ **Disable khi loading**: Nên bind `[disable]="isLoading()"` để ngăn người dùng chuyển trang trong lúc đang gọi API, tránh race condition.
|
|
123
326
|
|
|
124
327
|
## Demo
|
|
125
328
|
|
|
@@ -127,4 +330,4 @@ Danh sách các nút số trang hiển thị được tính toán linh hoạt ba
|
|
|
127
330
|
npx nx serve core-ui
|
|
128
331
|
```
|
|
129
332
|
|
|
130
|
-
Truy cập: `http://localhost:
|
|
333
|
+
Truy cập: `http://localhost:4500/pagination`
|
package/esm2022/index.mjs
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export * from './pagination.component';
|
|
2
|
-
|
|
2
|
+
export * from './pagination.type';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3BhZ2luYXRpb24udHlwZSc7XG4iXX0=
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, model, output, signal, untracked } from '@angular/core';
|
|
2
3
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
4
|
import { LibsUiComponentsInputsInputComponent } from '@libs-ui/components-inputs-input';
|
|
4
5
|
import { TranslateProviderConfig } from '@libs-ui/services-translate';
|
|
6
|
+
import { isNil } from '@libs-ui/utils';
|
|
5
7
|
import { TranslateModule } from '@ngx-translate/core';
|
|
6
8
|
import { debounceTime, Subject } from 'rxjs';
|
|
7
|
-
import { isNil } from '@libs-ui/utils';
|
|
8
|
-
import { NgTemplateOutlet } from '@angular/common';
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
import * as i1 from "@ngx-translate/core";
|
|
11
11
|
export class LibsUiComponentsPaginationComponent {
|
|
12
|
+
fakeEventHtml = new Event('click');
|
|
12
13
|
isEnterSearch = signal(false);
|
|
13
14
|
listPageDisplay = signal([]);
|
|
14
15
|
gotoPageNumber = signal(undefined);
|
|
@@ -24,29 +25,48 @@ export class LibsUiComponentsPaginationComponent {
|
|
|
24
25
|
numberPageDisplay = input(5, { transform: (value) => value || 5 });
|
|
25
26
|
totalItems = input.required();
|
|
26
27
|
perPage = input.required();
|
|
28
|
+
firstPageStartNumber = input(1, { transform: (value) => value ?? 1 });
|
|
27
29
|
currentPage = model.required();
|
|
30
|
+
currentPageComputed = computed(() => this.currentPage() + (this.firstPageStartNumber() === 1 ? 0 : 1));
|
|
28
31
|
outPageSelect = output();
|
|
29
32
|
destroyRef = inject(DestroyRef);
|
|
30
33
|
constructor() {
|
|
34
|
+
let totalItems = 0;
|
|
31
35
|
effect(() => {
|
|
32
|
-
if (!isNil(this.
|
|
36
|
+
if (!isNil(this.totalItems()) || totalItems !== this.totalItems()) {
|
|
33
37
|
untracked(() => {
|
|
38
|
+
totalItems = this.totalItems();
|
|
34
39
|
this.renderPagination();
|
|
35
|
-
if (this.totalPage() && this.
|
|
36
|
-
this.
|
|
40
|
+
if (this.totalPage() && this.currentPageComputed() >= this.totalPage()) {
|
|
41
|
+
this.selectPage(this.fakeEventHtml, { key: `${this.totalPage()}`, value: `${this.totalPage()}` });
|
|
37
42
|
}
|
|
38
43
|
});
|
|
39
44
|
}
|
|
40
45
|
});
|
|
41
46
|
this.onChangeValue.pipe(debounceTime(1500), takeUntilDestroyed(this.destroyRef)).subscribe((value) => {
|
|
42
|
-
if (this.isEnterSearch()) {
|
|
47
|
+
if (this.isEnterSearch() || +value === this.currentPageComputed()) {
|
|
43
48
|
this.isEnterSearch.set(false);
|
|
44
49
|
return;
|
|
45
50
|
}
|
|
46
|
-
this.
|
|
47
|
-
this.outPageSelect.emit(this.currentPage());
|
|
51
|
+
this.selectPage(this.fakeEventHtml, { key: `${value}`, value: `${value}` });
|
|
48
52
|
});
|
|
49
53
|
}
|
|
54
|
+
ngOnInit() {
|
|
55
|
+
if (!isNil(this.currentPage()) && !isNil(this.totalItems()) && !isNil(this.perPage())) {
|
|
56
|
+
this.renderPagination();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
get FunctionsControl() {
|
|
60
|
+
return {
|
|
61
|
+
changePage: async (value) => {
|
|
62
|
+
if (!isNil(value)) {
|
|
63
|
+
await this.changePage(value);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
await this.changePage(this.currentPageComputed());
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
50
70
|
renderPagination() {
|
|
51
71
|
if (this.perPage() > 0 && !isNil(this.totalItems())) {
|
|
52
72
|
this.totalPage.set(Math.ceil(this.totalItems() / this.perPage()));
|
|
@@ -58,30 +78,34 @@ export class LibsUiComponentsPaginationComponent {
|
|
|
58
78
|
}));
|
|
59
79
|
return;
|
|
60
80
|
}
|
|
61
|
-
if (this.
|
|
81
|
+
if (this.currentPageComputed() < this.numberPageDisplay() - 1) {
|
|
62
82
|
this.listPageDisplay.set(Array.from({ length: this.numberPageDisplay() }, (_, index) => {
|
|
63
83
|
return { key: `${index + 1}`, value: `${index + 1}` };
|
|
64
84
|
}));
|
|
65
85
|
return;
|
|
66
86
|
}
|
|
67
|
-
const startPage = this.
|
|
68
|
-
let numberPageBefore =
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
87
|
+
const startPage = this.currentPageComputed() - this.numberPageDisplay() / 2;
|
|
88
|
+
let numberPageBefore = [
|
|
89
|
+
this.currentPageComputed(),
|
|
90
|
+
0,
|
|
91
|
+
this.numberPageDisplay() / 2,
|
|
92
|
+
][Math.sign(startPage) + 1];
|
|
93
|
+
const gapAfter = this.numberPageDisplay() - numberPageBefore;
|
|
94
|
+
const endPage = this.currentPageComputed() + gapAfter;
|
|
95
|
+
const numberPageAfter = this.totalPage() >= endPage ? gapAfter : this.totalPage() - this.currentPageComputed();
|
|
72
96
|
if (numberPageBefore + numberPageAfter < this.numberPageDisplay()) {
|
|
73
97
|
numberPageBefore = this.numberPageDisplay() - numberPageAfter;
|
|
74
98
|
}
|
|
75
99
|
for (let i = 0; i < numberPageBefore; i++) {
|
|
76
100
|
this.listPageDisplay.update((listPage) => {
|
|
77
|
-
listPage.unshift({ key: `${this.
|
|
101
|
+
listPage.unshift({ key: `${this.currentPageComputed() - i}`, value: `${this.currentPageComputed() - i}` });
|
|
78
102
|
return [...listPage];
|
|
79
103
|
});
|
|
80
104
|
}
|
|
81
105
|
if (numberPageAfter >= 0) {
|
|
82
106
|
for (let i = 1; i <= numberPageAfter; i++) {
|
|
83
107
|
this.listPageDisplay.update((listPage) => {
|
|
84
|
-
listPage.push({ key: `${this.
|
|
108
|
+
listPage.push({ key: `${this.currentPageComputed() + i}`, value: `${this.currentPageComputed() + i}` });
|
|
85
109
|
return [...listPage];
|
|
86
110
|
});
|
|
87
111
|
}
|
|
@@ -89,13 +113,17 @@ export class LibsUiComponentsPaginationComponent {
|
|
|
89
113
|
}
|
|
90
114
|
selectPage(e, item) {
|
|
91
115
|
e.stopPropagation();
|
|
92
|
-
|
|
116
|
+
const pageSelect = +item.key - (this.firstPageStartNumber() === 0 ? 1 : 0);
|
|
117
|
+
if (pageSelect === this.currentPage()) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
this.currentPage.set(pageSelect);
|
|
93
121
|
this.outPageSelect.emit(this.currentPage());
|
|
94
122
|
this.renderPagination();
|
|
95
123
|
}
|
|
96
124
|
nextPage(e) {
|
|
97
125
|
e.stopPropagation();
|
|
98
|
-
if (this.
|
|
126
|
+
if (this.currentPageComputed() < this.totalPage()) {
|
|
99
127
|
this.currentPage.update((currentPage) => currentPage + 1);
|
|
100
128
|
this.outPageSelect.emit(this.currentPage());
|
|
101
129
|
this.renderPagination();
|
|
@@ -103,13 +131,13 @@ export class LibsUiComponentsPaginationComponent {
|
|
|
103
131
|
}
|
|
104
132
|
prePage(e) {
|
|
105
133
|
e.stopPropagation();
|
|
106
|
-
if (this.
|
|
134
|
+
if (this.currentPageComputed() > 1) {
|
|
107
135
|
this.currentPage.update((currentPage) => currentPage - 1);
|
|
108
136
|
this.outPageSelect.emit(this.currentPage());
|
|
109
137
|
this.renderPagination();
|
|
110
138
|
}
|
|
111
139
|
}
|
|
112
|
-
changePage(value) {
|
|
140
|
+
async changePage(value) {
|
|
113
141
|
value = value;
|
|
114
142
|
if (!value) {
|
|
115
143
|
this.gotoPageNumber.set(undefined);
|
|
@@ -119,24 +147,17 @@ export class LibsUiComponentsPaginationComponent {
|
|
|
119
147
|
this.onChangeValue.next(value);
|
|
120
148
|
}
|
|
121
149
|
handlerEnterInput() {
|
|
122
|
-
if (
|
|
150
|
+
if (isNil(this.gotoPageNumber()) || this.gotoPageNumber() === this.currentPageComputed()) {
|
|
123
151
|
return;
|
|
124
152
|
}
|
|
125
153
|
this.isEnterSearch.set(true);
|
|
126
|
-
this.
|
|
127
|
-
}
|
|
128
|
-
changeInputSearch(value) {
|
|
129
|
-
if (value >= 1 && value <= this.totalPage() && value !== this.currentPage()) {
|
|
130
|
-
this.currentPage.set(value);
|
|
131
|
-
this.outPageSelect.emit(this.currentPage());
|
|
132
|
-
this.renderPagination();
|
|
133
|
-
}
|
|
154
|
+
this.selectPage(this.fakeEventHtml, { key: `${this.gotoPageNumber()}`, value: `${this.gotoPageNumber()}` });
|
|
134
155
|
}
|
|
135
156
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
136
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPaginationComponent, isStandalone: true, selector: "libs_ui-components-pagination", inputs: { showTotalPage: { classPropertyName: "showTotalPage", publicName: "showTotalPage", isSignal: true, isRequired: false, transformFunction: null }, showInputGotoPage: { classPropertyName: "showInputGotoPage", publicName: "showInputGotoPage", isSignal: true, isRequired: false, transformFunction: null }, modeDisplayTotalPageAndGotoPage: { classPropertyName: "modeDisplayTotalPageAndGotoPage", publicName: "modeDisplayTotalPageAndGotoPage", isSignal: true, isRequired: false, transformFunction: null }, classDisplayTotalPageAndGotoPage: { classPropertyName: "classDisplayTotalPageAndGotoPage", publicName: "classDisplayTotalPageAndGotoPage", isSignal: true, isRequired: false, transformFunction: null }, classIncludeContainer: { classPropertyName: "classIncludeContainer", publicName: "classIncludeContainer", isSignal: true, isRequired: false, transformFunction: null }, classIncludeItem: { classPropertyName: "classIncludeItem", publicName: "classIncludeItem", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, numberPageDisplay: { classPropertyName: "numberPageDisplay", publicName: "numberPageDisplay", isSignal: true, isRequired: false, transformFunction: null }, totalItems: { classPropertyName: "totalItems", publicName: "totalItems", isSignal: true, isRequired: true, transformFunction: null }, perPage: { classPropertyName: "perPage", publicName: "perPage", isSignal: true, isRequired: true, transformFunction: null }, currentPage: { classPropertyName: "currentPage", publicName: "currentPage", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { currentPage: "currentPageChange", outPageSelect: "outPageSelect" }, providers: [TranslateProviderConfig], ngImport: i0, template: "<div class=\"flex flex-col items-center flex-wrap w-full justify-center {{ classIncludeContainer() ?? '' }}\">\n @let constHtmlDisplayTotalPageAndGotoPage = showTotalPage() || showInputGotoPage();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'top') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div class=\"flex shrink-0 h-full items-center\">\n @let constHtmlDisableButtonPre =
|
|
157
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPaginationComponent, isStandalone: true, selector: "libs_ui-components-pagination", inputs: { showTotalPage: { classPropertyName: "showTotalPage", publicName: "showTotalPage", isSignal: true, isRequired: false, transformFunction: null }, showInputGotoPage: { classPropertyName: "showInputGotoPage", publicName: "showInputGotoPage", isSignal: true, isRequired: false, transformFunction: null }, modeDisplayTotalPageAndGotoPage: { classPropertyName: "modeDisplayTotalPageAndGotoPage", publicName: "modeDisplayTotalPageAndGotoPage", isSignal: true, isRequired: false, transformFunction: null }, classDisplayTotalPageAndGotoPage: { classPropertyName: "classDisplayTotalPageAndGotoPage", publicName: "classDisplayTotalPageAndGotoPage", isSignal: true, isRequired: false, transformFunction: null }, classIncludeContainer: { classPropertyName: "classIncludeContainer", publicName: "classIncludeContainer", isSignal: true, isRequired: false, transformFunction: null }, classIncludeItem: { classPropertyName: "classIncludeItem", publicName: "classIncludeItem", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, numberPageDisplay: { classPropertyName: "numberPageDisplay", publicName: "numberPageDisplay", isSignal: true, isRequired: false, transformFunction: null }, totalItems: { classPropertyName: "totalItems", publicName: "totalItems", isSignal: true, isRequired: true, transformFunction: null }, perPage: { classPropertyName: "perPage", publicName: "perPage", isSignal: true, isRequired: true, transformFunction: null }, firstPageStartNumber: { classPropertyName: "firstPageStartNumber", publicName: "firstPageStartNumber", isSignal: true, isRequired: false, transformFunction: null }, currentPage: { classPropertyName: "currentPage", publicName: "currentPage", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { currentPage: "currentPageChange", outPageSelect: "outPageSelect" }, providers: [TranslateProviderConfig], ngImport: i0, template: "<div class=\"flex flex-col items-center flex-wrap w-full justify-center {{ classIncludeContainer() ?? '' }}\">\n @let constHtmlDisplayTotalPageAndGotoPage = showTotalPage() || showInputGotoPage();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'top') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div class=\"flex shrink-0 h-full items-center\">\n @let constHtmlDisableButtonPre = currentPageComputed() <= 1 || totalPage() <= 1 || disable();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'left') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div\n class=\"libs-ui-components-pagination-button rotate-[180deg] pl-[14px] pr-[6px]\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonPre\"\n [class.pointer-events-none]=\"constHtmlDisableButtonPre\"\n (click)=\"prePage($event)\"\n (keydown.enter)=\"prePage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @for (item of listPageDisplay(); track item.key) {\n <div\n class=\"libs-ui-components-pagination-item libs-ui-font-h3m {{ classIncludeItem() ?? '' }}\"\n [class.libs-ui-components-pagination-active]=\"item.key === currentPageComputed() + ''\"\n [class.libs-ui-disable]=\"disable()\"\n [class.pointer-events-none]=\"disable()\"\n (click)=\"selectPage($event, item)\"\n (keydown.enter)=\"selectPage($event, item)\">\n {{ item.value }}\n </div>\n } @empty {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_no_data_yet' | translate }}\n </div>\n }\n\n @let constHtmlDisableButtonNext = currentPageComputed() >= totalPage() || disable();\n <div\n class=\"libs-ui-components-pagination-button pl-[14px] pr-[6p]x\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonNext\"\n [class.pointer-events-none]=\"constHtmlDisableButtonNext\"\n (click)=\"nextPage($event)\"\n (keydown.enter)=\"nextPage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'right') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'bottom') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n</div>\n\n<ng-template #gotoPageNumberRef>\n <div\n class=\"flex shrink-0 h-full items-center {{ classDisplayTotalPageAndGotoPage() ?? '' }}\"\n [class.mb-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'top'\"\n [class.mt-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'bottom'\">\n @if (showTotalPage()) {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px]\">\n {{ 'i18n_value_sum_page' | translate: { value: totalPage() } }}\n </div>\n }\n @if (showInputGotoPage()) {\n @if (showTotalPage()) {\n <div class=\"h-[16px] w-[1px] bg-[#CDD0D6]\"></div>\n }\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_go_to' | translate }}\n </div>\n <div class=\"w-[60px] mr-[12px] shrink-0\">\n <libs_ui-components-inputs-input\n [dataType]=\"'int'\"\n classInclude=\"!rounded-[6px]\"\n [maxValueNumber]=\"totalPage()\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [defaultHeight]=\"28\"\n [value]=\"gotoPageNumber() || ''\"\n (outChange)=\"changePage($event)\"\n (outEnterEvent)=\"handlerEnterInput()\"\n [disable]=\"disable() || totalPage() <= numberPageDisplay()\" />\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{width:100%}.libs-ui-components-pagination-item{color:#1c1f22;display:flex;flex-shrink:0;align-items:center;justify-content:center;padding:4px 12px;cursor:pointer}.libs-ui-components-pagination-item [class^=mo-svg-font]:before{color:#1c1f22;font-size:var(--mo-heading-4-size)!important}.libs-ui-components-pagination-item.libs-ui-components-pagination-active{color:var(--libs-ui-color-default)}.libs-ui-components-pagination-item.libs-ui-components-pagination-active [class^=mo-svg-font]:before{color:var(--libs-ui-color-default)}.libs-ui-components-pagination-button{cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "typeInput", "modeInput", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "selectAllTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iframeTextareaCustomStyle", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
137
158
|
}
|
|
138
159
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPaginationComponent, decorators: [{
|
|
139
160
|
type: Component,
|
|
140
|
-
args: [{ selector: 'libs_ui-components-pagination', standalone: true, imports: [TranslateModule, LibsUiComponentsInputsInputComponent, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, providers: [TranslateProviderConfig], template: "<div class=\"flex flex-col items-center flex-wrap w-full justify-center {{ classIncludeContainer() ?? '' }}\">\n @let constHtmlDisplayTotalPageAndGotoPage = showTotalPage() || showInputGotoPage();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'top') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div class=\"flex shrink-0 h-full items-center\">\n @let constHtmlDisableButtonPre =
|
|
161
|
+
args: [{ selector: 'libs_ui-components-pagination', standalone: true, imports: [TranslateModule, LibsUiComponentsInputsInputComponent, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, providers: [TranslateProviderConfig], template: "<div class=\"flex flex-col items-center flex-wrap w-full justify-center {{ classIncludeContainer() ?? '' }}\">\n @let constHtmlDisplayTotalPageAndGotoPage = showTotalPage() || showInputGotoPage();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'top') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div class=\"flex shrink-0 h-full items-center\">\n @let constHtmlDisableButtonPre = currentPageComputed() <= 1 || totalPage() <= 1 || disable();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'left') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div\n class=\"libs-ui-components-pagination-button rotate-[180deg] pl-[14px] pr-[6px]\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonPre\"\n [class.pointer-events-none]=\"constHtmlDisableButtonPre\"\n (click)=\"prePage($event)\"\n (keydown.enter)=\"prePage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @for (item of listPageDisplay(); track item.key) {\n <div\n class=\"libs-ui-components-pagination-item libs-ui-font-h3m {{ classIncludeItem() ?? '' }}\"\n [class.libs-ui-components-pagination-active]=\"item.key === currentPageComputed() + ''\"\n [class.libs-ui-disable]=\"disable()\"\n [class.pointer-events-none]=\"disable()\"\n (click)=\"selectPage($event, item)\"\n (keydown.enter)=\"selectPage($event, item)\">\n {{ item.value }}\n </div>\n } @empty {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_no_data_yet' | translate }}\n </div>\n }\n\n @let constHtmlDisableButtonNext = currentPageComputed() >= totalPage() || disable();\n <div\n class=\"libs-ui-components-pagination-button pl-[14px] pr-[6p]x\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonNext\"\n [class.pointer-events-none]=\"constHtmlDisableButtonNext\"\n (click)=\"nextPage($event)\"\n (keydown.enter)=\"nextPage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'right') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'bottom') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n</div>\n\n<ng-template #gotoPageNumberRef>\n <div\n class=\"flex shrink-0 h-full items-center {{ classDisplayTotalPageAndGotoPage() ?? '' }}\"\n [class.mb-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'top'\"\n [class.mt-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'bottom'\">\n @if (showTotalPage()) {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px]\">\n {{ 'i18n_value_sum_page' | translate: { value: totalPage() } }}\n </div>\n }\n @if (showInputGotoPage()) {\n @if (showTotalPage()) {\n <div class=\"h-[16px] w-[1px] bg-[#CDD0D6]\"></div>\n }\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_go_to' | translate }}\n </div>\n <div class=\"w-[60px] mr-[12px] shrink-0\">\n <libs_ui-components-inputs-input\n [dataType]=\"'int'\"\n classInclude=\"!rounded-[6px]\"\n [maxValueNumber]=\"totalPage()\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [defaultHeight]=\"28\"\n [value]=\"gotoPageNumber() || ''\"\n (outChange)=\"changePage($event)\"\n (outEnterEvent)=\"handlerEnterInput()\"\n [disable]=\"disable() || totalPage() <= numberPageDisplay()\" />\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{width:100%}.libs-ui-components-pagination-item{color:#1c1f22;display:flex;flex-shrink:0;align-items:center;justify-content:center;padding:4px 12px;cursor:pointer}.libs-ui-components-pagination-item [class^=mo-svg-font]:before{color:#1c1f22;font-size:var(--mo-heading-4-size)!important}.libs-ui-components-pagination-item.libs-ui-components-pagination-active{color:var(--libs-ui-color-default)}.libs-ui-components-pagination-item.libs-ui-components-pagination-active [class^=mo-svg-font]:before{color:var(--libs-ui-color-default)}.libs-ui-components-pagination-button{cursor:pointer}\n"] }]
|
|
141
162
|
}], ctorParameters: () => [] });
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9zcmMvcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9zcmMvcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEksT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDeEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBWW5ELE1BQU0sT0FBTyxtQ0FBbUM7SUFDdEMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixlQUFlLEdBQUcsTUFBTSxDQUF3QyxFQUFFLENBQUMsQ0FBQztJQUNwRSxjQUFjLEdBQUcsTUFBTSxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUN2RCxTQUFTLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLGFBQWEs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QkFBZ0IsRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO3dHQWxKVSxtQ0FBbUM7NEZBQW5DLG1DQUFtQyx5MERBRm5DLENBQUMsdUJBQXVCLENBQUMsMEJDakJ0Qyx3bEhBZ0ZBLHVvQkRqRVksZUFBZSw0RkFBRSxvQ0FBb0Msd2hEQUFFLGdCQUFnQjs7NEZBSXRFLG1DQUFtQztrQkFWL0MsU0FBUzsrQkFFRSwrQkFBK0IsY0FHN0IsSUFBSSxXQUNQLENBQUMsZUFBZSxFQUFFLG9DQUFvQyxFQUFFLGdCQUFnQixDQUFDLG1CQUNqRSx1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDLENBQUMsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzSW5wdXRDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1pbnB1dCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVQcm92aWRlckNvbmZpZyB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLXRyYW5zbGF0ZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXBhZ2luYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5zY3NzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0lucHV0c0lucHV0Q29tcG9uZW50LCBOZ1RlbXBsYXRlT3V0bGV0XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1RyYW5zbGF0ZVByb3ZpZGVyQ29uZmlnXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1BhZ2luYXRpb25Db21wb25lbnQge1xuICBwcml2YXRlIGlzRW50ZXJTZWFyY2ggPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgbGlzdFBhZ2VEaXNwbGF5ID0gc2lnbmFsPEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4+KFtdKTtcbiAgcHJvdGVjdGVkIGdvdG9QYWdlTnVtYmVyID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIHRvdGFsUGFnZSA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uQ2hhbmdlVmFsdWUgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgcmVhZG9ubHkgc2hvd1RvdGFsUGFnZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHNob3dJbnB1dEdvdG9QYWdlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSA9IGlucHV0PCd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnPignYm90dG9tJyk7XG4gIHJlYWRvbmx5IGNsYXNzRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUNvbnRhaW5lciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlSXRlbSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG51bWJlclBhZ2VEaXNwbGF5ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDUsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8IDUgfSk7XG4gIHJlYWRvbmx5IHRvdGFsSXRlbXMgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IHBlclBhZ2UgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGN1cnJlbnRQYWdlID0gbW9kZWwucmVxdWlyZWQ8bnVtYmVyPigpO1xuXG4gIHJlYWRvbmx5IG91dFBhZ2VTZWxlY3QgPSBvdXRwdXQ8bnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIWlzTmlsKHRoaXMuY3VycmVudFBhZ2UoKSkgJiYgIWlzTmlsKHRoaXMudG90YWxJdGVtcygpKSAmJiAhaXNOaWwodGhpcy5wZXJQYWdlKCkpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJQYWdpbmF0aW9uKCk7XG4gICAgICAgICAgaWYgKHRoaXMudG90YWxQYWdlKCkgJiYgdGhpcy5jdXJyZW50UGFnZSgpID49IHRoaXMudG90YWxQYWdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlSW5wdXRTZWFyY2godGhpcy50b3RhbFBhZ2UoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm9uQ2hhbmdlVmFsdWUucGlwZShkZWJvdW5jZVRpbWUoMTUwMCksIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0VudGVyU2VhcmNoKCkpIHtcbiAgICAgICAgdGhpcy5pc0VudGVyU2VhcmNoLnNldChmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudFBhZ2Uuc2V0KHZhbHVlKTtcbiAgICAgIHRoaXMub3V0UGFnZVNlbGVjdC5lbWl0KHRoaXMuY3VycmVudFBhZ2UoKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclBhZ2luYXRpb24oKSB7XG4gICAgaWYgKHRoaXMucGVyUGFnZSgpID4gMCAmJiAhaXNOaWwodGhpcy50b3RhbEl0ZW1zKCkpKSB7XG4gICAgICB0aGlzLnRvdGFsUGFnZS5zZXQoTWF0aC5jZWlsKHRoaXMudG90YWxJdGVtcygpIC8gdGhpcy5wZXJQYWdlKCkpKTtcbiAgICB9XG4gICAgdGhpcy5saXN0UGFnZURpc3BsYXkuc2V0KFtdKTtcblxuICAgIGlmICh0aGlzLnRvdGFsUGFnZSgpIDw9IHRoaXMubnVtYmVyUGFnZURpc3BsYXkoKSkge1xuICAgICAgdGhpcy5saXN0UGFnZURpc3BsYXkuc2V0KFxuICAgICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLnRvdGFsUGFnZSgpIH0sIChfLCBpbmRleCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7IGtleTogYCR7aW5kZXggKyAxfWAsIHZhbHVlOiBgJHtpbmRleCArIDF9YCB9O1xuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlKCkgPCB0aGlzLm51bWJlclBhZ2VEaXNwbGF5KCkgLSAxKSB7XG4gICAgICB0aGlzLmxpc3RQYWdlRGlzcGxheS5zZXQoXG4gICAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMubnVtYmVyUGFnZURpc3BsYXkoKSB9LCAoXywgaW5kZXgpID0+IHtcbiAgICAgICAgICByZXR1cm4geyBrZXk6IGAke2luZGV4ICsgMX1gLCB2YWx1ZTogYCR7aW5kZXggKyAxfWAgfTtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlKCkgLSB0aGlzLm51bWJlclBhZ2VEaXNwbGF5KCkgLyAyO1xuICAgIGxldCBudW1iZXJQYWdlQmVmb3JlID0gc3RhcnRQYWdlIDwgMCA/IHRoaXMuY3VycmVudFBhZ2UoKSA6IHN0YXJ0UGFnZSA9PT0gMCA/IDAgOiB0aGlzLm51bWJlclBhZ2VEaXNwbGF5KCkgLyAyO1xuICAgIGNvbnN0IGdhcEFmZXIgPSB0aGlzLm51bWJlclBhZ2VEaXNwbGF5KCkgLSBudW1iZXJQYWdlQmVmb3JlO1xuICAgIGNvbnN0IGVuZFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlKCkgKyBnYXBBZmVyO1xuICAgIGNvbnN0IG51bWJlclBhZ2VBZnRlciA9IHRoaXMudG90YWxQYWdlKCkgPj0gZW5kUGFnZSA/IGdhcEFmZXIgOiB0aGlzLnRvdGFsUGFnZSgpIC0gdGhpcy5jdXJyZW50UGFnZSgpO1xuXG4gICAgaWYgKG51bWJlclBhZ2VCZWZvcmUgKyBudW1iZXJQYWdlQWZ0ZXIgPCB0aGlzLm51bWJlclBhZ2VEaXNwbGF5KCkpIHtcbiAgICAgIG51bWJlclBhZ2VCZWZvcmUgPSB0aGlzLm51bWJlclBhZ2VEaXNwbGF5KCkgLSBudW1iZXJQYWdlQWZ0ZXI7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJQYWdlQmVmb3JlOyBpKyspIHtcbiAgICAgIHRoaXMubGlzdFBhZ2VEaXNwbGF5LnVwZGF0ZSgobGlzdFBhZ2UpID0+IHtcbiAgICAgICAgbGlzdFBhZ2UudW5zaGlmdCh7IGtleTogYCR7dGhpcy5jdXJyZW50UGFnZSgpIC0gaX1gLCB2YWx1ZTogYCR7dGhpcy5jdXJyZW50UGFnZSgpIC0gaX1gIH0pO1xuXG4gICAgICAgIHJldHVybiBbLi4ubGlzdFBhZ2VdO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG51bWJlclBhZ2VBZnRlciA+PSAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBudW1iZXJQYWdlQWZ0ZXI7IGkrKykge1xuICAgICAgICB0aGlzLmxpc3RQYWdlRGlzcGxheS51cGRhdGUoKGxpc3RQYWdlKSA9PiB7XG4gICAgICAgICAgbGlzdFBhZ2UucHVzaCh7IGtleTogYCR7dGhpcy5jdXJyZW50UGFnZSgpICsgaX1gLCB2YWx1ZTogYCR7dGhpcy5jdXJyZW50UGFnZSgpICsgaX1gIH0pO1xuICAgICAgICAgIHJldHVybiBbLi4ubGlzdFBhZ2VdO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0UGFnZShlOiBFdmVudCwgaXRlbTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlLnNldCgraXRlbS5rZXkpO1xuICAgIHRoaXMub3V0UGFnZVNlbGVjdC5lbWl0KHRoaXMuY3VycmVudFBhZ2UoKSk7XG4gICAgdGhpcy5yZW5kZXJQYWdpbmF0aW9uKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV4dFBhZ2UoZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlKCkgPCB0aGlzLnRvdGFsUGFnZSgpKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLnVwZGF0ZSgoY3VycmVudFBhZ2UpID0+IGN1cnJlbnRQYWdlICsgMSk7XG4gICAgICB0aGlzLm91dFBhZ2VTZWxlY3QuZW1pdCh0aGlzLmN1cnJlbnRQYWdlKCkpO1xuICAgICAgdGhpcy5yZW5kZXJQYWdpbmF0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHByZVBhZ2UoZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlKCkgPiAxKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLnVwZGF0ZSgoY3VycmVudFBhZ2UpID0+IGN1cnJlbnRQYWdlIC0gMSk7XG4gICAgICB0aGlzLm91dFBhZ2VTZWxlY3QuZW1pdCh0aGlzLmN1cnJlbnRQYWdlKCkpO1xuICAgICAgdGhpcy5yZW5kZXJQYWdpbmF0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoYW5nZVBhZ2UodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHZhbHVlID0gdmFsdWUgYXMgbnVtYmVyO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuZ290b1BhZ2VOdW1iZXIuc2V0KHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZ290b1BhZ2VOdW1iZXIuc2V0KHZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlVmFsdWUubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckVudGVySW5wdXQoKSB7XG4gICAgaWYgKCF0aGlzLmdvdG9QYWdlTnVtYmVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0VudGVyU2VhcmNoLnNldCh0cnVlKTtcbiAgICB0aGlzLmNoYW5nZUlucHV0U2VhcmNoKHRoaXMuZ290b1BhZ2VOdW1iZXIoKSBhcyBudW1iZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VJbnB1dFNlYXJjaCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlID49IDEgJiYgdmFsdWUgPD0gdGhpcy50b3RhbFBhZ2UoKSAmJiB2YWx1ZSAhPT0gdGhpcy5jdXJyZW50UGFnZSgpKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLnNldCh2YWx1ZSk7XG4gICAgICB0aGlzLm91dFBhZ2VTZWxlY3QuZW1pdCh0aGlzLmN1cnJlbnRQYWdlKCkpO1xuICAgICAgdGhpcy5yZW5kZXJQYWdpbmF0aW9uKCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZmxleC13cmFwIHctZnVsbCBqdXN0aWZ5LWNlbnRlciB7eyBjbGFzc0luY2x1ZGVDb250YWluZXIoKSA/PyAnJyB9fVwiPlxuICBAbGV0IGNvbnN0SHRtbERpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSA9IHNob3dUb3RhbFBhZ2UoKSB8fCBzaG93SW5wdXRHb3RvUGFnZSgpO1xuICBAaWYgKGNvbnN0SHRtbERpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSAmJiBtb2RlRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlKCkgPT09ICd0b3AnKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdvdG9QYWdlTnVtYmVyUmVmXCIgLz5cbiAgfVxuICA8ZGl2IGNsYXNzPVwiZmxleCBzaHJpbmstMCBoLWZ1bGwgaXRlbXMtY2VudGVyXCI+XG4gICAgQGxldCBjb25zdEh0bWxEaXNhYmxlQnV0dG9uUHJlID0gY3VycmVudFBhZ2UoKSA8PSAxIHx8IHRvdGFsUGFnZSgpIDw9IDEgfHwgZGlzYWJsZSgpO1xuICAgIEBpZiAoY29uc3RIdG1sRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlICYmIG1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UoKSA9PT0gJ2xlZnQnKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ290b1BhZ2VOdW1iZXJSZWZcIiAvPlxuICAgIH1cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1wYWdpbmF0aW9uLWJ1dHRvbiByb3RhdGUtWzE4MGRlZ10gcGwtWzE0cHhdIHByLVs2cHhdXCJcbiAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGVdPVwiY29uc3RIdG1sRGlzYWJsZUJ1dHRvblByZVwiXG4gICAgICBbY2xhc3MucG9pbnRlci1ldmVudHMtbm9uZV09XCJjb25zdEh0bWxEaXNhYmxlQnV0dG9uUHJlXCJcbiAgICAgIChjbGljayk9XCJwcmVQYWdlKCRldmVudClcIj5cbiAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgbGlicy11aS1mb250LWgyclwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICBAZm9yIChpdGVtIG9mIGxpc3RQYWdlRGlzcGxheSgpOyB0cmFjayBpdGVtLmtleSkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1wYWdpbmF0aW9uLWl0ZW0gbGlicy11aS1mb250LWgzbSB7eyBjbGFzc0luY2x1ZGVJdGVtKCkgPz8gJycgfX1cIlxuICAgICAgICBbY2xhc3MubGlicy11aS1jb21wb25lbnRzLXBhZ2luYXRpb24tYWN0aXZlXT1cIml0ZW0ua2V5ID09PSBjdXJyZW50UGFnZSgpICsgJydcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cImRpc2FibGUoKVwiXG4gICAgICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1ub25lXT1cImRpc2FibGUoKVwiXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RQYWdlKCRldmVudCwgaXRlbSlcIj5cbiAgICAgICAge3sgaXRlbS52YWx1ZSB9fVxuICAgICAgPC9kaXY+XG4gICAgfSBAZW1wdHkge1xuICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNW0gdGV4dC1bIzlDQTJBRF0gbXgtWzEycHhdIGZsZXggc2hyaW5rLTBcIj5cbiAgICAgICAge3sgJ2kxOG5fbm9fZGF0YV95ZXQnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGxldCBjb25zdEh0bWxEaXNhYmxlQnV0dG9uTmV4dCA9IGN1cnJlbnRQYWdlKCkgPj0gdG90YWxQYWdlKCkgfHwgZGlzYWJsZSgpO1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibGlicy11aS1jb21wb25lbnRzLXBhZ2luYXRpb24tYnV0dG9uIHBsLVsxNHB4XSBwci1bNnBdeFwiXG4gICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cImNvbnN0SHRtbERpc2FibGVCdXR0b25OZXh0XCJcbiAgICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1ub25lXT1cImNvbnN0SHRtbERpc2FibGVCdXR0b25OZXh0XCJcbiAgICAgIChjbGljayk9XCJuZXh0UGFnZSgkZXZlbnQpXCI+XG4gICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IGxpYnMtdWktZm9udC1oMnJcIj48L2k+XG4gICAgPC9kaXY+XG4gICAgQGlmIChjb25zdEh0bWxEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UgJiYgbW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSgpID09PSAncmlnaHQnKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ290b1BhZ2VOdW1iZXJSZWZcIiAvPlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoY29uc3RIdG1sRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlICYmIG1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UoKSA9PT0gJ2JvdHRvbScpIHtcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ290b1BhZ2VOdW1iZXJSZWZcIiAvPlxuICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNnb3RvUGFnZU51bWJlclJlZj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZmxleCBzaHJpbmstMCBoLWZ1bGwgaXRlbXMtY2VudGVyIHt7IGNsYXNzRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlKCkgPz8gJycgfX1cIlxuICAgIFtjbGFzcy5tYi1bMTZweF1dPVwibW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSgpID09PSAndG9wJ1wiXG4gICAgW2NsYXNzLm10LVsxNnB4XV09XCJtb2RlRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlKCkgPT09ICdib3R0b20nXCI+XG4gICAgQGlmIChzaG93VG90YWxQYWdlKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVtIHRleHQtWyM5Q0EyQURdIG14LVsxMnB4XVwiPlxuICAgICAgICB7eyAnaTE4bl92YWx1ZV9zdW1fcGFnZScgfCB0cmFuc2xhdGU6IHsgdmFsdWU6IHRvdGFsUGFnZSgpIH0gfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKHNob3dJbnB1dEdvdG9QYWdlKCkpIHtcbiAgICAgIEBpZiAoc2hvd1RvdGFsUGFnZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoLVsxNnB4XSB3LVsxcHhdIGJnLVsjQ0REMEQ2XVwiPjwvZGl2PlxuICAgICAgfVxuICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNW0gdGV4dC1bIzlDQTJBRF0gbXgtWzEycHhdIGZsZXggc2hyaW5rLTBcIj5cbiAgICAgICAge3sgJ2kxOG5fZ29fdG8nIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LVs2MHB4XSBtci1bMTJweF0gc2hyaW5rLTBcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcbiAgICAgICAgICBbZGF0YVR5cGVdPVwiJ2ludCdcIlxuICAgICAgICAgIGNsYXNzSW5jbHVkZT1cIiFyb3VuZGVkLVs2cHhdXCJcbiAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwidG90YWxQYWdlKClcIlxuICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgIFtkZWZhdWx0SGVpZ2h0XT1cIjI4XCJcbiAgICAgICAgICBbdmFsdWVdPVwiZ290b1BhZ2VOdW1iZXIoKSB8fCAnJ1wiXG4gICAgICAgICAgKG91dENoYW5nZSk9XCJjaGFuZ2VQYWdlKCRldmVudClcIlxuICAgICAgICAgIChvdXRFbnRlckV2ZW50KT1cImhhbmRsZXJFbnRlcklucHV0KClcIlxuICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCB0b3RhbFBhZ2UoKSA8PSA1XCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9zcmMvcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9zcmMvcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFKLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQWE3QyxNQUFNLE9BQU8sbUNBQW1DO0lBQzdCLGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLGVBQWUsR0FBRyxNQUFNLENBQXdDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLGNBQWMsR0FBRyxNQUFNLENBQXFCLFNBQVMsQ0FBQyxD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SSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlHLENBQUM7d0dBM0tVLG1DQUFtQzs0RkFBbkMsbUNBQW1DLDgrREFGbkMsQ0FBQyx1QkFBdUIsQ0FBQywwQkNsQnRDLGl4SEFvRkEsdW9CRHBFWSxlQUFlLDRGQUFFLG9DQUFvQyx3aERBQUUsZ0JBQWdCOzs0RkFJdEUsbUNBQW1DO2tCQVYvQyxTQUFTOytCQUVFLCtCQUErQixjQUc3QixJQUFJLFdBQ1AsQ0FBQyxlQUFlLEVBQUUsb0NBQW9DLEVBQUUsZ0JBQWdCLENBQUMsbUJBQ2pFLHVCQUF1QixDQUFDLE1BQU0sYUFDcEMsQ0FBQyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIERlc3Ryb3lSZWYsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgbW9kZWwsIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0lucHV0c0lucHV0Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtaW5wdXQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUHJvdmlkZXJDb25maWcgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy10cmFuc2xhdGUnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSVBhZ2luYXRpb25GdW5jdGlvbnNDb250cm9sIH0gZnJvbSAnLi9wYWdpbmF0aW9uLnR5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtcGFnaW5hdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50LnNjc3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLCBMaWJzVWlDb21wb25lbnRzSW5wdXRzSW5wdXRDb21wb25lbnQsIE5nVGVtcGxhdGVPdXRsZXRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbVHJhbnNsYXRlUHJvdmlkZXJDb25maWddLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUGFnaW5hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFrZUV2ZW50SHRtbCA9IG5ldyBFdmVudCgnY2xpY2snKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc0VudGVyU2VhcmNoID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxpc3RQYWdlRGlzcGxheSA9IHNpZ25hbDxBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+PihbXSk7XG4gIHByb3RlY3RlZCBnb3RvUGFnZU51bWJlciA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCB0b3RhbFBhZ2UgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZVZhbHVlID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gIHJlYWRvbmx5IHNob3dUb3RhbFBhZ2UgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBzaG93SW5wdXRHb3RvUGFnZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UgPSBpbnB1dDwndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0Jz4oJ2JvdHRvbScpO1xuICByZWFkb25seSBjbGFzc0Rpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSA9IGlucHV0PHN0cmluZz4oKTtcblxuICByZWFkb25seSBjbGFzc0luY2x1ZGVDb250YWluZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUl0ZW0gPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBudW1iZXJQYWdlRGlzcGxheSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPig1LCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSB8fCA1IH0pO1xuICByZWFkb25seSB0b3RhbEl0ZW1zID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyPigpO1xuICByZWFkb25seSBwZXJQYWdlID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyPigpO1xuICByZWFkb25seSBmaXJzdFBhZ2VTdGFydE51bWJlciA9IGlucHV0PG51bWJlciwgMCB8IDEgfCB1bmRlZmluZWQ+KDEsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IDEgfSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRQYWdlID0gbW9kZWwucmVxdWlyZWQ8bnVtYmVyPigpO1xuICByZWFkb25seSBjdXJyZW50UGFnZUNvbXB1dGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdXJyZW50UGFnZSgpICsgKHRoaXMuZmlyc3RQYWdlU3RhcnROdW1iZXIoKSA9PT0gMSA/IDAgOiAxKSk7XG4gIHJlYWRvbmx5IG91dFBhZ2VTZWxlY3QgPSBvdXRwdXQ8bnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGxldCB0b3RhbEl0ZW1zID0gMDtcbiAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICggIWlzTmlsKHRoaXMudG90YWxJdGVtcygpKXx8IHRvdGFsSXRlbXMgIT09IHRoaXMudG90YWxJdGVtcygpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgdG90YWxJdGVtcyA9IHRoaXMudG90YWxJdGVtcygpO1xuICAgICAgICAgIHRoaXMucmVuZGVyUGFnaW5hdGlvbigpO1xuICAgICAgICAgIGlmICh0aGlzLnRvdGFsUGFnZSgpICYmIHRoaXMuY3VycmVudFBhZ2VDb21wdXRlZCgpID49IHRoaXMudG90YWxQYWdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0UGFnZSh0aGlzLmZha2VFdmVudEh0bWwsIHsga2V5OiBgJHt0aGlzLnRvdGFsUGFnZSgpfWAsIHZhbHVlOiBgJHt0aGlzLnRvdGFsUGFnZSgpfWAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm9uQ2hhbmdlVmFsdWUucGlwZShkZWJvdW5jZVRpbWUoMTUwMCksIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0VudGVyU2VhcmNoKCkgfHwgK3ZhbHVlID09PSB0aGlzLmN1cnJlbnRQYWdlQ29tcHV0ZWQoKSkge1xuICAgICAgICB0aGlzLmlzRW50ZXJTZWFyY2guc2V0KGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RQYWdlKHRoaXMuZmFrZUV2ZW50SHRtbCwgeyBrZXk6IGAke3ZhbHVlfWAsIHZhbHVlOiBgJHt2YWx1ZX1gIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCFpc05pbCh0aGlzLmN1cnJlbnRQYWdlKCkpICYmICFpc05pbCh0aGlzLnRvdGFsSXRlbXMoKSkgJiYgIWlzTmlsKHRoaXMucGVyUGFnZSgpKSkge1xuICAgICAgdGhpcy5yZW5kZXJQYWdpbmF0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElQYWdpbmF0aW9uRnVuY3Rpb25zQ29udHJvbCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5nZVBhZ2U6YXN5bmMgKHZhbHVlPzpudW1iZXIpPT4ge1xuICAgICAgaWYoIWlzTmlsKHZhbHVlKSl7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hhbmdlUGFnZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuY2hhbmdlUGFnZSh0aGlzLmN1cnJlbnRQYWdlQ29tcHV0ZWQoKSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyUGFnaW5hdGlvbigpIHtcbiAgICBpZiAodGhpcy5wZXJQYWdlKCkgPiAwICYmICFpc05pbCh0aGlzLnRvdGFsSXRlbXMoKSkpIHtcbiAgICAgIHRoaXMudG90YWxQYWdlLnNldChNYXRoLmNlaWwodGhpcy50b3RhbEl0ZW1zKCkgLyB0aGlzLnBlclBhZ2UoKSkpO1xuICAgIH1cbiAgICB0aGlzLmxpc3RQYWdlRGlzcGxheS5zZXQoW10pO1xuXG4gICAgaWYgKHRoaXMudG90YWxQYWdlKCkgPD0gdGhpcy5udW1iZXJQYWdlRGlzcGxheSgpKSB7XG4gICAgICB0aGlzLmxpc3RQYWdlRGlzcGxheS5zZXQoXG4gICAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMudG90YWxQYWdlKCkgfSwgKF8sIGluZGV4KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsga2V5OiBgJHtpbmRleCArIDF9YCwgdmFsdWU6IGAke2luZGV4ICsgMX1gIH07XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VDb21wdXRlZCgpIDwgdGhpcy5udW1iZXJQYWdlRGlzcGxheSgpIC0gMSkge1xuICAgICAgdGhpcy5saXN0UGFnZURpc3BsYXkuc2V0KFxuICAgICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLm51bWJlclBhZ2VEaXNwbGF5KCkgfSwgKF8sIGluZGV4KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsga2V5OiBgJHtpbmRleCArIDF9YCwgdmFsdWU6IGAke2luZGV4ICsgMX1gIH07XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRQYWdlID0gdGhpcy5jdXJyZW50UGFnZUNvbXB1dGVkKCkgLSB0aGlzLm51bWJlclBhZ2VEaXNwbGF5KCkgLyAyO1xuICAgIGxldCBudW1iZXJQYWdlQmVmb3JlID0gW1xuICAgICAgdGhpcy5jdXJyZW50UGFnZUNvbXB1dGVkKCksXG4gICAgICAwLFxuICAgICAgdGhpcy5udW1iZXJQYWdlRGlzcGxheSgpIC8gMixcbiAgICBdW01hdGguc2lnbihzdGFydFBhZ2UpICsgMV07XG4gICAgY29uc3QgZ2FwQWZ0ZXIgPSB0aGlzLm51bWJlclBhZ2VEaXNwbGF5KCkgLSBudW1iZXJQYWdlQmVmb3JlO1xuICAgIGNvbnN0IGVuZFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlQ29tcHV0ZWQoKSArIGdhcEFmdGVyO1xuICAgIGNvbnN0IG51bWJlclBhZ2VBZnRlciA9IHRoaXMudG90YWxQYWdlKCkgPj0gZW5kUGFnZSA/IGdhcEFmdGVyIDogdGhpcy50b3RhbFBhZ2UoKSAtIHRoaXMuY3VycmVudFBhZ2VDb21wdXRlZCgpO1xuXG4gICAgaWYgKG51bWJlclBhZ2VCZWZvcmUgKyBudW1iZXJQYWdlQWZ0ZXIgPCB0aGlzLm51bWJlclBhZ2VEaXNwbGF5KCkpIHtcbiAgICAgIG51bWJlclBhZ2VCZWZvcmUgPSB0aGlzLm51bWJlclBhZ2VEaXNwbGF5KCkgLSBudW1iZXJQYWdlQWZ0ZXI7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJQYWdlQmVmb3JlOyBpKyspIHtcbiAgICAgIHRoaXMubGlzdFBhZ2VEaXNwbGF5LnVwZGF0ZSgobGlzdFBhZ2UpID0+IHtcbiAgICAgICAgbGlzdFBhZ2UudW5zaGlmdCh7IGtleTogYCR7dGhpcy5jdXJyZW50UGFnZUNvbXB1dGVkKCkgLSBpfWAsIHZhbHVlOiBgJHt0aGlzLmN1cnJlbnRQYWdlQ29tcHV0ZWQoKSAtIGl9YCB9KTtcblxuICAgICAgICByZXR1cm4gWy4uLmxpc3RQYWdlXTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChudW1iZXJQYWdlQWZ0ZXIgPj0gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbnVtYmVyUGFnZUFmdGVyOyBpKyspIHtcbiAgICAgICAgdGhpcy5saXN0UGFnZURpc3BsYXkudXBkYXRlKChsaXN0UGFnZSkgPT4ge1xuICAgICAgICAgIGxpc3RQYWdlLnB1c2goeyBrZXk6IGAke3RoaXMuY3VycmVudFBhZ2VDb21wdXRlZCgpICsgaX1gLCB2YWx1ZTogYCR7dGhpcy5jdXJyZW50UGFnZUNvbXB1dGVkKCkgKyBpfWAgfSk7XG4gICAgICAgICAgcmV0dXJuIFsuLi5saXN0UGFnZV07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZWxlY3RQYWdlKGU6IEV2ZW50LCBpdGVtOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IHBhZ2VTZWxlY3QgPSAraXRlbS5rZXkgLSAodGhpcy5maXJzdFBhZ2VTdGFydE51bWJlcigpID09PSAwID8gMSA6IDApO1xuXG4gICBcbiAgICBpZiAocGFnZVNlbGVjdCA9PT0gdGhpcy5jdXJyZW50UGFnZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50UGFnZS5zZXQocGFnZVNlbGVjdCk7XG4gICAgdGhpcy5vdXRQYWdlU2VsZWN0LmVtaXQodGhpcy5jdXJyZW50UGFnZSgpKTtcbiAgICB0aGlzLnJlbmRlclBhZ2luYXRpb24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXh0UGFnZShlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VDb21wdXRlZCgpIDwgdGhpcy50b3RhbFBhZ2UoKSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZS51cGRhdGUoKGN1cnJlbnRQYWdlKSA9PiBjdXJyZW50UGFnZSArIDEpO1xuICAgICAgdGhpcy5vdXRQYWdlU2VsZWN0LmVtaXQodGhpcy5jdXJyZW50UGFnZSgpKTtcbiAgICAgIHRoaXMucmVuZGVyUGFnaW5hdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVQYWdlKGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZUNvbXB1dGVkKCkgPiAxKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLnVwZGF0ZSgoY3VycmVudFBhZ2UpID0+IGN1cnJlbnRQYWdlIC0gMSk7XG4gICAgICB0aGlzLm91dFBhZ2VTZWxlY3QuZW1pdCh0aGlzLmN1cnJlbnRQYWdlKCkpO1xuICAgICAgdGhpcy5yZW5kZXJQYWdpbmF0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNoYW5nZVBhZ2UodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHZhbHVlID0gdmFsdWUgYXMgbnVtYmVyO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuZ290b1BhZ2VOdW1iZXIuc2V0KHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZ290b1BhZ2VOdW1iZXIuc2V0KHZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlVmFsdWUubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckVudGVySW5wdXQoKSB7XG4gICAgaWYgKGlzTmlsKHRoaXMuZ290b1BhZ2VOdW1iZXIoKSkgfHwgdGhpcy5nb3RvUGFnZU51bWJlcigpID09PSB0aGlzLmN1cnJlbnRQYWdlQ29tcHV0ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNFbnRlclNlYXJjaC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5zZWxlY3RQYWdlKHRoaXMuZmFrZUV2ZW50SHRtbCwgeyBrZXk6IGAke3RoaXMuZ290b1BhZ2VOdW1iZXIoKX1gLCB2YWx1ZTogYCR7dGhpcy5nb3RvUGFnZU51bWJlcigpfWAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgdy1mdWxsIGp1c3RpZnktY2VudGVyIHt7IGNsYXNzSW5jbHVkZUNvbnRhaW5lcigpID8/ICcnIH19XCI+XG4gIEBsZXQgY29uc3RIdG1sRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlID0gc2hvd1RvdGFsUGFnZSgpIHx8IHNob3dJbnB1dEdvdG9QYWdlKCk7XG4gIEBpZiAoY29uc3RIdG1sRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlICYmIG1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UoKSA9PT0gJ3RvcCcpIHtcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ290b1BhZ2VOdW1iZXJSZWZcIiAvPlxuICB9XG4gIDxkaXYgY2xhc3M9XCJmbGV4IHNocmluay0wIGgtZnVsbCBpdGVtcy1jZW50ZXJcIj5cbiAgICBAbGV0IGNvbnN0SHRtbERpc2FibGVCdXR0b25QcmUgPSBjdXJyZW50UGFnZUNvbXB1dGVkKCkgPD0gMSB8fCB0b3RhbFBhZ2UoKSA8PSAxIHx8IGRpc2FibGUoKTtcbiAgICBAaWYgKGNvbnN0SHRtbERpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSAmJiBtb2RlRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlKCkgPT09ICdsZWZ0Jykge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdvdG9QYWdlTnVtYmVyUmVmXCIgLz5cbiAgICB9XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtcGFnaW5hdGlvbi1idXR0b24gcm90YXRlLVsxODBkZWddIHBsLVsxNHB4XSBwci1bNnB4XVwiXG4gICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cImNvbnN0SHRtbERpc2FibGVCdXR0b25QcmVcIlxuICAgICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwiY29uc3RIdG1sRGlzYWJsZUJ1dHRvblByZVwiXG4gICAgICAoY2xpY2spPVwicHJlUGFnZSgkZXZlbnQpXCJcbiAgICAgIChrZXlkb3duLmVudGVyKT1cInByZVBhZ2UoJGV2ZW50KVwiPlxuICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCBsaWJzLXVpLWZvbnQtaDJyXCI+PC9pPlxuICAgIDwvZGl2PlxuICAgIEBmb3IgKGl0ZW0gb2YgbGlzdFBhZ2VEaXNwbGF5KCk7IHRyYWNrIGl0ZW0ua2V5KSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibGlicy11aS1jb21wb25lbnRzLXBhZ2luYXRpb24taXRlbSBsaWJzLXVpLWZvbnQtaDNtIHt7IGNsYXNzSW5jbHVkZUl0ZW0oKSA/PyAnJyB9fVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWNvbXBvbmVudHMtcGFnaW5hdGlvbi1hY3RpdmVdPVwiaXRlbS5rZXkgPT09IGN1cnJlbnRQYWdlQ29tcHV0ZWQoKSArICcnXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktZGlzYWJsZV09XCJkaXNhYmxlKClcIlxuICAgICAgICBbY2xhc3MucG9pbnRlci1ldmVudHMtbm9uZV09XCJkaXNhYmxlKClcIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0UGFnZSgkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2VsZWN0UGFnZSgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgIHt7IGl0ZW0udmFsdWUgfX1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVtcHR5IHtcbiAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVtIHRleHQtWyM5Q0EyQURdIG14LVsxMnB4XSBmbGV4IHNocmluay0wXCI+XG4gICAgICAgIHt7ICdpMThuX25vX2RhdGFfeWV0JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGxldCBjb25zdEh0bWxEaXNhYmxlQnV0dG9uTmV4dCA9IGN1cnJlbnRQYWdlQ29tcHV0ZWQoKSA+PSB0b3RhbFBhZ2UoKSB8fCBkaXNhYmxlKCk7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtcGFnaW5hdGlvbi1idXR0b24gcGwtWzE0cHhdIHByLVs2cF14XCJcbiAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGVdPVwiY29uc3RIdG1sRGlzYWJsZUJ1dHRvbk5leHRcIlxuICAgICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwiY29uc3RIdG1sRGlzYWJsZUJ1dHRvbk5leHRcIlxuICAgICAgKGNsaWNrKT1cIm5leHRQYWdlKCRldmVudClcIlxuICAgICAgKGtleWRvd24uZW50ZXIpPVwibmV4dFBhZ2UoJGV2ZW50KVwiPlxuICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCBsaWJzLXVpLWZvbnQtaDJyXCI+PC9pPlxuICAgIDwvZGl2PlxuICAgIEBpZiAoY29uc3RIdG1sRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlICYmIG1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UoKSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdvdG9QYWdlTnVtYmVyUmVmXCIgLz5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKGNvbnN0SHRtbERpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSAmJiBtb2RlRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlKCkgPT09ICdib3R0b20nKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdvdG9QYWdlTnVtYmVyUmVmXCIgLz5cbiAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZ290b1BhZ2VOdW1iZXJSZWY+XG4gIDxkaXZcbiAgICBjbGFzcz1cImZsZXggc2hyaW5rLTAgaC1mdWxsIGl0ZW1zLWNlbnRlciB7eyBjbGFzc0Rpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSgpID8/ICcnIH19XCJcbiAgICBbY2xhc3MubWItWzE2cHhdXT1cIm1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UoKSA9PT0gJ3RvcCdcIlxuICAgIFtjbGFzcy5tdC1bMTZweF1dPVwibW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZSgpID09PSAnYm90dG9tJ1wiPlxuICAgIEBpZiAoc2hvd1RvdGFsUGFnZSgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg1bSB0ZXh0LVsjOUNBMkFEXSBteC1bMTJweF1cIj5cbiAgICAgICAge3sgJ2kxOG5fdmFsdWVfc3VtX3BhZ2UnIHwgdHJhbnNsYXRlOiB7IHZhbHVlOiB0b3RhbFBhZ2UoKSB9IH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChzaG93SW5wdXRHb3RvUGFnZSgpKSB7XG4gICAgICBAaWYgKHNob3dUb3RhbFBhZ2UoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiaC1bMTZweF0gdy1bMXB4XSBiZy1bI0NERDBENl1cIj48L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVtIHRleHQtWyM5Q0EyQURdIG14LVsxMnB4XSBmbGV4IHNocmluay0wXCI+XG4gICAgICAgIHt7ICdpMThuX2dvX3RvJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidy1bNjBweF0gbXItWzEycHhdIHNocmluay0wXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLWlucHV0XG4gICAgICAgICAgW2RhdGFUeXBlXT1cIidpbnQnXCJcbiAgICAgICAgICBjbGFzc0luY2x1ZGU9XCIhcm91bmRlZC1bNnB4XVwiXG4gICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cInRvdGFsUGFnZSgpXCJcbiAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICBbZGVmYXVsdEhlaWdodF09XCIyOFwiXG4gICAgICAgICAgW3ZhbHVlXT1cImdvdG9QYWdlTnVtYmVyKCkgfHwgJydcIlxuICAgICAgICAgIChvdXRDaGFuZ2UpPVwiY2hhbmdlUGFnZSgkZXZlbnQpXCJcbiAgICAgICAgICAob3V0RW50ZXJFdmVudCk9XCJoYW5kbGVyRW50ZXJJbnB1dCgpXCJcbiAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgdG90YWxQYWdlKCkgPD0gbnVtYmVyUGFnZURpc3BsYXkoKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi50eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3BhZ2luYXRpb24vc3JjL3BhZ2luYXRpb24udHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgSVBhZ2luYXRpb25Db25maWcgPSB7XG4gIHBvc2l0aW9uPzogJ3RvcCcgfCAnYm90dG9tJztcbiAgY2xhc3NJbmNsdWRlQ29udGFpbmVyPzogc3RyaW5nO1xuICBjbGFzc0luY2x1ZGVJdGVtPzogc3RyaW5nO1xuICBkaXNhYmxlPzogYm9vbGVhbjtcbiAgbnVtYmVyUGFnZURpc3BsYXk/OiBudW1iZXI7XG4gIHNob3dUb3RhbFBhZ2U/OiBib29sZWFuO1xuICBmaXJzdFBhZ2VTdGFydE51bWJlcj86IDAgfCAxO1xuICBzaG93SW5wdXRHb3RvUGFnZT86IGJvb2xlYW47XG4gIG1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2U/OiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JztcbiAgY2xhc3NEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2U/OiBzdHJpbmc7XG4gIHBlclBhZ2U/OiBudW1iZXI7XG4gIHRvdGFsSXRlbXM/OiBudW1iZXI7XG4gIGN1cnJlbnRQYWdlPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJUGFnaW5hdGlvbkZ1bmN0aW9uc0NvbnRyb2wge1xuICBjaGFuZ2VQYWdlOiAocGFnZT86IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPjtcbn1cbiJdfQ==
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
1
2
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, input, model, output, inject, DestroyRef, effect, untracked,
|
|
3
|
+
import { signal, input, model, computed, output, inject, DestroyRef, effect, untracked, Component, ChangeDetectionStrategy } from '@angular/core';
|
|
3
4
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
5
|
import { LibsUiComponentsInputsInputComponent } from '@libs-ui/components-inputs-input';
|
|
5
6
|
import { TranslateProviderConfig } from '@libs-ui/services-translate';
|
|
7
|
+
import { isNil } from '@libs-ui/utils';
|
|
6
8
|
import * as i1 from '@ngx-translate/core';
|
|
7
9
|
import { TranslateModule } from '@ngx-translate/core';
|
|
8
10
|
import { Subject, debounceTime } from 'rxjs';
|
|
9
|
-
import { isNil } from '@libs-ui/utils';
|
|
10
|
-
import { NgTemplateOutlet } from '@angular/common';
|
|
11
11
|
|
|
12
12
|
class LibsUiComponentsPaginationComponent {
|
|
13
|
+
fakeEventHtml = new Event('click');
|
|
13
14
|
isEnterSearch = signal(false);
|
|
14
15
|
listPageDisplay = signal([]);
|
|
15
16
|
gotoPageNumber = signal(undefined);
|
|
@@ -25,29 +26,48 @@ class LibsUiComponentsPaginationComponent {
|
|
|
25
26
|
numberPageDisplay = input(5, { transform: (value) => value || 5 });
|
|
26
27
|
totalItems = input.required();
|
|
27
28
|
perPage = input.required();
|
|
29
|
+
firstPageStartNumber = input(1, { transform: (value) => value ?? 1 });
|
|
28
30
|
currentPage = model.required();
|
|
31
|
+
currentPageComputed = computed(() => this.currentPage() + (this.firstPageStartNumber() === 1 ? 0 : 1));
|
|
29
32
|
outPageSelect = output();
|
|
30
33
|
destroyRef = inject(DestroyRef);
|
|
31
34
|
constructor() {
|
|
35
|
+
let totalItems = 0;
|
|
32
36
|
effect(() => {
|
|
33
|
-
if (!isNil(this.
|
|
37
|
+
if (!isNil(this.totalItems()) || totalItems !== this.totalItems()) {
|
|
34
38
|
untracked(() => {
|
|
39
|
+
totalItems = this.totalItems();
|
|
35
40
|
this.renderPagination();
|
|
36
|
-
if (this.totalPage() && this.
|
|
37
|
-
this.
|
|
41
|
+
if (this.totalPage() && this.currentPageComputed() >= this.totalPage()) {
|
|
42
|
+
this.selectPage(this.fakeEventHtml, { key: `${this.totalPage()}`, value: `${this.totalPage()}` });
|
|
38
43
|
}
|
|
39
44
|
});
|
|
40
45
|
}
|
|
41
46
|
});
|
|
42
47
|
this.onChangeValue.pipe(debounceTime(1500), takeUntilDestroyed(this.destroyRef)).subscribe((value) => {
|
|
43
|
-
if (this.isEnterSearch()) {
|
|
48
|
+
if (this.isEnterSearch() || +value === this.currentPageComputed()) {
|
|
44
49
|
this.isEnterSearch.set(false);
|
|
45
50
|
return;
|
|
46
51
|
}
|
|
47
|
-
this.
|
|
48
|
-
this.outPageSelect.emit(this.currentPage());
|
|
52
|
+
this.selectPage(this.fakeEventHtml, { key: `${value}`, value: `${value}` });
|
|
49
53
|
});
|
|
50
54
|
}
|
|
55
|
+
ngOnInit() {
|
|
56
|
+
if (!isNil(this.currentPage()) && !isNil(this.totalItems()) && !isNil(this.perPage())) {
|
|
57
|
+
this.renderPagination();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
get FunctionsControl() {
|
|
61
|
+
return {
|
|
62
|
+
changePage: async (value) => {
|
|
63
|
+
if (!isNil(value)) {
|
|
64
|
+
await this.changePage(value);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
await this.changePage(this.currentPageComputed());
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
51
71
|
renderPagination() {
|
|
52
72
|
if (this.perPage() > 0 && !isNil(this.totalItems())) {
|
|
53
73
|
this.totalPage.set(Math.ceil(this.totalItems() / this.perPage()));
|
|
@@ -59,30 +79,34 @@ class LibsUiComponentsPaginationComponent {
|
|
|
59
79
|
}));
|
|
60
80
|
return;
|
|
61
81
|
}
|
|
62
|
-
if (this.
|
|
82
|
+
if (this.currentPageComputed() < this.numberPageDisplay() - 1) {
|
|
63
83
|
this.listPageDisplay.set(Array.from({ length: this.numberPageDisplay() }, (_, index) => {
|
|
64
84
|
return { key: `${index + 1}`, value: `${index + 1}` };
|
|
65
85
|
}));
|
|
66
86
|
return;
|
|
67
87
|
}
|
|
68
|
-
const startPage = this.
|
|
69
|
-
let numberPageBefore =
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
88
|
+
const startPage = this.currentPageComputed() - this.numberPageDisplay() / 2;
|
|
89
|
+
let numberPageBefore = [
|
|
90
|
+
this.currentPageComputed(),
|
|
91
|
+
0,
|
|
92
|
+
this.numberPageDisplay() / 2,
|
|
93
|
+
][Math.sign(startPage) + 1];
|
|
94
|
+
const gapAfter = this.numberPageDisplay() - numberPageBefore;
|
|
95
|
+
const endPage = this.currentPageComputed() + gapAfter;
|
|
96
|
+
const numberPageAfter = this.totalPage() >= endPage ? gapAfter : this.totalPage() - this.currentPageComputed();
|
|
73
97
|
if (numberPageBefore + numberPageAfter < this.numberPageDisplay()) {
|
|
74
98
|
numberPageBefore = this.numberPageDisplay() - numberPageAfter;
|
|
75
99
|
}
|
|
76
100
|
for (let i = 0; i < numberPageBefore; i++) {
|
|
77
101
|
this.listPageDisplay.update((listPage) => {
|
|
78
|
-
listPage.unshift({ key: `${this.
|
|
102
|
+
listPage.unshift({ key: `${this.currentPageComputed() - i}`, value: `${this.currentPageComputed() - i}` });
|
|
79
103
|
return [...listPage];
|
|
80
104
|
});
|
|
81
105
|
}
|
|
82
106
|
if (numberPageAfter >= 0) {
|
|
83
107
|
for (let i = 1; i <= numberPageAfter; i++) {
|
|
84
108
|
this.listPageDisplay.update((listPage) => {
|
|
85
|
-
listPage.push({ key: `${this.
|
|
109
|
+
listPage.push({ key: `${this.currentPageComputed() + i}`, value: `${this.currentPageComputed() + i}` });
|
|
86
110
|
return [...listPage];
|
|
87
111
|
});
|
|
88
112
|
}
|
|
@@ -90,13 +114,17 @@ class LibsUiComponentsPaginationComponent {
|
|
|
90
114
|
}
|
|
91
115
|
selectPage(e, item) {
|
|
92
116
|
e.stopPropagation();
|
|
93
|
-
|
|
117
|
+
const pageSelect = +item.key - (this.firstPageStartNumber() === 0 ? 1 : 0);
|
|
118
|
+
if (pageSelect === this.currentPage()) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.currentPage.set(pageSelect);
|
|
94
122
|
this.outPageSelect.emit(this.currentPage());
|
|
95
123
|
this.renderPagination();
|
|
96
124
|
}
|
|
97
125
|
nextPage(e) {
|
|
98
126
|
e.stopPropagation();
|
|
99
|
-
if (this.
|
|
127
|
+
if (this.currentPageComputed() < this.totalPage()) {
|
|
100
128
|
this.currentPage.update((currentPage) => currentPage + 1);
|
|
101
129
|
this.outPageSelect.emit(this.currentPage());
|
|
102
130
|
this.renderPagination();
|
|
@@ -104,13 +132,13 @@ class LibsUiComponentsPaginationComponent {
|
|
|
104
132
|
}
|
|
105
133
|
prePage(e) {
|
|
106
134
|
e.stopPropagation();
|
|
107
|
-
if (this.
|
|
135
|
+
if (this.currentPageComputed() > 1) {
|
|
108
136
|
this.currentPage.update((currentPage) => currentPage - 1);
|
|
109
137
|
this.outPageSelect.emit(this.currentPage());
|
|
110
138
|
this.renderPagination();
|
|
111
139
|
}
|
|
112
140
|
}
|
|
113
|
-
changePage(value) {
|
|
141
|
+
async changePage(value) {
|
|
114
142
|
value = value;
|
|
115
143
|
if (!value) {
|
|
116
144
|
this.gotoPageNumber.set(undefined);
|
|
@@ -120,25 +148,18 @@ class LibsUiComponentsPaginationComponent {
|
|
|
120
148
|
this.onChangeValue.next(value);
|
|
121
149
|
}
|
|
122
150
|
handlerEnterInput() {
|
|
123
|
-
if (
|
|
151
|
+
if (isNil(this.gotoPageNumber()) || this.gotoPageNumber() === this.currentPageComputed()) {
|
|
124
152
|
return;
|
|
125
153
|
}
|
|
126
154
|
this.isEnterSearch.set(true);
|
|
127
|
-
this.
|
|
128
|
-
}
|
|
129
|
-
changeInputSearch(value) {
|
|
130
|
-
if (value >= 1 && value <= this.totalPage() && value !== this.currentPage()) {
|
|
131
|
-
this.currentPage.set(value);
|
|
132
|
-
this.outPageSelect.emit(this.currentPage());
|
|
133
|
-
this.renderPagination();
|
|
134
|
-
}
|
|
155
|
+
this.selectPage(this.fakeEventHtml, { key: `${this.gotoPageNumber()}`, value: `${this.gotoPageNumber()}` });
|
|
135
156
|
}
|
|
136
157
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
137
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPaginationComponent, isStandalone: true, selector: "libs_ui-components-pagination", inputs: { showTotalPage: { classPropertyName: "showTotalPage", publicName: "showTotalPage", isSignal: true, isRequired: false, transformFunction: null }, showInputGotoPage: { classPropertyName: "showInputGotoPage", publicName: "showInputGotoPage", isSignal: true, isRequired: false, transformFunction: null }, modeDisplayTotalPageAndGotoPage: { classPropertyName: "modeDisplayTotalPageAndGotoPage", publicName: "modeDisplayTotalPageAndGotoPage", isSignal: true, isRequired: false, transformFunction: null }, classDisplayTotalPageAndGotoPage: { classPropertyName: "classDisplayTotalPageAndGotoPage", publicName: "classDisplayTotalPageAndGotoPage", isSignal: true, isRequired: false, transformFunction: null }, classIncludeContainer: { classPropertyName: "classIncludeContainer", publicName: "classIncludeContainer", isSignal: true, isRequired: false, transformFunction: null }, classIncludeItem: { classPropertyName: "classIncludeItem", publicName: "classIncludeItem", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, numberPageDisplay: { classPropertyName: "numberPageDisplay", publicName: "numberPageDisplay", isSignal: true, isRequired: false, transformFunction: null }, totalItems: { classPropertyName: "totalItems", publicName: "totalItems", isSignal: true, isRequired: true, transformFunction: null }, perPage: { classPropertyName: "perPage", publicName: "perPage", isSignal: true, isRequired: true, transformFunction: null }, currentPage: { classPropertyName: "currentPage", publicName: "currentPage", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { currentPage: "currentPageChange", outPageSelect: "outPageSelect" }, providers: [TranslateProviderConfig], ngImport: i0, template: "<div class=\"flex flex-col items-center flex-wrap w-full justify-center {{ classIncludeContainer() ?? '' }}\">\n @let constHtmlDisplayTotalPageAndGotoPage = showTotalPage() || showInputGotoPage();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'top') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div class=\"flex shrink-0 h-full items-center\">\n @let constHtmlDisableButtonPre =
|
|
158
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPaginationComponent, isStandalone: true, selector: "libs_ui-components-pagination", inputs: { showTotalPage: { classPropertyName: "showTotalPage", publicName: "showTotalPage", isSignal: true, isRequired: false, transformFunction: null }, showInputGotoPage: { classPropertyName: "showInputGotoPage", publicName: "showInputGotoPage", isSignal: true, isRequired: false, transformFunction: null }, modeDisplayTotalPageAndGotoPage: { classPropertyName: "modeDisplayTotalPageAndGotoPage", publicName: "modeDisplayTotalPageAndGotoPage", isSignal: true, isRequired: false, transformFunction: null }, classDisplayTotalPageAndGotoPage: { classPropertyName: "classDisplayTotalPageAndGotoPage", publicName: "classDisplayTotalPageAndGotoPage", isSignal: true, isRequired: false, transformFunction: null }, classIncludeContainer: { classPropertyName: "classIncludeContainer", publicName: "classIncludeContainer", isSignal: true, isRequired: false, transformFunction: null }, classIncludeItem: { classPropertyName: "classIncludeItem", publicName: "classIncludeItem", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, numberPageDisplay: { classPropertyName: "numberPageDisplay", publicName: "numberPageDisplay", isSignal: true, isRequired: false, transformFunction: null }, totalItems: { classPropertyName: "totalItems", publicName: "totalItems", isSignal: true, isRequired: true, transformFunction: null }, perPage: { classPropertyName: "perPage", publicName: "perPage", isSignal: true, isRequired: true, transformFunction: null }, firstPageStartNumber: { classPropertyName: "firstPageStartNumber", publicName: "firstPageStartNumber", isSignal: true, isRequired: false, transformFunction: null }, currentPage: { classPropertyName: "currentPage", publicName: "currentPage", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { currentPage: "currentPageChange", outPageSelect: "outPageSelect" }, providers: [TranslateProviderConfig], ngImport: i0, template: "<div class=\"flex flex-col items-center flex-wrap w-full justify-center {{ classIncludeContainer() ?? '' }}\">\n @let constHtmlDisplayTotalPageAndGotoPage = showTotalPage() || showInputGotoPage();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'top') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div class=\"flex shrink-0 h-full items-center\">\n @let constHtmlDisableButtonPre = currentPageComputed() <= 1 || totalPage() <= 1 || disable();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'left') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div\n class=\"libs-ui-components-pagination-button rotate-[180deg] pl-[14px] pr-[6px]\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonPre\"\n [class.pointer-events-none]=\"constHtmlDisableButtonPre\"\n (click)=\"prePage($event)\"\n (keydown.enter)=\"prePage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @for (item of listPageDisplay(); track item.key) {\n <div\n class=\"libs-ui-components-pagination-item libs-ui-font-h3m {{ classIncludeItem() ?? '' }}\"\n [class.libs-ui-components-pagination-active]=\"item.key === currentPageComputed() + ''\"\n [class.libs-ui-disable]=\"disable()\"\n [class.pointer-events-none]=\"disable()\"\n (click)=\"selectPage($event, item)\"\n (keydown.enter)=\"selectPage($event, item)\">\n {{ item.value }}\n </div>\n } @empty {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_no_data_yet' | translate }}\n </div>\n }\n\n @let constHtmlDisableButtonNext = currentPageComputed() >= totalPage() || disable();\n <div\n class=\"libs-ui-components-pagination-button pl-[14px] pr-[6p]x\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonNext\"\n [class.pointer-events-none]=\"constHtmlDisableButtonNext\"\n (click)=\"nextPage($event)\"\n (keydown.enter)=\"nextPage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'right') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'bottom') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n</div>\n\n<ng-template #gotoPageNumberRef>\n <div\n class=\"flex shrink-0 h-full items-center {{ classDisplayTotalPageAndGotoPage() ?? '' }}\"\n [class.mb-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'top'\"\n [class.mt-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'bottom'\">\n @if (showTotalPage()) {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px]\">\n {{ 'i18n_value_sum_page' | translate: { value: totalPage() } }}\n </div>\n }\n @if (showInputGotoPage()) {\n @if (showTotalPage()) {\n <div class=\"h-[16px] w-[1px] bg-[#CDD0D6]\"></div>\n }\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_go_to' | translate }}\n </div>\n <div class=\"w-[60px] mr-[12px] shrink-0\">\n <libs_ui-components-inputs-input\n [dataType]=\"'int'\"\n classInclude=\"!rounded-[6px]\"\n [maxValueNumber]=\"totalPage()\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [defaultHeight]=\"28\"\n [value]=\"gotoPageNumber() || ''\"\n (outChange)=\"changePage($event)\"\n (outEnterEvent)=\"handlerEnterInput()\"\n [disable]=\"disable() || totalPage() <= numberPageDisplay()\" />\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{width:100%}.libs-ui-components-pagination-item{color:#1c1f22;display:flex;flex-shrink:0;align-items:center;justify-content:center;padding:4px 12px;cursor:pointer}.libs-ui-components-pagination-item [class^=mo-svg-font]:before{color:#1c1f22;font-size:var(--mo-heading-4-size)!important}.libs-ui-components-pagination-item.libs-ui-components-pagination-active{color:var(--libs-ui-color-default)}.libs-ui-components-pagination-item.libs-ui-components-pagination-active [class^=mo-svg-font]:before{color:var(--libs-ui-color-default)}.libs-ui-components-pagination-button{cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "typeInput", "modeInput", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "selectAllTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iframeTextareaCustomStyle", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
138
159
|
}
|
|
139
160
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPaginationComponent, decorators: [{
|
|
140
161
|
type: Component,
|
|
141
|
-
args: [{ selector: 'libs_ui-components-pagination', standalone: true, imports: [TranslateModule, LibsUiComponentsInputsInputComponent, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, providers: [TranslateProviderConfig], template: "<div class=\"flex flex-col items-center flex-wrap w-full justify-center {{ classIncludeContainer() ?? '' }}\">\n @let constHtmlDisplayTotalPageAndGotoPage = showTotalPage() || showInputGotoPage();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'top') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div class=\"flex shrink-0 h-full items-center\">\n @let constHtmlDisableButtonPre =
|
|
162
|
+
args: [{ selector: 'libs_ui-components-pagination', standalone: true, imports: [TranslateModule, LibsUiComponentsInputsInputComponent, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, providers: [TranslateProviderConfig], template: "<div class=\"flex flex-col items-center flex-wrap w-full justify-center {{ classIncludeContainer() ?? '' }}\">\n @let constHtmlDisplayTotalPageAndGotoPage = showTotalPage() || showInputGotoPage();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'top') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div class=\"flex shrink-0 h-full items-center\">\n @let constHtmlDisableButtonPre = currentPageComputed() <= 1 || totalPage() <= 1 || disable();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'left') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div\n class=\"libs-ui-components-pagination-button rotate-[180deg] pl-[14px] pr-[6px]\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonPre\"\n [class.pointer-events-none]=\"constHtmlDisableButtonPre\"\n (click)=\"prePage($event)\"\n (keydown.enter)=\"prePage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @for (item of listPageDisplay(); track item.key) {\n <div\n class=\"libs-ui-components-pagination-item libs-ui-font-h3m {{ classIncludeItem() ?? '' }}\"\n [class.libs-ui-components-pagination-active]=\"item.key === currentPageComputed() + ''\"\n [class.libs-ui-disable]=\"disable()\"\n [class.pointer-events-none]=\"disable()\"\n (click)=\"selectPage($event, item)\"\n (keydown.enter)=\"selectPage($event, item)\">\n {{ item.value }}\n </div>\n } @empty {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_no_data_yet' | translate }}\n </div>\n }\n\n @let constHtmlDisableButtonNext = currentPageComputed() >= totalPage() || disable();\n <div\n class=\"libs-ui-components-pagination-button pl-[14px] pr-[6p]x\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonNext\"\n [class.pointer-events-none]=\"constHtmlDisableButtonNext\"\n (click)=\"nextPage($event)\"\n (keydown.enter)=\"nextPage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'right') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'bottom') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n</div>\n\n<ng-template #gotoPageNumberRef>\n <div\n class=\"flex shrink-0 h-full items-center {{ classDisplayTotalPageAndGotoPage() ?? '' }}\"\n [class.mb-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'top'\"\n [class.mt-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'bottom'\">\n @if (showTotalPage()) {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px]\">\n {{ 'i18n_value_sum_page' | translate: { value: totalPage() } }}\n </div>\n }\n @if (showInputGotoPage()) {\n @if (showTotalPage()) {\n <div class=\"h-[16px] w-[1px] bg-[#CDD0D6]\"></div>\n }\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_go_to' | translate }}\n </div>\n <div class=\"w-[60px] mr-[12px] shrink-0\">\n <libs_ui-components-inputs-input\n [dataType]=\"'int'\"\n classInclude=\"!rounded-[6px]\"\n [maxValueNumber]=\"totalPage()\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [defaultHeight]=\"28\"\n [value]=\"gotoPageNumber() || ''\"\n (outChange)=\"changePage($event)\"\n (outEnterEvent)=\"handlerEnterInput()\"\n [disable]=\"disable() || totalPage() <= numberPageDisplay()\" />\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{width:100%}.libs-ui-components-pagination-item{color:#1c1f22;display:flex;flex-shrink:0;align-items:center;justify-content:center;padding:4px 12px;cursor:pointer}.libs-ui-components-pagination-item [class^=mo-svg-font]:before{color:#1c1f22;font-size:var(--mo-heading-4-size)!important}.libs-ui-components-pagination-item.libs-ui-components-pagination-active{color:var(--libs-ui-color-default)}.libs-ui-components-pagination-item.libs-ui-components-pagination-active [class^=mo-svg-font]:before{color:var(--libs-ui-color-default)}.libs-ui-components-pagination-button{cursor:pointer}\n"] }]
|
|
142
163
|
}], ctorParameters: () => [] });
|
|
143
164
|
|
|
144
165
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-pagination.mjs","sources":["../../../../../libs-ui/components/pagination/src/pagination.component.ts","../../../../../libs-ui/components/pagination/src/pagination.component.html","../../../../../libs-ui/components/pagination/src/libs-ui-components-pagination.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, input, model, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { LibsUiComponentsInputsInputComponent } from '@libs-ui/components-inputs-input';\nimport { TranslateProviderConfig } from '@libs-ui/services-translate';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { debounceTime, Subject } from 'rxjs';\nimport { isNil } from '@libs-ui/utils';\nimport { NgTemplateOutlet } from '@angular/common';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-pagination',\n templateUrl: './pagination.component.html',\n styleUrl: './pagination.component.scss',\n standalone: true,\n imports: [TranslateModule, LibsUiComponentsInputsInputComponent, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [TranslateProviderConfig],\n})\nexport class LibsUiComponentsPaginationComponent {\n private isEnterSearch = signal(false);\n protected listPageDisplay = signal<Array<{ key: string; value: string }>>([]);\n protected gotoPageNumber = signal<number | undefined>(undefined);\n protected totalPage = signal<number>(0);\n private readonly onChangeValue = new Subject<number>();\n\n readonly showTotalPage = input<boolean>();\n readonly showInputGotoPage = input<boolean>();\n readonly modeDisplayTotalPageAndGotoPage = input<'top' | 'bottom' | 'left' | 'right'>('bottom');\n readonly classDisplayTotalPageAndGotoPage = input<string>();\n\n readonly classIncludeContainer = input<string>();\n readonly classIncludeItem = input<string>();\n readonly disable = input<boolean>();\n readonly numberPageDisplay = input<number, number | undefined>(5, { transform: (value) => value || 5 });\n readonly totalItems = input.required<number>();\n readonly perPage = input.required<number>();\n readonly currentPage = model.required<number>();\n\n readonly outPageSelect = output<number>();\n private readonly destroyRef = inject(DestroyRef);\n constructor() {\n effect(() => {\n if (!isNil(this.currentPage()) && !isNil(this.totalItems()) && !isNil(this.perPage())) {\n untracked(() => {\n this.renderPagination();\n if (this.totalPage() && this.currentPage() >= this.totalPage()) {\n this.changeInputSearch(this.totalPage());\n }\n });\n }\n });\n this.onChangeValue.pipe(debounceTime(1500), takeUntilDestroyed(this.destroyRef)).subscribe((value) => {\n if (this.isEnterSearch()) {\n this.isEnterSearch.set(false);\n return;\n }\n this.currentPage.set(value);\n this.outPageSelect.emit(this.currentPage());\n });\n }\n\n private renderPagination() {\n if (this.perPage() > 0 && !isNil(this.totalItems())) {\n this.totalPage.set(Math.ceil(this.totalItems() / this.perPage()));\n }\n this.listPageDisplay.set([]);\n\n if (this.totalPage() <= this.numberPageDisplay()) {\n this.listPageDisplay.set(\n Array.from({ length: this.totalPage() }, (_, index) => {\n return { key: `${index + 1}`, value: `${index + 1}` };\n })\n );\n\n return;\n }\n\n if (this.currentPage() < this.numberPageDisplay() - 1) {\n this.listPageDisplay.set(\n Array.from({ length: this.numberPageDisplay() }, (_, index) => {\n return { key: `${index + 1}`, value: `${index + 1}` };\n })\n );\n\n return;\n }\n\n const startPage = this.currentPage() - this.numberPageDisplay() / 2;\n let numberPageBefore = startPage < 0 ? this.currentPage() : startPage === 0 ? 0 : this.numberPageDisplay() / 2;\n const gapAfer = this.numberPageDisplay() - numberPageBefore;\n const endPage = this.currentPage() + gapAfer;\n const numberPageAfter = this.totalPage() >= endPage ? gapAfer : this.totalPage() - this.currentPage();\n\n if (numberPageBefore + numberPageAfter < this.numberPageDisplay()) {\n numberPageBefore = this.numberPageDisplay() - numberPageAfter;\n }\n\n for (let i = 0; i < numberPageBefore; i++) {\n this.listPageDisplay.update((listPage) => {\n listPage.unshift({ key: `${this.currentPage() - i}`, value: `${this.currentPage() - i}` });\n\n return [...listPage];\n });\n }\n\n if (numberPageAfter >= 0) {\n for (let i = 1; i <= numberPageAfter; i++) {\n this.listPageDisplay.update((listPage) => {\n listPage.push({ key: `${this.currentPage() + i}`, value: `${this.currentPage() + i}` });\n return [...listPage];\n });\n }\n }\n }\n\n protected selectPage(e: Event, item: { key: string; value: string }) {\n e.stopPropagation();\n this.currentPage.set(+item.key);\n this.outPageSelect.emit(this.currentPage());\n this.renderPagination();\n }\n\n protected nextPage(e: Event) {\n e.stopPropagation();\n if (this.currentPage() < this.totalPage()) {\n this.currentPage.update((currentPage) => currentPage + 1);\n this.outPageSelect.emit(this.currentPage());\n this.renderPagination();\n }\n }\n\n protected prePage(e: Event) {\n e.stopPropagation();\n if (this.currentPage() > 1) {\n this.currentPage.update((currentPage) => currentPage - 1);\n this.outPageSelect.emit(this.currentPage());\n this.renderPagination();\n }\n }\n\n protected changePage(value: string | number) {\n value = value as number;\n if (!value) {\n this.gotoPageNumber.set(undefined);\n return;\n }\n this.gotoPageNumber.set(value);\n this.onChangeValue.next(value);\n }\n\n protected handlerEnterInput() {\n if (!this.gotoPageNumber()) {\n return;\n }\n this.isEnterSearch.set(true);\n this.changeInputSearch(this.gotoPageNumber() as number);\n }\n\n private changeInputSearch(value: number) {\n if (value >= 1 && value <= this.totalPage() && value !== this.currentPage()) {\n this.currentPage.set(value);\n this.outPageSelect.emit(this.currentPage());\n this.renderPagination();\n }\n }\n}\n","<div class=\"flex flex-col items-center flex-wrap w-full justify-center {{ classIncludeContainer() ?? '' }}\">\n @let constHtmlDisplayTotalPageAndGotoPage = showTotalPage() || showInputGotoPage();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'top') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div class=\"flex shrink-0 h-full items-center\">\n @let constHtmlDisableButtonPre = currentPage() <= 1 || totalPage() <= 1 || disable();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'left') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div\n class=\"libs-ui-components-pagination-button rotate-[180deg] pl-[14px] pr-[6px]\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonPre\"\n [class.pointer-events-none]=\"constHtmlDisableButtonPre\"\n (click)=\"prePage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @for (item of listPageDisplay(); track item.key) {\n <div\n class=\"libs-ui-components-pagination-item libs-ui-font-h3m {{ classIncludeItem() ?? '' }}\"\n [class.libs-ui-components-pagination-active]=\"item.key === currentPage() + ''\"\n [class.libs-ui-disable]=\"disable()\"\n [class.pointer-events-none]=\"disable()\"\n (click)=\"selectPage($event, item)\">\n {{ item.value }}\n </div>\n } @empty {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_no_data_yet' | translate }}\n </div>\n }\n @let constHtmlDisableButtonNext = currentPage() >= totalPage() || disable();\n <div\n class=\"libs-ui-components-pagination-button pl-[14px] pr-[6p]x\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonNext\"\n [class.pointer-events-none]=\"constHtmlDisableButtonNext\"\n (click)=\"nextPage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'right') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'bottom') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n</div>\n\n<ng-template #gotoPageNumberRef>\n <div\n class=\"flex shrink-0 h-full items-center {{ classDisplayTotalPageAndGotoPage() ?? '' }}\"\n [class.mb-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'top'\"\n [class.mt-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'bottom'\">\n @if (showTotalPage()) {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px]\">\n {{ 'i18n_value_sum_page' | translate: { value: totalPage() } }}\n </div>\n }\n @if (showInputGotoPage()) {\n @if (showTotalPage()) {\n <div class=\"h-[16px] w-[1px] bg-[#CDD0D6]\"></div>\n }\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_go_to' | translate }}\n </div>\n <div class=\"w-[60px] mr-[12px] shrink-0\">\n <libs_ui-components-inputs-input\n [dataType]=\"'int'\"\n classInclude=\"!rounded-[6px]\"\n [maxValueNumber]=\"totalPage()\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [defaultHeight]=\"28\"\n [value]=\"gotoPageNumber() || ''\"\n (outChange)=\"changePage($event)\"\n (outEnterEvent)=\"handlerEnterInput()\"\n [disable]=\"disable() || totalPage() <= 5\" />\n </div>\n }\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-pagination.mjs","sources":["../../../../../libs-ui/components/pagination/src/pagination.component.ts","../../../../../libs-ui/components/pagination/src/pagination.component.html","../../../../../libs-ui/components/pagination/src/libs-ui-components-pagination.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, model, OnInit, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { LibsUiComponentsInputsInputComponent } from '@libs-ui/components-inputs-input';\nimport { TranslateProviderConfig } from '@libs-ui/services-translate';\nimport { isNil } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { debounceTime, Subject } from 'rxjs';\nimport { IPaginationFunctionsControl } from './pagination.type';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-pagination',\n templateUrl: './pagination.component.html',\n styleUrl: './pagination.component.scss',\n standalone: true,\n imports: [TranslateModule, LibsUiComponentsInputsInputComponent, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [TranslateProviderConfig],\n})\nexport class LibsUiComponentsPaginationComponent implements OnInit {\n private readonly fakeEventHtml = new Event('click');\n private readonly isEnterSearch = signal(false);\n protected listPageDisplay = signal<Array<{ key: string; value: string }>>([]);\n protected gotoPageNumber = signal<number | undefined>(undefined);\n protected totalPage = signal<number>(0);\n private readonly onChangeValue = new Subject<number>();\n\n readonly showTotalPage = input<boolean>();\n readonly showInputGotoPage = input<boolean>();\n readonly modeDisplayTotalPageAndGotoPage = input<'top' | 'bottom' | 'left' | 'right'>('bottom');\n readonly classDisplayTotalPageAndGotoPage = input<string>();\n\n readonly classIncludeContainer = input<string>();\n readonly classIncludeItem = input<string>();\n readonly disable = input<boolean>();\n readonly numberPageDisplay = input<number, number | undefined>(5, { transform: (value) => value || 5 });\n readonly totalItems = input.required<number>();\n readonly perPage = input.required<number>();\n readonly firstPageStartNumber = input<number, 0 | 1 | undefined>(1, { transform: (value) => value ?? 1 });\n readonly currentPage = model.required<number>();\n readonly currentPageComputed = computed(() => this.currentPage() + (this.firstPageStartNumber() === 1 ? 0 : 1));\n readonly outPageSelect = output<number>();\n private readonly destroyRef = inject(DestroyRef);\n constructor() {\n let totalItems = 0;\n effect(() => {\n if ( !isNil(this.totalItems())|| totalItems !== this.totalItems()) {\n untracked(() => {\n totalItems = this.totalItems();\n this.renderPagination();\n if (this.totalPage() && this.currentPageComputed() >= this.totalPage()) {\n this.selectPage(this.fakeEventHtml, { key: `${this.totalPage()}`, value: `${this.totalPage()}` });\n }\n });\n }\n });\n this.onChangeValue.pipe(debounceTime(1500), takeUntilDestroyed(this.destroyRef)).subscribe((value) => {\n if (this.isEnterSearch() || +value === this.currentPageComputed()) {\n this.isEnterSearch.set(false);\n return;\n }\n this.selectPage(this.fakeEventHtml, { key: `${value}`, value: `${value}` });\n });\n }\n\n ngOnInit(): void {\n if (!isNil(this.currentPage()) && !isNil(this.totalItems()) && !isNil(this.perPage())) {\n this.renderPagination();\n }\n }\n\n public get FunctionsControl(): IPaginationFunctionsControl {\n return {\n changePage:async (value?:number)=> {\n if(!isNil(value)){\n await this.changePage(value);\n return;\n }\n await this.changePage(this.currentPageComputed());\n }\n };\n }\n\n private renderPagination() {\n if (this.perPage() > 0 && !isNil(this.totalItems())) {\n this.totalPage.set(Math.ceil(this.totalItems() / this.perPage()));\n }\n this.listPageDisplay.set([]);\n\n if (this.totalPage() <= this.numberPageDisplay()) {\n this.listPageDisplay.set(\n Array.from({ length: this.totalPage() }, (_, index) => {\n return { key: `${index + 1}`, value: `${index + 1}` };\n })\n );\n\n return;\n }\n\n if (this.currentPageComputed() < this.numberPageDisplay() - 1) {\n this.listPageDisplay.set(\n Array.from({ length: this.numberPageDisplay() }, (_, index) => {\n return { key: `${index + 1}`, value: `${index + 1}` };\n })\n );\n\n return;\n }\n\n const startPage = this.currentPageComputed() - this.numberPageDisplay() / 2;\n let numberPageBefore = [\n this.currentPageComputed(),\n 0,\n this.numberPageDisplay() / 2,\n ][Math.sign(startPage) + 1];\n const gapAfter = this.numberPageDisplay() - numberPageBefore;\n const endPage = this.currentPageComputed() + gapAfter;\n const numberPageAfter = this.totalPage() >= endPage ? gapAfter : this.totalPage() - this.currentPageComputed();\n\n if (numberPageBefore + numberPageAfter < this.numberPageDisplay()) {\n numberPageBefore = this.numberPageDisplay() - numberPageAfter;\n }\n\n for (let i = 0; i < numberPageBefore; i++) {\n this.listPageDisplay.update((listPage) => {\n listPage.unshift({ key: `${this.currentPageComputed() - i}`, value: `${this.currentPageComputed() - i}` });\n\n return [...listPage];\n });\n }\n\n if (numberPageAfter >= 0) {\n for (let i = 1; i <= numberPageAfter; i++) {\n this.listPageDisplay.update((listPage) => {\n listPage.push({ key: `${this.currentPageComputed() + i}`, value: `${this.currentPageComputed() + i}` });\n return [...listPage];\n });\n }\n }\n }\n\n protected selectPage(e: Event, item: { key: string; value: string }) {\n e.stopPropagation();\n const pageSelect = +item.key - (this.firstPageStartNumber() === 0 ? 1 : 0);\n\n \n if (pageSelect === this.currentPage()) {\n return;\n }\n\n this.currentPage.set(pageSelect);\n this.outPageSelect.emit(this.currentPage());\n this.renderPagination();\n }\n\n protected nextPage(e: Event) {\n e.stopPropagation();\n if (this.currentPageComputed() < this.totalPage()) {\n this.currentPage.update((currentPage) => currentPage + 1);\n this.outPageSelect.emit(this.currentPage());\n this.renderPagination();\n }\n }\n\n protected prePage(e: Event) {\n e.stopPropagation();\n if (this.currentPageComputed() > 1) {\n this.currentPage.update((currentPage) => currentPage - 1);\n this.outPageSelect.emit(this.currentPage());\n this.renderPagination();\n }\n }\n\n protected async changePage(value: string | number) {\n value = value as number;\n if (!value) {\n this.gotoPageNumber.set(undefined);\n return;\n }\n this.gotoPageNumber.set(value);\n this.onChangeValue.next(value);\n }\n\n protected handlerEnterInput() {\n if (isNil(this.gotoPageNumber()) || this.gotoPageNumber() === this.currentPageComputed()) {\n return;\n }\n\n this.isEnterSearch.set(true);\n this.selectPage(this.fakeEventHtml, { key: `${this.gotoPageNumber()}`, value: `${this.gotoPageNumber()}` });\n }\n}\n","<div class=\"flex flex-col items-center flex-wrap w-full justify-center {{ classIncludeContainer() ?? '' }}\">\n @let constHtmlDisplayTotalPageAndGotoPage = showTotalPage() || showInputGotoPage();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'top') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div class=\"flex shrink-0 h-full items-center\">\n @let constHtmlDisableButtonPre = currentPageComputed() <= 1 || totalPage() <= 1 || disable();\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'left') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n <div\n class=\"libs-ui-components-pagination-button rotate-[180deg] pl-[14px] pr-[6px]\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonPre\"\n [class.pointer-events-none]=\"constHtmlDisableButtonPre\"\n (click)=\"prePage($event)\"\n (keydown.enter)=\"prePage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @for (item of listPageDisplay(); track item.key) {\n <div\n class=\"libs-ui-components-pagination-item libs-ui-font-h3m {{ classIncludeItem() ?? '' }}\"\n [class.libs-ui-components-pagination-active]=\"item.key === currentPageComputed() + ''\"\n [class.libs-ui-disable]=\"disable()\"\n [class.pointer-events-none]=\"disable()\"\n (click)=\"selectPage($event, item)\"\n (keydown.enter)=\"selectPage($event, item)\">\n {{ item.value }}\n </div>\n } @empty {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_no_data_yet' | translate }}\n </div>\n }\n\n @let constHtmlDisableButtonNext = currentPageComputed() >= totalPage() || disable();\n <div\n class=\"libs-ui-components-pagination-button pl-[14px] pr-[6p]x\"\n [class.libs-ui-disable]=\"constHtmlDisableButtonNext\"\n [class.pointer-events-none]=\"constHtmlDisableButtonNext\"\n (click)=\"nextPage($event)\"\n (keydown.enter)=\"nextPage($event)\">\n <i class=\"libs-ui-icon-chevron-right libs-ui-font-h2r\"></i>\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'right') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n </div>\n @if (constHtmlDisplayTotalPageAndGotoPage && modeDisplayTotalPageAndGotoPage() === 'bottom') {\n <ng-container *ngTemplateOutlet=\"gotoPageNumberRef\" />\n }\n</div>\n\n<ng-template #gotoPageNumberRef>\n <div\n class=\"flex shrink-0 h-full items-center {{ classDisplayTotalPageAndGotoPage() ?? '' }}\"\n [class.mb-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'top'\"\n [class.mt-[16px]]=\"modeDisplayTotalPageAndGotoPage() === 'bottom'\">\n @if (showTotalPage()) {\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px]\">\n {{ 'i18n_value_sum_page' | translate: { value: totalPage() } }}\n </div>\n }\n @if (showInputGotoPage()) {\n @if (showTotalPage()) {\n <div class=\"h-[16px] w-[1px] bg-[#CDD0D6]\"></div>\n }\n <div class=\"libs-ui-font-h5m text-[#9CA2AD] mx-[12px] flex shrink-0\">\n {{ 'i18n_go_to' | translate }}\n </div>\n <div class=\"w-[60px] mr-[12px] shrink-0\">\n <libs_ui-components-inputs-input\n [dataType]=\"'int'\"\n classInclude=\"!rounded-[6px]\"\n [maxValueNumber]=\"totalPage()\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [defaultHeight]=\"28\"\n [value]=\"gotoPageNumber() || ''\"\n (outChange)=\"changePage($event)\"\n (outEnterEvent)=\"handlerEnterInput()\"\n [disable]=\"disable() || totalPage() <= numberPageDisplay()\" />\n </div>\n }\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-pagination",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.357-0",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": ">=18.0.0",
|
|
6
|
-
"@angular/core": ">=18.0.0"
|
|
6
|
+
"@angular/core": ">=18.0.0",
|
|
7
|
+
"@libs-ui/components-inputs-input": "0.2.357-0",
|
|
8
|
+
"@libs-ui/services-translate": "0.2.357-0",
|
|
9
|
+
"@ngx-translate/core": "^15.0.0",
|
|
10
|
+
"rxjs": "~7.8.0",
|
|
11
|
+
"@libs-ui/utils": "0.2.357-0"
|
|
7
12
|
},
|
|
8
13
|
"sideEffects": false,
|
|
9
14
|
"module": "fesm2022/libs-ui-components-pagination.mjs",
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import { IPaginationFunctionsControl } from './pagination.type';
|
|
1
3
|
import * as i0 from "@angular/core";
|
|
2
|
-
export declare class LibsUiComponentsPaginationComponent {
|
|
3
|
-
private
|
|
4
|
+
export declare class LibsUiComponentsPaginationComponent implements OnInit {
|
|
5
|
+
private readonly fakeEventHtml;
|
|
6
|
+
private readonly isEnterSearch;
|
|
4
7
|
protected listPageDisplay: import("@angular/core").WritableSignal<{
|
|
5
8
|
key: string;
|
|
6
9
|
value: string;
|
|
@@ -18,10 +21,14 @@ export declare class LibsUiComponentsPaginationComponent {
|
|
|
18
21
|
readonly numberPageDisplay: import("@angular/core").InputSignalWithTransform<number, number | undefined>;
|
|
19
22
|
readonly totalItems: import("@angular/core").InputSignal<number>;
|
|
20
23
|
readonly perPage: import("@angular/core").InputSignal<number>;
|
|
24
|
+
readonly firstPageStartNumber: import("@angular/core").InputSignalWithTransform<number, 0 | 1 | undefined>;
|
|
21
25
|
readonly currentPage: import("@angular/core").ModelSignal<number>;
|
|
26
|
+
readonly currentPageComputed: import("@angular/core").Signal<number>;
|
|
22
27
|
readonly outPageSelect: import("@angular/core").OutputEmitterRef<number>;
|
|
23
28
|
private readonly destroyRef;
|
|
24
29
|
constructor();
|
|
30
|
+
ngOnInit(): void;
|
|
31
|
+
get FunctionsControl(): IPaginationFunctionsControl;
|
|
25
32
|
private renderPagination;
|
|
26
33
|
protected selectPage(e: Event, item: {
|
|
27
34
|
key: string;
|
|
@@ -29,9 +36,8 @@ export declare class LibsUiComponentsPaginationComponent {
|
|
|
29
36
|
}): void;
|
|
30
37
|
protected nextPage(e: Event): void;
|
|
31
38
|
protected prePage(e: Event): void;
|
|
32
|
-
protected changePage(value: string | number): void
|
|
39
|
+
protected changePage(value: string | number): Promise<void>;
|
|
33
40
|
protected handlerEnterInput(): void;
|
|
34
|
-
private changeInputSearch;
|
|
35
41
|
static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiComponentsPaginationComponent, never>;
|
|
36
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<LibsUiComponentsPaginationComponent, "libs_ui-components-pagination", never, { "showTotalPage": { "alias": "showTotalPage"; "required": false; "isSignal": true; }; "showInputGotoPage": { "alias": "showInputGotoPage"; "required": false; "isSignal": true; }; "modeDisplayTotalPageAndGotoPage": { "alias": "modeDisplayTotalPageAndGotoPage"; "required": false; "isSignal": true; }; "classDisplayTotalPageAndGotoPage": { "alias": "classDisplayTotalPageAndGotoPage"; "required": false; "isSignal": true; }; "classIncludeContainer": { "alias": "classIncludeContainer"; "required": false; "isSignal": true; }; "classIncludeItem": { "alias": "classIncludeItem"; "required": false; "isSignal": true; }; "disable": { "alias": "disable"; "required": false; "isSignal": true; }; "numberPageDisplay": { "alias": "numberPageDisplay"; "required": false; "isSignal": true; }; "totalItems": { "alias": "totalItems"; "required": true; "isSignal": true; }; "perPage": { "alias": "perPage"; "required": true; "isSignal": true; }; "currentPage": { "alias": "currentPage"; "required": true; "isSignal": true; }; }, { "currentPage": "currentPageChange"; "outPageSelect": "outPageSelect"; }, never, never, true, never>;
|
|
42
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LibsUiComponentsPaginationComponent, "libs_ui-components-pagination", never, { "showTotalPage": { "alias": "showTotalPage"; "required": false; "isSignal": true; }; "showInputGotoPage": { "alias": "showInputGotoPage"; "required": false; "isSignal": true; }; "modeDisplayTotalPageAndGotoPage": { "alias": "modeDisplayTotalPageAndGotoPage"; "required": false; "isSignal": true; }; "classDisplayTotalPageAndGotoPage": { "alias": "classDisplayTotalPageAndGotoPage"; "required": false; "isSignal": true; }; "classIncludeContainer": { "alias": "classIncludeContainer"; "required": false; "isSignal": true; }; "classIncludeItem": { "alias": "classIncludeItem"; "required": false; "isSignal": true; }; "disable": { "alias": "disable"; "required": false; "isSignal": true; }; "numberPageDisplay": { "alias": "numberPageDisplay"; "required": false; "isSignal": true; }; "totalItems": { "alias": "totalItems"; "required": true; "isSignal": true; }; "perPage": { "alias": "perPage"; "required": true; "isSignal": true; }; "firstPageStartNumber": { "alias": "firstPageStartNumber"; "required": false; "isSignal": true; }; "currentPage": { "alias": "currentPage"; "required": true; "isSignal": true; }; }, { "currentPage": "currentPageChange"; "outPageSelect": "outPageSelect"; }, never, never, true, never>;
|
|
37
43
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type IPaginationConfig = {
|
|
2
|
+
position?: 'top' | 'bottom';
|
|
3
|
+
classIncludeContainer?: string;
|
|
4
|
+
classIncludeItem?: string;
|
|
5
|
+
disable?: boolean;
|
|
6
|
+
numberPageDisplay?: number;
|
|
7
|
+
showTotalPage?: boolean;
|
|
8
|
+
firstPageStartNumber?: 0 | 1;
|
|
9
|
+
showInputGotoPage?: boolean;
|
|
10
|
+
modeDisplayTotalPageAndGotoPage?: 'top' | 'bottom' | 'left' | 'right';
|
|
11
|
+
classDisplayTotalPageAndGotoPage?: string;
|
|
12
|
+
perPage?: number;
|
|
13
|
+
totalItems?: number;
|
|
14
|
+
currentPage?: number;
|
|
15
|
+
};
|
|
16
|
+
export interface IPaginationFunctionsControl {
|
|
17
|
+
changePage: (page?: number) => Promise<void>;
|
|
18
|
+
}
|