@libs-ui/components-tabs 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,151 +1,524 @@
|
|
|
1
1
|
# @libs-ui/components-tabs
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Angular Standalone Component hiển thị thanh Tabs với hỗ trợ đầy đủ Angular Signals, Responsive "More" Menu tự động, Drag & Drop và nhiều chế độ căn chỉnh.
|
|
4
4
|
|
|
5
5
|
## Giới thiệu
|
|
6
6
|
|
|
7
|
-
`LibsUiComponentsTabsComponent` là một standalone Angular component
|
|
7
|
+
`LibsUiComponentsTabsComponent` là một standalone Angular component được xây dựng hoàn toàn trên Angular Signals. Component tự động tính toán và ẩn các tab không vừa chiều ngang vào menu "More" (chế độ `left`), hỗ trợ kéo thả để sắp xếp lại thứ tự, cho phép kiểm soát chuyển tab bằng callback bất đồng bộ, và cung cấp FunctionsControl để điều khiển từ component cha qua `viewChild`.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Tính năng
|
|
10
10
|
|
|
11
|
-
- ✅ **Angular Signals**: Full support
|
|
12
|
-
- ✅ **Responsive "More" Menu**:
|
|
13
|
-
- ✅ **
|
|
14
|
-
- ✅ **
|
|
15
|
-
- ✅ **
|
|
16
|
-
- ✅ **
|
|
11
|
+
- ✅ **Angular Signals**: Full support — `items` là `WritableSignal<Array<WritableSignal<ITabsItem>>>`, phản ứng ngay khi signal bên trong thay đổi.
|
|
12
|
+
- ✅ **Responsive "More" Menu**: Chế độ `left` tự động ẩn các tab thừa vào popover "Xem thêm" khi container hẹp.
|
|
13
|
+
- ✅ **Calculator V2**: Thuật toán tính chiều rộng thế hệ mới dùng `ResizeObserver`, không flicker, không reorder DOM.
|
|
14
|
+
- ✅ **Drag & Drop**: Hỗ trợ kéo thả để thay đổi vị trí tab (tích hợp `@libs-ui/components-drag-drop`).
|
|
15
|
+
- ✅ **4 chế độ hiển thị**: `left`, `center`, `space-between`, `center-has-line`.
|
|
16
|
+
- ✅ **Rich Content**: Mỗi tab item hỗ trợ icon trái/phải, badge số lượng, red dot, ảnh avatar, nút action trái/phải.
|
|
17
|
+
- ✅ **Guard chuyển tab**: Input `checkCanChangeTabSelected` cho phép chặn hoặc xác nhận trước khi đổi tab (hỗ trợ async).
|
|
18
|
+
- ✅ **FunctionsControl**: Expose API `addTabsItem`, `selectedTabsItem`, `calculatorTabsItemsDisplay` ra ngoài qua `outFunctionsControl`.
|
|
19
|
+
- ✅ **OnPush Change Detection**: Tối ưu hiệu năng cho danh sách tab lớn.
|
|
17
20
|
|
|
18
21
|
## Khi nào sử dụng
|
|
19
22
|
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
23
|
+
- Phân chia nội dung thành nhiều view/module trong cùng một màn hình (trang chi tiết, dashboard).
|
|
24
|
+
- Thanh điều hướng ngang với số tab không cố định — tính năng "More" sẽ gom phần thừa tự động.
|
|
25
|
+
- Tab có thể thêm/xóa động (browser-like tabs) — dùng `FunctionsControl.addTabsItem`.
|
|
26
|
+
- Cần quy trình dạng bước (step wizard) — dùng `mode="center-has-line"` kết hợp `hasStep`.
|
|
27
|
+
- Danh sách tab cần sắp xếp lại bằng kéo thả.
|
|
24
28
|
|
|
25
29
|
## Cài đặt
|
|
26
30
|
|
|
27
31
|
```bash
|
|
28
|
-
# npm
|
|
29
32
|
npm install @libs-ui/components-tabs
|
|
30
|
-
|
|
31
|
-
# yarn
|
|
32
|
-
yarn add @libs-ui/components-tabs
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
## Import
|
|
36
36
|
|
|
37
37
|
```typescript
|
|
38
38
|
import { LibsUiComponentsTabsComponent } from '@libs-ui/components-tabs';
|
|
39
|
+
import { ITabs, ITabsItem, ITabsFunctionControlEvent, ITabsItemEvent, ITabCssConfig, TYPE_TAB_MODE } from '@libs-ui/components-tabs';
|
|
39
40
|
|
|
40
41
|
@Component({
|
|
41
42
|
standalone: true,
|
|
42
43
|
imports: [LibsUiComponentsTabsComponent],
|
|
43
|
-
// ...
|
|
44
44
|
})
|
|
45
45
|
export class YourComponent {}
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
-
## Ví dụ
|
|
48
|
+
## Ví dụ sử dụng
|
|
49
|
+
|
|
50
|
+
### Ví dụ 1 — Basic (tabs căn trái, responsive tự động)
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { signal, WritableSignal } from '@angular/core';
|
|
54
|
+
import { ITabs, ITabsItem, LibsUiComponentsTabsComponent } from '@libs-ui/components-tabs';
|
|
55
|
+
|
|
56
|
+
@Component({
|
|
57
|
+
standalone: true,
|
|
58
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
59
|
+
imports: [LibsUiComponentsTabsComponent],
|
|
60
|
+
template: `
|
|
61
|
+
<libs_ui-components-tabs
|
|
62
|
+
[tabs]="tabsConfig"
|
|
63
|
+
[(keySelected)]="selectedKey"
|
|
64
|
+
(outKeySelected)="handlerKeySelected($event)"
|
|
65
|
+
/>
|
|
66
|
+
<p>Tab đang chọn: {{ selectedKey() }}</p>
|
|
67
|
+
`,
|
|
68
|
+
})
|
|
69
|
+
export class BasicTabsComponent {
|
|
70
|
+
protected selectedKey = signal<string>('overview');
|
|
71
|
+
|
|
72
|
+
protected tabsConfig: ITabs = {
|
|
73
|
+
items: signal<Array<WritableSignal<ITabsItem>>>([
|
|
74
|
+
signal({ key: 'overview', label: 'Tổng quan' }),
|
|
75
|
+
signal({ key: 'detail', label: 'Chi tiết' }),
|
|
76
|
+
signal({ key: 'history', label: 'Lịch sử' }),
|
|
77
|
+
signal({ key: 'setting', label: 'Cài đặt', disable: true }),
|
|
78
|
+
]),
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
protected handlerKeySelected(key: string): void {
|
|
82
|
+
// event.stopPropagation() không cần ở đây vì outKeySelected là OutputEmitterRef
|
|
83
|
+
console.log('Tab đã chọn:', key);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Ví dụ 2 — Center mode với icon và badge
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import { signal, WritableSignal } from '@angular/core';
|
|
92
|
+
import { ITabs, ITabsItem, LibsUiComponentsTabsComponent } from '@libs-ui/components-tabs';
|
|
93
|
+
|
|
94
|
+
@Component({
|
|
95
|
+
standalone: true,
|
|
96
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
97
|
+
imports: [LibsUiComponentsTabsComponent],
|
|
98
|
+
template: `
|
|
99
|
+
<libs_ui-components-tabs
|
|
100
|
+
[tabs]="tabsConfig"
|
|
101
|
+
[(keySelected)]="selectedKey"
|
|
102
|
+
mode="center"
|
|
103
|
+
/>
|
|
104
|
+
`,
|
|
105
|
+
})
|
|
106
|
+
export class CenterTabsComponent {
|
|
107
|
+
protected selectedKey = signal<string>('messages');
|
|
108
|
+
|
|
109
|
+
protected tabsConfig: ITabs = {
|
|
110
|
+
hasCount: true,
|
|
111
|
+
items: signal<Array<WritableSignal<ITabsItem>>>([
|
|
112
|
+
signal({
|
|
113
|
+
key: 'messages',
|
|
114
|
+
label: 'Tin nhắn',
|
|
115
|
+
iconLeft: 'libs-ui-icon-mail',
|
|
116
|
+
count: 5,
|
|
117
|
+
classCircle: 'bg-red-500 text-white',
|
|
118
|
+
}),
|
|
119
|
+
signal({
|
|
120
|
+
key: 'notifications',
|
|
121
|
+
label: 'Thông báo',
|
|
122
|
+
iconLeft: 'libs-ui-icon-bell',
|
|
123
|
+
count: 99,
|
|
124
|
+
modeCount: 'x+',
|
|
125
|
+
maxCount: 9,
|
|
126
|
+
classCircle: 'bg-blue-500 text-white',
|
|
127
|
+
}),
|
|
128
|
+
signal({
|
|
129
|
+
key: 'profile',
|
|
130
|
+
label: 'Hồ sơ',
|
|
131
|
+
iconRight: 'libs-ui-icon-user',
|
|
132
|
+
hasRedDot: true,
|
|
133
|
+
}),
|
|
134
|
+
]),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Ví dụ 3 — Drag & Drop với Calculator V2
|
|
49
140
|
|
|
50
|
-
|
|
141
|
+
```typescript
|
|
142
|
+
import { signal, WritableSignal } from '@angular/core';
|
|
143
|
+
import { ITabs, ITabsItem, LibsUiComponentsTabsComponent } from '@libs-ui/components-tabs';
|
|
51
144
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
[
|
|
145
|
+
@Component({
|
|
146
|
+
standalone: true,
|
|
147
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
148
|
+
imports: [LibsUiComponentsTabsComponent],
|
|
149
|
+
template: `
|
|
150
|
+
<libs_ui-components-tabs
|
|
151
|
+
[tabs]="tabsConfig"
|
|
152
|
+
[(keySelected)]="selectedKey"
|
|
153
|
+
[allowDragDropPosition]="true"
|
|
154
|
+
[useCalculatorV2]="true"
|
|
155
|
+
(outDragTabChange)="handlerDragChange()"
|
|
156
|
+
/>
|
|
157
|
+
`,
|
|
158
|
+
})
|
|
159
|
+
export class DragTabsComponent {
|
|
160
|
+
protected selectedKey = signal<string>('tab1');
|
|
161
|
+
|
|
162
|
+
protected tabsConfig: ITabs = {
|
|
163
|
+
items: signal<Array<WritableSignal<ITabsItem>>>([
|
|
164
|
+
signal({ key: 'tab1', label: 'Mục 1' }),
|
|
165
|
+
signal({ key: 'tab2', label: 'Mục 2' }),
|
|
166
|
+
signal({ key: 'tab3', label: 'Mục 3' }),
|
|
167
|
+
signal({ key: 'tab4', label: 'Mục 4' }),
|
|
168
|
+
]),
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
protected handlerDragChange(): void {
|
|
172
|
+
console.log('Thứ tự tab đã thay đổi');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
56
175
|
```
|
|
57
176
|
|
|
177
|
+
### Ví dụ 4 — Guard chuyển tab (async confirmation)
|
|
178
|
+
|
|
58
179
|
```typescript
|
|
59
|
-
// Trong component class
|
|
60
180
|
import { signal, WritableSignal } from '@angular/core';
|
|
61
|
-
import { ITabs, ITabsItem } from '@libs-ui/components-tabs';
|
|
181
|
+
import { ITabs, ITabsItem, LibsUiComponentsTabsComponent } from '@libs-ui/components-tabs';
|
|
182
|
+
|
|
183
|
+
@Component({
|
|
184
|
+
standalone: true,
|
|
185
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
186
|
+
imports: [LibsUiComponentsTabsComponent],
|
|
187
|
+
template: `
|
|
188
|
+
<libs_ui-components-tabs
|
|
189
|
+
[tabs]="tabsConfig"
|
|
190
|
+
[(keySelected)]="selectedKey"
|
|
191
|
+
[checkCanChangeTabSelected]="checkCanChange"
|
|
192
|
+
/>
|
|
193
|
+
`,
|
|
194
|
+
})
|
|
195
|
+
export class GuardedTabsComponent {
|
|
196
|
+
protected selectedKey = signal<string>('tab1');
|
|
197
|
+
protected hasUnsavedChanges = signal<boolean>(true);
|
|
198
|
+
|
|
199
|
+
protected tabsConfig: ITabs = {
|
|
200
|
+
items: signal<Array<WritableSignal<ITabsItem>>>([
|
|
201
|
+
signal({ key: 'tab1', label: 'Form nhập liệu' }),
|
|
202
|
+
signal({ key: 'tab2', label: 'Xem trước' }),
|
|
203
|
+
]),
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
protected checkCanChange = async (): Promise<boolean> => {
|
|
207
|
+
if (!this.hasUnsavedChanges()) return true;
|
|
208
|
+
return confirm('Bạn có thay đổi chưa lưu. Tiếp tục chuyển tab?');
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
```
|
|
62
212
|
|
|
63
|
-
|
|
64
|
-
const item1 = signal<ITabsItem>({ key: 'tab1', label: 'Tab 1' });
|
|
65
|
-
const item2 = signal<ITabsItem>({ key: 'tab2', label: 'Tab 2' });
|
|
213
|
+
### Ví dụ 5 — FunctionsControl để thêm tab động
|
|
66
214
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
};
|
|
215
|
+
```typescript
|
|
216
|
+
import { signal, WritableSignal } from '@angular/core';
|
|
217
|
+
import { ITabs, ITabsItem, ITabsFunctionControlEvent, LibsUiComponentsTabsComponent } from '@libs-ui/components-tabs';
|
|
71
218
|
|
|
72
|
-
|
|
219
|
+
@Component({
|
|
220
|
+
standalone: true,
|
|
221
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
222
|
+
imports: [LibsUiComponentsTabsComponent],
|
|
223
|
+
template: `
|
|
224
|
+
<libs_ui-components-tabs
|
|
225
|
+
[tabs]="tabsConfig"
|
|
226
|
+
[(keySelected)]="selectedKey"
|
|
227
|
+
[useEffectUpdateItems]="true"
|
|
228
|
+
(outFunctionsControl)="handlerFunctionsControl($event)"
|
|
229
|
+
/>
|
|
230
|
+
<button (click)="addNewTab()">Thêm tab</button>
|
|
231
|
+
`,
|
|
232
|
+
})
|
|
233
|
+
export class DynamicTabsComponent {
|
|
234
|
+
protected selectedKey = signal<string>('tab1');
|
|
235
|
+
private functionsControl: ITabsFunctionControlEvent | undefined;
|
|
236
|
+
|
|
237
|
+
protected tabsConfig: ITabs = {
|
|
238
|
+
allowRemove: true,
|
|
239
|
+
items: signal<Array<WritableSignal<ITabsItem>>>([
|
|
240
|
+
signal({ key: 'tab1', label: 'Tab đầu tiên' }),
|
|
241
|
+
]),
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
protected handlerFunctionsControl(fc: ITabsFunctionControlEvent): void {
|
|
245
|
+
this.functionsControl = fc;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
protected addNewTab(): void {
|
|
249
|
+
const key = `tab_${Date.now()}`;
|
|
250
|
+
const newItem = signal<ITabsItem>({ key, label: `Tab ${key.slice(-4)}` });
|
|
251
|
+
this.functionsControl?.addTabsItem(newItem, true);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
73
254
|
```
|
|
74
255
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
256
|
+
### Ví dụ 6 — Step mode (quy trình dạng bước)
|
|
257
|
+
|
|
258
|
+
```typescript
|
|
259
|
+
import { signal, WritableSignal } from '@angular/core';
|
|
260
|
+
import { ITabs, ITabsItem, LibsUiComponentsTabsComponent } from '@libs-ui/components-tabs';
|
|
261
|
+
|
|
262
|
+
@Component({
|
|
263
|
+
standalone: true,
|
|
264
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
265
|
+
imports: [LibsUiComponentsTabsComponent],
|
|
266
|
+
template: `
|
|
267
|
+
<libs_ui-components-tabs
|
|
268
|
+
[tabs]="tabsConfig"
|
|
269
|
+
[(keySelected)]="selectedKey"
|
|
270
|
+
mode="center-has-line"
|
|
271
|
+
[ignoreCalculatorTab]="true"
|
|
272
|
+
/>
|
|
273
|
+
`,
|
|
274
|
+
})
|
|
275
|
+
export class StepTabsComponent {
|
|
276
|
+
protected selectedKey = signal<string>('step1');
|
|
277
|
+
|
|
278
|
+
protected tabsConfig: ITabs = {
|
|
279
|
+
hasStep: true,
|
|
280
|
+
stepCompleted: 1,
|
|
281
|
+
items: signal<Array<WritableSignal<ITabsItem>>>([
|
|
282
|
+
signal({ key: 'step1', label: 'Thông tin cơ bản' }),
|
|
283
|
+
signal({ key: 'step2', label: 'Xác minh' }),
|
|
284
|
+
signal({ key: 'step3', label: 'Hoàn tất' }),
|
|
285
|
+
]),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## @Input()
|
|
291
|
+
|
|
292
|
+
| Input | Type | Default | Mô tả | Ví dụ |
|
|
293
|
+
|---|---|---|---|---|
|
|
294
|
+
| `tabs` | `ITabs` | **Required** | Cấu hình chính chứa danh sách items dạng nested Signal. | `[tabs]="tabsConfig"` |
|
|
295
|
+
| `keySelected` | `string` (model) | **Required** | Key của tab đang chọn, hỗ trợ two-way binding. | `[(keySelected)]="selectedKey"` |
|
|
296
|
+
| `mode` | `TYPE_TAB_MODE` | `'left'` | Chế độ căn chỉnh: `'left'`, `'center'`, `'space-between'`, `'center-has-line'`. | `mode="center"` |
|
|
297
|
+
| `fieldKey` | `string` | `'key'` | Tên trường làm định danh duy nhất trong object item. | `[fieldKey]="'id'"` |
|
|
298
|
+
| `fieldLabel` | `string` | `'label'` | Tên trường hiển thị nhãn tab (hỗ trợ i18n key). | `[fieldLabel]="'name'"` |
|
|
299
|
+
| `disable` | `boolean` | `undefined` | Vô hiệu hóa toàn bộ component tabs. | `[disable]="true"` |
|
|
300
|
+
| `disableLabel` | `boolean` | `undefined` | Ẩn nhãn văn bản trên tab item. | `[disableLabel]="true"` |
|
|
301
|
+
| `heightTabItem` | `number` | `40` | Chiều cao của thanh tab header tính bằng px. | `[heightTabItem]="48"` |
|
|
302
|
+
| `ignoreCalculatorTab` | `boolean` | `false` | Bỏ qua tính toán responsive — dùng khi biết trước số tab vừa vặn. | `[ignoreCalculatorTab]="true"` |
|
|
303
|
+
| `size` | `'langer' \| 'medium'` | `'medium'` | Kích thước tổng thể của component. | `size="langer"` |
|
|
304
|
+
| `allowDragDropPosition` | `boolean` | `undefined` | Cho phép kéo thả thay đổi thứ tự tab. | `[allowDragDropPosition]="true"` |
|
|
305
|
+
| `zIndex` | `number` | `undefined` | Z-index áp dụng cho popover More và overlay. | `[zIndex]="100"` |
|
|
306
|
+
| `configCss` | `ITabCssConfig` (model) | `undefined` | Override CSS padding/margin cho các mode. Tự động set nếu không truyền. | `[(configCss)]="cssConfig"` |
|
|
307
|
+
| `popoverShowMoreTabItem` | `IPopover` | `undefined` | Cấu hình vị trí và style cho popover menu "Xem thêm". | `[popoverShowMoreTabItem]="popoverCfg"` |
|
|
308
|
+
| `checkCanChangeTabSelected` | `() => boolean \| Promise<boolean>` | `undefined` | Callback gác cổng trước khi chuyển tab. Trả về `false` để hủy. | `[checkCanChangeTabSelected]="checkFn"` |
|
|
309
|
+
| `useEffectUpdateItems` | `boolean` | `false` | Dùng `effect()` để tự động cập nhật danh sách hiển thị khi signal items thay đổi từ bên ngoài. Bật khi tab list là động. | `[useEffectUpdateItems]="true"` |
|
|
310
|
+
| `useCalculatorV2` | `boolean` | `false` | Bật thuật toán V2 dùng `ResizeObserver` — không flicker, không reorder DOM. Khuyến nghị cho tab mới. | `[useCalculatorV2]="true"` |
|
|
311
|
+
|
|
312
|
+
## @Output()
|
|
313
|
+
|
|
314
|
+
| Output | Type | Mô tả | Handler TS | Binding HTML |
|
|
315
|
+
|---|---|---|---|---|
|
|
316
|
+
| `(outKeySelected)` | `string` | Emit key của tab vừa được chọn. | `handlerKeySelected(key: string): void { /* key là tab key */ }` | `(outKeySelected)="handlerKeySelected($event)"` |
|
|
317
|
+
| `(outFunctionsControl)` | `ITabsFunctionControlEvent` | Emit object chứa API điều khiển tabs: `addTabsItem`, `selectedTabsItem`, `calculatorTabsItemsDisplay`. | `handlerFunctionsControl(fc: ITabsFunctionControlEvent): void { this.tabsFc = fc; }` | `(outFunctionsControl)="handlerFunctionsControl($event)"` |
|
|
318
|
+
| `(outDragTabChange)` | `void` | Emit sau khi người dùng kéo thả hoàn tất, thứ tự items đã cập nhật. | `handlerDragChange(): void { /* đọc lại tabs().items() */ }` | `(outDragTabChange)="handlerDragChange()"` |
|
|
319
|
+
| `(outDisplayMoreItem)` | `boolean` | Emit `true` khi có tab bị ẩn vào menu More, `false` khi tất cả tab vừa. | `handlerDisplayMore(visible: boolean): void { this.hasMore.set(visible); }` | `(outDisplayMoreItem)="handlerDisplayMore($event)"` |
|
|
320
|
+
| `(outAction)` | `ITabsItemEvent` | Emit khi người dùng click vào action item (nút remove, configButtonLeft/Right). `key` là `'remove'` hoặc key action tùy chỉnh. | `handlerAction(event: ITabsItemEvent): void { if (event.key === 'remove') this.removeTab(event.item); }` | `(outAction)="handlerAction($event)"` |
|
|
109
321
|
|
|
110
322
|
## Types & Interfaces
|
|
111
323
|
|
|
112
324
|
```typescript
|
|
325
|
+
import {
|
|
326
|
+
ITabs,
|
|
327
|
+
ITabsItem,
|
|
328
|
+
ITabCssConfig,
|
|
329
|
+
ITabsFunctionControlEvent,
|
|
330
|
+
ITabsItemEvent,
|
|
331
|
+
TYPE_TAB_MODE,
|
|
332
|
+
} from '@libs-ui/components-tabs';
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
/** Cấu hình tổng thể cho component tabs */
|
|
113
337
|
export interface ITabs {
|
|
338
|
+
/** Danh sách các tab item dạng nested Signal — BẮT BUỘC */
|
|
114
339
|
items: WritableSignal<Array<WritableSignal<ITabsItem>>>;
|
|
340
|
+
|
|
341
|
+
/** Hiển thị ảnh avatar bên trái nhãn tab */
|
|
115
342
|
hasImage?: boolean;
|
|
343
|
+
|
|
344
|
+
/** Hiển thị badge số đếm bên phải nhãn tab */
|
|
116
345
|
hasCount?: boolean;
|
|
346
|
+
|
|
347
|
+
/** Hiển thị nút xóa (remove) trên mỗi tab */
|
|
117
348
|
allowRemove?: boolean;
|
|
349
|
+
|
|
350
|
+
/** Cấu hình nút xóa (IButton) */
|
|
351
|
+
configButtonRemove?: IButton;
|
|
352
|
+
|
|
353
|
+
/** Chế độ step wizard — hiển thị số thứ tự trên mỗi tab */
|
|
118
354
|
hasStep?: boolean;
|
|
119
|
-
|
|
355
|
+
|
|
356
|
+
/** Số bước đã hoàn thành — dùng với hasStep */
|
|
357
|
+
stepCompleted?: number;
|
|
358
|
+
|
|
359
|
+
/** Hiển thị nền cho step đã hoàn thành */
|
|
360
|
+
stepHasBackGround?: boolean;
|
|
361
|
+
|
|
362
|
+
/** Bỏ qua nền cho tab đang selected trong step mode */
|
|
363
|
+
ignoreSelectedBackgroundStep?: boolean;
|
|
364
|
+
|
|
365
|
+
/** Ẩn đường kẻ dưới trên tab header */
|
|
366
|
+
ignoreShowLineBottomInTab?: boolean;
|
|
367
|
+
|
|
368
|
+
/** Class CSS tùy chỉnh cho phần header */
|
|
369
|
+
classIncludeHeader?: string;
|
|
370
|
+
|
|
371
|
+
/** Class CSS cho vùng center của header */
|
|
372
|
+
classIncludeHeaderCenter?: string;
|
|
373
|
+
|
|
374
|
+
/** Class CSS cho vùng right của header */
|
|
375
|
+
classIncludeHeaderRight?: string;
|
|
376
|
+
|
|
377
|
+
/** Class CSS áp dụng lên mỗi tab item */
|
|
378
|
+
classIncludeItem?: string;
|
|
379
|
+
|
|
380
|
+
/** Class CSS áp dụng lên tab item đang active */
|
|
381
|
+
classIncludeActiveItem?: string;
|
|
382
|
+
|
|
383
|
+
/** Giới hạn chiều rộng tối đa (px) của nhãn tab */
|
|
384
|
+
maxWidthTextLabelItem?: number;
|
|
385
|
+
|
|
386
|
+
/** Cấu hình action ở góc phải header (popover với danh sách) */
|
|
387
|
+
actionRightConfig?: WritableSignal<{
|
|
388
|
+
getListViewConfig: TYPE_FUNCTION<WritableSignal<IListConfigItem>>;
|
|
389
|
+
config?: WritableSignal<IPopoverOverlay>;
|
|
390
|
+
onlyShowWhenHoverItemActive?: boolean;
|
|
391
|
+
classInclude?: string;
|
|
392
|
+
customView?: () => Observable<string>;
|
|
393
|
+
}>;
|
|
394
|
+
|
|
395
|
+
/** Bỏ qua margin-left cho nút "Xem thêm" */
|
|
396
|
+
viewMoreIgnoreMarginLeft?: boolean;
|
|
120
397
|
}
|
|
121
398
|
|
|
399
|
+
/** Cấu hình cho từng tab item */
|
|
122
400
|
export interface ITabsItem {
|
|
401
|
+
/** Định danh duy nhất của tab */
|
|
123
402
|
key?: string;
|
|
403
|
+
|
|
404
|
+
/** Class CSS bổ sung cho tab item */
|
|
405
|
+
classInclude?: string;
|
|
406
|
+
|
|
407
|
+
/** Vô hiệu hóa tab item này */
|
|
408
|
+
disable?: boolean;
|
|
409
|
+
|
|
410
|
+
/** Nhãn hiển thị (hỗ trợ i18n key) */
|
|
124
411
|
label?: string;
|
|
412
|
+
|
|
413
|
+
/** Class CSS cho nhãn */
|
|
414
|
+
classLabel?: string;
|
|
415
|
+
|
|
416
|
+
/** Icon class bên trái nhãn (vd: 'libs-ui-icon-mail') */
|
|
125
417
|
iconLeft?: string;
|
|
418
|
+
|
|
419
|
+
/** Icon class bên phải nhãn */
|
|
420
|
+
iconRight?: string;
|
|
421
|
+
|
|
422
|
+
/** Hiển thị red dot trên tab */
|
|
423
|
+
hasRedDot?: boolean;
|
|
424
|
+
|
|
425
|
+
/** Số đếm hiển thị dạng badge */
|
|
126
426
|
count?: number;
|
|
127
|
-
|
|
128
|
-
|
|
427
|
+
|
|
428
|
+
/** Chế độ hiển thị badge: 'x' | '0x' | 'x+' */
|
|
429
|
+
modeCount?: TYPE_BADGE_MODE;
|
|
430
|
+
|
|
431
|
+
/** Số tối đa hiển thị trước khi thêm '+' */
|
|
432
|
+
maxCount?: number;
|
|
433
|
+
|
|
434
|
+
/** Class CSS cho vòng tròn badge */
|
|
435
|
+
classCircle?: string;
|
|
436
|
+
|
|
437
|
+
/** URL ảnh avatar bên trái */
|
|
438
|
+
linkImage?: string;
|
|
439
|
+
|
|
440
|
+
/** URL ảnh fallback khi ảnh chính lỗi */
|
|
441
|
+
linkImageError?: string;
|
|
442
|
+
|
|
443
|
+
/** Trạng thái invalid — đổi màu sang đỏ trong step mode */
|
|
444
|
+
invalid?: boolean;
|
|
445
|
+
|
|
446
|
+
/** Nút action bên phải tab item */
|
|
447
|
+
configButtonRight?: IButton;
|
|
448
|
+
|
|
449
|
+
/** Nút action bên trái tab item */
|
|
450
|
+
configButtonLeft?: IButton;
|
|
451
|
+
|
|
452
|
+
/** Chiều rộng đã đo được — do component tự tính, không set thủ công */
|
|
453
|
+
specificWidth?: number;
|
|
454
|
+
|
|
455
|
+
/** Trạng thái hiển thị — do component tự quản lý */
|
|
456
|
+
specificDisplay?: boolean;
|
|
457
|
+
|
|
458
|
+
/** Thứ tự sắp xếp — do component tự quản lý */
|
|
459
|
+
order?: number;
|
|
460
|
+
|
|
461
|
+
/** Cho phép thêm thuộc tính tuỳ chỉnh */
|
|
462
|
+
[param: string]: any;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/** Override CSS theo từng mode */
|
|
466
|
+
export interface ITabCssConfig {
|
|
467
|
+
/** Class áp dụng cho tab đầu tiên */
|
|
468
|
+
first: string;
|
|
469
|
+
/** Class áp dụng cho các tab còn lại */
|
|
470
|
+
other: string;
|
|
471
|
+
/** Class áp dụng cho header wrapper */
|
|
472
|
+
header?: string;
|
|
473
|
+
/** Class áp dụng cho phần center của header */
|
|
474
|
+
headerCenter?: string;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/** API điều khiển tabs từ bên ngoài (nhận qua outFunctionsControl) */
|
|
478
|
+
export interface ITabsFunctionControlEvent {
|
|
479
|
+
/** Thêm tab item mới vào danh sách */
|
|
480
|
+
addTabsItem: (
|
|
481
|
+
item: WritableSignal<ITabsItem>,
|
|
482
|
+
selected?: boolean, // true = chuyển sang tab mới ngay
|
|
483
|
+
addFirst?: boolean, // true = thêm vào đầu danh sách
|
|
484
|
+
indexAdd?: number // vị trí cụ thể để chèn vào
|
|
485
|
+
) => Promise<void>;
|
|
486
|
+
|
|
487
|
+
/** Tính toán lại các tab cần hiển thị (dùng sau khi resize thủ công) */
|
|
488
|
+
calculatorTabsItemsDisplay: () => Promise<void>;
|
|
489
|
+
|
|
490
|
+
/** Chuyển sang tab theo key */
|
|
491
|
+
selectedTabsItem: (
|
|
492
|
+
key: string,
|
|
493
|
+
resetDisable?: boolean // true = bật lại tab dù đang disable
|
|
494
|
+
) => Promise<void>;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/** Dữ liệu emit từ outAction */
|
|
498
|
+
export interface ITabsItemEvent {
|
|
499
|
+
/** Key của action: 'remove' hoặc key action từ configButtonLeft/Right */
|
|
500
|
+
key: string;
|
|
501
|
+
/** Data của tab item liên quan */
|
|
502
|
+
item: ITabsItem;
|
|
129
503
|
}
|
|
504
|
+
|
|
505
|
+
/** Chế độ hiển thị của component */
|
|
506
|
+
export type TYPE_TAB_MODE = 'left' | 'center' | 'space-between' | 'center-has-line';
|
|
130
507
|
```
|
|
131
508
|
|
|
132
|
-
##
|
|
509
|
+
## Lưu ý quan trọng
|
|
510
|
+
|
|
511
|
+
⚠️ **Nested Signals bắt buộc**: `tabs.items` PHẢI là `WritableSignal<Array<WritableSignal<ITabsItem>>>`. Không truyền plain array — component sẽ không phản ứng khi thêm/xóa item.
|
|
512
|
+
|
|
513
|
+
⚠️ **useEffectUpdateItems khi items thay đổi động**: Khi danh sách tab được thay đổi từ bên ngoài component (vd: sau khi nhận dữ liệu từ API hoặc Modal), BẮT BUỘC bật `[useEffectUpdateItems]="true"` để component tự cập nhật danh sách hiển thị.
|
|
133
514
|
|
|
134
|
-
|
|
515
|
+
⚠️ **Calculator V2 khuyến nghị cho code mới**: `[useCalculatorV2]="true"` dùng `ResizeObserver` thay vì `MutationObserver` + `setTimeout` — không flicker, không reorder DOM, an toàn với `ChangeDetectionStrategy.OnPush`. Mặc định `false` để giữ backward compatible với code cũ.
|
|
135
516
|
|
|
136
|
-
|
|
137
|
-
| --------------------- | ------------------------------------ |
|
|
138
|
-
| `.libs-ui-tab` | Container chính của tabs component. |
|
|
139
|
-
| `.libs-ui-tab-header` | Header chứa danh sách các tab items. |
|
|
517
|
+
⚠️ **mode center-has-line cho step wizard**: Kết hợp với `tabs.hasStep = true` và `tabs.stepCompleted` để hiển thị chỉ báo bước hoàn thành. Nên dùng với `[ignoreCalculatorTab]="true"` khi số bước cố định.
|
|
140
518
|
|
|
141
|
-
|
|
519
|
+
⚠️ **allowRemove cần xử lý outAction**: Khi bật `tabs.allowRemove`, lắng nghe `(outAction)` để xử lý sự kiện `key === 'remove'`. Component chỉ emit event, không tự xóa item khỏi danh sách.
|
|
142
520
|
|
|
143
|
-
|
|
144
|
-
| --------------- | ------- | ---------------- |
|
|
145
|
-
| Angular | 18+ | Framework |
|
|
146
|
-
| Angular Signals | - | State management |
|
|
147
|
-
| TailwindCSS | 3.x | Styling |
|
|
148
|
-
| OnPush | - | Change Detection |
|
|
521
|
+
⚠️ **fieldKey và fieldLabel cho data custom**: Khi object item dùng tên trường khác `key`/`label` (vd: từ API trả về `id`/`name`), phải truyền `[fieldKey]="'id'"` và `[fieldLabel]="'name'"` để component đọc đúng trường.
|
|
149
522
|
|
|
150
523
|
## Demo
|
|
151
524
|
|
|
@@ -153,7 +526,9 @@ export interface ITabsItem {
|
|
|
153
526
|
npx nx serve core-ui
|
|
154
527
|
```
|
|
155
528
|
|
|
156
|
-
Truy cập: `http://localhost:4500/tabs`
|
|
529
|
+
Truy cập: `http://localhost:4500/tabs`
|
|
530
|
+
|
|
531
|
+
Bao gồm các ví dụ: Basic responsive, Center mode, Rich content (icon + badge), Drag & Drop, và tích hợp Modal V2 để cấu hình danh sách tab động.
|
|
157
532
|
|
|
158
533
|
## Unit Tests
|
|
159
534
|
|
|
@@ -161,6 +536,8 @@ Truy cập: `http://localhost:4500/tabs` để xem toàn bộ các demo từ cơ
|
|
|
161
536
|
npx nx test components-tabs
|
|
162
537
|
```
|
|
163
538
|
|
|
164
|
-
|
|
539
|
+
Chạy test cho file cụ thể:
|
|
165
540
|
|
|
166
|
-
|
|
541
|
+
```bash
|
|
542
|
+
npx nx test components-tabs --testFile=libs-ui/components/tabs/src/tabs.component.spec.ts
|
|
543
|
+
```
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { computed, signal, input, model, output, inject, ElementRef, effect, untracked,
|
|
2
|
+
import { computed, signal, input, model, output, inject, ElementRef, effect, untracked, Component, ChangeDetectionStrategy, DestroyRef, viewChild } from '@angular/core';
|
|
3
3
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
5
5
|
import { LibsUiComponentsDragContainerDirective, LibsUiDragItemDirective } from '@libs-ui/components-drag-drop';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-tabs.mjs","sources":["../../../../../libs-ui/components/tabs/src/item/item.component.ts","../../../../../libs-ui/components/tabs/src/item/item.component.html","../../../../../libs-ui/components/tabs/src/utils/tabs.ts","../../../../../libs-ui/components/tabs/src/tabs.component.ts","../../../../../libs-ui/components/tabs/src/tabs.component.html","../../../../../libs-ui/components/tabs/src/libs-ui-components-tabs.ts"],"sourcesContent":["import { AsyncPipe } from '@angular/common';\nimport { AfterViewInit, ChangeDetectionStrategy, Component, computed, effect, ElementRef, inject, input, model, OnDestroy, OnInit, output, signal, untracked } from '@angular/core';\nimport { LibsUiComponentsBadgeComponent } from '@libs-ui/components-badge';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IListDataEmitKey, LibsUiComponentsListComponent } from '@libs-ui/components-list';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { IEvent } from '@libs-ui/interfaces-types';\nimport { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';\nimport { escapeHtml, uuid } from '@libs-ui/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { debounceTime, Subject } from 'rxjs';\nimport { ITabs, ITabsItem, ITabsItemEvent, TYPE_TAB_MODE } from '../interfaces/tab.interface';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-tabs-item',\n templateUrl: './item.component.html',\n styleUrls: ['./item.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AsyncPipe, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsBadgeComponent, LibsUiComponentsListComponent, LibsUiPipesCallFunctionInTemplatePipe],\n})\nexport class LibsUiComponentsTabsItemComponent implements OnInit, AfterViewInit, OnDestroy {\n // #region PROPERTY\n protected labelComputed = computed(() => escapeHtml(this.translateService.instant(this.item()[this.fieldLabel()])));\n protected actionShowing = signal<boolean>(false);\n\n private readonly mutationObserver = signal<MutationObserver | undefined>(undefined);\n private readonly mutationObserverSubject = new Subject<void>();\n private resizeObserverV2: ResizeObserver | undefined;\n\n private readonly popoverFunctionControlEvent = signal<IPopoverFunctionControlEvent | undefined>(undefined);\n\n // #region INPUT\n readonly ignoreCalculatorTab = input.required<boolean>();\n readonly step = input.required<number>();\n readonly mode = input.required<TYPE_TAB_MODE>();\n readonly tabs = input.required<ITabs>();\n readonly item = model.required<ITabsItem>();\n readonly keySelected = input.required<string>();\n readonly fieldLabel = input.required<string>();\n readonly fieldKey = input.required<string>();\n readonly cssDefault = input.required<string>();\n readonly size = input.required<'langer' | 'medium'>();\n readonly disable = input<boolean>();\n readonly disableLabel = input<boolean>();\n readonly zIndex = input<number>();\n readonly changeViewTab = input.required<Subject<void>>();\n /** V2 mode — dùng ResizeObserver thay vì MutationObserver. Mặc định false để giữ behavior cũ. */\n readonly useCalculatorV2 = input<boolean>(false);\n\n // #region OUTPUT\n readonly outAction = output<ITabsItemEvent>();\n\n /* INJECT*/\n private readonly element = inject(ElementRef);\n private readonly translateService = inject(TranslateService);\n\n constructor() {\n effect(() => {\n if (this.useCalculatorV2()) {\n // V2 — ResizeObserver được setup ở ngAfterViewInit, effect không cần làm gì.\n return;\n }\n if (this.mode() !== 'left' || this.ignoreCalculatorTab()) {\n return;\n }\n untracked(() => {\n setTimeout(() => {\n this.updateSpecificWidth();\n this.mutationObserver()?.disconnect();\n this.mutationObserverSubject.pipe(debounceTime(10)).subscribe(() => this.updateSpecificWidth());\n this.mutationObserver.set(new MutationObserver(() => this.mutationObserverSubject.next()));\n this.mutationObserver()?.observe(this.element.nativeElement, { attributes: true, childList: true, subtree: true });\n });\n });\n });\n }\n\n ngOnInit() {\n if (!this.item().key) {\n this.item.update((item) => ({ ...item, key: uuid() }));\n }\n }\n\n ngAfterViewInit() {\n if (!this.useCalculatorV2() || this.ignoreCalculatorTab() || this.mode() !== 'left') {\n return;\n }\n this.setupResizeObserverV2();\n }\n\n /* FUNCTIONS */\n private setupResizeObserverV2() {\n if (this.resizeObserverV2 || typeof ResizeObserver === 'undefined') {\n return;\n }\n this.resizeObserverV2 = new ResizeObserver(() => this.updateSpecificWidth());\n this.resizeObserverV2.observe(this.element.nativeElement);\n }\n\n private updateSpecificWidth() {\n const preSpecificWidth = this.item().specificWidth;\n const width = this.element.nativeElement.offsetWidth;\n if (width && preSpecificWidth !== width) {\n this.item.update((item) => ({ ...item, specificWidth: width }));\n this.changeViewTab().next();\n }\n }\n\n protected handlerImgError(event: Event) {\n event.stopPropagation();\n (event as IEvent).target.src = this.item().linkImageError;\n }\n\n protected handlerSelectedKey(event: IListDataEmitKey | undefined) {\n if (!event) {\n return;\n }\n this.outAction.emit({ item: this.item(), key: event.key as string });\n this.popoverFunctionControlEvent()?.removePopoverOverlay();\n }\n\n protected handlerPopoverFunctionControlEvent(event: IPopoverFunctionControlEvent) {\n this.popoverFunctionControlEvent.set(event);\n }\n\n protected handlerPopoverEvent(event: TYPE_POPOVER_EVENT) {\n if (event !== 'show' && event !== 'remove') {\n return;\n }\n this.actionShowing.set(event === 'show');\n }\n\n protected handlerClickButton(event: Event, type: 'configButtonLeft' | 'configButtonRight' | 'remove') {\n event.stopPropagation();\n if (type === 'remove') {\n this.outAction.emit({ key: 'remove', item: this.item() });\n return;\n }\n const action = this.item()[type]?.action;\n if (action) {\n action(this.item());\n }\n }\n\n ngOnDestroy(): void {\n this.mutationObserver()?.disconnect();\n this.resizeObserverV2?.disconnect();\n this.resizeObserverV2 = undefined;\n }\n}\n","@if (item(); as item) {\n <div\n #itemEl\n class=\"libs-ui-tab-header-center-item {{ cssDefault() }} {{ item.classInclude || '' }} {{ item[fieldKey()] === keySelected() && tabs().classIncludeActiveItem ? tabs().classIncludeActiveItem : '' }}\"\n [attr.key]=\"item[fieldKey()]\"\n [attr.invalid]=\"item.invalid && !tabs().ignoreShowLineBottomInTab\"\n [attr.active]=\"item[fieldKey()] === keySelected() && !tabs().ignoreShowLineBottomInTab\"\n [attr.disable]=\"disable()\"\n [class.!cursor-pointer]=\"!disable()\"\n [class.!cursor-default]=\"disable()\"\n [class.libs-ui-tab-header-center-item-hover]=\"!tabs().ignoreShowLineBottomInTab\"\n [class.libs-ui-tab-header-center-item-action-show]=\"actionShowing()\">\n @if (tabs().hasImage) {\n <img\n class=\"libs-ui-tab-header-center-item-image {{ item.classImageInclude || '' }}\"\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"!item.popoverImage\"\n [config]=\"item.popoverImage\"\n [ignoreStopPropagationEvent]=\"true\"\n [class.libs-ui-disable]=\"disable()\"\n [src]=\"item.linkImage\"\n alt=\"\"\n [attr.key]=\"item[fieldKey()]\"\n (error)=\"handlerImgError($event)\" />\n }\n @if (item.iconLeft) {\n <i\n class=\"libs-ui-tab-header-center-item-icon libs-ui-mr-8px {{ item.iconLeft }}\"\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"!item.popoverIconLeft\"\n [config]=\"item.popoverIconLeft\"\n [ignoreStopPropagationEvent]=\"true\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.libs-ui-disable]=\"disable()\"></i>\n }\n @if (item.is_pin) {\n <i\n class=\"libs-ui-tab-header-center-item-icon mr-[8px] {{ item[fieldKey()] === keySelected() ? 'libs-ui-icon-pin-solid' : 'libs-ui-icon-pin-outline' }}\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.libs-ui-disable]=\"disable()\"></i>\n }\n @if (tabs().hasStep) {\n @if (tabs().stepHasBackGround) {\n <div\n class=\"libs-ui-tab-header-center-item-step !border-none libs-ui-font-h6m\"\n [class.!text-[#ffffff]]=\"item[fieldKey()] === keySelected() && !tabs().ignoreSelectedBackgroundStep && !item.invalid\"\n [class.!text-[var(--libs-ui-color-default)]]=\"item[fieldKey()] === keySelected() && tabs().ignoreSelectedBackgroundStep && !item.invalid\"\n [class.!text-[#f15767]]=\"item.invalid\"\n [class.bg-[#f8f9fa]]=\"step() > (tabs().stepCompleted || 0) && (tabs().ignoreSelectedBackgroundStep || disable()) && !item.invalid\"\n [class.bg-[#00bc62]]=\"step() <= (tabs().stepCompleted || -1) && !tabs().ignoreSelectedBackgroundStep && !item.invalid\"\n [class.bg-[var(--libs-ui-color-default)]]=\"item[fieldKey()] === keySelected() && !tabs().ignoreSelectedBackgroundStep && !item.invalid\"\n [class.bg-[var(--libs-ui-color-light-2)]]=\"((item[fieldKey()] === keySelected() && tabs().ignoreSelectedBackgroundStep) || (step() > (tabs().stepCompleted || 0) && !tabs().ignoreSelectedBackgroundStep)) && !item.invalid\"\n [class.!bg-[#fdeaec]]=\"item.invalid\">\n @if (step() <= (tabs().stepCompleted || -1)) {\n <i class=\"libs-ui-icon-check text-[#ffffff]\"></i>\n } @else {\n <span [class.text-[#cdd0d6]]=\"disable()\">{{ step() }}</span>\n }\n </div>\n } @else {\n <div\n class=\"libs-ui-tab-header-center-item-step\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.libs-ui-disable]=\"disable()\">\n <span>{{ step() }}</span>\n </div>\n }\n }\n @if (item.configButtonLeft) {\n <libs_ui-components-buttons-button\n [type]=\"item.configButtonLeft.type || 'button-link-third'\"\n [classInclude]=\"item.configButtonLeft.classInclude || ''\"\n [classIconLeft]=\"item.configButtonLeft.classIconLeft || ''\"\n [classLabel]=\"item.configButtonLeft.classLabel || ''\"\n [classIconRight]=\"item.configButtonLeft.classIconRight || ''\"\n [label]=\"item.configButtonLeft.label || ''\"\n [popover]=\"item.configButtonLeft.popover || {}\"\n (outClick)=\"handlerClickButton($event, 'configButtonLeft')\" />\n }\n @if (item[fieldLabel()]) {\n <div\n class=\"relative flex\"\n [style.maxWidth.px]=\"tabs().maxWidthTextLabelItem || 160\">\n <span\n LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{ position: { mode: step() === 1 ? 'start' : 'center', distance: 0 }, zIndex: zIndex() }\"\n [attr.size]=\"size()\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.!text-[#f15767]]=\"item.invalid\"\n [ignoreStopPropagationEvent]=\"true\"\n [classInclude]=\"'w-full libs-ui-tab-header-center-item-label ' + (item.classLabel || 'libs-ui-font-h6m') + (disableLabel() && disable() ? ' libs-ui-disable' : '') + (tabs().stepHasBackGround && disable() ? ' text-[#cdd0d6]' : '')\"\n [innerHTML]=\"labelComputed()\"></span>\n @if (item.hasRedDot) {\n <div class=\"absolute right-[-6px] top-[-2px] w-[6px] h-[6px] bg-[#ee2d41] rounded-[6px]\"></div>\n }\n </div>\n }\n @if (item.popover) {\n <i\n class=\"libs-ui-tab-header-center-item-icon ml-[8px] libs-ui-icon-tooltip-outline\"\n LibsUiComponentsPopoverDirective\n [config]=\"item.popover\"\n [ignoreStopPropagationEvent]=\"true\"\n [class.libs-ui-disable]=\"disable()\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"></i>\n }\n @if (item.iconRight && !item.iconRightBehindBadge) {\n <i\n class=\"libs-ui-tab-header-center-item-icon {{ item.iconRight }}\"\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"!item.popoverIconRight\"\n [config]=\"item.popoverIconRight\"\n [ignoreStopPropagationEvent]=\"true\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.libs-ui-disable]=\"disable()\"></i>\n }\n @if (item.count !== undefined) {\n <libs_ui-components-badge\n [mode]=\"item.modeCount || 'x+'\"\n [count]=\"item.count\"\n [maxCount]=\"item.maxCount || 99\"\n [classCircle]=\"(item.classCircle || 'libs-ui-font-h5r') + (item.invalid ? ' !text-[#f15767] !bg-[#fdeaec]' : '')\"\n [active]=\"item[fieldKey()] === keySelected()\"\n [class.libs-ui-disable]=\"disable()\" />\n }\n @if (item.iconRight && item.iconRightBehindBadge) {\n <i\n class=\"libs-ui-tab-header-center-item-icon {{ item.iconRight }}\"\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"!item.popoverIconRight\"\n [config]=\"item.popoverIconRight\"\n [ignoreStopPropagationEvent]=\"true\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.libs-ui-disable]=\"disable()\"></i>\n }\n @if (item.configButtonRight) {\n <libs_ui-components-buttons-button\n [type]=\"item.configButtonRight.type || 'button-link-third'\"\n [classInclude]=\"item.configButtonRight.classInclude || ''\"\n [classIconLeft]=\"item.configButtonRight.classIconLeft || ''\"\n [classLabel]=\"item.configButtonRight.classLabel || ''\"\n [classIconRight]=\"item.configButtonRight.classIconRight || ''\"\n [popover]=\"item.configButtonRight.popover || {}\"\n [label]=\"item.configButtonRight.label || ''\"\n (outClick)=\"handlerClickButton($event, 'configButtonRight')\" />\n }\n @if (tabs().actionRightConfig?.(); as right) {\n <libs_ui-components-popover\n [class]=\"right.classInclude || 'ml-[8px]'\"\n [class.libs-ui-tab-header-center-item-action]=\"right.onlyShowWhenHoverItemActive\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [mode]=\"'click-toggle'\"\n [ignoreStopPropagationEvent]=\"true\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [elementRefCustom]=\"right.onlyShowWhenHoverItemActive ? undefined : itemEl\"\n [config]=\"{\n zIndex: right.config?.()?.zIndex || 1000,\n maxHeight: right.config?.()?.maxHeight || 287,\n maxWidth: right.config?.()?.maxWidth || 2048,\n width: right.config?.()?.width || 220,\n direction: right.config?.()?.direction || 'bottom',\n template: right.config?.()?.template || actionEl,\n classInclude: (right.config?.()?.classInclude || '') + ' !rounded-[4px] overflow-hidden',\n whiteTheme: true,\n ignoreArrow: true,\n position: right.config?.()?.position || { mode: 'start', distance: 0 },\n }\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\">\n @if (right.customView) {\n <div [innerHtml]=\"item[fieldKey()] | LibsUiPipesCallFunctionInTemplatePipe: right.customView : item\"></div>\n } @else {\n <i\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.invalid]=\"item.invalid\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class]=\"right.onlyShowWhenHoverItemActive ? 'libs-ui-icon-more-vertical rotate-90 libs-ui-tab-header-center-item-icon' : 'libs-ui-icon-chevron-right rotate-90 libs-ui-tab-header-center-item-icon'\"></i>\n }\n </libs_ui-components-popover>\n <ng-template #actionEl>\n @if (0 | LibsUiPipesCallFunctionInTemplatePipe: right.getListViewConfig : item : item[fieldKey()] : { valueIs0: 0 } | async; as config) {\n <libs_ui-components-list\n [config]=\"config()\"\n [maxItemShow]=\"5\"\n [hiddenInputSearch]=\"true\"\n [paddingLeftItem]=\"true\"\n (outSelectKey)=\"handlerSelectedKey($event)\" />\n }\n </ng-template>\n }\n @if (tabs().allowRemove && tabs().items().length > 1) {\n <libs_ui-components-buttons-button\n [type]=\"tabs().configButtonRemove?.type || 'button-link-custom'\"\n [iconOnlyType]=\"tabs().configButtonRemove?.iconOnlyType || true\"\n [classInclude]=\"tabs().configButtonRemove?.classInclude || 'ml-[8px] !p-0'\"\n [classIconLeft]=\"tabs().configButtonRemove?.classIconLeft || 'libs-ui-icon-close'\"\n [classLabel]=\"tabs().configButtonRemove?.classLabel || ''\"\n [classIconRight]=\"tabs().configButtonRemove?.classIconRight || ''\"\n [popover]=\"tabs().configButtonRemove?.popover || { config: { content: 'i18n_delete' } }\"\n [label]=\"tabs().configButtonRemove?.label || ''\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#6a7383',\n text_hover: '#f15767',\n text_active: '#f15767',\n text_disable: '#cdd0d6',\n },\n rootColor: '#f15767',\n }\"\n (outClick)=\"handlerClickButton($event, 'remove')\" />\n }\n </div>\n}\n","import { signal } from '@angular/core';\nimport { IDataFunctionCallInConfig, IListConfigItem } from '@libs-ui/components-list';\nimport { IHttpRequestConfig, returnListObject } from '@libs-ui/services-http-request';\nimport { convertObjectToSignal, escapeHtml, isNil } from '@libs-ui/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { of } from 'rxjs';\nimport { ITabs, ITabsItem } from '../interfaces/tab.interface';\n\nexport const tabMoreListConfig = (translate: TranslateService, fieldKey: string, fieldLabel: string, tabs: ITabs, disable: boolean | undefined): IListConfigItem => {\n return {\n type: 'text',\n httpRequestData: signal<IHttpRequestConfig>({\n objectInstance: returnListObject(\n tabs\n .items()\n .filter((item) => !item().specificDisplay)\n .map((item) => item())\n ),\n functionName: 'listObservable',\n argumentsValue: [],\n }),\n configTemplateText: signal({\n fieldKey: fieldKey || 'key',\n getClassItem: () => '!py-[12px]',\n classRows: 'w-full',\n notUseVirtualScroll: true,\n rows: convertObjectToSignal([\n {\n classCols: 'flex items-center',\n cols: [\n {\n getPopover: (item: ITabsItem) => {\n if (!tabs.hasStep) {\n return;\n }\n const step = (item.order || 0) + 1;\n let classStep = 'bg-[#f8f9fa] text-[#9ca2ad]';\n if (item.invalid) {\n classStep = '!text-[#f15767] !bg-[#fdeaec]';\n }\n if (item.disable || disable) {\n classStep = 'bg-[#f8f9fa] text-[#cdd0d6]';\n }\n return {\n classInclude: 'flex',\n dataView: `\n <div class=\"libs-ui-font-h6m rounded-full min-w-[24px] min-h-[24px] flex items-center justify-center mr-[8px] ${classStep}\">\n ${step <= (tabs.stepCompleted || -1) ? `<i class=\"libs-ui-icon-check text-[#ffffff]\"></i>` : `${step}`}\n </div>\n `,\n };\n },\n },\n {\n getPopover: (item: ITabsItem) => (item.iconLeft ? { classInclude: 'flex', dataView: `<i class=\"${item.iconLeft} text-[16px] mr-[8px]\"></i>` } : undefined),\n },\n {\n getClassCol: (item: ITabsItem) => `libs-ui-font-h6m ${item.invalid ? '!text-[#f15767]' : 'text-[#6a7383]'}`,\n getValue: (data: IDataFunctionCallInConfig) => of(escapeHtml(translate.instant(data.item[fieldLabel] || ' '))),\n },\n {\n getPopover: (item: ITabsItem) => (item.popover ? { config: item.popover } : undefined),\n },\n {\n getPopover: (item: ITabsItem) => (item.iconRight ? { classInclude: 'flex', dataView: `<i class=\"${item.iconRight} text-[16px] ml-[8px]\"></i>` } : undefined),\n },\n {\n getConfigBadge: (item: ITabsItem) => {\n if (isNil(item.count)) {\n return;\n }\n return {\n mode: item.modeCount || 'x+',\n count: item.count,\n maxCount: item.maxCount || 99,\n classCircle: (item.classCircle || 'libs-ui-font-h5r') + (item.invalid ? ' !text-[#f15767] !bg-[#fdeaec]' : ''),\n };\n },\n },\n ],\n },\n ]),\n }),\n };\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, inject, input, model, OnDestroy, OnInit, output, signal, untracked, viewChild, WritableSignal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IDrop, LibsUiComponentsDragContainerDirective, LibsUiDragItemDirective } from '@libs-ui/components-drag-drop';\nimport { IListDataEmitKey, LibsUiComponentsListComponent } from '@libs-ui/components-list';\nimport { IPopover, IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { convertObjectToSignal, isNil, uuid } from '@libs-ui/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { fromEvent, Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { ITabCssConfig, ITabs, ITabsFunctionControlEvent, ITabsItem, ITabsItemEvent, TYPE_TAB_MODE } from './interfaces/tab.interface';\nimport { LibsUiComponentsTabsItemComponent } from './item/item.component';\nimport { tabMoreListConfig } from './utils/tabs';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-tabs',\n templateUrl: './tabs.component.html',\n styleUrls: ['./tabs.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsDragContainerDirective, LibsUiDragItemDirective, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsTabsItemComponent, LibsUiComponentsListComponent],\n})\nexport class LibsUiComponentsTabsComponent implements OnInit, AfterViewInit, OnDestroy {\n // #region PROPERTY\n protected itemsDisplay = signal<Array<WritableSignal<ITabsItem>>>([]);\n protected displayMoreItem = signal<boolean>(false);\n protected tabMoreListConfig = computed(() => tabMoreListConfig(this.translate, this.fieldKey(), this.fieldLabel(), this.tabs(), this.disable()));\n protected changeViewTab = new Subject<void>();\n protected groupName = signal<string>(uuid());\n protected stylesDragDropOverrideComputed = computed(() => this.updateStylesDragDropOverride());\n /**\n * V2 — số item đang hiển thị (specificDisplay !== false). Dùng cho mode `space-between`\n * tính width đều cho các item visible (item hidden ở `position: absolute` không chiếm chỗ).\n */\n protected displayedCount = computed(() => {\n if (!this.useCalculatorV2()) return this.itemsDisplay().length || 1;\n const count = this.itemsDisplay().filter((s) => s().specificDisplay !== false).length;\n return count || 1;\n });\n\n /** V2 — kích thước container do ResizeObserver cập nhật, dùng để compute synchronous. */\n private readonly containerWidthV2 = signal<number>(0);\n private readonly headerLeftWidthV2 = signal<number>(0);\n private readonly headerRightWidthV2 = signal<number>(0);\n private resizeObserverV2: ResizeObserver | undefined;\n\n private readonly popoverFunctionControlEvent = signal<IPopoverFunctionControlEvent | undefined>(undefined);\n private readonly onDestroy = new Subject<void>();\n private readonly destroyRef = inject(DestroyRef);\n\n // #region INPUT\n readonly tabs = input.required<ITabs>();\n readonly keySelected = model.required<string>();\n readonly mode = input<TYPE_TAB_MODE>('left');\n readonly fieldKey = input<string>('key');\n readonly fieldLabel = input<string>('label');\n readonly disable = input<boolean>();\n readonly disableLabel = input<boolean>();\n readonly heightTabItem = input<number>(40);\n readonly ignoreCalculatorTab = input<boolean>(false);\n readonly size = input<'langer' | 'medium'>('medium');\n readonly allowDragDropPosition = input<boolean>();\n readonly zIndex = input<number>();\n readonly configCss = model<ITabCssConfig>();\n readonly popoverShowMoreTabItem = input<IPopover>();\n readonly checkCanChangeTabSelected = input<() => boolean | Promise<boolean>>();\n readonly useEffectUpdateItems = input<boolean>();\n /**\n * V2 mode — khi `true`:\n * - Bỏ container đo song song (không render 2 lần).\n * - Dùng ResizeObserver thay MutationObserver/setTimeout/debounce.\n * - Compute synchronous, không reorder items → không flicker.\n * Mặc định `false` để giữ 100% behavior cũ (backward compatible).\n */\n readonly useCalculatorV2 = input<boolean>(false);\n\n // #region OUTPUT\n readonly outKeySelected = output<string>();\n readonly outFunctionsControl = output<ITabsFunctionControlEvent>();\n readonly outDragTabChange = output<void>();\n readonly outDisplayMoreItem = output<boolean>();\n readonly outAction = output<ITabsItemEvent>();\n\n /* VIEW CHILD */\n private readonly headerEl = viewChild.required<ElementRef>('headerEl');\n private readonly headerLeftEl = viewChild.required<ElementRef>('headerLeftEl');\n private readonly headerRightEl = viewChild.required<ElementRef>('headerRightEl');\n\n /* INJECT*/\n private readonly translate = inject(TranslateService);\n\n constructor() {\n effect(() => {\n const items = this.tabs()?.items();\n if (!this.useEffectUpdateItems()) return;\n untracked(() => {\n this.updateItemsDisplay(items);\n });\n });\n\n // V2 — effect tự động recompute khi container/headerLeft/headerRight đổi kích thước hoặc selected đổi.\n effect(() => {\n if (!this.useCalculatorV2()) return;\n const containerWidth = this.containerWidthV2();\n // Đọc cả các signal phụ thuộc để effect tự re-run khi chúng đổi.\n this.headerLeftWidthV2();\n this.headerRightWidthV2();\n this.keySelected();\n const items = this.tabs()?.items();\n if (!containerWidth || !items?.length) return;\n untracked(() => this.computeDisplayItemsV2(items));\n });\n }\n\n ngOnInit() {\n this.updateTabsCssConfig();\n this.outFunctionsControl.emit(this.FunctionsControl);\n if (!this.useEffectUpdateItems()) {\n this.updateItemsDisplay(this.tabs()?.items());\n }\n fromEvent(window, 'resize')\n .pipe(debounceTime(250), takeUntil(this.onDestroy))\n .subscribe(() => {\n if (!this.tabs().items().length) {\n return;\n }\n // V2 không cần xử lý resize ở đây — ResizeObserver tự fire.\n if (this.useCalculatorV2()) {\n return;\n }\n this.displayMoreItem.set(false);\n this.calculatorTabsItemDisplay();\n });\n // V1 path: preserve old behavior với debounce(20).\n this.changeViewTab.pipe(debounceTime(20), takeUntil(this.onDestroy)).subscribe(() => {\n if (this.useCalculatorV2()) return;\n this.calculatorTabsItemDisplay();\n });\n // V2 path: chạy sync (không debounce) — ResizeObserver đã batch theo frame.\n this.changeViewTab.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n if (!this.useCalculatorV2()) return;\n const items = this.tabs()?.items();\n if (items?.length) this.computeDisplayItemsV2(items);\n });\n }\n\n ngAfterViewInit() {\n if (this.useCalculatorV2()) {\n this.setupResizeObserverV2();\n }\n }\n\n private setupResizeObserverV2() {\n if (this.resizeObserverV2 || typeof ResizeObserver === 'undefined') {\n return;\n }\n const headerEl = this.headerEl()?.nativeElement;\n const headerLeftEl = this.headerLeftEl()?.nativeElement;\n const headerRightEl = this.headerRightEl()?.nativeElement;\n if (!headerEl) return;\n\n this.resizeObserverV2 = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const target = entry.target;\n const width = (target as HTMLElement).clientWidth || 0;\n switch (target) {\n case headerEl:\n if (this.containerWidthV2() !== width) this.containerWidthV2.set(width);\n break;\n case headerLeftEl:\n if (this.headerLeftWidthV2() !== width) this.headerLeftWidthV2.set(width);\n break;\n case headerRightEl:\n if (this.headerRightWidthV2() !== width) this.headerRightWidthV2.set(width);\n break;\n }\n }\n });\n this.resizeObserverV2.observe(headerEl);\n if (headerLeftEl) this.resizeObserverV2.observe(headerLeftEl);\n if (headerRightEl) this.resizeObserverV2.observe(headerRightEl);\n }\n\n private updateItemsDisplay(items: Array<WritableSignal<ITabsItem>>) {\n if (!items) return;\n untracked(() => {\n if (this.mode() !== 'left' || this.ignoreCalculatorTab()) {\n items.forEach((item) => item.update((data) => ({ ...data, specificDisplay: true })));\n this.itemsDisplay.set(items);\n return;\n }\n if (this.useCalculatorV2()) {\n // V2: itemsDisplay chứa toàn bộ items (không filter). ResizeObserver sẽ đo width\n // và compute sẽ set specificDisplay flag — style binding ẩn item overflow.\n items.forEach((item) => item.update((data) => ({ ...data, specificDisplay: true })));\n this.itemsDisplay.set([...items]);\n if (this.containerWidthV2()) {\n this.computeDisplayItemsV2(items);\n }\n return;\n }\n this.calculatorTabsItemDisplay();\n });\n }\n\n /* FUNCTIONS */\n public get FunctionsControl(): ITabsFunctionControlEvent {\n return {\n addTabsItem: this.addTabsItem.bind(this),\n calculatorTabsItemsDisplay: this.calculatorTabsItemDisplayDispatch.bind(this),\n selectedTabsItem: this.handlerSelectedTabsItem.bind(this),\n };\n }\n\n private updateTabsCssConfig() {\n if (this.configCss()) {\n return;\n }\n switch (this.mode()) {\n case 'left':\n this.configCss.set({\n first: 'ml-[20px] mr-[16px]',\n other: 'ml-[20px] mr-[16px]',\n });\n break;\n case 'center':\n this.configCss.set({\n first: 'px-[12px] ml-[18px] mr-[18px]',\n other: 'px-[12px] mx-[18px]',\n header: 'flex justify-center',\n });\n break;\n case 'center-has-line':\n this.configCss.set({\n first: 'px-[16px]',\n other: 'px-[16px]',\n headerCenter: 'items-center',\n });\n break;\n case 'space-between':\n this.configCss.set({\n first: 'mx-auto',\n other: 'mx-auto',\n headerCenter: 'w-full',\n });\n break;\n }\n }\n\n private updateStylesDragDropOverride() {\n if (this.allowDragDropPosition()) {\n return [\n {\n className: 'libs-ui-drag-drop-item-placeholder',\n styles: '',\n },\n {\n className: 'libs-ui-drag-drop-item',\n styles: 'cursor: move;',\n },\n {\n className: 'libs-ui-drag-drop-item-dragging',\n styles: 'cursor: move; background: #dddddd;',\n },\n ];\n }\n return [\n {\n className: 'libs-ui-drag-drop-item',\n styles: '',\n },\n {\n className: 'libs-ui-drag-drop-item-disable',\n styles: '',\n },\n ];\n }\n\n protected handlerDropContainer(event: IDrop) {\n const { itemDragInfo } = event;\n if (!itemDragInfo) {\n return;\n }\n const items = this.tabs().items;\n const { indexDrag, indexDrop } = itemDragInfo;\n if (isNil(indexDrag) || isNil(indexDrop) || indexDrop === indexDrag) {\n return;\n }\n const itemDrag = items()[indexDrag];\n items.update((items) => {\n items.splice(indexDrag, 1);\n items.splice(indexDrop, 0, itemDrag);\n return [...items];\n });\n this.outDragTabChange.emit();\n }\n\n protected handlerPopoverFunctionControlEvent(event: IPopoverFunctionControlEvent) {\n this.popoverFunctionControlEvent.set(event);\n }\n\n private async handlerSelectedTabsItem(key: string, resetDisable = true) {\n const itemSelected = this.tabs()\n .items()\n .find((item) => item()[this.fieldKey()] === key);\n if (!itemSelected) {\n return;\n }\n if (resetDisable) {\n itemSelected.update((item) => ({ ...item, disable: false }));\n }\n this.handlerClickItem(itemSelected);\n }\n\n protected handlerSelectedKey(event: IListDataEmitKey | undefined) {\n if (!event) {\n return;\n }\n this.handlerClickItem(convertObjectToSignal(event.item));\n this.outDragTabChange.emit();\n }\n\n protected async handlerClickItem(item: WritableSignal<ITabsItem>) {\n if (item().disable || this.disable()) {\n return;\n }\n const checkCanChangeTabSelected = this.checkCanChangeTabSelected();\n if (checkCanChangeTabSelected) {\n const state = await checkCanChangeTabSelected();\n if (state) {\n this.changeItemSelected(item);\n }\n return;\n }\n this.changeItemSelected(item);\n }\n\n private changeItemSelected(item: WritableSignal<ITabsItem>) {\n this.keySelected.set(item()[this.fieldKey()]);\n this.outKeySelected.emit(this.keySelected());\n this.popoverFunctionControlEvent()?.removePopoverOverlay();\n this.calculatorTabsItemDisplayDispatch();\n }\n\n protected async handlerAction(event: ITabsItemEvent) {\n this.outAction.emit(event);\n }\n\n private async addTabsItem(item: WritableSignal<ITabsItem>, selected = true, addFirst?: boolean, indexAdd?: number) {\n const items = this.tabs().items;\n items.update((items) => {\n if (addFirst) {\n return [item, ...items];\n }\n if (indexAdd) {\n items.splice(indexAdd, 0, item);\n return items;\n }\n return [...items, item];\n });\n if (selected) {\n this.handlerClickItem(item);\n }\n }\n\n /** Dispatch sang nhánh V1 hoặc V2 dựa theo flag. Public API giữ nguyên signature. */\n private async calculatorTabsItemDisplayDispatch() {\n if (this.useCalculatorV2()) {\n const items = this.tabs()?.items();\n if (items?.length) this.computeDisplayItemsV2(items);\n return;\n }\n await this.calculatorTabsItemDisplay();\n }\n\n protected async calculatorTabsItemDisplay() {\n let items = this.tabs().items();\n const indexItemSelected = items.findIndex((item) => item()[this.fieldKey()] === this.keySelected());\n if (indexItemSelected < 0) {\n return;\n }\n this.displayMoreItem.set(false);\n let displayMoreItem = false;\n const headerWidth = this.headerEl().nativeElement.clientWidth || 0;\n const itemSelected = items[indexItemSelected];\n const itemSelectedWidth = itemSelected().specificWidth;\n let totalWidthItemsDisplay = (this.headerLeftEl().nativeElement.clientWidth || 0) + (this.headerRightEl().nativeElement.clientWidth || 0) + 32;\n items.forEach((item, index) => {\n if (!item().specificWidth) {\n return;\n }\n item.update((data) => ({ ...data, specificDisplay: false }));\n const itemWidth = item().specificWidth || 0;\n const width = totalWidthItemsDisplay + itemWidth + (index < indexItemSelected ? itemSelectedWidth : 0);\n totalWidthItemsDisplay += itemWidth;\n if (width > headerWidth) {\n displayMoreItem = true;\n return;\n }\n item.update((data) => ({ ...data, specificDisplay: true }));\n });\n itemSelected.update((data) => ({ ...data, specificDisplay: true }));\n const display = items.filter((item) => item().specificDisplay === true);\n const notDisplay = items.filter((item) => item().specificDisplay === false);\n items = display.concat(notDisplay);\n items.forEach((item, index) => item.update((data) => ({ ...data, order: index })));\n const sortedItems = [...items].sort((prev, next) => (prev().order || 0) - (next().order || 0));\n // Check if order actually changed before setting to avoid triggering redundant cycles\n const orderChanged = items.some((item, index) => item()[this.fieldKey()] !== sortedItems[index]()[this.fieldKey()]);\n\n if (orderChanged) {\n this.tabs().items.set(sortedItems);\n }\n\n this.displayMoreItem.set(displayMoreItem);\n this.outDisplayMoreItem.emit(this.displayMoreItem());\n\n const newItemsDisplay = this.tabs()\n .items()\n .filter((item) => item().specificDisplay);\n this.itemsDisplay.set(newItemsDisplay);\n }\n\n /**\n * V2 — Tính displayItems synchronous, không reorder, không setTimeout.\n *\n * Why: tránh flicker do reorder DOM + bỏ thuật toán \"cảm tính\" debounce.\n * How to apply: gọi mỗi khi container width / headerLeft / headerRight / item widths / selected key đổi.\n */\n private computeDisplayItemsV2(items: Array<WritableSignal<ITabsItem>>) {\n if (this.mode() !== 'left' || this.ignoreCalculatorTab()) {\n items.forEach((item) => item.update((data) => ({ ...data, specificDisplay: true })));\n this.itemsDisplay.set([...items]);\n this.displayMoreItem.set(false);\n this.outDisplayMoreItem.emit(false);\n return;\n }\n\n const headerWidth = this.containerWidthV2();\n if (!headerWidth) return;\n\n const indexItemSelected = items.findIndex((item) => item()[this.fieldKey()] === this.keySelected());\n if (indexItemSelected < 0) return;\n\n const itemSelected = items[indexItemSelected];\n const itemSelectedWidth = itemSelected().specificWidth || 0;\n const reservedWidth = this.headerLeftWidthV2() + this.headerRightWidthV2() + 32;\n\n let totalWidth = reservedWidth;\n let displayMoreItem = false;\n\n items.forEach((item, index) => {\n const itemWidth = item().specificWidth || 0;\n if (!itemWidth) {\n // Chưa có width — tạm hiển thị để ResizeObserver có element mà đo.\n item.update((data) => ({ ...data, specificDisplay: true }));\n return;\n }\n // Reserve space cho selected nếu item này nằm trước selected.\n const projected = totalWidth + itemWidth + (index < indexItemSelected ? itemSelectedWidth : 0);\n totalWidth += itemWidth;\n if (projected > headerWidth) {\n item.update((data) => ({ ...data, specificDisplay: false }));\n displayMoreItem = true;\n return;\n }\n item.update((data) => ({ ...data, specificDisplay: true }));\n });\n // Selected luôn hiển thị.\n itemSelected.update((data) => ({ ...data, specificDisplay: true }));\n\n // V2: itemsDisplay chứa TẤT CẢ items — không filter. Item overflow được ẩn qua style binding\n // (visibility: hidden + position: absolute) để giữ DOM stable, tránh mount/unmount gây flicker.\n // ResizeObserver luôn đo được width vì mọi item luôn có DOM.\n const allItems = [...items];\n const currentDisplay = this.itemsDisplay();\n // Chỉ set khi nội dung array thực sự đổi (tránh CD thừa).\n const arrayChanged = allItems.length !== currentDisplay.length || allItems.some((it, i) => it !== currentDisplay[i]);\n if (arrayChanged) {\n this.itemsDisplay.set(allItems);\n }\n\n if (this.displayMoreItem() !== displayMoreItem) {\n this.displayMoreItem.set(displayMoreItem);\n this.outDisplayMoreItem.emit(displayMoreItem);\n }\n }\n\n ngOnDestroy() {\n this.resizeObserverV2?.disconnect();\n this.resizeObserverV2 = undefined;\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","<div class=\"libs-ui-tab\">\n <div\n #headerEl\n class=\"libs-ui-tab-header z-[1] {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div\n #headerLeftEl\n class=\"libs-ui-tab-header-left\">\n <ng-content select=\"div.libs-ui-tab-header-left\"></ng-content>\n </div>\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n <div\n class=\"!flex w-full\"\n #elementContainerEl\n LibsUiComponentsDragContainerDirective\n [stylesOverride]=\"stylesDragDropOverrideComputed()\"\n [groupName]=\"groupName()\"\n [(items)]=\"itemsDisplay\"\n [directionDrag]=\"'horizontal'\"\n [disableDragContainer]=\"!allowDragDropPosition()\"\n [acceptDragSameGroup]=\"allowDragDropPosition()\"\n (outDroppedContainer)=\"handlerDropContainer($event)\">\n @for (item of itemsDisplay(); track item) {\n <div\n LibsUiDragItemDirective\n [disable]=\"disable() || !allowDragDropPosition() || (useCalculatorV2() && item().specificDisplay === false)\"\n [elementContainer]=\"elementContainerEl\"\n [dragBoundary]=\"true\"\n [dragBoundaryAcceptMouseLeaveContainer]=\"true\"\n class=\"relative libs-ui-tab-item-container\"\n [style.width.px]=\"mode() === 'space-between' ? elementContainerEl.clientWidth / displayedCount() : undefined\"\n [class.flex]=\"mode() === 'center-has-line'\"\n [class.items-center]=\"mode() === 'center-has-line'\"\n [style.visibility]=\"useCalculatorV2() && item().specificDisplay === false ? 'hidden' : null\"\n [style.position]=\"useCalculatorV2() && item().specificDisplay === false ? 'absolute' : null\"\n [style.pointer-events]=\"useCalculatorV2() && item().specificDisplay === false ? 'none' : null\"\n [attr.aria-hidden]=\"useCalculatorV2() && item().specificDisplay === false ? 'true' : null\">\n @if (allowDragDropPosition() && !disable()) {\n <span class=\"libs-ui-icon-arrange text-[#9ca2ad] absolute top-[14px] left-[4px]\"></span>\n }\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [class.!pointer-events-none]=\"item().disable || disable()\"\n [disable]=\"item().disable || disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [ignoreCalculatorTab]=\"ignoreCalculatorTab() || !useCalculatorV2()\"\n [useCalculatorV2]=\"useCalculatorV2()\"\n [changeViewTab]=\"changeViewTab\"\n (click)=\"handlerClickItem(item)\"\n (keydown.enter)=\"handlerClickItem(item)\"\n (outAction)=\"handlerAction($event)\" />\n @if (mode() === 'center-has-line' && !$last) {\n <div class=\"w-[40px] h-[1px] bg-[#e6e7ea]\"></div>\n }\n </div>\n }\n </div>\n </div>\n <div\n class=\"flex items-center\"\n [class.ml-auto]=\"displayMoreItem() && !tabs().viewMoreIgnoreMarginLeft\">\n @if (displayMoreItem()) {\n <libs_ui-components-popover\n class=\"w-full h-full flex items-center\"\n [mode]=\"'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{\n zIndex: popoverShowMoreTabItem()?.config?.zIndex || 1000,\n maxHeight: popoverShowMoreTabItem()?.config?.maxHeight || 287,\n maxWidth: popoverShowMoreTabItem()?.config?.maxWidth || 2048,\n width: popoverShowMoreTabItem()?.config?.width || 277,\n direction: popoverShowMoreTabItem()?.config?.direction || 'bottom',\n template: popoverShowMoreTabItem()?.config?.template || menuEl,\n whiteTheme: true,\n ignoreArrow: true,\n position: popoverShowMoreTabItem()?.config?.position || { mode: 'end', distance: 0 },\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classInclude]=\"'!p-[8px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical rotate-90 text-[16px] mr-0'\"\n [popover]=\"{ config: { content: popoverShowMoreTabItem()?.config?.content || 'i18n_view_more' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-popover>\n }\n </div>\n <div\n #headerRightEl\n class=\"libs-ui-tab-header-right {{ tabs().classIncludeHeaderRight || '' }}\">\n <ng-content select=\"div.libs-ui-tab-header-right\"></ng-content>\n </div>\n </div>\n @if (!useCalculatorV2()) {\n <div class=\"absolute top-0 z-0 w-full\">\n <div\n class=\"libs-ui-tab-header {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n @for (item of tabs().items(); track item) {\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [disable]=\"disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [changeViewTab]=\"changeViewTab\"\n [ignoreCalculatorTab]=\"ignoreCalculatorTab()\" />\n }\n </div>\n </div>\n </div>\n }\n</div>\n<ng-template #menuEl>\n <libs_ui-components-list\n [config]=\"tabMoreListConfig()\"\n [maxItemShow]=\"5\"\n [hiddenInputSearch]=\"true\"\n [paddingLeftItem]=\"true\"\n (outSelectKey)=\"handlerSelectedKey($event)\" />\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["debounceTime"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-tabs.mjs","sources":["../../../../../libs-ui/components/tabs/src/item/item.component.ts","../../../../../libs-ui/components/tabs/src/item/item.component.html","../../../../../libs-ui/components/tabs/src/utils/tabs.ts","../../../../../libs-ui/components/tabs/src/tabs.component.ts","../../../../../libs-ui/components/tabs/src/tabs.component.html","../../../../../libs-ui/components/tabs/src/libs-ui-components-tabs.ts"],"sourcesContent":["import { AsyncPipe } from '@angular/common';\nimport { AfterViewInit, ChangeDetectionStrategy, Component, computed, effect, ElementRef, inject, input, model, OnDestroy, OnInit, output, signal, untracked } from '@angular/core';\nimport { LibsUiComponentsBadgeComponent } from '@libs-ui/components-badge';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IListDataEmitKey, LibsUiComponentsListComponent } from '@libs-ui/components-list';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { IEvent } from '@libs-ui/interfaces-types';\nimport { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';\nimport { escapeHtml, uuid } from '@libs-ui/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { debounceTime, Subject } from 'rxjs';\nimport { ITabs, ITabsItem, ITabsItemEvent, TYPE_TAB_MODE } from '../interfaces/tab.interface';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-tabs-item',\n templateUrl: './item.component.html',\n styleUrls: ['./item.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AsyncPipe, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsBadgeComponent, LibsUiComponentsListComponent, LibsUiPipesCallFunctionInTemplatePipe],\n})\nexport class LibsUiComponentsTabsItemComponent implements OnInit, AfterViewInit, OnDestroy {\n // #region PROPERTY\n protected labelComputed = computed(() => escapeHtml(this.translateService.instant(this.item()[this.fieldLabel()])));\n protected actionShowing = signal<boolean>(false);\n\n private readonly mutationObserver = signal<MutationObserver | undefined>(undefined);\n private readonly mutationObserverSubject = new Subject<void>();\n private resizeObserverV2: ResizeObserver | undefined;\n\n private readonly popoverFunctionControlEvent = signal<IPopoverFunctionControlEvent | undefined>(undefined);\n\n // #region INPUT\n readonly ignoreCalculatorTab = input.required<boolean>();\n readonly step = input.required<number>();\n readonly mode = input.required<TYPE_TAB_MODE>();\n readonly tabs = input.required<ITabs>();\n readonly item = model.required<ITabsItem>();\n readonly keySelected = input.required<string>();\n readonly fieldLabel = input.required<string>();\n readonly fieldKey = input.required<string>();\n readonly cssDefault = input.required<string>();\n readonly size = input.required<'langer' | 'medium'>();\n readonly disable = input<boolean>();\n readonly disableLabel = input<boolean>();\n readonly zIndex = input<number>();\n readonly changeViewTab = input.required<Subject<void>>();\n /** V2 mode — dùng ResizeObserver thay vì MutationObserver. Mặc định false để giữ behavior cũ. */\n readonly useCalculatorV2 = input<boolean>(false);\n\n // #region OUTPUT\n readonly outAction = output<ITabsItemEvent>();\n\n /* INJECT*/\n private readonly element = inject(ElementRef);\n private readonly translateService = inject(TranslateService);\n\n constructor() {\n effect(() => {\n if (this.useCalculatorV2()) {\n // V2 — ResizeObserver được setup ở ngAfterViewInit, effect không cần làm gì.\n return;\n }\n if (this.mode() !== 'left' || this.ignoreCalculatorTab()) {\n return;\n }\n untracked(() => {\n setTimeout(() => {\n this.updateSpecificWidth();\n this.mutationObserver()?.disconnect();\n this.mutationObserverSubject.pipe(debounceTime(10)).subscribe(() => this.updateSpecificWidth());\n this.mutationObserver.set(new MutationObserver(() => this.mutationObserverSubject.next()));\n this.mutationObserver()?.observe(this.element.nativeElement, { attributes: true, childList: true, subtree: true });\n });\n });\n });\n }\n\n ngOnInit() {\n if (!this.item().key) {\n this.item.update((item) => ({ ...item, key: uuid() }));\n }\n }\n\n ngAfterViewInit() {\n if (!this.useCalculatorV2() || this.ignoreCalculatorTab() || this.mode() !== 'left') {\n return;\n }\n this.setupResizeObserverV2();\n }\n\n /* FUNCTIONS */\n private setupResizeObserverV2() {\n if (this.resizeObserverV2 || typeof ResizeObserver === 'undefined') {\n return;\n }\n this.resizeObserverV2 = new ResizeObserver(() => this.updateSpecificWidth());\n this.resizeObserverV2.observe(this.element.nativeElement);\n }\n\n private updateSpecificWidth() {\n const preSpecificWidth = this.item().specificWidth;\n const width = this.element.nativeElement.offsetWidth;\n if (width && preSpecificWidth !== width) {\n this.item.update((item) => ({ ...item, specificWidth: width }));\n this.changeViewTab().next();\n }\n }\n\n protected handlerImgError(event: Event) {\n event.stopPropagation();\n (event as IEvent).target.src = this.item().linkImageError;\n }\n\n protected handlerSelectedKey(event: IListDataEmitKey | undefined) {\n if (!event) {\n return;\n }\n this.outAction.emit({ item: this.item(), key: event.key as string });\n this.popoverFunctionControlEvent()?.removePopoverOverlay();\n }\n\n protected handlerPopoverFunctionControlEvent(event: IPopoverFunctionControlEvent) {\n this.popoverFunctionControlEvent.set(event);\n }\n\n protected handlerPopoverEvent(event: TYPE_POPOVER_EVENT) {\n if (event !== 'show' && event !== 'remove') {\n return;\n }\n this.actionShowing.set(event === 'show');\n }\n\n protected handlerClickButton(event: Event, type: 'configButtonLeft' | 'configButtonRight' | 'remove') {\n event.stopPropagation();\n if (type === 'remove') {\n this.outAction.emit({ key: 'remove', item: this.item() });\n return;\n }\n const action = this.item()[type]?.action;\n if (action) {\n action(this.item());\n }\n }\n\n ngOnDestroy(): void {\n this.mutationObserver()?.disconnect();\n this.resizeObserverV2?.disconnect();\n this.resizeObserverV2 = undefined;\n }\n}\n","@if (item(); as item) {\n <div\n #itemEl\n class=\"libs-ui-tab-header-center-item {{ cssDefault() }} {{ item.classInclude || '' }} {{ item[fieldKey()] === keySelected() && tabs().classIncludeActiveItem ? tabs().classIncludeActiveItem : '' }}\"\n [attr.key]=\"item[fieldKey()]\"\n [attr.invalid]=\"item.invalid && !tabs().ignoreShowLineBottomInTab\"\n [attr.active]=\"item[fieldKey()] === keySelected() && !tabs().ignoreShowLineBottomInTab\"\n [attr.disable]=\"disable()\"\n [class.!cursor-pointer]=\"!disable()\"\n [class.!cursor-default]=\"disable()\"\n [class.libs-ui-tab-header-center-item-hover]=\"!tabs().ignoreShowLineBottomInTab\"\n [class.libs-ui-tab-header-center-item-action-show]=\"actionShowing()\">\n @if (tabs().hasImage) {\n <img\n class=\"libs-ui-tab-header-center-item-image {{ item.classImageInclude || '' }}\"\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"!item.popoverImage\"\n [config]=\"item.popoverImage\"\n [ignoreStopPropagationEvent]=\"true\"\n [class.libs-ui-disable]=\"disable()\"\n [src]=\"item.linkImage\"\n alt=\"\"\n [attr.key]=\"item[fieldKey()]\"\n (error)=\"handlerImgError($event)\" />\n }\n @if (item.iconLeft) {\n <i\n class=\"libs-ui-tab-header-center-item-icon libs-ui-mr-8px {{ item.iconLeft }}\"\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"!item.popoverIconLeft\"\n [config]=\"item.popoverIconLeft\"\n [ignoreStopPropagationEvent]=\"true\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.libs-ui-disable]=\"disable()\"></i>\n }\n @if (item.is_pin) {\n <i\n class=\"libs-ui-tab-header-center-item-icon mr-[8px] {{ item[fieldKey()] === keySelected() ? 'libs-ui-icon-pin-solid' : 'libs-ui-icon-pin-outline' }}\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.libs-ui-disable]=\"disable()\"></i>\n }\n @if (tabs().hasStep) {\n @if (tabs().stepHasBackGround) {\n <div\n class=\"libs-ui-tab-header-center-item-step !border-none libs-ui-font-h6m\"\n [class.!text-[#ffffff]]=\"item[fieldKey()] === keySelected() && !tabs().ignoreSelectedBackgroundStep && !item.invalid\"\n [class.!text-[var(--libs-ui-color-default)]]=\"item[fieldKey()] === keySelected() && tabs().ignoreSelectedBackgroundStep && !item.invalid\"\n [class.!text-[#f15767]]=\"item.invalid\"\n [class.bg-[#f8f9fa]]=\"step() > (tabs().stepCompleted || 0) && (tabs().ignoreSelectedBackgroundStep || disable()) && !item.invalid\"\n [class.bg-[#00bc62]]=\"step() <= (tabs().stepCompleted || -1) && !tabs().ignoreSelectedBackgroundStep && !item.invalid\"\n [class.bg-[var(--libs-ui-color-default)]]=\"item[fieldKey()] === keySelected() && !tabs().ignoreSelectedBackgroundStep && !item.invalid\"\n [class.bg-[var(--libs-ui-color-light-2)]]=\"((item[fieldKey()] === keySelected() && tabs().ignoreSelectedBackgroundStep) || (step() > (tabs().stepCompleted || 0) && !tabs().ignoreSelectedBackgroundStep)) && !item.invalid\"\n [class.!bg-[#fdeaec]]=\"item.invalid\">\n @if (step() <= (tabs().stepCompleted || -1)) {\n <i class=\"libs-ui-icon-check text-[#ffffff]\"></i>\n } @else {\n <span [class.text-[#cdd0d6]]=\"disable()\">{{ step() }}</span>\n }\n </div>\n } @else {\n <div\n class=\"libs-ui-tab-header-center-item-step\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.libs-ui-disable]=\"disable()\">\n <span>{{ step() }}</span>\n </div>\n }\n }\n @if (item.configButtonLeft) {\n <libs_ui-components-buttons-button\n [type]=\"item.configButtonLeft.type || 'button-link-third'\"\n [classInclude]=\"item.configButtonLeft.classInclude || ''\"\n [classIconLeft]=\"item.configButtonLeft.classIconLeft || ''\"\n [classLabel]=\"item.configButtonLeft.classLabel || ''\"\n [classIconRight]=\"item.configButtonLeft.classIconRight || ''\"\n [label]=\"item.configButtonLeft.label || ''\"\n [popover]=\"item.configButtonLeft.popover || {}\"\n (outClick)=\"handlerClickButton($event, 'configButtonLeft')\" />\n }\n @if (item[fieldLabel()]) {\n <div\n class=\"relative flex\"\n [style.maxWidth.px]=\"tabs().maxWidthTextLabelItem || 160\">\n <span\n LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{ position: { mode: step() === 1 ? 'start' : 'center', distance: 0 }, zIndex: zIndex() }\"\n [attr.size]=\"size()\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.!text-[#f15767]]=\"item.invalid\"\n [ignoreStopPropagationEvent]=\"true\"\n [classInclude]=\"'w-full libs-ui-tab-header-center-item-label ' + (item.classLabel || 'libs-ui-font-h6m') + (disableLabel() && disable() ? ' libs-ui-disable' : '') + (tabs().stepHasBackGround && disable() ? ' text-[#cdd0d6]' : '')\"\n [innerHTML]=\"labelComputed()\"></span>\n @if (item.hasRedDot) {\n <div class=\"absolute right-[-6px] top-[-2px] w-[6px] h-[6px] bg-[#ee2d41] rounded-[6px]\"></div>\n }\n </div>\n }\n @if (item.popover) {\n <i\n class=\"libs-ui-tab-header-center-item-icon ml-[8px] libs-ui-icon-tooltip-outline\"\n LibsUiComponentsPopoverDirective\n [config]=\"item.popover\"\n [ignoreStopPropagationEvent]=\"true\"\n [class.libs-ui-disable]=\"disable()\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"></i>\n }\n @if (item.iconRight && !item.iconRightBehindBadge) {\n <i\n class=\"libs-ui-tab-header-center-item-icon {{ item.iconRight }}\"\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"!item.popoverIconRight\"\n [config]=\"item.popoverIconRight\"\n [ignoreStopPropagationEvent]=\"true\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.libs-ui-disable]=\"disable()\"></i>\n }\n @if (item.count !== undefined) {\n <libs_ui-components-badge\n [mode]=\"item.modeCount || 'x+'\"\n [count]=\"item.count\"\n [maxCount]=\"item.maxCount || 99\"\n [classCircle]=\"(item.classCircle || 'libs-ui-font-h5r') + (item.invalid ? ' !text-[#f15767] !bg-[#fdeaec]' : '')\"\n [active]=\"item[fieldKey()] === keySelected()\"\n [class.libs-ui-disable]=\"disable()\" />\n }\n @if (item.iconRight && item.iconRightBehindBadge) {\n <i\n class=\"libs-ui-tab-header-center-item-icon {{ item.iconRight }}\"\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"!item.popoverIconRight\"\n [config]=\"item.popoverIconRight\"\n [ignoreStopPropagationEvent]=\"true\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class.libs-ui-disable]=\"disable()\"></i>\n }\n @if (item.configButtonRight) {\n <libs_ui-components-buttons-button\n [type]=\"item.configButtonRight.type || 'button-link-third'\"\n [classInclude]=\"item.configButtonRight.classInclude || ''\"\n [classIconLeft]=\"item.configButtonRight.classIconLeft || ''\"\n [classLabel]=\"item.configButtonRight.classLabel || ''\"\n [classIconRight]=\"item.configButtonRight.classIconRight || ''\"\n [popover]=\"item.configButtonRight.popover || {}\"\n [label]=\"item.configButtonRight.label || ''\"\n (outClick)=\"handlerClickButton($event, 'configButtonRight')\" />\n }\n @if (tabs().actionRightConfig?.(); as right) {\n <libs_ui-components-popover\n [class]=\"right.classInclude || 'ml-[8px]'\"\n [class.libs-ui-tab-header-center-item-action]=\"right.onlyShowWhenHoverItemActive\"\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [mode]=\"'click-toggle'\"\n [ignoreStopPropagationEvent]=\"true\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [elementRefCustom]=\"right.onlyShowWhenHoverItemActive ? undefined : itemEl\"\n [config]=\"{\n zIndex: right.config?.()?.zIndex || 1000,\n maxHeight: right.config?.()?.maxHeight || 287,\n maxWidth: right.config?.()?.maxWidth || 2048,\n width: right.config?.()?.width || 220,\n direction: right.config?.()?.direction || 'bottom',\n template: right.config?.()?.template || actionEl,\n classInclude: (right.config?.()?.classInclude || '') + ' !rounded-[4px] overflow-hidden',\n whiteTheme: true,\n ignoreArrow: true,\n position: right.config?.()?.position || { mode: 'start', distance: 0 },\n }\"\n (outEvent)=\"handlerPopoverEvent($event)\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\">\n @if (right.customView) {\n <div [innerHtml]=\"item[fieldKey()] | LibsUiPipesCallFunctionInTemplatePipe: right.customView : item\"></div>\n } @else {\n <i\n [attr.active]=\"item[fieldKey()] === keySelected()\"\n [attr.invalid]=\"item.invalid\"\n [attr.completed]=\"step() <= (tabs().stepCompleted || -1)\"\n [class]=\"right.onlyShowWhenHoverItemActive ? 'libs-ui-icon-more-vertical rotate-90 libs-ui-tab-header-center-item-icon' : 'libs-ui-icon-chevron-right rotate-90 libs-ui-tab-header-center-item-icon'\"></i>\n }\n </libs_ui-components-popover>\n <ng-template #actionEl>\n @if (0 | LibsUiPipesCallFunctionInTemplatePipe: right.getListViewConfig : item : item[fieldKey()] : { valueIs0: 0 } | async; as config) {\n <libs_ui-components-list\n [config]=\"config()\"\n [maxItemShow]=\"5\"\n [hiddenInputSearch]=\"true\"\n [paddingLeftItem]=\"true\"\n (outSelectKey)=\"handlerSelectedKey($event)\" />\n }\n </ng-template>\n }\n @if (tabs().allowRemove && tabs().items().length > 1) {\n <libs_ui-components-buttons-button\n [type]=\"tabs().configButtonRemove?.type || 'button-link-custom'\"\n [iconOnlyType]=\"tabs().configButtonRemove?.iconOnlyType || true\"\n [classInclude]=\"tabs().configButtonRemove?.classInclude || 'ml-[8px] !p-0'\"\n [classIconLeft]=\"tabs().configButtonRemove?.classIconLeft || 'libs-ui-icon-close'\"\n [classLabel]=\"tabs().configButtonRemove?.classLabel || ''\"\n [classIconRight]=\"tabs().configButtonRemove?.classIconRight || ''\"\n [popover]=\"tabs().configButtonRemove?.popover || { config: { content: 'i18n_delete' } }\"\n [label]=\"tabs().configButtonRemove?.label || ''\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#6a7383',\n text_hover: '#f15767',\n text_active: '#f15767',\n text_disable: '#cdd0d6',\n },\n rootColor: '#f15767',\n }\"\n (outClick)=\"handlerClickButton($event, 'remove')\" />\n }\n </div>\n}\n","import { signal } from '@angular/core';\nimport { IDataFunctionCallInConfig, IListConfigItem } from '@libs-ui/components-list';\nimport { IHttpRequestConfig, returnListObject } from '@libs-ui/services-http-request';\nimport { convertObjectToSignal, escapeHtml, isNil } from '@libs-ui/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { of } from 'rxjs';\nimport { ITabs, ITabsItem } from '../interfaces/tab.interface';\n\nexport const tabMoreListConfig = (translate: TranslateService, fieldKey: string, fieldLabel: string, tabs: ITabs, disable: boolean | undefined): IListConfigItem => {\n return {\n type: 'text',\n httpRequestData: signal<IHttpRequestConfig>({\n objectInstance: returnListObject(\n tabs\n .items()\n .filter((item) => !item().specificDisplay)\n .map((item) => item())\n ),\n functionName: 'listObservable',\n argumentsValue: [],\n }),\n configTemplateText: signal({\n fieldKey: fieldKey || 'key',\n getClassItem: () => '!py-[12px]',\n classRows: 'w-full',\n notUseVirtualScroll: true,\n rows: convertObjectToSignal([\n {\n classCols: 'flex items-center',\n cols: [\n {\n getPopover: (item: ITabsItem) => {\n if (!tabs.hasStep) {\n return;\n }\n const step = (item.order || 0) + 1;\n let classStep = 'bg-[#f8f9fa] text-[#9ca2ad]';\n if (item.invalid) {\n classStep = '!text-[#f15767] !bg-[#fdeaec]';\n }\n if (item.disable || disable) {\n classStep = 'bg-[#f8f9fa] text-[#cdd0d6]';\n }\n return {\n classInclude: 'flex',\n dataView: `\n <div class=\"libs-ui-font-h6m rounded-full min-w-[24px] min-h-[24px] flex items-center justify-center mr-[8px] ${classStep}\">\n ${step <= (tabs.stepCompleted || -1) ? `<i class=\"libs-ui-icon-check text-[#ffffff]\"></i>` : `${step}`}\n </div>\n `,\n };\n },\n },\n {\n getPopover: (item: ITabsItem) => (item.iconLeft ? { classInclude: 'flex', dataView: `<i class=\"${item.iconLeft} text-[16px] mr-[8px]\"></i>` } : undefined),\n },\n {\n getClassCol: (item: ITabsItem) => `libs-ui-font-h6m ${item.invalid ? '!text-[#f15767]' : 'text-[#6a7383]'}`,\n getValue: (data: IDataFunctionCallInConfig) => of(escapeHtml(translate.instant(data.item[fieldLabel] || ' '))),\n },\n {\n getPopover: (item: ITabsItem) => (item.popover ? { config: item.popover } : undefined),\n },\n {\n getPopover: (item: ITabsItem) => (item.iconRight ? { classInclude: 'flex', dataView: `<i class=\"${item.iconRight} text-[16px] ml-[8px]\"></i>` } : undefined),\n },\n {\n getConfigBadge: (item: ITabsItem) => {\n if (isNil(item.count)) {\n return;\n }\n return {\n mode: item.modeCount || 'x+',\n count: item.count,\n maxCount: item.maxCount || 99,\n classCircle: (item.classCircle || 'libs-ui-font-h5r') + (item.invalid ? ' !text-[#f15767] !bg-[#fdeaec]' : ''),\n };\n },\n },\n ],\n },\n ]),\n }),\n };\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, inject, input, model, OnDestroy, OnInit, output, signal, untracked, viewChild, WritableSignal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IDrop, LibsUiComponentsDragContainerDirective, LibsUiDragItemDirective } from '@libs-ui/components-drag-drop';\nimport { IListDataEmitKey, LibsUiComponentsListComponent } from '@libs-ui/components-list';\nimport { IPopover, IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { convertObjectToSignal, isNil, uuid } from '@libs-ui/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { fromEvent, Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { ITabCssConfig, ITabs, ITabsFunctionControlEvent, ITabsItem, ITabsItemEvent, TYPE_TAB_MODE } from './interfaces/tab.interface';\nimport { LibsUiComponentsTabsItemComponent } from './item/item.component';\nimport { tabMoreListConfig } from './utils/tabs';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-tabs',\n templateUrl: './tabs.component.html',\n styleUrls: ['./tabs.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsDragContainerDirective, LibsUiDragItemDirective, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsTabsItemComponent, LibsUiComponentsListComponent],\n})\nexport class LibsUiComponentsTabsComponent implements OnInit, AfterViewInit, OnDestroy {\n // #region PROPERTY\n protected itemsDisplay = signal<Array<WritableSignal<ITabsItem>>>([]);\n protected displayMoreItem = signal<boolean>(false);\n protected tabMoreListConfig = computed(() => tabMoreListConfig(this.translate, this.fieldKey(), this.fieldLabel(), this.tabs(), this.disable()));\n protected changeViewTab = new Subject<void>();\n protected groupName = signal<string>(uuid());\n protected stylesDragDropOverrideComputed = computed(() => this.updateStylesDragDropOverride());\n /**\n * V2 — số item đang hiển thị (specificDisplay !== false). Dùng cho mode `space-between`\n * tính width đều cho các item visible (item hidden ở `position: absolute` không chiếm chỗ).\n */\n protected displayedCount = computed(() => {\n if (!this.useCalculatorV2()) return this.itemsDisplay().length || 1;\n const count = this.itemsDisplay().filter((s) => s().specificDisplay !== false).length;\n return count || 1;\n });\n\n /** V2 — kích thước container do ResizeObserver cập nhật, dùng để compute synchronous. */\n private readonly containerWidthV2 = signal<number>(0);\n private readonly headerLeftWidthV2 = signal<number>(0);\n private readonly headerRightWidthV2 = signal<number>(0);\n private resizeObserverV2: ResizeObserver | undefined;\n\n private readonly popoverFunctionControlEvent = signal<IPopoverFunctionControlEvent | undefined>(undefined);\n private readonly onDestroy = new Subject<void>();\n private readonly destroyRef = inject(DestroyRef);\n\n // #region INPUT\n readonly tabs = input.required<ITabs>();\n readonly keySelected = model.required<string>();\n readonly mode = input<TYPE_TAB_MODE>('left');\n readonly fieldKey = input<string>('key');\n readonly fieldLabel = input<string>('label');\n readonly disable = input<boolean>();\n readonly disableLabel = input<boolean>();\n readonly heightTabItem = input<number>(40);\n readonly ignoreCalculatorTab = input<boolean>(false);\n readonly size = input<'langer' | 'medium'>('medium');\n readonly allowDragDropPosition = input<boolean>();\n readonly zIndex = input<number>();\n readonly configCss = model<ITabCssConfig>();\n readonly popoverShowMoreTabItem = input<IPopover>();\n readonly checkCanChangeTabSelected = input<() => boolean | Promise<boolean>>();\n readonly useEffectUpdateItems = input<boolean>();\n /**\n * V2 mode — khi `true`:\n * - Bỏ container đo song song (không render 2 lần).\n * - Dùng ResizeObserver thay MutationObserver/setTimeout/debounce.\n * - Compute synchronous, không reorder items → không flicker.\n * Mặc định `false` để giữ 100% behavior cũ (backward compatible).\n */\n readonly useCalculatorV2 = input<boolean>(false);\n\n // #region OUTPUT\n readonly outKeySelected = output<string>();\n readonly outFunctionsControl = output<ITabsFunctionControlEvent>();\n readonly outDragTabChange = output<void>();\n readonly outDisplayMoreItem = output<boolean>();\n readonly outAction = output<ITabsItemEvent>();\n\n /* VIEW CHILD */\n private readonly headerEl = viewChild.required<ElementRef>('headerEl');\n private readonly headerLeftEl = viewChild.required<ElementRef>('headerLeftEl');\n private readonly headerRightEl = viewChild.required<ElementRef>('headerRightEl');\n\n /* INJECT*/\n private readonly translate = inject(TranslateService);\n\n constructor() {\n effect(() => {\n const items = this.tabs()?.items();\n if (!this.useEffectUpdateItems()) return;\n untracked(() => {\n this.updateItemsDisplay(items);\n });\n });\n\n // V2 — effect tự động recompute khi container/headerLeft/headerRight đổi kích thước hoặc selected đổi.\n effect(() => {\n if (!this.useCalculatorV2()) return;\n const containerWidth = this.containerWidthV2();\n // Đọc cả các signal phụ thuộc để effect tự re-run khi chúng đổi.\n this.headerLeftWidthV2();\n this.headerRightWidthV2();\n this.keySelected();\n const items = this.tabs()?.items();\n if (!containerWidth || !items?.length) return;\n untracked(() => this.computeDisplayItemsV2(items));\n });\n }\n\n ngOnInit() {\n this.updateTabsCssConfig();\n this.outFunctionsControl.emit(this.FunctionsControl);\n if (!this.useEffectUpdateItems()) {\n this.updateItemsDisplay(this.tabs()?.items());\n }\n fromEvent(window, 'resize')\n .pipe(debounceTime(250), takeUntil(this.onDestroy))\n .subscribe(() => {\n if (!this.tabs().items().length) {\n return;\n }\n // V2 không cần xử lý resize ở đây — ResizeObserver tự fire.\n if (this.useCalculatorV2()) {\n return;\n }\n this.displayMoreItem.set(false);\n this.calculatorTabsItemDisplay();\n });\n // V1 path: preserve old behavior với debounce(20).\n this.changeViewTab.pipe(debounceTime(20), takeUntil(this.onDestroy)).subscribe(() => {\n if (this.useCalculatorV2()) return;\n this.calculatorTabsItemDisplay();\n });\n // V2 path: chạy sync (không debounce) — ResizeObserver đã batch theo frame.\n this.changeViewTab.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n if (!this.useCalculatorV2()) return;\n const items = this.tabs()?.items();\n if (items?.length) this.computeDisplayItemsV2(items);\n });\n }\n\n ngAfterViewInit() {\n if (this.useCalculatorV2()) {\n this.setupResizeObserverV2();\n }\n }\n\n private setupResizeObserverV2() {\n if (this.resizeObserverV2 || typeof ResizeObserver === 'undefined') {\n return;\n }\n const headerEl = this.headerEl()?.nativeElement;\n const headerLeftEl = this.headerLeftEl()?.nativeElement;\n const headerRightEl = this.headerRightEl()?.nativeElement;\n if (!headerEl) return;\n\n this.resizeObserverV2 = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const target = entry.target;\n const width = (target as HTMLElement).clientWidth || 0;\n switch (target) {\n case headerEl:\n if (this.containerWidthV2() !== width) this.containerWidthV2.set(width);\n break;\n case headerLeftEl:\n if (this.headerLeftWidthV2() !== width) this.headerLeftWidthV2.set(width);\n break;\n case headerRightEl:\n if (this.headerRightWidthV2() !== width) this.headerRightWidthV2.set(width);\n break;\n }\n }\n });\n this.resizeObserverV2.observe(headerEl);\n if (headerLeftEl) this.resizeObserverV2.observe(headerLeftEl);\n if (headerRightEl) this.resizeObserverV2.observe(headerRightEl);\n }\n\n private updateItemsDisplay(items: Array<WritableSignal<ITabsItem>>) {\n if (!items) return;\n untracked(() => {\n if (this.mode() !== 'left' || this.ignoreCalculatorTab()) {\n items.forEach((item) => item.update((data) => ({ ...data, specificDisplay: true })));\n this.itemsDisplay.set(items);\n return;\n }\n if (this.useCalculatorV2()) {\n // V2: itemsDisplay chứa toàn bộ items (không filter). ResizeObserver sẽ đo width\n // và compute sẽ set specificDisplay flag — style binding ẩn item overflow.\n items.forEach((item) => item.update((data) => ({ ...data, specificDisplay: true })));\n this.itemsDisplay.set([...items]);\n if (this.containerWidthV2()) {\n this.computeDisplayItemsV2(items);\n }\n return;\n }\n this.calculatorTabsItemDisplay();\n });\n }\n\n /* FUNCTIONS */\n public get FunctionsControl(): ITabsFunctionControlEvent {\n return {\n addTabsItem: this.addTabsItem.bind(this),\n calculatorTabsItemsDisplay: this.calculatorTabsItemDisplayDispatch.bind(this),\n selectedTabsItem: this.handlerSelectedTabsItem.bind(this),\n };\n }\n\n private updateTabsCssConfig() {\n if (this.configCss()) {\n return;\n }\n switch (this.mode()) {\n case 'left':\n this.configCss.set({\n first: 'ml-[20px] mr-[16px]',\n other: 'ml-[20px] mr-[16px]',\n });\n break;\n case 'center':\n this.configCss.set({\n first: 'px-[12px] ml-[18px] mr-[18px]',\n other: 'px-[12px] mx-[18px]',\n header: 'flex justify-center',\n });\n break;\n case 'center-has-line':\n this.configCss.set({\n first: 'px-[16px]',\n other: 'px-[16px]',\n headerCenter: 'items-center',\n });\n break;\n case 'space-between':\n this.configCss.set({\n first: 'mx-auto',\n other: 'mx-auto',\n headerCenter: 'w-full',\n });\n break;\n }\n }\n\n private updateStylesDragDropOverride() {\n if (this.allowDragDropPosition()) {\n return [\n {\n className: 'libs-ui-drag-drop-item-placeholder',\n styles: '',\n },\n {\n className: 'libs-ui-drag-drop-item',\n styles: 'cursor: move;',\n },\n {\n className: 'libs-ui-drag-drop-item-dragging',\n styles: 'cursor: move; background: #dddddd;',\n },\n ];\n }\n return [\n {\n className: 'libs-ui-drag-drop-item',\n styles: '',\n },\n {\n className: 'libs-ui-drag-drop-item-disable',\n styles: '',\n },\n ];\n }\n\n protected handlerDropContainer(event: IDrop) {\n const { itemDragInfo } = event;\n if (!itemDragInfo) {\n return;\n }\n const items = this.tabs().items;\n const { indexDrag, indexDrop } = itemDragInfo;\n if (isNil(indexDrag) || isNil(indexDrop) || indexDrop === indexDrag) {\n return;\n }\n const itemDrag = items()[indexDrag];\n items.update((items) => {\n items.splice(indexDrag, 1);\n items.splice(indexDrop, 0, itemDrag);\n return [...items];\n });\n this.outDragTabChange.emit();\n }\n\n protected handlerPopoverFunctionControlEvent(event: IPopoverFunctionControlEvent) {\n this.popoverFunctionControlEvent.set(event);\n }\n\n private async handlerSelectedTabsItem(key: string, resetDisable = true) {\n const itemSelected = this.tabs()\n .items()\n .find((item) => item()[this.fieldKey()] === key);\n if (!itemSelected) {\n return;\n }\n if (resetDisable) {\n itemSelected.update((item) => ({ ...item, disable: false }));\n }\n this.handlerClickItem(itemSelected);\n }\n\n protected handlerSelectedKey(event: IListDataEmitKey | undefined) {\n if (!event) {\n return;\n }\n this.handlerClickItem(convertObjectToSignal(event.item));\n this.outDragTabChange.emit();\n }\n\n protected async handlerClickItem(item: WritableSignal<ITabsItem>) {\n if (item().disable || this.disable()) {\n return;\n }\n const checkCanChangeTabSelected = this.checkCanChangeTabSelected();\n if (checkCanChangeTabSelected) {\n const state = await checkCanChangeTabSelected();\n if (state) {\n this.changeItemSelected(item);\n }\n return;\n }\n this.changeItemSelected(item);\n }\n\n private changeItemSelected(item: WritableSignal<ITabsItem>) {\n this.keySelected.set(item()[this.fieldKey()]);\n this.outKeySelected.emit(this.keySelected());\n this.popoverFunctionControlEvent()?.removePopoverOverlay();\n this.calculatorTabsItemDisplayDispatch();\n }\n\n protected async handlerAction(event: ITabsItemEvent) {\n this.outAction.emit(event);\n }\n\n private async addTabsItem(item: WritableSignal<ITabsItem>, selected = true, addFirst?: boolean, indexAdd?: number) {\n const items = this.tabs().items;\n items.update((items) => {\n if (addFirst) {\n return [item, ...items];\n }\n if (indexAdd) {\n items.splice(indexAdd, 0, item);\n return items;\n }\n return [...items, item];\n });\n if (selected) {\n this.handlerClickItem(item);\n }\n }\n\n /** Dispatch sang nhánh V1 hoặc V2 dựa theo flag. Public API giữ nguyên signature. */\n private async calculatorTabsItemDisplayDispatch() {\n if (this.useCalculatorV2()) {\n const items = this.tabs()?.items();\n if (items?.length) this.computeDisplayItemsV2(items);\n return;\n }\n await this.calculatorTabsItemDisplay();\n }\n\n protected async calculatorTabsItemDisplay() {\n let items = this.tabs().items();\n const indexItemSelected = items.findIndex((item) => item()[this.fieldKey()] === this.keySelected());\n if (indexItemSelected < 0) {\n return;\n }\n this.displayMoreItem.set(false);\n let displayMoreItem = false;\n const headerWidth = this.headerEl().nativeElement.clientWidth || 0;\n const itemSelected = items[indexItemSelected];\n const itemSelectedWidth = itemSelected().specificWidth;\n let totalWidthItemsDisplay = (this.headerLeftEl().nativeElement.clientWidth || 0) + (this.headerRightEl().nativeElement.clientWidth || 0) + 32;\n items.forEach((item, index) => {\n if (!item().specificWidth) {\n return;\n }\n item.update((data) => ({ ...data, specificDisplay: false }));\n const itemWidth = item().specificWidth || 0;\n const width = totalWidthItemsDisplay + itemWidth + (index < indexItemSelected ? itemSelectedWidth : 0);\n totalWidthItemsDisplay += itemWidth;\n if (width > headerWidth) {\n displayMoreItem = true;\n return;\n }\n item.update((data) => ({ ...data, specificDisplay: true }));\n });\n itemSelected.update((data) => ({ ...data, specificDisplay: true }));\n const display = items.filter((item) => item().specificDisplay === true);\n const notDisplay = items.filter((item) => item().specificDisplay === false);\n items = display.concat(notDisplay);\n items.forEach((item, index) => item.update((data) => ({ ...data, order: index })));\n const sortedItems = [...items].sort((prev, next) => (prev().order || 0) - (next().order || 0));\n // Check if order actually changed before setting to avoid triggering redundant cycles\n const orderChanged = items.some((item, index) => item()[this.fieldKey()] !== sortedItems[index]()[this.fieldKey()]);\n\n if (orderChanged) {\n this.tabs().items.set(sortedItems);\n }\n\n this.displayMoreItem.set(displayMoreItem);\n this.outDisplayMoreItem.emit(this.displayMoreItem());\n\n const newItemsDisplay = this.tabs()\n .items()\n .filter((item) => item().specificDisplay);\n this.itemsDisplay.set(newItemsDisplay);\n }\n\n /**\n * V2 — Tính displayItems synchronous, không reorder, không setTimeout.\n *\n * Why: tránh flicker do reorder DOM + bỏ thuật toán \"cảm tính\" debounce.\n * How to apply: gọi mỗi khi container width / headerLeft / headerRight / item widths / selected key đổi.\n */\n private computeDisplayItemsV2(items: Array<WritableSignal<ITabsItem>>) {\n if (this.mode() !== 'left' || this.ignoreCalculatorTab()) {\n items.forEach((item) => item.update((data) => ({ ...data, specificDisplay: true })));\n this.itemsDisplay.set([...items]);\n this.displayMoreItem.set(false);\n this.outDisplayMoreItem.emit(false);\n return;\n }\n\n const headerWidth = this.containerWidthV2();\n if (!headerWidth) return;\n\n const indexItemSelected = items.findIndex((item) => item()[this.fieldKey()] === this.keySelected());\n if (indexItemSelected < 0) return;\n\n const itemSelected = items[indexItemSelected];\n const itemSelectedWidth = itemSelected().specificWidth || 0;\n const reservedWidth = this.headerLeftWidthV2() + this.headerRightWidthV2() + 32;\n\n let totalWidth = reservedWidth;\n let displayMoreItem = false;\n\n items.forEach((item, index) => {\n const itemWidth = item().specificWidth || 0;\n if (!itemWidth) {\n // Chưa có width — tạm hiển thị để ResizeObserver có element mà đo.\n item.update((data) => ({ ...data, specificDisplay: true }));\n return;\n }\n // Reserve space cho selected nếu item này nằm trước selected.\n const projected = totalWidth + itemWidth + (index < indexItemSelected ? itemSelectedWidth : 0);\n totalWidth += itemWidth;\n if (projected > headerWidth) {\n item.update((data) => ({ ...data, specificDisplay: false }));\n displayMoreItem = true;\n return;\n }\n item.update((data) => ({ ...data, specificDisplay: true }));\n });\n // Selected luôn hiển thị.\n itemSelected.update((data) => ({ ...data, specificDisplay: true }));\n\n // V2: itemsDisplay chứa TẤT CẢ items — không filter. Item overflow được ẩn qua style binding\n // (visibility: hidden + position: absolute) để giữ DOM stable, tránh mount/unmount gây flicker.\n // ResizeObserver luôn đo được width vì mọi item luôn có DOM.\n const allItems = [...items];\n const currentDisplay = this.itemsDisplay();\n // Chỉ set khi nội dung array thực sự đổi (tránh CD thừa).\n const arrayChanged = allItems.length !== currentDisplay.length || allItems.some((it, i) => it !== currentDisplay[i]);\n if (arrayChanged) {\n this.itemsDisplay.set(allItems);\n }\n\n if (this.displayMoreItem() !== displayMoreItem) {\n this.displayMoreItem.set(displayMoreItem);\n this.outDisplayMoreItem.emit(displayMoreItem);\n }\n }\n\n ngOnDestroy() {\n this.resizeObserverV2?.disconnect();\n this.resizeObserverV2 = undefined;\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","<div class=\"libs-ui-tab\">\n <div\n #headerEl\n class=\"libs-ui-tab-header z-[1] {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div\n #headerLeftEl\n class=\"libs-ui-tab-header-left\">\n <ng-content select=\"div.libs-ui-tab-header-left\"></ng-content>\n </div>\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n <div\n class=\"!flex w-full\"\n #elementContainerEl\n LibsUiComponentsDragContainerDirective\n [stylesOverride]=\"stylesDragDropOverrideComputed()\"\n [groupName]=\"groupName()\"\n [(items)]=\"itemsDisplay\"\n [directionDrag]=\"'horizontal'\"\n [disableDragContainer]=\"!allowDragDropPosition()\"\n [acceptDragSameGroup]=\"allowDragDropPosition()\"\n (outDroppedContainer)=\"handlerDropContainer($event)\">\n @for (item of itemsDisplay(); track item) {\n <div\n LibsUiDragItemDirective\n [disable]=\"disable() || !allowDragDropPosition() || (useCalculatorV2() && item().specificDisplay === false)\"\n [elementContainer]=\"elementContainerEl\"\n [dragBoundary]=\"true\"\n [dragBoundaryAcceptMouseLeaveContainer]=\"true\"\n class=\"relative libs-ui-tab-item-container\"\n [style.width.px]=\"mode() === 'space-between' ? elementContainerEl.clientWidth / displayedCount() : undefined\"\n [class.flex]=\"mode() === 'center-has-line'\"\n [class.items-center]=\"mode() === 'center-has-line'\"\n [style.visibility]=\"useCalculatorV2() && item().specificDisplay === false ? 'hidden' : null\"\n [style.position]=\"useCalculatorV2() && item().specificDisplay === false ? 'absolute' : null\"\n [style.pointer-events]=\"useCalculatorV2() && item().specificDisplay === false ? 'none' : null\"\n [attr.aria-hidden]=\"useCalculatorV2() && item().specificDisplay === false ? 'true' : null\">\n @if (allowDragDropPosition() && !disable()) {\n <span class=\"libs-ui-icon-arrange text-[#9ca2ad] absolute top-[14px] left-[4px]\"></span>\n }\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [class.!pointer-events-none]=\"item().disable || disable()\"\n [disable]=\"item().disable || disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [ignoreCalculatorTab]=\"ignoreCalculatorTab() || !useCalculatorV2()\"\n [useCalculatorV2]=\"useCalculatorV2()\"\n [changeViewTab]=\"changeViewTab\"\n (click)=\"handlerClickItem(item)\"\n (keydown.enter)=\"handlerClickItem(item)\"\n (outAction)=\"handlerAction($event)\" />\n @if (mode() === 'center-has-line' && !$last) {\n <div class=\"w-[40px] h-[1px] bg-[#e6e7ea]\"></div>\n }\n </div>\n }\n </div>\n </div>\n <div\n class=\"flex items-center\"\n [class.ml-auto]=\"displayMoreItem() && !tabs().viewMoreIgnoreMarginLeft\">\n @if (displayMoreItem()) {\n <libs_ui-components-popover\n class=\"w-full h-full flex items-center\"\n [mode]=\"'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{\n zIndex: popoverShowMoreTabItem()?.config?.zIndex || 1000,\n maxHeight: popoverShowMoreTabItem()?.config?.maxHeight || 287,\n maxWidth: popoverShowMoreTabItem()?.config?.maxWidth || 2048,\n width: popoverShowMoreTabItem()?.config?.width || 277,\n direction: popoverShowMoreTabItem()?.config?.direction || 'bottom',\n template: popoverShowMoreTabItem()?.config?.template || menuEl,\n whiteTheme: true,\n ignoreArrow: true,\n position: popoverShowMoreTabItem()?.config?.position || { mode: 'end', distance: 0 },\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classInclude]=\"'!p-[8px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical rotate-90 text-[16px] mr-0'\"\n [popover]=\"{ config: { content: popoverShowMoreTabItem()?.config?.content || 'i18n_view_more' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-popover>\n }\n </div>\n <div\n #headerRightEl\n class=\"libs-ui-tab-header-right {{ tabs().classIncludeHeaderRight || '' }}\">\n <ng-content select=\"div.libs-ui-tab-header-right\"></ng-content>\n </div>\n </div>\n @if (!useCalculatorV2()) {\n <div class=\"absolute top-0 z-0 w-full\">\n <div\n class=\"libs-ui-tab-header {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n @for (item of tabs().items(); track item) {\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [disable]=\"disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [changeViewTab]=\"changeViewTab\"\n [ignoreCalculatorTab]=\"ignoreCalculatorTab()\" />\n }\n </div>\n </div>\n </div>\n }\n</div>\n<ng-template #menuEl>\n <libs_ui-components-list\n [config]=\"tabMoreListConfig()\"\n [maxItemShow]=\"5\"\n [hiddenInputSearch]=\"true\"\n [paddingLeftItem]=\"true\"\n (outSelectKey)=\"handlerSelectedKey($event)\" />\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["debounceTime"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-tabs",
|
|
3
|
-
"version": "0.2.356-
|
|
3
|
+
"version": "0.2.356-43",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/core": ">=18.0.0",
|
|
6
|
-
"@libs-ui/components-badge": "0.2.356-
|
|
7
|
-
"@libs-ui/components-buttons-button": "0.2.356-
|
|
8
|
-
"@libs-ui/components-list": "0.2.356-
|
|
9
|
-
"@libs-ui/components-popover": "0.2.356-
|
|
6
|
+
"@libs-ui/components-badge": "0.2.356-43",
|
|
7
|
+
"@libs-ui/components-buttons-button": "0.2.356-43",
|
|
8
|
+
"@libs-ui/components-list": "0.2.356-43",
|
|
9
|
+
"@libs-ui/components-popover": "0.2.356-43",
|
|
10
10
|
"rxjs": "~7.8.0",
|
|
11
|
-
"@libs-ui/interfaces-types": "0.2.356-
|
|
12
|
-
"@libs-ui/utils": "0.2.356-
|
|
11
|
+
"@libs-ui/interfaces-types": "0.2.356-43",
|
|
12
|
+
"@libs-ui/utils": "0.2.356-43",
|
|
13
13
|
"@ngx-translate/core": "^15.0.0",
|
|
14
|
-
"@libs-ui/pipes-call-function-in-template": "0.2.356-
|
|
15
|
-
"@libs-ui/components-drag-drop": "0.2.356-
|
|
16
|
-
"@libs-ui/services-http-request": "0.2.356-
|
|
14
|
+
"@libs-ui/pipes-call-function-in-template": "0.2.356-43",
|
|
15
|
+
"@libs-ui/components-drag-drop": "0.2.356-43",
|
|
16
|
+
"@libs-ui/services-http-request": "0.2.356-43",
|
|
17
17
|
"@angular/common": "~18.2.0"
|
|
18
18
|
},
|
|
19
19
|
"sideEffects": false,
|