@libs-ui/components-pagination 0.2.356-42 → 0.2.356-43
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
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`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NgTemplateOutlet } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { signal, input, model, computed, output, inject, DestroyRef, effect, untracked,
|
|
3
|
+
import { signal, input, model, computed, output, inject, DestroyRef, effect, untracked, Component, ChangeDetectionStrategy } from '@angular/core';
|
|
4
4
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
5
|
import { LibsUiComponentsInputsInputComponent } from '@libs-ui/components-inputs-input';
|
|
6
6
|
import { TranslateProviderConfig } from '@libs-ui/services-translate';
|
|
@@ -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 { 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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"}
|
|
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/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-pagination",
|
|
3
|
-
"version": "0.2.356-
|
|
3
|
+
"version": "0.2.356-43",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": ">=18.0.0",
|
|
6
6
|
"@angular/core": ">=18.0.0",
|
|
7
|
-
"@libs-ui/components-inputs-input": "0.2.356-
|
|
8
|
-
"@libs-ui/services-translate": "0.2.356-
|
|
7
|
+
"@libs-ui/components-inputs-input": "0.2.356-43",
|
|
8
|
+
"@libs-ui/services-translate": "0.2.356-43",
|
|
9
9
|
"@ngx-translate/core": "^15.0.0",
|
|
10
10
|
"rxjs": "~7.8.0",
|
|
11
|
-
"@libs-ui/utils": "0.2.356-
|
|
11
|
+
"@libs-ui/utils": "0.2.356-43"
|
|
12
12
|
},
|
|
13
13
|
"sideEffects": false,
|
|
14
14
|
"module": "fesm2022/libs-ui-components-pagination.mjs",
|