@libs-ui/components-buttons-dropdown 0.2.356-9 → 0.2.357-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -1,44 +1,45 @@
|
|
|
1
1
|
# @libs-ui/components-buttons-dropdown
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Dropdown button với menu tùy chọn dạng popover, hỗ trợ hai chế độ: apply ngay khi chọn hoặc chọn trước rồi xác nhận sau.
|
|
4
4
|
|
|
5
5
|
## Giới thiệu
|
|
6
6
|
|
|
7
|
-
`LibsUiComponentsButtonsDropdownComponent` là một standalone Angular component
|
|
7
|
+
`LibsUiComponentsButtonsDropdownComponent` là một standalone Angular component kết hợp button và popover menu thành một khối tương tác hoàn chỉnh. Component cung cấp hai chế độ hoạt động: `applyNow = true` để emit ngay khi user chọn item, hoặc `applyNow = false` để tách biệt nút mở menu và nút xác nhận (Apply). Nội dung item được sanitize tự động qua `escapeHtml` để ngăn XSS.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Tính năng
|
|
10
10
|
|
|
11
|
-
- ✅
|
|
12
|
-
- ✅
|
|
13
|
-
- ✅
|
|
14
|
-
- ✅
|
|
15
|
-
- ✅
|
|
16
|
-
- ✅
|
|
17
|
-
- ✅
|
|
18
|
-
- ✅
|
|
19
|
-
- ✅
|
|
11
|
+
- ✅ Hai chế độ hoạt động: apply ngay (`applyNow = true`) hoặc chọn rồi xác nhận (`applyNow = false`)
|
|
12
|
+
- ✅ Two-way binding cho item đang được chọn qua `[(keySelected)]`
|
|
13
|
+
- ✅ Tùy chỉnh tên field hiển thị (`fieldDisplay`) và field key (`keyField`) — không cần format lại data
|
|
14
|
+
- ✅ Hỗ trợ icon bên trái cho từng item qua `fieldClassIconLeft`
|
|
15
|
+
- ✅ Custom sub-template cho item (`subTemplate`) và button lồng trong item (`buttonTemplateConfig`)
|
|
16
|
+
- ✅ Popover cấu hình linh hoạt: hướng mở, kích thước, z-index, animation
|
|
17
|
+
- ✅ Truy cập programmatic qua getter `FunctionsControl` để mở/đóng popup từ bên ngoài
|
|
18
|
+
- ✅ XSS-safe: giá trị `fieldDisplay` của mọi item tự động qua `escapeHtml`
|
|
19
|
+
- ✅ Hỗ trợ disable toàn bộ button hoặc từng item riêng lẻ
|
|
20
|
+
- ✅ Angular Signals + `ChangeDetectionStrategy.OnPush` — hiệu năng tối ưu
|
|
20
21
|
|
|
21
22
|
## Khi nào sử dụng
|
|
22
23
|
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
24
|
+
- Cần button gọi menu dropdown chọn một giá trị (filter, sort, action)
|
|
25
|
+
- Cần tách luồng "chọn trước — xác nhận sau" (ví dụ: chọn kỳ báo cáo rồi bấm Apply)
|
|
26
|
+
- Cần action menu với icon và label cho từng mục
|
|
27
|
+
- Cần dropdown lồng popover với vị trí và kích thước tùy chỉnh theo context giao diện
|
|
27
28
|
|
|
28
29
|
## Cài đặt
|
|
29
30
|
|
|
30
31
|
```bash
|
|
31
|
-
# npm
|
|
32
32
|
npm install @libs-ui/components-buttons-dropdown
|
|
33
|
-
|
|
34
|
-
# yarn
|
|
35
|
-
yarn add @libs-ui/components-buttons-dropdown
|
|
36
33
|
```
|
|
37
34
|
|
|
38
35
|
## Import
|
|
39
36
|
|
|
40
37
|
```typescript
|
|
41
|
-
import {
|
|
38
|
+
import {
|
|
39
|
+
LibsUiComponentsButtonsDropdownComponent,
|
|
40
|
+
IButtonDropdown,
|
|
41
|
+
IPopupConfigButtonDropdown,
|
|
42
|
+
} from '@libs-ui/components-buttons-dropdown';
|
|
42
43
|
|
|
43
44
|
@Component({
|
|
44
45
|
standalone: true,
|
|
@@ -48,260 +49,444 @@ import { LibsUiComponentsButtonsDropdownComponent, IButtonDropdown, IPopupConfig
|
|
|
48
49
|
export class YourComponent {}
|
|
49
50
|
```
|
|
50
51
|
|
|
51
|
-
## Ví dụ
|
|
52
|
+
## Ví dụ sử dụng
|
|
53
|
+
|
|
54
|
+
### 1. Apply ngay — chọn là emit
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// component.ts
|
|
58
|
+
import { Component } from '@angular/core';
|
|
59
|
+
import { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';
|
|
52
60
|
|
|
53
|
-
|
|
61
|
+
@Component({
|
|
62
|
+
selector: 'app-example',
|
|
63
|
+
standalone: true,
|
|
64
|
+
imports: [LibsUiComponentsButtonsDropdownComponent],
|
|
65
|
+
templateUrl: './example.component.html',
|
|
66
|
+
})
|
|
67
|
+
export class ExampleComponent {
|
|
68
|
+
readonly statusOptions = [
|
|
69
|
+
{ key: 'active', label: 'Đang hoạt động' },
|
|
70
|
+
{ key: 'inactive', label: 'Ngừng hoạt động' },
|
|
71
|
+
{ key: 'pending', label: 'Chờ duyệt' },
|
|
72
|
+
];
|
|
73
|
+
|
|
74
|
+
handlerSelectStatus(event: Event, item: { key: string; label: string }): void {
|
|
75
|
+
event.stopPropagation();
|
|
76
|
+
console.log('Đã chọn:', item);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
54
80
|
|
|
55
81
|
```html
|
|
82
|
+
<!-- example.component.html -->
|
|
56
83
|
<libs_ui-components-buttons-dropdown
|
|
57
|
-
label="
|
|
58
|
-
[items]="
|
|
84
|
+
label="Trạng thái"
|
|
85
|
+
[items]="statusOptions"
|
|
59
86
|
[applyNow]="true"
|
|
60
|
-
(outSelectItem)="
|
|
87
|
+
(outSelectItem)="handlerSelectStatus($event, $event)" />
|
|
61
88
|
```
|
|
62
89
|
|
|
90
|
+
### 2. Chọn trước — xác nhận sau (applyNow = false)
|
|
91
|
+
|
|
63
92
|
```typescript
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
93
|
+
// component.ts
|
|
94
|
+
import { Component, signal } from '@angular/core';
|
|
95
|
+
import { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';
|
|
96
|
+
|
|
97
|
+
@Component({
|
|
98
|
+
selector: 'app-filter',
|
|
99
|
+
standalone: true,
|
|
100
|
+
imports: [LibsUiComponentsButtonsDropdownComponent],
|
|
101
|
+
templateUrl: './filter.component.html',
|
|
102
|
+
})
|
|
103
|
+
export class FilterComponent {
|
|
104
|
+
protected selectedPeriodKey = signal<string>('q1');
|
|
105
|
+
|
|
106
|
+
readonly periodOptions = [
|
|
107
|
+
{ key: 'q1', label: 'Quý 1' },
|
|
108
|
+
{ key: 'q2', label: 'Quý 2' },
|
|
109
|
+
{ key: 'q3', label: 'Quý 3' },
|
|
110
|
+
{ key: 'q4', label: 'Quý 4' },
|
|
111
|
+
];
|
|
112
|
+
|
|
113
|
+
handlerApplyPeriod(event: Event, item: { key: string; label: string }): void {
|
|
114
|
+
event.stopPropagation();
|
|
115
|
+
console.log('Áp dụng kỳ:', item);
|
|
116
|
+
}
|
|
72
117
|
}
|
|
73
118
|
```
|
|
74
119
|
|
|
75
|
-
### With Apply Button
|
|
76
|
-
|
|
77
120
|
```html
|
|
121
|
+
<!-- filter.component.html -->
|
|
78
122
|
<libs_ui-components-buttons-dropdown
|
|
79
|
-
label="
|
|
80
|
-
[items]="
|
|
123
|
+
label="Chọn kỳ"
|
|
124
|
+
[items]="periodOptions"
|
|
81
125
|
[applyNow]="false"
|
|
82
|
-
[(keySelected)]="
|
|
83
|
-
(outApply)="
|
|
126
|
+
[(keySelected)]="selectedPeriodKey"
|
|
127
|
+
(outApply)="handlerApplyPeriod($event, $event)" />
|
|
84
128
|
```
|
|
85
129
|
|
|
130
|
+
### 3. Custom tên field — data không cần format lại
|
|
131
|
+
|
|
86
132
|
```typescript
|
|
87
|
-
|
|
133
|
+
// component.ts
|
|
134
|
+
import { Component } from '@angular/core';
|
|
135
|
+
import { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';
|
|
88
136
|
|
|
89
|
-
|
|
90
|
-
|
|
137
|
+
@Component({
|
|
138
|
+
selector: 'app-user-picker',
|
|
139
|
+
standalone: true,
|
|
140
|
+
imports: [LibsUiComponentsButtonsDropdownComponent],
|
|
141
|
+
templateUrl: './user-picker.component.html',
|
|
142
|
+
})
|
|
143
|
+
export class UserPickerComponent {
|
|
144
|
+
readonly users = [
|
|
145
|
+
{ userId: 'u1', fullName: 'Nguyễn Văn An' },
|
|
146
|
+
{ userId: 'u2', fullName: 'Trần Thị Bình' },
|
|
147
|
+
{ userId: 'u3', fullName: 'Lê Quốc Cường' },
|
|
148
|
+
];
|
|
149
|
+
|
|
150
|
+
handlerSelectUser(event: Event, user: { userId: string; fullName: string }): void {
|
|
151
|
+
event.stopPropagation();
|
|
152
|
+
console.log('Người được chọn:', user.fullName);
|
|
153
|
+
}
|
|
91
154
|
}
|
|
92
155
|
```
|
|
93
156
|
|
|
94
|
-
### Custom Field Names
|
|
95
|
-
|
|
96
157
|
```html
|
|
158
|
+
<!-- user-picker.component.html -->
|
|
97
159
|
<libs_ui-components-buttons-dropdown
|
|
98
|
-
label="
|
|
160
|
+
label="Chọn người dùng"
|
|
99
161
|
[items]="users"
|
|
100
|
-
fieldDisplay="
|
|
101
|
-
keyField="
|
|
162
|
+
fieldDisplay="fullName"
|
|
163
|
+
keyField="userId"
|
|
102
164
|
[applyNow]="true"
|
|
103
|
-
(outSelectItem)="
|
|
165
|
+
(outSelectItem)="handlerSelectUser($event, $event)" />
|
|
104
166
|
```
|
|
105
167
|
|
|
168
|
+
### 4. Items có icon
|
|
169
|
+
|
|
106
170
|
```typescript
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
{ id: 'u3', name: 'Bob Johnson' },
|
|
111
|
-
];
|
|
112
|
-
```
|
|
171
|
+
// component.ts
|
|
172
|
+
import { Component } from '@angular/core';
|
|
173
|
+
import { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';
|
|
113
174
|
|
|
114
|
-
|
|
175
|
+
@Component({
|
|
176
|
+
selector: 'app-action-menu',
|
|
177
|
+
standalone: true,
|
|
178
|
+
imports: [LibsUiComponentsButtonsDropdownComponent],
|
|
179
|
+
templateUrl: './action-menu.component.html',
|
|
180
|
+
})
|
|
181
|
+
export class ActionMenuComponent {
|
|
182
|
+
readonly actionItems = [
|
|
183
|
+
{ key: 'edit', label: 'Chỉnh sửa', classIconLeft: 'libs-ui-icon-edit' },
|
|
184
|
+
{ key: 'duplicate', label: 'Nhân bản', classIconLeft: 'libs-ui-icon-copy' },
|
|
185
|
+
{ key: 'delete', label: 'Xóa', classIconLeft: 'libs-ui-icon-delete' },
|
|
186
|
+
];
|
|
187
|
+
|
|
188
|
+
handlerSelectAction(event: Event, action: { key: string; label: string }): void {
|
|
189
|
+
event.stopPropagation();
|
|
190
|
+
console.log('Hành động:', action.key);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
```
|
|
115
194
|
|
|
116
195
|
```html
|
|
196
|
+
<!-- action-menu.component.html -->
|
|
117
197
|
<libs_ui-components-buttons-dropdown
|
|
118
|
-
label="
|
|
119
|
-
[items]="
|
|
120
|
-
fieldClassIconLeft="
|
|
198
|
+
label="Thao tác"
|
|
199
|
+
[items]="actionItems"
|
|
200
|
+
fieldClassIconLeft="classIconLeft"
|
|
121
201
|
[applyNow]="true"
|
|
122
|
-
(outSelectItem)="
|
|
202
|
+
(outSelectItem)="handlerSelectAction($event, $event)" />
|
|
123
203
|
```
|
|
124
204
|
|
|
205
|
+
### 5. Tùy chỉnh cấu hình popover
|
|
206
|
+
|
|
125
207
|
```typescript
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
208
|
+
// component.ts
|
|
209
|
+
import { Component } from '@angular/core';
|
|
210
|
+
import {
|
|
211
|
+
LibsUiComponentsButtonsDropdownComponent,
|
|
212
|
+
IPopupConfigButtonDropdown,
|
|
213
|
+
} from '@libs-ui/components-buttons-dropdown';
|
|
214
|
+
|
|
215
|
+
@Component({
|
|
216
|
+
selector: 'app-custom-popup',
|
|
217
|
+
standalone: true,
|
|
218
|
+
imports: [LibsUiComponentsButtonsDropdownComponent],
|
|
219
|
+
templateUrl: './custom-popup.component.html',
|
|
220
|
+
})
|
|
221
|
+
export class CustomPopupComponent {
|
|
222
|
+
readonly menuItems = [
|
|
223
|
+
{ key: '1', label: 'Mục 1' },
|
|
224
|
+
{ key: '2', label: 'Mục 2' },
|
|
225
|
+
{ key: '3', label: 'Mục 3' },
|
|
226
|
+
];
|
|
227
|
+
|
|
228
|
+
readonly popupConfig: IPopupConfigButtonDropdown = {
|
|
229
|
+
width: 280,
|
|
230
|
+
maxHeight: 200,
|
|
231
|
+
direction: 'bottom',
|
|
232
|
+
zIndex: 1500,
|
|
233
|
+
position: { mode: 'end', distance: 0 },
|
|
234
|
+
};
|
|
132
235
|
|
|
133
|
-
|
|
236
|
+
handlerSelectMenu(event: Event, item: { key: string }): void {
|
|
237
|
+
event.stopPropagation();
|
|
238
|
+
console.log('Chọn:', item.key);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
```
|
|
134
242
|
|
|
135
243
|
```html
|
|
244
|
+
<!-- custom-popup.component.html -->
|
|
136
245
|
<libs_ui-components-buttons-dropdown
|
|
137
|
-
label="
|
|
138
|
-
[items]="
|
|
139
|
-
[popupConfig]="
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
direction: 'bottom',
|
|
143
|
-
zIndex: 1500
|
|
144
|
-
}"
|
|
145
|
-
[applyNow]="true" />
|
|
246
|
+
label="Tùy chọn"
|
|
247
|
+
[items]="menuItems"
|
|
248
|
+
[popupConfig]="popupConfig"
|
|
249
|
+
[applyNow]="true"
|
|
250
|
+
(outSelectItem)="handlerSelectMenu($event, $event)" />
|
|
146
251
|
```
|
|
147
252
|
|
|
148
|
-
###
|
|
253
|
+
### 6. Các kiểu button (typeButton)
|
|
149
254
|
|
|
150
255
|
```html
|
|
151
|
-
|
|
152
|
-
<libs_ui-components-buttons-dropdown
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
256
|
+
<div class="flex gap-2">
|
|
257
|
+
<libs_ui-components-buttons-dropdown
|
|
258
|
+
label="Primary"
|
|
259
|
+
[items]="menuItems"
|
|
260
|
+
typeButton="button-primary"
|
|
261
|
+
[applyNow]="true" />
|
|
262
|
+
|
|
263
|
+
<libs_ui-components-buttons-dropdown
|
|
264
|
+
label="Secondary"
|
|
265
|
+
[items]="menuItems"
|
|
266
|
+
typeButton="button-secondary"
|
|
267
|
+
[applyNow]="true" />
|
|
268
|
+
|
|
269
|
+
<libs_ui-components-buttons-dropdown
|
|
270
|
+
label="Outline"
|
|
271
|
+
[items]="menuItems"
|
|
272
|
+
typeButton="button-outline"
|
|
273
|
+
[applyNow]="true" />
|
|
274
|
+
</div>
|
|
275
|
+
```
|
|
157
276
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
277
|
+
### 7. Truy cập programmatic qua FunctionsControl (ViewChild)
|
|
278
|
+
|
|
279
|
+
```typescript
|
|
280
|
+
// parent.component.ts
|
|
281
|
+
import { Component, viewChild } from '@angular/core';
|
|
282
|
+
import { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';
|
|
283
|
+
|
|
284
|
+
@Component({
|
|
285
|
+
selector: 'app-parent',
|
|
286
|
+
standalone: true,
|
|
287
|
+
imports: [LibsUiComponentsButtonsDropdownComponent],
|
|
288
|
+
templateUrl: './parent.component.html',
|
|
289
|
+
})
|
|
290
|
+
export class ParentComponent {
|
|
291
|
+
private readonly dropdownRef = viewChild<LibsUiComponentsButtonsDropdownComponent>('dropdownRef');
|
|
292
|
+
|
|
293
|
+
handlerOpenDropdown(event: Event): void {
|
|
294
|
+
event.stopPropagation();
|
|
295
|
+
this.dropdownRef()?.FunctionsControl?.show?.();
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
handlerCloseDropdown(event: Event): void {
|
|
299
|
+
event.stopPropagation();
|
|
300
|
+
this.dropdownRef()?.FunctionsControl?.hide?.();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
```
|
|
164
304
|
|
|
165
|
-
|
|
305
|
+
```html
|
|
306
|
+
<!-- parent.component.html -->
|
|
166
307
|
<libs_ui-components-buttons-dropdown
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
[applyNow]="true"
|
|
308
|
+
#dropdownRef
|
|
309
|
+
label="Menu"
|
|
310
|
+
[items]="menuItems"
|
|
311
|
+
[applyNow]="true"
|
|
312
|
+
(outFunctionsControl)="handlerFunctionsControl($event)" />
|
|
171
313
|
```
|
|
172
314
|
|
|
173
|
-
##
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
|
180
|
-
|
|
|
181
|
-
| `[
|
|
182
|
-
| `[
|
|
183
|
-
| `[
|
|
184
|
-
| `[
|
|
185
|
-
| `[
|
|
186
|
-
| `[
|
|
187
|
-
| `[
|
|
188
|
-
| `[
|
|
189
|
-
| `[
|
|
190
|
-
| `[
|
|
191
|
-
| `[
|
|
192
|
-
| `[
|
|
193
|
-
| `[
|
|
194
|
-
| `[
|
|
195
|
-
| `[
|
|
196
|
-
| `[
|
|
197
|
-
| `[
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
|
206
|
-
|
|
|
207
|
-
| `(
|
|
208
|
-
| `(
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
315
|
+
## @Input()
|
|
316
|
+
|
|
317
|
+
| Input | Type | Default | Mô tả | Ví dụ |
|
|
318
|
+
|---|---|---|---|---|
|
|
319
|
+
| `[applyNow]` | `boolean` | `false` | `true`: emit ngay khi chọn item; `false`: tách nút mở menu và nút Apply | `[applyNow]="true"` |
|
|
320
|
+
| `[classIconLeft]` | `string` | `''` | Class icon hiển thị bên trái label trên button chính | `classIconLeft="libs-ui-icon-filter"` |
|
|
321
|
+
| `[classIconRight]` | `string` | `'libs-ui-icon-move-right rotate-[90deg]'` | Class icon mũi tên bên phải trên nút toggle menu (chế độ `applyNow=false`) | `classIconRight="libs-ui-icon-chevron-down"` |
|
|
322
|
+
| `[classInclude]` | `string` | `''` | Class CSS bổ sung cho button | `classInclude="w-full"` |
|
|
323
|
+
| `[classIncludeContainer]` | `string` | `undefined` | Class CSS bổ sung cho div container bọc ngoài | `classIncludeContainer="flex-1"` |
|
|
324
|
+
| `[classLabel]` | `string` | `''` | Class CSS cho label text trên button | `classLabel="libs-ui-font-h5m"` |
|
|
325
|
+
| `[disable]` | `boolean` | `false` | Disable toàn bộ button | `[disable]="isLoading()"` |
|
|
326
|
+
| `[fieldClass]` | `string` | `'class'` | Tên field trong object item chứa class CSS của item đó | `fieldClass="cssClass"` |
|
|
327
|
+
| `[fieldClassIconLeft]` | `string` | `'classIconLeft'` | Tên field trong object item chứa class icon bên trái | `fieldClassIconLeft="iconClass"` |
|
|
328
|
+
| `[fieldDisplay]` | `string` | `'label'` | Tên field trong object item dùng để hiển thị text | `fieldDisplay="name"` |
|
|
329
|
+
| `[iconOnlyType]` | `boolean` | `false` | Chỉ hiển thị icon, ẩn label trên button | `[iconOnlyType]="true"` |
|
|
330
|
+
| `[ignoreHiddenPopoverContentWhenMouseLeave]` | `boolean` | `true` | Giữ popover mở khi chuột di ra ngoài vùng content | `[ignoreHiddenPopoverContentWhenMouseLeave]="false"` |
|
|
331
|
+
| `[items]` | `Array<any>` | **required** | Danh sách items hiển thị trong menu | `[items]="options"` |
|
|
332
|
+
| `[keyField]` | `string` | `'key'` | Tên field trong object item dùng làm giá trị key định danh | `keyField="id"` |
|
|
333
|
+
| `[(keySelected)]` | `string` | `undefined` | Key của item đang được chọn — hỗ trợ two-way binding | `[(keySelected)]="selectedKey"` |
|
|
334
|
+
| `[label]` | `string` | `undefined` | Label mặc định của button (khi chưa chọn item nào, hoặc ở chế độ `applyNow=true`) | `label="Chọn trạng thái"` |
|
|
335
|
+
| `[modePopover]` | `TYPE_POPOVER_MODE` | `'click-toggle'` | Chế độ kích hoạt popover | `modePopover="click-toggle"` |
|
|
336
|
+
| `[popupConfig]` | `IPopupConfigButtonDropdown` | `{ width: 205, maxWidth: 250, maxHeight: 140, zIndex: 1200, direction: 'top' }` | Cấu hình chi tiết cho popover (kích thước, vị trí, z-index) | `[popupConfig]="myConfig"` |
|
|
337
|
+
| `[showBorderBottom]` | `boolean` | `false` | Hiển thị đường kẻ phân cách dưới mỗi item trong menu | `[showBorderBottom]="true"` |
|
|
338
|
+
| `[sizeButton]` | `TYPE_SIZE_BUTTON` | `'medium'` | Kích thước button | `sizeButton="small"` |
|
|
339
|
+
| `[typeButton]` | `TYPE_BUTTON` | `'button-primary'` | Kiểu button (màu sắc, style) | `typeButton="button-secondary"` |
|
|
340
|
+
|
|
341
|
+
## @Output()
|
|
342
|
+
|
|
343
|
+
| Output | Type | Mô tả | Handler TS | Binding HTML |
|
|
344
|
+
|---|---|---|---|---|
|
|
345
|
+
| `(outApply)` | `any` | Emit item được chọn khi bấm nút Apply (chỉ ở chế độ `applyNow = false`) | `handlerApply(event: Event, item: any): void { event.stopPropagation(); console.log(item); }` | `(outApply)="handlerApply($event, $event)"` |
|
|
346
|
+
| `(outFunctionsControl)` | `IPopoverFunctionControlEvent` | Emit object chứa các hàm điều khiển popover (show, hide) ngay sau khi popover khởi tạo | `handlerFunctionsControl(event: Event, ctrl: IPopoverFunctionControlEvent): void { event.stopPropagation(); }` | `(outFunctionsControl)="handlerFunctionsControl($event, $event)"` |
|
|
347
|
+
| `(outHover)` | `boolean` | Emit `false` mỗi khi user vừa chọn xong một item | `handlerHover(event: Event, state: boolean): void { event.stopPropagation(); }` | `(outHover)="handlerHover($event, $event)"` |
|
|
348
|
+
| `(outIconEvent)` | `MouseEvent` | Emit MouseEvent khi click vào icon của button | `handlerIconClick(event: MouseEvent): void { event.stopPropagation(); }` | `(outIconEvent)="handlerIconClick($event)"` |
|
|
349
|
+
| `(outPopoverEvent)` | `TYPE_POPOVER_EVENT` | Emit các sự kiện lifecycle của popover (open, close, ...) | `handlerPopoverEvent(event: Event, evt: TYPE_POPOVER_EVENT): void { event.stopPropagation(); }` | `(outPopoverEvent)="handlerPopoverEvent($event, $event)"` |
|
|
350
|
+
| `(outSelectItem)` | `any` | Emit object item khi user click chọn một mục trong menu | `handlerSelectItem(event: Event, item: any): void { event.stopPropagation(); console.log(item); }` | `(outSelectItem)="handlerSelectItem($event, $event)"` |
|
|
351
|
+
|
|
352
|
+
## Public API — FunctionsControl
|
|
353
|
+
|
|
354
|
+
Truy cập qua `viewChild` để điều khiển popover từ component cha:
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
import { Component, viewChild } from '@angular/core';
|
|
358
|
+
import {
|
|
359
|
+
LibsUiComponentsButtonsDropdownComponent,
|
|
360
|
+
IButtonDropdown,
|
|
361
|
+
} from '@libs-ui/components-buttons-dropdown';
|
|
362
|
+
import { IPopoverFunctionControlEvent } from '@libs-ui/components-popover';
|
|
363
|
+
|
|
364
|
+
@Component({
|
|
365
|
+
selector: 'app-demo',
|
|
366
|
+
standalone: true,
|
|
367
|
+
imports: [LibsUiComponentsButtonsDropdownComponent],
|
|
368
|
+
template: `
|
|
369
|
+
<libs_ui-components-buttons-dropdown
|
|
370
|
+
#myDropdown
|
|
371
|
+
label="Menu"
|
|
372
|
+
[items]="items"
|
|
373
|
+
[applyNow]="true"
|
|
374
|
+
(outFunctionsControl)="handlerControl($event)" />
|
|
375
|
+
`,
|
|
376
|
+
})
|
|
377
|
+
export class DemoComponent {
|
|
378
|
+
private readonly dropdownRef = viewChild<LibsUiComponentsButtonsDropdownComponent>('myDropdown');
|
|
379
|
+
|
|
380
|
+
protected items = [
|
|
381
|
+
{ key: '1', label: 'Mục 1' },
|
|
382
|
+
{ key: '2', label: 'Mục 2' },
|
|
383
|
+
];
|
|
384
|
+
|
|
385
|
+
handlerControl(ctrl: IPopoverFunctionControlEvent): void {
|
|
386
|
+
// ctrl được lưu bên trong component — gọi show/hide từ bên ngoài
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Mở popup từ bên ngoài
|
|
390
|
+
openMenu(): void {
|
|
391
|
+
this.dropdownRef()?.FunctionsControl?.show?.();
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// Đóng popup từ bên ngoài
|
|
395
|
+
closeMenu(): void {
|
|
396
|
+
this.dropdownRef()?.FunctionsControl?.hide?.();
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
| Getter | Return Type | Mô tả |
|
|
402
|
+
|---|---|---|
|
|
403
|
+
| `FunctionsControl` | `IPopoverFunctionControlEvent \| undefined` | Trả về object chứa các hàm điều khiển popover. `undefined` nếu popover chưa khởi tạo |
|
|
404
|
+
|
|
405
|
+
## Cấu trúc Item
|
|
406
|
+
|
|
407
|
+
Mỗi phần tử trong mảng `items` hỗ trợ các thuộc tính sau:
|
|
408
|
+
|
|
409
|
+
```typescript
|
|
410
|
+
interface DropdownItem {
|
|
411
|
+
// Bắt buộc (tên field tùy theo fieldDisplay và keyField)
|
|
412
|
+
label: string; // field hiển thị — mặc định key là 'label'
|
|
413
|
+
key: string; // field key định danh — mặc định key là 'key'
|
|
414
|
+
|
|
415
|
+
// Tùy chọn — styling
|
|
416
|
+
class?: string; // Class CSS cho span hiển thị label của item (ghi đè 'libs-ui-font-h5r')
|
|
417
|
+
classIconLeft?: string; // Class icon hiển thị bên trái label item
|
|
418
|
+
classInclude?: string; // Class CSS bổ sung cho div wrapper của item
|
|
419
|
+
classRow?: string; // Class CSS cho div row ngoài cùng của item
|
|
420
|
+
|
|
421
|
+
// Tùy chọn — behavior
|
|
422
|
+
disable?: boolean; // Disable item (pointer-events-none + visual disabled)
|
|
423
|
+
ignoreFlex?: boolean; // Bỏ display:flex cho wrapper item
|
|
424
|
+
showPopover?: boolean; // Hiển thị tooltip/popover riêng cho item này
|
|
425
|
+
popoverContent?: string; // Nội dung tooltip khi showPopover = true
|
|
426
|
+
|
|
427
|
+
// Tùy chọn — advanced
|
|
428
|
+
subTemplate?: TemplateRef<unknown>; // Custom Angular template render bên trong item
|
|
429
|
+
buttonTemplateConfig?: { // Render thêm một button bên trong item
|
|
430
|
+
icon?: string; // Class icon bên phải button
|
|
431
|
+
iconLeft?: string; // Class icon bên trái button
|
|
432
|
+
label?: string; // Label của button
|
|
433
|
+
type?: TYPE_BUTTON; // Kiểu button
|
|
434
|
+
action: (item: DropdownItem, allItems: DropdownItem[]) => void; // Callback khi click
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
```
|
|
219
438
|
|
|
220
439
|
## Types & Interfaces
|
|
221
440
|
|
|
222
441
|
```typescript
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
442
|
+
import {
|
|
443
|
+
IButtonDropdown,
|
|
444
|
+
IPopupConfigButtonDropdown,
|
|
445
|
+
} from '@libs-ui/components-buttons-dropdown';
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
```typescript
|
|
449
|
+
// IButtonDropdown — kế thừa IButton, mô tả đầy đủ inputs của component
|
|
226
450
|
export interface IButtonDropdown extends IButton {
|
|
227
|
-
/** Danh sách các mục sẽ hiển thị trong menu */
|
|
228
451
|
items: any[];
|
|
229
|
-
/** Tên trường dùng để hiển thị nội dung của mỗi mục */
|
|
230
452
|
fieldDisplay?: string;
|
|
231
|
-
/** Tên trường dùng làm giá trị key của mỗi mục */
|
|
232
453
|
keyField?: string;
|
|
233
|
-
/** Giá trị key đang được chọn (hỗ trợ two-way binding) */
|
|
234
454
|
keySelected?: string;
|
|
235
|
-
/** Nếu true: chọn xong tự emit sự kiện; false: cần bấm nút Áp dụng */
|
|
236
455
|
applyNow?: boolean;
|
|
237
|
-
/** Hiển thị đường kẻ dưới menu khi mở */
|
|
238
456
|
showBorderBottom?: boolean;
|
|
239
|
-
/** Cấu hình chi tiết cho popover (vị trí, kích thước) */
|
|
240
457
|
popupConfig?: IPopupConfigButtonDropdown;
|
|
241
|
-
/** Giữ popover mở khi chuột rời khỏi nội dung */
|
|
242
458
|
ignoreHiddenPopoverContentWhenMouseLeave?: boolean;
|
|
243
|
-
/** Cách hiển thị popover (click, hover,...) */
|
|
244
459
|
modePopover?: TYPE_POPOVER_MODE;
|
|
245
460
|
}
|
|
246
461
|
|
|
247
|
-
|
|
248
|
-
* Cấu hình cho Dropdown popover
|
|
249
|
-
*/
|
|
462
|
+
// IPopupConfigButtonDropdown — cấu hình popover
|
|
250
463
|
export interface IPopupConfigButtonDropdown {
|
|
251
|
-
width?: number;
|
|
252
|
-
maxWidth?: number;
|
|
253
|
-
maxHeight?: number;
|
|
254
|
-
zIndex?: number;
|
|
255
|
-
direction?: TYPE_POPOVER_DIRECTION;
|
|
256
|
-
timeDestroy?: number;
|
|
257
|
-
widthByParent?: boolean;
|
|
464
|
+
width?: number; // Chiều rộng cố định (px)
|
|
465
|
+
maxWidth?: number; // Chiều rộng tối đa (px)
|
|
466
|
+
maxHeight?: number; // Chiều cao tối đa của danh sách (px)
|
|
467
|
+
zIndex?: number; // z-index của popover layer
|
|
468
|
+
direction?: TYPE_POPOVER_DIRECTION; // Hướng mở: 'top' | 'bottom' | 'left' | 'right'
|
|
469
|
+
timeDestroy?: number; // Thời gian (ms) trước khi DOM popover bị destroy sau khi đóng
|
|
470
|
+
widthByParent?: boolean; // Lấy chiều rộng theo parent element
|
|
258
471
|
position?: {
|
|
259
|
-
mode: 'start' | 'center' | 'end';
|
|
260
|
-
distance: number;
|
|
472
|
+
mode: 'start' | 'center' | 'end'; // Căn lề ngang của popup so với trigger
|
|
473
|
+
distance: number; // Khoảng lệch theo chiều ngang (px)
|
|
261
474
|
};
|
|
262
|
-
classInclude?: string;
|
|
475
|
+
classInclude?: string; // Class CSS bổ sung cho container popover
|
|
263
476
|
}
|
|
264
477
|
```
|
|
265
478
|
|
|
266
|
-
##
|
|
479
|
+
## Lưu ý quan trọng
|
|
267
480
|
|
|
268
|
-
|
|
481
|
+
⚠️ **`items` là required**: Input `[items]` bắt buộc phải truyền vào. Truyền mảng rỗng `[]` để hiển thị trạng thái "Không có dữ liệu".
|
|
269
482
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
[fieldDisplay]: string; // Mặc định: 'label'
|
|
274
|
-
[keyField]: string; // Mặc định: 'key'
|
|
275
|
-
|
|
276
|
-
// Optional fields
|
|
277
|
-
class?: string; // Class cho item
|
|
278
|
-
classIconLeft?: string; // Icon class
|
|
279
|
-
classInclude?: string; // Class bổ sung
|
|
280
|
-
classRow?: string; // Class cho row
|
|
281
|
-
disable?: boolean; // Disable item
|
|
282
|
-
ignoreFlex?: boolean; // Không dùng flex layout
|
|
283
|
-
showPopover?: boolean; // Hiển thị popover cho item
|
|
284
|
-
popoverContent?: string; // Nội dung popover
|
|
285
|
-
subTemplate?: TemplateRef; // Custom template
|
|
286
|
-
buttonTemplateConfig?: {
|
|
287
|
-
// Config cho button trong item
|
|
288
|
-
icon?: string;
|
|
289
|
-
iconLeft?: string;
|
|
290
|
-
label?: string;
|
|
291
|
-
type?: TYPE_BUTTON;
|
|
292
|
-
action: (item: any, items: any[]) => void;
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
```
|
|
483
|
+
⚠️ **`applyNow = false` yêu cầu `keyField`**: Khi dùng chế độ apply sau, component cần `keyField` để theo dõi item đang được chọn. Giá trị mặc định là `'key'` — đảm bảo mỗi item có field `key` hoặc truyền `keyField` phù hợp.
|
|
484
|
+
|
|
485
|
+
⚠️ **Label button thay đổi khi `applyNow = false`**: Ở chế độ `applyNow = false`, sau khi user chọn item, label trên button chính sẽ tự động cập nhật sang tên item được chọn (dựa theo `fieldDisplay`). Để label cố định, dùng `applyNow = true`.
|
|
296
486
|
|
|
297
|
-
|
|
487
|
+
⚠️ **XSS tự động**: Giá trị của field `fieldDisplay` trong từng item được tự động xử lý qua `escapeHtml` khi truyền vào component. Không cần escape thủ công trước khi truyền.
|
|
298
488
|
|
|
299
|
-
|
|
300
|
-
| --------------- | ------- | ---------------- |
|
|
301
|
-
| Angular | 18+ | Framework |
|
|
302
|
-
| Angular Signals | - | State management |
|
|
303
|
-
| TailwindCSS | 3.x | Styling |
|
|
304
|
-
| OnPush | - | Change Detection |
|
|
489
|
+
⚠️ **`FunctionsControl` có thể `undefined`**: Getter `FunctionsControl` trả về `undefined` nếu popover chưa được mount. Luôn kiểm tra `?.` trước khi gọi các method bên trong.
|
|
305
490
|
|
|
306
491
|
## Demo
|
|
307
492
|
|
|
@@ -310,20 +495,3 @@ npx nx serve core-ui
|
|
|
310
495
|
```
|
|
311
496
|
|
|
312
497
|
Truy cập: `http://localhost:4500/buttons/dropdown`
|
|
313
|
-
|
|
314
|
-
## Unit Tests
|
|
315
|
-
|
|
316
|
-
```bash
|
|
317
|
-
# Chạy tests
|
|
318
|
-
npx nx test components-buttons-dropdown
|
|
319
|
-
|
|
320
|
-
# Coverage
|
|
321
|
-
npx nx test components-buttons-dropdown --coverage
|
|
322
|
-
|
|
323
|
-
# Watch mode
|
|
324
|
-
npx nx test components-buttons-dropdown --watch
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
## License
|
|
328
|
-
|
|
329
|
-
MIT
|
package/dropdown.component.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { IPopoverFunctionControlEvent, TYPE_POPOVER_EVENT, TYPE_POPOVER_MODE } f
|
|
|
3
3
|
import { IPopupConfigButtonDropdown } from './dropdown.interface';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class LibsUiComponentsButtonsDropdownComponent {
|
|
6
|
-
private functionsControlPopover;
|
|
6
|
+
private readonly functionsControlPopover;
|
|
7
7
|
protected labelDisplay: import("@angular/core").Signal<any>;
|
|
8
8
|
readonly label: import("@angular/core").InputSignal<string | undefined>;
|
|
9
9
|
readonly fieldClass: import("@angular/core").InputSignal<string>;
|
|
@@ -72,7 +72,7 @@ export class LibsUiComponentsButtonsDropdownComponent {
|
|
|
72
72
|
data.buttonTemplateConfig.action(data, items);
|
|
73
73
|
}
|
|
74
74
|
labelComputed() {
|
|
75
|
-
if (!this.keySelected() || !this.items()
|
|
75
|
+
if (!this.keySelected() || !this.items()?.length || !this.keyField() || this.applyNow()) {
|
|
76
76
|
return this.label();
|
|
77
77
|
}
|
|
78
78
|
for (const item of this.items()) {
|
|
@@ -83,10 +83,10 @@ export class LibsUiComponentsButtonsDropdownComponent {
|
|
|
83
83
|
return this.label();
|
|
84
84
|
}
|
|
85
85
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsButtonsDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
86
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsButtonsDropdownComponent, isStandalone: true, selector: "libs_ui-components-buttons-dropdown", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, fieldClass: { classPropertyName: "fieldClass", publicName: "fieldClass", isSignal: true, isRequired: false, transformFunction: null }, fieldClassIconLeft: { classPropertyName: "fieldClassIconLeft", publicName: "fieldClassIconLeft", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, fieldDisplay: { classPropertyName: "fieldDisplay", publicName: "fieldDisplay", isSignal: true, isRequired: false, transformFunction: null }, keyField: { classPropertyName: "keyField", publicName: "keyField", isSignal: true, isRequired: false, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: false, transformFunction: null }, applyNow: { classPropertyName: "applyNow", publicName: "applyNow", isSignal: true, isRequired: false, transformFunction: null }, showBorderBottom: { classPropertyName: "showBorderBottom", publicName: "showBorderBottom", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, sizeButton: { classPropertyName: "sizeButton", publicName: "sizeButton", isSignal: true, isRequired: false, transformFunction: null }, classLabel: { classPropertyName: "classLabel", publicName: "classLabel", isSignal: true, isRequired: false, transformFunction: null }, iconOnlyType: { classPropertyName: "iconOnlyType", publicName: "iconOnlyType", isSignal: true, isRequired: false, transformFunction: null }, classIconRight: { classPropertyName: "classIconRight", publicName: "classIconRight", isSignal: true, isRequired: false, transformFunction: null }, classIconLeft: { classPropertyName: "classIconLeft", publicName: "classIconLeft", isSignal: true, isRequired: false, transformFunction: null }, typeButton: { classPropertyName: "typeButton", publicName: "typeButton", isSignal: true, isRequired: false, transformFunction: null }, popupConfig: { classPropertyName: "popupConfig", publicName: "popupConfig", isSignal: true, isRequired: false, transformFunction: null }, ignoreHiddenPopoverContentWhenMouseLeave: { classPropertyName: "ignoreHiddenPopoverContentWhenMouseLeave", publicName: "ignoreHiddenPopoverContentWhenMouseLeave", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, modePopover: { classPropertyName: "modePopover", publicName: "modePopover", isSignal: true, isRequired: false, transformFunction: null }, classIncludeContainer: { classPropertyName: "classIncludeContainer", publicName: "classIncludeContainer", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keySelected: "keySelectedChange", outSelectItem: "outSelectItem", outHover: "outHover", outApply: "outApply", outPopoverEvent: "outPopoverEvent", outFunctionsControl: "outFunctionsControl", outIconEvent: "outIconEvent" }, ngImport: i0, template: "<div\n #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button\n [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0,\n },\n },\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button\n [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance: 2,\n position: {\n mode: 'start',\n distance: 0,\n },\n },\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2 }\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event, item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span\n [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\"></span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button\n [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null; context: { item: item }\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n", styles: [":host ::ng-deep .libs-ui-buttons-dropdown{max-width:max-content}:host ::ng-deep .libs-ui-buttons-dropdown .libs-ui-button{border-radius:0!important;height:100%}:host ::ng-deep .libs-ui-buttons-dropdown>:first-child libs_ui-components-popover .libs-ui-button{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;padding-right:8px}:host ::ng-deep .libs-ui-buttons-dropdown>:last-child libs_ui-components-popover .libs-ui-button{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important;padding-left:0}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:first-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:last-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:first-child libs_ui-components-popover .libs-ui-button{padding-right:12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent!important;padding:4px 12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:first-child libs_ui-components-popover .libs-ui-button{border-right:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:first-child libs_ui-components-popover .libs-ui-button{border-right:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:last-child libs_ui-components-popover .libs-ui-button{border-left:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover *>[class^=libs-ui-icon]:before{color:var(--libs-ui-color-light-1, #4e8cf7)}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover .libs-ui-button{color:var(--libs-ui-color-light-1, #4e8cf7);background:var(--mo-button-other-color-background-hover, #e9f1fe)!important}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
86
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsButtonsDropdownComponent, isStandalone: true, selector: "libs_ui-components-buttons-dropdown", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, fieldClass: { classPropertyName: "fieldClass", publicName: "fieldClass", isSignal: true, isRequired: false, transformFunction: null }, fieldClassIconLeft: { classPropertyName: "fieldClassIconLeft", publicName: "fieldClassIconLeft", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, fieldDisplay: { classPropertyName: "fieldDisplay", publicName: "fieldDisplay", isSignal: true, isRequired: false, transformFunction: null }, keyField: { classPropertyName: "keyField", publicName: "keyField", isSignal: true, isRequired: false, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: false, transformFunction: null }, applyNow: { classPropertyName: "applyNow", publicName: "applyNow", isSignal: true, isRequired: false, transformFunction: null }, showBorderBottom: { classPropertyName: "showBorderBottom", publicName: "showBorderBottom", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, sizeButton: { classPropertyName: "sizeButton", publicName: "sizeButton", isSignal: true, isRequired: false, transformFunction: null }, classLabel: { classPropertyName: "classLabel", publicName: "classLabel", isSignal: true, isRequired: false, transformFunction: null }, iconOnlyType: { classPropertyName: "iconOnlyType", publicName: "iconOnlyType", isSignal: true, isRequired: false, transformFunction: null }, classIconRight: { classPropertyName: "classIconRight", publicName: "classIconRight", isSignal: true, isRequired: false, transformFunction: null }, classIconLeft: { classPropertyName: "classIconLeft", publicName: "classIconLeft", isSignal: true, isRequired: false, transformFunction: null }, typeButton: { classPropertyName: "typeButton", publicName: "typeButton", isSignal: true, isRequired: false, transformFunction: null }, popupConfig: { classPropertyName: "popupConfig", publicName: "popupConfig", isSignal: true, isRequired: false, transformFunction: null }, ignoreHiddenPopoverContentWhenMouseLeave: { classPropertyName: "ignoreHiddenPopoverContentWhenMouseLeave", publicName: "ignoreHiddenPopoverContentWhenMouseLeave", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, modePopover: { classPropertyName: "modePopover", publicName: "modePopover", isSignal: true, isRequired: false, transformFunction: null }, classIncludeContainer: { classPropertyName: "classIncludeContainer", publicName: "classIncludeContainer", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keySelected: "keySelectedChange", outSelectItem: "outSelectItem", outHover: "outHover", outApply: "outApply", outPopoverEvent: "outPopoverEvent", outFunctionsControl: "outFunctionsControl", outIconEvent: "outIconEvent" }, ngImport: i0, template: "<div\n #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button\n [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0,\n },\n },\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button\n [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance: 2,\n position: {\n mode: 'start',\n distance: 0,\n },\n },\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2 }\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n tabindex=\"0\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event, item)\"\n (keydown.enter)=\"handlerSelectItem($any($event), item)\"\n (keydown.space)=\"handlerSelectItem($any($event), item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span\n [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\"></span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button\n [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null; context: { item: item }\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n", styles: [":host ::ng-deep .libs-ui-buttons-dropdown{max-width:max-content}:host ::ng-deep .libs-ui-buttons-dropdown .libs-ui-button{border-radius:0!important;height:100%}:host ::ng-deep .libs-ui-buttons-dropdown>:first-child libs_ui-components-popover .libs-ui-button{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;padding-right:8px}:host ::ng-deep .libs-ui-buttons-dropdown>:last-child libs_ui-components-popover .libs-ui-button{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important;padding-left:0}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:first-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:last-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:first-child libs_ui-components-popover .libs-ui-button{padding-right:12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent!important;padding:4px 12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:first-child libs_ui-components-popover .libs-ui-button{border-right:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:first-child libs_ui-components-popover .libs-ui-button{border-right:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:last-child libs_ui-components-popover .libs-ui-button{border-left:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover *>[class^=libs-ui-icon]:before{color:var(--libs-ui-color-light-1, #4e8cf7)}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover .libs-ui-button{color:var(--libs-ui-color-light-1, #4e8cf7);background:var(--mo-button-other-color-background-hover, #e9f1fe)!important}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
87
87
|
}
|
|
88
88
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsButtonsDropdownComponent, decorators: [{
|
|
89
89
|
type: Component,
|
|
90
|
-
args: [{ selector: 'libs_ui-components-buttons-dropdown', standalone: true, imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsPopoverComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button\n [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0,\n },\n },\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button\n [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance: 2,\n position: {\n mode: 'start',\n distance: 0,\n },\n },\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2 }\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event, item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span\n [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\"></span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button\n [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null; context: { item: item }\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n", styles: [":host ::ng-deep .libs-ui-buttons-dropdown{max-width:max-content}:host ::ng-deep .libs-ui-buttons-dropdown .libs-ui-button{border-radius:0!important;height:100%}:host ::ng-deep .libs-ui-buttons-dropdown>:first-child libs_ui-components-popover .libs-ui-button{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;padding-right:8px}:host ::ng-deep .libs-ui-buttons-dropdown>:last-child libs_ui-components-popover .libs-ui-button{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important;padding-left:0}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:first-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:last-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:first-child libs_ui-components-popover .libs-ui-button{padding-right:12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent!important;padding:4px 12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:first-child libs_ui-components-popover .libs-ui-button{border-right:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:first-child libs_ui-components-popover .libs-ui-button{border-right:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:last-child libs_ui-components-popover .libs-ui-button{border-left:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover *>[class^=libs-ui-icon]:before{color:var(--libs-ui-color-light-1, #4e8cf7)}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover .libs-ui-button{color:var(--libs-ui-color-light-1, #4e8cf7);background:var(--mo-button-other-color-background-hover, #e9f1fe)!important}\n"] }]
|
|
90
|
+
args: [{ selector: 'libs_ui-components-buttons-dropdown', standalone: true, imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsPopoverComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button\n [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0,\n },\n },\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button\n [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance: 2,\n position: {\n mode: 'start',\n distance: 0,\n },\n },\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2 }\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n tabindex=\"0\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event, item)\"\n (keydown.enter)=\"handlerSelectItem($any($event), item)\"\n (keydown.space)=\"handlerSelectItem($any($event), item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span\n [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\"></span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button\n [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null; context: { item: item }\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n", styles: [":host ::ng-deep .libs-ui-buttons-dropdown{max-width:max-content}:host ::ng-deep .libs-ui-buttons-dropdown .libs-ui-button{border-radius:0!important;height:100%}:host ::ng-deep .libs-ui-buttons-dropdown>:first-child libs_ui-components-popover .libs-ui-button{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;padding-right:8px}:host ::ng-deep .libs-ui-buttons-dropdown>:last-child libs_ui-components-popover .libs-ui-button{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important;padding-left:0}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:first-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:last-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:first-child libs_ui-components-popover .libs-ui-button{padding-right:12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent!important;padding:4px 12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:first-child libs_ui-components-popover .libs-ui-button{border-right:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:first-child libs_ui-components-popover .libs-ui-button{border-right:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:last-child libs_ui-components-popover .libs-ui-button{border-left:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover *>[class^=libs-ui-icon]:before{color:var(--libs-ui-color-light-1, #4e8cf7)}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover .libs-ui-button{color:var(--libs-ui-color-light-1, #4e8cf7);background:var(--mo-button-other-color-background-hover, #e9f1fe)!important}\n"] }]
|
|
91
91
|
}] });
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2J1dHRvbnMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9idXR0b25zL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBaUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUMzSCxPQUFPLEVBQWdDLGdDQUFnQyxFQUF5QyxNQUFNLDZCQUE2QixDQUFDO0FBQ3BKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQVl0RCxNQUFNLE9BQU8sd0NBQXdDO0lBQ25ELG1CQUFtQjtJQUNYLHVCQUF1QixHQUFHLE1BQU0sQ0FBMkMsU0FBUyxDQUFDLENBQUM7SUFDcEYsWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRWpFLGdCQUFnQjtJQUNQLEtBQUssR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUN4QixVQUFVLEdBQUcsS0FBSyxDQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUNBQW1DO0lBQ3hFLGtCQUFrQixHQUFHLEtBQUssQ0FBUyxlQUFlLENBQUMsQ0FBQyxDQUFD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LENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUN4RyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixDQUFDO1FBQ0QsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNoQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDakQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO3dHQXBGVSx3Q0FBd0M7NEZBQXhDLHdDQUF3Qyx3d0dDbEJyRCw4OEtBb0lBLGswRURySFksZUFBZSw0RkFBRSxnQkFBZ0Isb0pBQUUsc0NBQXNDLHNqQkFBRSxnQ0FBZ0M7OzRGQUcxRyx3Q0FBd0M7a0JBVHBELFNBQVM7K0JBRUUscUNBQXFDLGNBR25DLElBQUksV0FDUCxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxzQ0FBc0MsRUFBRSxnQ0FBZ0MsQ0FBQyxtQkFDckcsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0LCBtb2RlbCwgb3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LCBUWVBFX0JVVFRPTiwgVFlQRV9TSVpFX0JVVFRPTiB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCwgVFlQRV9QT1BPVkVSX01PREUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSVBvcHVwQ29uZmlnQnV0dG9uRHJvcGRvd24gfSBmcm9tICcuL2Ryb3Bkb3duLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWRyb3Bkb3duJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2Ryb3Bkb3duLmNvbXBvbmVudC5zY3NzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNCdXR0b25zRHJvcGRvd25Db21wb25lbnQge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByaXZhdGUgZnVuY3Rpb25zQ29udHJvbFBvcG92ZXIgPSBzaWduYWw8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxhYmVsRGlzcGxheSA9IGNvbXB1dGVkKHRoaXMubGFiZWxDb21wdXRlZC5iaW5kKHRoaXMpKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGxhYmVsID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBmaWVsZENsYXNzID0gaW5wdXQ8c3RyaW5nPignY2xhc3MnKTsgLy8gY2hhbmdlIGNvbG9yIGxhYmVsIGl0ZW0gb2YgaXRlbXNcbiAgcmVhZG9ubHkgZmllbGRDbGFzc0ljb25MZWZ0ID0gaW5wdXQ8c3RyaW5nPignY2xhc3NJY29uTGVmdCcpOyAvLyBpY29uY2xhc3MgaXRlbSBvZiBpdGVtc1xuICByZWFkb25seSBpdGVtcyA9IGlucHV0LnJlcXVpcmVkPEFycmF5PGFueT4sIEFycmF5PGFueT4+KHsgdHJhbnNmb3JtOiAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+ICh7IC4uLml0ZW0sIFt0aGlzLmZpZWxkRGlzcGxheSgpXTogZXNjYXBlSHRtbChpdGVtW3RoaXMuZmllbGREaXNwbGF5KCldKSB9KSkgfSk7IC8vIHJlcXVyaWVkXG4gIHJlYWRvbmx5IGZpZWxkRGlzcGxheSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignbGFiZWwnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAnbGFiZWwnIH0pO1xuICByZWFkb25seSBrZXlGaWVsZCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigna2V5JywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gJ2tleScgfSk7XG4gIHJlYWRvbmx5IGtleVNlbGVjdGVkID0gbW9kZWw8c3RyaW5nPigpO1xuICByZWFkb25seSBhcHBseU5vdyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTsgLy8gaWYgbm90IGFwcGx5Tm93OiBrZXlGaWVsZCBpcyByZXF1cmllZFxuICByZWFkb25seSBzaG93Qm9yZGVyQm90dG9tID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzaXplQnV0dG9uID0gaW5wdXQ8VFlQRV9TSVpFX0JVVFRPTj4oJ21lZGl1bScpO1xuICByZWFkb25seSBjbGFzc0xhYmVsID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGljb25Pbmx5VHlwZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgY2xhc3NJY29uUmlnaHQgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtWzkwZGVnXScpO1xuICByZWFkb25seSBjbGFzc0ljb25MZWZ0ID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IHR5cGVCdXR0b24gPSBpbnB1dDxUWVBFX0JVVFRPTj4oJ2J1dHRvbi1wcmltYXJ5Jyk7XG4gIHJlYWRvbmx5IHBvcHVwQ29uZmlnID0gaW5wdXQ8SVBvcHVwQ29uZmlnQnV0dG9uRHJvcGRvd24+KHsgd2lkdGg6IDIwNSwgbWF4V2lkdGg6IDI1MCwgbWF4SGVpZ2h0OiAxNDAsIHpJbmRleDogMTIwMCwgZGlyZWN0aW9uOiAndG9wJyB9KTtcbiAgcmVhZG9ubHkgaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgbW9kZVBvcG92ZXIgPSBpbnB1dDxUWVBFX1BPUE9WRVJfTU9ERT4oJ2NsaWNrLXRvZ2dsZScpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVDb250YWluZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0U2VsZWN0SXRlbSA9IG91dHB1dDxhbnk+KCk7XG4gIHJlYWRvbmx5IG91dEhvdmVyID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEFwcGx5ID0gb3V0cHV0PGFueT4oKTsgLy8gc+G7rSBk4bulbmcgY2hvIGLhuqVtIGJ1dHRvbiBsZWZ0IGNo4bq/IMSR4buZIGFwcGx5Tm93ID0gZmFsc2U7XG4gIHJlYWRvbmx5IG91dFBvcG92ZXJFdmVudCA9IG91dHB1dDxUWVBFX1BPUE9WRVJfRVZFTlQ+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0SWNvbkV2ZW50ID0gb3V0cHV0PE1vdXNlRXZlbnQ+KCk7XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQXBwbHkoKSB7XG4gICAgaWYgKCF0aGlzLmFwcGx5Tm93KCkpIHtcbiAgICAgIHRoaXMub3V0QXBwbHkuZW1pdCh0aGlzLml0ZW1zKCkuZmluZCgoaXRlbSkgPT4gaXRlbVt0aGlzLmtleUZpZWxkKCldID09PSB0aGlzLmtleVNlbGVjdGVkKCkpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdEl0ZW0oZXZlbnQ6IEV2ZW50LCBkYXRhOiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZGF0YS5zdWJUZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXBwbHlOb3coKSkge1xuICAgICAgdGhpcy5rZXlTZWxlY3RlZC5zZXQoZGF0YVt0aGlzLmtleUZpZWxkKCldKTtcbiAgICB9XG4gICAgdGhpcy5vdXRTZWxlY3RJdGVtLmVtaXQoZGF0YSk7XG4gICAgdGhpcy5vdXRIb3Zlci5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUG9wb3ZlckV2ZW50KGV2ZW50OiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICB0aGlzLm91dFBvcG92ZXJFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUG9wb3ZlckNvbnRyb2xFdmVudChjb250cm9sOiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoY29udHJvbCk7XG4gICAgdGhpcy5mdW5jdGlvbnNDb250cm9sUG9wb3Zlci5zZXQoY29udHJvbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25zQ29udHJvbFBvcG92ZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ2xpY2tCdXR0b25UZW1wbGF0ZShldmVudDogRXZlbnQsIGRhdGE6IGFueSwgaXRlbXM6IEFycmF5PGFueT4pIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkYXRhLmJ1dHRvblRlbXBsYXRlQ29uZmlnLmFjdGlvbihkYXRhLCBpdGVtcyk7XG4gIH1cblxuICBwcml2YXRlIGxhYmVsQ29tcHV0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmtleVNlbGVjdGVkKCkgfHwgIXRoaXMuaXRlbXMoKSB8fCAhdGhpcy5pdGVtcygpLmxlbmd0aCB8fCAhdGhpcy5rZXlGaWVsZCgpIHx8IHRoaXMuYXBwbHlOb3coKSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFiZWwoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMoKSkge1xuICAgICAgaWYgKGl0ZW1bdGhpcy5rZXlGaWVsZCgpXSA9PT0gdGhpcy5rZXlTZWxlY3RlZCgpKSB7XG4gICAgICAgIHJldHVybiBpdGVtW3RoaXMuZmllbGREaXNwbGF5KCldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxhYmVsKCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgI2J1dHRvbkRyb3Bkb3duRWxcbiAgY2xhc3M9XCJsaWJzLXVpLWJ1dHRvbnMtZHJvcGRvd24gZmxleCB7eyBjbGFzc0luY2x1ZGVDb250YWluZXIoKSB8fCAnJyB9fVwiXG4gIFtjbGFzcy5saWJzLXVpLWJ1dHRvbnMtZHJvcGRvd24tdW4tYXBwbHktbm93XT1cIiFhcHBseU5vdygpXCJcbiAgW2NsYXNzLmxpYnMtdWktYnV0dG9ucy1kcm9wZG93bi1hcHBseS1ub3ctYnV0dG9uLXByaW1hcnldPVwiYXBwbHlOb3coKSAmJiB0eXBlQnV0dG9uKCkgPT09ICdidXR0b24tcHJpbWFyeSdcIlxuICBbY2xhc3MubGlicy11aS1idXR0b25zLWRyb3Bkb3duLWFwcGx5LW5vdy1idXR0b24tc2Vjb25kYXJ5XT1cImFwcGx5Tm93KCkgJiYgdHlwZUJ1dHRvbigpID09PSAnYnV0dG9uLXNlY29uZGFyeSdcIj5cbiAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKVwiXG4gICAgW2ljb25Pbmx5VHlwZV09XCJpY29uT25seVR5cGUoKVwiXG4gICAgW2NsYXNzSWNvbkxlZnRdPVwiY2xhc3NJY29uTGVmdCgpXCJcbiAgICBbY2xhc3NJY29uUmlnaHRdPVwiIWFwcGx5Tm93KCkgPyAnJyA6IGNsYXNzSWNvblJpZ2h0KClcIlxuICAgIFt0eXBlXT1cInR5cGVCdXR0b24oKVwiXG4gICAgW2NsYXNzTGFiZWxdPVwiY2xhc3NMYWJlbCgpXCJcbiAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzSW5jbHVkZSgpXCJcbiAgICBbc2l6ZUJ1dHRvbl09XCJzaXplQnV0dG9uKClcIlxuICAgIFtwb3BvdmVyXT1cIntcbiAgICAgIGVsZW1lbnRSZWZDdXN0b206IGJ1dHRvbkRyb3Bkb3duRWwsXG4gICAgICBtb2RlOiBtb2RlUG9wb3ZlcigpLFxuICAgICAgaWdub3JlU2hvd1BvcG92ZXI6ICFhcHBseU5vdygpLFxuICAgICAgaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgICAgICB0aW1lOiAwLjUsXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZUNvbnRlbnRFbCxcbiAgICAgICAgd2hpdGVUaGVtZTogdHJ1ZSxcbiAgICAgICAgaWdub3JlQXJyb3c6IHRydWUsXG4gICAgICAgIHdpZHRoOiBwb3B1cENvbmZpZygpLndpZHRoLFxuICAgICAgICB3aWR0aEJ5UGFyZW50OiBwb3B1cENvbmZpZygpLndpZHRoQnlQYXJlbnQgPz8gZmFsc2UsXG4gICAgICAgIG1heFdpZHRoOiBwb3B1cENvbmZpZygpLm1heFdpZHRoLFxuICAgICAgICBtYXhIZWlnaHQ6IHBvcHVwQ29uZmlnKCkubWF4SGVpZ2h0LFxuICAgICAgICB6SW5kZXg6IHBvcHVwQ29uZmlnKCkuekluZGV4LFxuICAgICAgICBjbGFzc0luY2x1ZGU6ICdyb3VuZGVkLVs0cHhdICcgKyBwb3B1cENvbmZpZygpLmNsYXNzSW5jbHVkZSxcbiAgICAgICAgZGlyZWN0aW9uOiBwb3B1cENvbmZpZygpLmRpcmVjdGlvbixcbiAgICAgICAgdGltZXJEZXN0cm95OiBwb3B1cENvbmZpZygpLnRpbWVEZXN0cm95LFxuICAgICAgICBkaXJlY3Rpb25EaXN0YW5jZTogMixcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICBtb2RlOiBwb3B1cENvbmZpZygpLnBvc2l0aW9uPy5tb2RlIHx8ICdzdGFydCcsXG4gICAgICAgICAgZGlzdGFuY2U6IHBvcHVwQ29uZmlnKCkucG9zaXRpb24/LmRpc3RhbmNlID8/IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cIlxuICAgIFtsYWJlbF09XCJsYWJlbERpc3BsYXkoKVwiXG4gICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlclBvcG92ZXJDb250cm9sRXZlbnQoJGV2ZW50KVwiXG4gICAgKG91dFBvcG92ZXJFdmVudCk9XCJoYW5kbGVyUG9wb3ZlckV2ZW50KCRldmVudClcIlxuICAgIChvdXRDbGljayk9XCJoYW5kbGVyQXBwbHkoKVwiIC8+XG4gIEBpZiAoIWFwcGx5Tm93KCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiaC1mdWxsIHctWzFweF0gYmctd2hpdGVcIj48L2Rpdj5cbiAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICBbdHlwZV09XCJ0eXBlQnV0dG9uKClcIlxuICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICAgIFtzaXplQnV0dG9uXT1cInNpemVCdXR0b24oKVwiXG4gICAgICBbcG9wb3Zlcl09XCJ7XG4gICAgICAgIG1vZGU6ICdjbGljay10b2dnbGUnLFxuICAgICAgICBpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlOiBpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlKCksXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgICAgICAgdGltZTogMC41LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlQ29udGVudEVsLFxuICAgICAgICAgIHdoaXRlVGhlbWU6IHRydWUsXG4gICAgICAgICAgaWdub3JlQXJyb3c6IHRydWUsXG4gICAgICAgICAgd2lkdGg6IHBvcHVwQ29uZmlnKCkud2lkdGgsXG4gICAgICAgICAgbWF4V2lkdGg6IHBvcHVwQ29uZmlnKCkubWF4V2lkdGgsXG4gICAgICAgICAgd2lkdGhCeVBhcmVudDogcG9wdXBDb25maWcoKS53aWR0aEJ5UGFyZW50ID8/IGZhbHNlLFxuICAgICAgICAgIG1heEhlaWdodDogcG9wdXBDb25maWcoKS5tYXhIZWlnaHQsXG4gICAgICAgICAgekluZGV4OiBwb3B1cENvbmZpZygpLnpJbmRleCxcbiAgICAgICAgICBkaXJlY3Rpb246IHBvcHVwQ29uZmlnKCkuZGlyZWN0aW9uLFxuICAgICAgICAgIGNsYXNzSW5jbHVkZTogcG9wdXBDb25maWcoKS5jbGFzc0luY2x1ZGUsXG4gICAgICAgICAgZGlyZWN0aW9uRGlzdGFuY2U6IDIsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIG1vZGU6ICdzdGFydCcsXG4gICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfVwiXG4gICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImNsYXNzSWNvblJpZ2h0KClcIlxuICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0luY2x1ZGUoKSB8fCAnIXB5LVs5cHhdJ1wiXG4gICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyUG9wb3ZlckNvbnRyb2xFdmVudCgkZXZlbnQpXCJcbiAgICAgIChvdXRQb3BvdmVyRXZlbnQpPVwiaGFuZGxlclBvcG92ZXJFdmVudCgkZXZlbnQpXCIgLz5cbiAgfVxuPC9kaXY+XG48bmctdGVtcGxhdGUgI3RlbXBsYXRlQ29udGVudEVsPlxuICA8ZGl2PlxuICAgIEBpZiAoaXRlbXMoKSAmJiBpdGVtcygpLmxlbmd0aCkge1xuICAgICAgPGRpdiBjbGFzcz1cIm0tMCBwLTBcIj5cbiAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtcygpOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInt7IGl0ZW0uY2xhc3NSb3cgfHwgJycgfX1cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6IGl0ZW0ucG9wb3ZlckNvbnRlbnQsIHpJbmRleDogcG9wdXBDb25maWcoKS56SW5kZXgsIGRpcmVjdGlvbkRpc3RhbmNlOiAtMiB9XCJcbiAgICAgICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cIiFpdGVtLnNob3dQb3BvdmVyXCJcbiAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktYmctbGlzdC1ob3ZlciByZWxhdGl2ZSBjdXJzb3ItcG9pbnRlciBweS1bN3B4XSB7eyBpdGVtLmNsYXNzSW5jbHVkZSB8fCAnJyB9fSAge3sgc2hvd0JvcmRlckJvdHRvbSgpID8gJ2xpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsJyA6ICcnIH19XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmZsZXhdPVwiIWl0ZW0uaWdub3JlRmxleFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5weC1bMTZweF1dPVwiYXBwbHlOb3coKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5wbC1bMTZweF1dPVwiIWFwcGx5Tm93KClcIlxuICAgICAgICAgICAgICBbY2xhc3MucHItWzQwcHhdXT1cIiFhcHBseU5vdygpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktZGlzYWJsZV09XCJpdGVtLmRpc2FibGVcIlxuICAgICAgICAgICAgICBbY2xhc3MucG9pbnRlci1ldmVudHMtbm9uZV09XCJpdGVtLmRpc2FibGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclNlbGVjdEl0ZW0oJGV2ZW50LCBpdGVtKVwiPlxuICAgICAgICAgICAgICBAaWYgKGl0ZW1bZmllbGRDbGFzc0ljb25MZWZ0KCldKSB7XG4gICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIml0ZW1bZmllbGRDbGFzc0ljb25MZWZ0KCldXCI+PC9pPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cIml0ZW1bZmllbGRDbGFzcygpXSA/PyAnbGlicy11aS1mb250LWg1cidcIlxuICAgICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiaXRlbVtmaWVsZERpc3BsYXkoKV0gfCB0cmFuc2xhdGVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS5idXR0b25UZW1wbGF0ZUNvbmZpZykge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIml0ZW0uYnV0dG9uVGVtcGxhdGVDb25maWcuaWNvbkxlZnRcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cIml0ZW0uYnV0dG9uVGVtcGxhdGVDb25maWcuaWNvblwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5idXR0b25UZW1wbGF0ZUNvbmZpZy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJpdGVtLmJ1dHRvblRlbXBsYXRlQ29uZmlnLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tCdXR0b25UZW1wbGF0ZSgkZXZlbnQsIGl0ZW0sIGl0ZW1zKCkpXCJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIml0ZW0uYnV0dG9uVGVtcGxhdGVDb25maWcudHlwZVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW0/LnN1YlRlbXBsYXRlIHx8IG51bGw7IGNvbnRleHQ6IHsgaXRlbTogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbVtrZXlGaWVsZCgpXSA9PT0ga2V5U2VsZWN0ZWQoKSAmJiAhYXBwbHlOb3coKSkge1xuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLWNoZWNrIGFic29sdXRlIHJpZ2h0LVsxNnB4XSB0b3AtWzhweF1cIj48L2k+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwLVsyMHB4XVwiXG4gICAgICAgIFtpbm5lckh0bWxdPVwiJ2kxOG5fbm9fZGF0YScgfCB0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2J1dHRvbnMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9idXR0b25zL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBaUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUMzSCxPQUFPLEVBQWdDLGdDQUFnQyxFQUF5QyxNQUFNLDZCQUE2QixDQUFDO0FBQ3BKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQVl0RCxNQUFNLE9BQU8sd0NBQXdDO0lBQ25ELG1CQUFtQjtJQUNGLHVCQUF1QixHQUFHLE1BQU0sQ0FBMkMsU0FBUyxDQUFDLENBQUM7SUFDN0YsWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRWpFLGdCQUFnQjtJQUNQLEtBQUssR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUN4QixVQUFVLEdBQUcsS0FBSyxDQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUNBQW1DO0lBQ3hFLGtCQUFrQixHQUFHLEtBQUssQ0FBUyxlQUFlLENBQUMsQ0FBQyxDQUFD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RixPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixDQUFDO1FBQ0QsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNoQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDakQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO3dHQXBGVSx3Q0FBd0M7NEZBQXhDLHdDQUF3Qyx3d0dDbEJyRCw4bkxBdUlBLGswRUR4SFksZUFBZSw0RkFBRSxnQkFBZ0Isb0pBQUUsc0NBQXNDLHNqQkFBRSxnQ0FBZ0M7OzRGQUcxRyx3Q0FBd0M7a0JBVHBELFNBQVM7K0JBRUUscUNBQXFDLGNBR25DLElBQUksV0FDUCxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxzQ0FBc0MsRUFBRSxnQ0FBZ0MsQ0FBQyxtQkFDckcsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0LCBtb2RlbCwgb3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LCBUWVBFX0JVVFRPTiwgVFlQRV9TSVpFX0JVVFRPTiB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCwgVFlQRV9QT1BPVkVSX01PREUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSVBvcHVwQ29uZmlnQnV0dG9uRHJvcGRvd24gfSBmcm9tICcuL2Ryb3Bkb3duLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWRyb3Bkb3duJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2Ryb3Bkb3duLmNvbXBvbmVudC5zY3NzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNCdXR0b25zRHJvcGRvd25Db21wb25lbnQge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByaXZhdGUgcmVhZG9ubHkgZnVuY3Rpb25zQ29udHJvbFBvcG92ZXIgPSBzaWduYWw8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxhYmVsRGlzcGxheSA9IGNvbXB1dGVkKHRoaXMubGFiZWxDb21wdXRlZC5iaW5kKHRoaXMpKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGxhYmVsID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBmaWVsZENsYXNzID0gaW5wdXQ8c3RyaW5nPignY2xhc3MnKTsgLy8gY2hhbmdlIGNvbG9yIGxhYmVsIGl0ZW0gb2YgaXRlbXNcbiAgcmVhZG9ubHkgZmllbGRDbGFzc0ljb25MZWZ0ID0gaW5wdXQ8c3RyaW5nPignY2xhc3NJY29uTGVmdCcpOyAvLyBpY29uY2xhc3MgaXRlbSBvZiBpdGVtc1xuICByZWFkb25seSBpdGVtcyA9IGlucHV0LnJlcXVpcmVkPEFycmF5PGFueT4sIEFycmF5PGFueT4+KHsgdHJhbnNmb3JtOiAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+ICh7IC4uLml0ZW0sIFt0aGlzLmZpZWxkRGlzcGxheSgpXTogZXNjYXBlSHRtbChpdGVtW3RoaXMuZmllbGREaXNwbGF5KCldKSB9KSkgfSk7IC8vIHJlcXVyaWVkXG4gIHJlYWRvbmx5IGZpZWxkRGlzcGxheSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignbGFiZWwnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAnbGFiZWwnIH0pO1xuICByZWFkb25seSBrZXlGaWVsZCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigna2V5JywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gJ2tleScgfSk7XG4gIHJlYWRvbmx5IGtleVNlbGVjdGVkID0gbW9kZWw8c3RyaW5nPigpO1xuICByZWFkb25seSBhcHBseU5vdyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTsgLy8gaWYgbm90IGFwcGx5Tm93OiBrZXlGaWVsZCBpcyByZXF1cmllZFxuICByZWFkb25seSBzaG93Qm9yZGVyQm90dG9tID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzaXplQnV0dG9uID0gaW5wdXQ8VFlQRV9TSVpFX0JVVFRPTj4oJ21lZGl1bScpO1xuICByZWFkb25seSBjbGFzc0xhYmVsID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGljb25Pbmx5VHlwZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgY2xhc3NJY29uUmlnaHQgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtWzkwZGVnXScpO1xuICByZWFkb25seSBjbGFzc0ljb25MZWZ0ID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IHR5cGVCdXR0b24gPSBpbnB1dDxUWVBFX0JVVFRPTj4oJ2J1dHRvbi1wcmltYXJ5Jyk7XG4gIHJlYWRvbmx5IHBvcHVwQ29uZmlnID0gaW5wdXQ8SVBvcHVwQ29uZmlnQnV0dG9uRHJvcGRvd24+KHsgd2lkdGg6IDIwNSwgbWF4V2lkdGg6IDI1MCwgbWF4SGVpZ2h0OiAxNDAsIHpJbmRleDogMTIwMCwgZGlyZWN0aW9uOiAndG9wJyB9KTtcbiAgcmVhZG9ubHkgaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgbW9kZVBvcG92ZXIgPSBpbnB1dDxUWVBFX1BPUE9WRVJfTU9ERT4oJ2NsaWNrLXRvZ2dsZScpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVDb250YWluZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0U2VsZWN0SXRlbSA9IG91dHB1dDxhbnk+KCk7XG4gIHJlYWRvbmx5IG91dEhvdmVyID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEFwcGx5ID0gb3V0cHV0PGFueT4oKTsgLy8gc+G7rSBk4bulbmcgY2hvIGLhuqVtIGJ1dHRvbiBsZWZ0IGNo4bq/IMSR4buZIGFwcGx5Tm93ID0gZmFsc2U7XG4gIHJlYWRvbmx5IG91dFBvcG92ZXJFdmVudCA9IG91dHB1dDxUWVBFX1BPUE9WRVJfRVZFTlQ+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0SWNvbkV2ZW50ID0gb3V0cHV0PE1vdXNlRXZlbnQ+KCk7XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQXBwbHkoKSB7XG4gICAgaWYgKCF0aGlzLmFwcGx5Tm93KCkpIHtcbiAgICAgIHRoaXMub3V0QXBwbHkuZW1pdCh0aGlzLml0ZW1zKCkuZmluZCgoaXRlbSkgPT4gaXRlbVt0aGlzLmtleUZpZWxkKCldID09PSB0aGlzLmtleVNlbGVjdGVkKCkpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdEl0ZW0oZXZlbnQ6IEV2ZW50LCBkYXRhOiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZGF0YS5zdWJUZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXBwbHlOb3coKSkge1xuICAgICAgdGhpcy5rZXlTZWxlY3RlZC5zZXQoZGF0YVt0aGlzLmtleUZpZWxkKCldKTtcbiAgICB9XG4gICAgdGhpcy5vdXRTZWxlY3RJdGVtLmVtaXQoZGF0YSk7XG4gICAgdGhpcy5vdXRIb3Zlci5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUG9wb3ZlckV2ZW50KGV2ZW50OiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICB0aGlzLm91dFBvcG92ZXJFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUG9wb3ZlckNvbnRyb2xFdmVudChjb250cm9sOiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoY29udHJvbCk7XG4gICAgdGhpcy5mdW5jdGlvbnNDb250cm9sUG9wb3Zlci5zZXQoY29udHJvbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25zQ29udHJvbFBvcG92ZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ2xpY2tCdXR0b25UZW1wbGF0ZShldmVudDogRXZlbnQsIGRhdGE6IGFueSwgaXRlbXM6IEFycmF5PGFueT4pIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkYXRhLmJ1dHRvblRlbXBsYXRlQ29uZmlnLmFjdGlvbihkYXRhLCBpdGVtcyk7XG4gIH1cblxuICBwcml2YXRlIGxhYmVsQ29tcHV0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmtleVNlbGVjdGVkKCkgfHwgIXRoaXMuaXRlbXMoKT8ubGVuZ3RoIHx8ICF0aGlzLmtleUZpZWxkKCkgfHwgdGhpcy5hcHBseU5vdygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYWJlbCgpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcygpKSB7XG4gICAgICBpZiAoaXRlbVt0aGlzLmtleUZpZWxkKCldID09PSB0aGlzLmtleVNlbGVjdGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1bdGhpcy5maWVsZERpc3BsYXkoKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubGFiZWwoKTtcbiAgfVxufVxuIiwiPGRpdlxuICAjYnV0dG9uRHJvcGRvd25FbFxuICBjbGFzcz1cImxpYnMtdWktYnV0dG9ucy1kcm9wZG93biBmbGV4IHt7IGNsYXNzSW5jbHVkZUNvbnRhaW5lcigpIHx8ICcnIH19XCJcbiAgW2NsYXNzLmxpYnMtdWktYnV0dG9ucy1kcm9wZG93bi11bi1hcHBseS1ub3ddPVwiIWFwcGx5Tm93KClcIlxuICBbY2xhc3MubGlicy11aS1idXR0b25zLWRyb3Bkb3duLWFwcGx5LW5vdy1idXR0b24tcHJpbWFyeV09XCJhcHBseU5vdygpICYmIHR5cGVCdXR0b24oKSA9PT0gJ2J1dHRvbi1wcmltYXJ5J1wiXG4gIFtjbGFzcy5saWJzLXVpLWJ1dHRvbnMtZHJvcGRvd24tYXBwbHktbm93LWJ1dHRvbi1zZWNvbmRhcnldPVwiYXBwbHlOb3coKSAmJiB0eXBlQnV0dG9uKCkgPT09ICdidXR0b24tc2Vjb25kYXJ5J1wiPlxuICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICBbaWNvbk9ubHlUeXBlXT1cImljb25Pbmx5VHlwZSgpXCJcbiAgICBbY2xhc3NJY29uTGVmdF09XCJjbGFzc0ljb25MZWZ0KClcIlxuICAgIFtjbGFzc0ljb25SaWdodF09XCIhYXBwbHlOb3coKSA/ICcnIDogY2xhc3NJY29uUmlnaHQoKVwiXG4gICAgW3R5cGVdPVwidHlwZUJ1dHRvbigpXCJcbiAgICBbY2xhc3NMYWJlbF09XCJjbGFzc0xhYmVsKClcIlxuICAgIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlKClcIlxuICAgIFtzaXplQnV0dG9uXT1cInNpemVCdXR0b24oKVwiXG4gICAgW3BvcG92ZXJdPVwie1xuICAgICAgZWxlbWVudFJlZkN1c3RvbTogYnV0dG9uRHJvcGRvd25FbCxcbiAgICAgIG1vZGU6IG1vZGVQb3BvdmVyKCksXG4gICAgICBpZ25vcmVTaG93UG9wb3ZlcjogIWFwcGx5Tm93KCksXG4gICAgICBpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgICAgIHRpbWU6IDAuNSxcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlQ29udGVudEVsLFxuICAgICAgICB3aGl0ZVRoZW1lOiB0cnVlLFxuICAgICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgICAgd2lkdGg6IHBvcHVwQ29uZmlnKCkud2lkdGgsXG4gICAgICAgIHdpZHRoQnlQYXJlbnQ6IHBvcHVwQ29uZmlnKCkud2lkdGhCeVBhcmVudCA/PyBmYWxzZSxcbiAgICAgICAgbWF4V2lkdGg6IHBvcHVwQ29uZmlnKCkubWF4V2lkdGgsXG4gICAgICAgIG1heEhlaWdodDogcG9wdXBDb25maWcoKS5tYXhIZWlnaHQsXG4gICAgICAgIHpJbmRleDogcG9wdXBDb25maWcoKS56SW5kZXgsXG4gICAgICAgIGNsYXNzSW5jbHVkZTogJ3JvdW5kZWQtWzRweF0gJyArIHBvcHVwQ29uZmlnKCkuY2xhc3NJbmNsdWRlLFxuICAgICAgICBkaXJlY3Rpb246IHBvcHVwQ29uZmlnKCkuZGlyZWN0aW9uLFxuICAgICAgICB0aW1lckRlc3Ryb3k6IHBvcHVwQ29uZmlnKCkudGltZURlc3Ryb3ksXG4gICAgICAgIGRpcmVjdGlvbkRpc3RhbmNlOiAyLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIG1vZGU6IHBvcHVwQ29uZmlnKCkucG9zaXRpb24/Lm1vZGUgfHwgJ3N0YXJ0JyxcbiAgICAgICAgICBkaXN0YW5jZTogcG9wdXBDb25maWcoKS5wb3NpdGlvbj8uZGlzdGFuY2UgPz8gMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVwiXG4gICAgW2xhYmVsXT1cImxhYmVsRGlzcGxheSgpXCJcbiAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyUG9wb3ZlckNvbnRyb2xFdmVudCgkZXZlbnQpXCJcbiAgICAob3V0UG9wb3ZlckV2ZW50KT1cImhhbmRsZXJQb3BvdmVyRXZlbnQoJGV2ZW50KVwiXG4gICAgKG91dENsaWNrKT1cImhhbmRsZXJBcHBseSgpXCIgLz5cbiAgQGlmICghYXBwbHlOb3coKSkge1xuICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgdy1bMXB4XSBiZy13aGl0ZVwiPjwvZGl2PlxuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgIFt0eXBlXT1cInR5cGVCdXR0b24oKVwiXG4gICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKClcIlxuICAgICAgW3NpemVCdXR0b25dPVwic2l6ZUJ1dHRvbigpXCJcbiAgICAgIFtwb3BvdmVyXT1cIntcbiAgICAgICAgbW9kZTogJ2NsaWNrLXRvZ2dsZScsXG4gICAgICAgIGlnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmU6IGlnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmUoKSxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgICAgICB0aW1lOiAwLjUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVDb250ZW50RWwsXG4gICAgICAgICAgd2hpdGVUaGVtZTogdHJ1ZSxcbiAgICAgICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgICAgICB3aWR0aDogcG9wdXBDb25maWcoKS53aWR0aCxcbiAgICAgICAgICBtYXhXaWR0aDogcG9wdXBDb25maWcoKS5tYXhXaWR0aCxcbiAgICAgICAgICB3aWR0aEJ5UGFyZW50OiBwb3B1cENvbmZpZygpLndpZHRoQnlQYXJlbnQgPz8gZmFsc2UsXG4gICAgICAgICAgbWF4SGVpZ2h0OiBwb3B1cENvbmZpZygpLm1heEhlaWdodCxcbiAgICAgICAgICB6SW5kZXg6IHBvcHVwQ29uZmlnKCkuekluZGV4LFxuICAgICAgICAgIGRpcmVjdGlvbjogcG9wdXBDb25maWcoKS5kaXJlY3Rpb24sXG4gICAgICAgICAgY2xhc3NJbmNsdWRlOiBwb3B1cENvbmZpZygpLmNsYXNzSW5jbHVkZSxcbiAgICAgICAgICBkaXJlY3Rpb25EaXN0YW5jZTogMixcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgbW9kZTogJ3N0YXJ0JyxcbiAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9XCJcbiAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICBbY2xhc3NJY29uUmlnaHRdPVwiY2xhc3NJY29uUmlnaHQoKVwiXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzSW5jbHVkZSgpIHx8ICchcHktWzlweF0nXCJcbiAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJQb3BvdmVyQ29udHJvbEV2ZW50KCRldmVudClcIlxuICAgICAgKG91dFBvcG92ZXJFdmVudCk9XCJoYW5kbGVyUG9wb3ZlckV2ZW50KCRldmVudClcIiAvPlxuICB9XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVDb250ZW50RWw+XG4gIDxkaXY+XG4gICAgQGlmIChpdGVtcygpICYmIGl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibS0wIHAtMFwiPlxuICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zKCk7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwie3sgaXRlbS5jbGFzc1JvdyB8fCAnJyB9fVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogaXRlbS5wb3BvdmVyQ29udGVudCwgekluZGV4OiBwb3B1cENvbmZpZygpLnpJbmRleCwgZGlyZWN0aW9uRGlzdGFuY2U6IC0yIH1cIlxuICAgICAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwiIWl0ZW0uc2hvd1BvcG92ZXJcIlxuICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1iZy1saXN0LWhvdmVyIHJlbGF0aXZlIGN1cnNvci1wb2ludGVyIHB5LVs3cHhdIHt7IGl0ZW0uY2xhc3NJbmNsdWRlIHx8ICcnIH19ICB7eyBzaG93Qm9yZGVyQm90dG9tKCkgPyAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnIDogJycgfX1cIlxuICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICBbY2xhc3MuZmxleF09XCIhaXRlbS5pZ25vcmVGbGV4XCJcbiAgICAgICAgICAgICAgW2NsYXNzLnB4LVsxNnB4XV09XCJhcHBseU5vdygpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnBsLVsxNnB4XV09XCIhYXBwbHlOb3coKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5wci1bNDBweF1dPVwiIWFwcGx5Tm93KClcIlxuICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cIml0ZW0uZGlzYWJsZVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1ub25lXT1cIml0ZW0uZGlzYWJsZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyU2VsZWN0SXRlbSgkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlclNlbGVjdEl0ZW0oJGFueSgkZXZlbnQpLCBpdGVtKVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cImhhbmRsZXJTZWxlY3RJdGVtKCRhbnkoJGV2ZW50KSwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgQGlmIChpdGVtW2ZpZWxkQ2xhc3NJY29uTGVmdCgpXSkge1xuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJpdGVtW2ZpZWxkQ2xhc3NJY29uTGVmdCgpXVwiPjwvaT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJpdGVtW2ZpZWxkQ2xhc3MoKV0gPz8gJ2xpYnMtdWktZm9udC1oNXInXCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cIml0ZW1bZmllbGREaXNwbGF5KCldIHwgdHJhbnNsYXRlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICBAaWYgKGl0ZW0uYnV0dG9uVGVtcGxhdGVDb25maWcpIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJpdGVtLmJ1dHRvblRlbXBsYXRlQ29uZmlnLmljb25MZWZ0XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJpdGVtLmJ1dHRvblRlbXBsYXRlQ29uZmlnLmljb25cIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIml0ZW0uYnV0dG9uVGVtcGxhdGVDb25maWcubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzTGFiZWxdPVwiaXRlbS5idXR0b25UZW1wbGF0ZUNvbmZpZy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrQnV0dG9uVGVtcGxhdGUoJGV2ZW50LCBpdGVtLCBpdGVtcygpKVwiXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCJpdGVtLmJ1dHRvblRlbXBsYXRlQ29uZmlnLnR5cGVcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtPy5zdWJUZW1wbGF0ZSB8fCBudWxsOyBjb250ZXh0OiB7IGl0ZW06IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICBAaWYgKGl0ZW1ba2V5RmllbGQoKV0gPT09IGtleVNlbGVjdGVkKCkgJiYgIWFwcGx5Tm93KCkpIHtcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGVjayBhYnNvbHV0ZSByaWdodC1bMTZweF0gdG9wLVs4cHhdXCI+PC9pPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicC1bMjBweF1cIlxuICAgICAgICBbaW5uZXJIdG1sXT1cIidpMThuX25vX2RhdGEnIHwgdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NgTemplateOutlet } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { signal, computed, input, model, output,
|
|
3
|
+
import { signal, computed, input, model, output, Component, ChangeDetectionStrategy } from '@angular/core';
|
|
4
4
|
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
5
5
|
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
6
6
|
import { escapeHtml } from '@libs-ui/utils';
|
|
@@ -73,7 +73,7 @@ class LibsUiComponentsButtonsDropdownComponent {
|
|
|
73
73
|
data.buttonTemplateConfig.action(data, items);
|
|
74
74
|
}
|
|
75
75
|
labelComputed() {
|
|
76
|
-
if (!this.keySelected() || !this.items()
|
|
76
|
+
if (!this.keySelected() || !this.items()?.length || !this.keyField() || this.applyNow()) {
|
|
77
77
|
return this.label();
|
|
78
78
|
}
|
|
79
79
|
for (const item of this.items()) {
|
|
@@ -84,11 +84,11 @@ class LibsUiComponentsButtonsDropdownComponent {
|
|
|
84
84
|
return this.label();
|
|
85
85
|
}
|
|
86
86
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsButtonsDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
87
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsButtonsDropdownComponent, isStandalone: true, selector: "libs_ui-components-buttons-dropdown", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, fieldClass: { classPropertyName: "fieldClass", publicName: "fieldClass", isSignal: true, isRequired: false, transformFunction: null }, fieldClassIconLeft: { classPropertyName: "fieldClassIconLeft", publicName: "fieldClassIconLeft", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, fieldDisplay: { classPropertyName: "fieldDisplay", publicName: "fieldDisplay", isSignal: true, isRequired: false, transformFunction: null }, keyField: { classPropertyName: "keyField", publicName: "keyField", isSignal: true, isRequired: false, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: false, transformFunction: null }, applyNow: { classPropertyName: "applyNow", publicName: "applyNow", isSignal: true, isRequired: false, transformFunction: null }, showBorderBottom: { classPropertyName: "showBorderBottom", publicName: "showBorderBottom", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, sizeButton: { classPropertyName: "sizeButton", publicName: "sizeButton", isSignal: true, isRequired: false, transformFunction: null }, classLabel: { classPropertyName: "classLabel", publicName: "classLabel", isSignal: true, isRequired: false, transformFunction: null }, iconOnlyType: { classPropertyName: "iconOnlyType", publicName: "iconOnlyType", isSignal: true, isRequired: false, transformFunction: null }, classIconRight: { classPropertyName: "classIconRight", publicName: "classIconRight", isSignal: true, isRequired: false, transformFunction: null }, classIconLeft: { classPropertyName: "classIconLeft", publicName: "classIconLeft", isSignal: true, isRequired: false, transformFunction: null }, typeButton: { classPropertyName: "typeButton", publicName: "typeButton", isSignal: true, isRequired: false, transformFunction: null }, popupConfig: { classPropertyName: "popupConfig", publicName: "popupConfig", isSignal: true, isRequired: false, transformFunction: null }, ignoreHiddenPopoverContentWhenMouseLeave: { classPropertyName: "ignoreHiddenPopoverContentWhenMouseLeave", publicName: "ignoreHiddenPopoverContentWhenMouseLeave", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, modePopover: { classPropertyName: "modePopover", publicName: "modePopover", isSignal: true, isRequired: false, transformFunction: null }, classIncludeContainer: { classPropertyName: "classIncludeContainer", publicName: "classIncludeContainer", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keySelected: "keySelectedChange", outSelectItem: "outSelectItem", outHover: "outHover", outApply: "outApply", outPopoverEvent: "outPopoverEvent", outFunctionsControl: "outFunctionsControl", outIconEvent: "outIconEvent" }, ngImport: i0, template: "<div\n #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button\n [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0,\n },\n },\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button\n [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance: 2,\n position: {\n mode: 'start',\n distance: 0,\n },\n },\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2 }\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event, item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span\n [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\"></span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button\n [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null; context: { item: item }\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n", styles: [":host ::ng-deep .libs-ui-buttons-dropdown{max-width:max-content}:host ::ng-deep .libs-ui-buttons-dropdown .libs-ui-button{border-radius:0!important;height:100%}:host ::ng-deep .libs-ui-buttons-dropdown>:first-child libs_ui-components-popover .libs-ui-button{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;padding-right:8px}:host ::ng-deep .libs-ui-buttons-dropdown>:last-child libs_ui-components-popover .libs-ui-button{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important;padding-left:0}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:first-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:last-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:first-child libs_ui-components-popover .libs-ui-button{padding-right:12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent!important;padding:4px 12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:first-child libs_ui-components-popover .libs-ui-button{border-right:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:first-child libs_ui-components-popover .libs-ui-button{border-right:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:last-child libs_ui-components-popover .libs-ui-button{border-left:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover *>[class^=libs-ui-icon]:before{color:var(--libs-ui-color-light-1, #4e8cf7)}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover .libs-ui-button{color:var(--libs-ui-color-light-1, #4e8cf7);background:var(--mo-button-other-color-background-hover, #e9f1fe)!important}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
87
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsButtonsDropdownComponent, isStandalone: true, selector: "libs_ui-components-buttons-dropdown", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, fieldClass: { classPropertyName: "fieldClass", publicName: "fieldClass", isSignal: true, isRequired: false, transformFunction: null }, fieldClassIconLeft: { classPropertyName: "fieldClassIconLeft", publicName: "fieldClassIconLeft", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, fieldDisplay: { classPropertyName: "fieldDisplay", publicName: "fieldDisplay", isSignal: true, isRequired: false, transformFunction: null }, keyField: { classPropertyName: "keyField", publicName: "keyField", isSignal: true, isRequired: false, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: false, transformFunction: null }, applyNow: { classPropertyName: "applyNow", publicName: "applyNow", isSignal: true, isRequired: false, transformFunction: null }, showBorderBottom: { classPropertyName: "showBorderBottom", publicName: "showBorderBottom", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, sizeButton: { classPropertyName: "sizeButton", publicName: "sizeButton", isSignal: true, isRequired: false, transformFunction: null }, classLabel: { classPropertyName: "classLabel", publicName: "classLabel", isSignal: true, isRequired: false, transformFunction: null }, iconOnlyType: { classPropertyName: "iconOnlyType", publicName: "iconOnlyType", isSignal: true, isRequired: false, transformFunction: null }, classIconRight: { classPropertyName: "classIconRight", publicName: "classIconRight", isSignal: true, isRequired: false, transformFunction: null }, classIconLeft: { classPropertyName: "classIconLeft", publicName: "classIconLeft", isSignal: true, isRequired: false, transformFunction: null }, typeButton: { classPropertyName: "typeButton", publicName: "typeButton", isSignal: true, isRequired: false, transformFunction: null }, popupConfig: { classPropertyName: "popupConfig", publicName: "popupConfig", isSignal: true, isRequired: false, transformFunction: null }, ignoreHiddenPopoverContentWhenMouseLeave: { classPropertyName: "ignoreHiddenPopoverContentWhenMouseLeave", publicName: "ignoreHiddenPopoverContentWhenMouseLeave", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, modePopover: { classPropertyName: "modePopover", publicName: "modePopover", isSignal: true, isRequired: false, transformFunction: null }, classIncludeContainer: { classPropertyName: "classIncludeContainer", publicName: "classIncludeContainer", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keySelected: "keySelectedChange", outSelectItem: "outSelectItem", outHover: "outHover", outApply: "outApply", outPopoverEvent: "outPopoverEvent", outFunctionsControl: "outFunctionsControl", outIconEvent: "outIconEvent" }, ngImport: i0, template: "<div\n #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button\n [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0,\n },\n },\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button\n [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance: 2,\n position: {\n mode: 'start',\n distance: 0,\n },\n },\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2 }\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n tabindex=\"0\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event, item)\"\n (keydown.enter)=\"handlerSelectItem($any($event), item)\"\n (keydown.space)=\"handlerSelectItem($any($event), item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span\n [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\"></span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button\n [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null; context: { item: item }\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n", styles: [":host ::ng-deep .libs-ui-buttons-dropdown{max-width:max-content}:host ::ng-deep .libs-ui-buttons-dropdown .libs-ui-button{border-radius:0!important;height:100%}:host ::ng-deep .libs-ui-buttons-dropdown>:first-child libs_ui-components-popover .libs-ui-button{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;padding-right:8px}:host ::ng-deep .libs-ui-buttons-dropdown>:last-child libs_ui-components-popover .libs-ui-button{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important;padding-left:0}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:first-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:last-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:first-child libs_ui-components-popover .libs-ui-button{padding-right:12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent!important;padding:4px 12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:first-child libs_ui-components-popover .libs-ui-button{border-right:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:first-child libs_ui-components-popover .libs-ui-button{border-right:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:last-child libs_ui-components-popover .libs-ui-button{border-left:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover *>[class^=libs-ui-icon]:before{color:var(--libs-ui-color-light-1, #4e8cf7)}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover .libs-ui-button{color:var(--libs-ui-color-light-1, #4e8cf7);background:var(--mo-button-other-color-background-hover, #e9f1fe)!important}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
88
88
|
}
|
|
89
89
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsButtonsDropdownComponent, decorators: [{
|
|
90
90
|
type: Component,
|
|
91
|
-
args: [{ selector: 'libs_ui-components-buttons-dropdown', standalone: true, imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsPopoverComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button\n [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0,\n },\n },\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button\n [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance: 2,\n position: {\n mode: 'start',\n distance: 0,\n },\n },\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2 }\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event, item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span\n [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\"></span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button\n [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null; context: { item: item }\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n", styles: [":host ::ng-deep .libs-ui-buttons-dropdown{max-width:max-content}:host ::ng-deep .libs-ui-buttons-dropdown .libs-ui-button{border-radius:0!important;height:100%}:host ::ng-deep .libs-ui-buttons-dropdown>:first-child libs_ui-components-popover .libs-ui-button{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;padding-right:8px}:host ::ng-deep .libs-ui-buttons-dropdown>:last-child libs_ui-components-popover .libs-ui-button{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important;padding-left:0}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:first-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:last-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:first-child libs_ui-components-popover .libs-ui-button{padding-right:12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent!important;padding:4px 12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:first-child libs_ui-components-popover .libs-ui-button{border-right:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:first-child libs_ui-components-popover .libs-ui-button{border-right:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:last-child libs_ui-components-popover .libs-ui-button{border-left:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover *>[class^=libs-ui-icon]:before{color:var(--libs-ui-color-light-1, #4e8cf7)}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover .libs-ui-button{color:var(--libs-ui-color-light-1, #4e8cf7);background:var(--mo-button-other-color-background-hover, #e9f1fe)!important}\n"] }]
|
|
91
|
+
args: [{ selector: 'libs_ui-components-buttons-dropdown', standalone: true, imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsPopoverComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button\n [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0,\n },\n },\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button\n [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance: 2,\n position: {\n mode: 'start',\n distance: 0,\n },\n },\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2 }\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n tabindex=\"0\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event, item)\"\n (keydown.enter)=\"handlerSelectItem($any($event), item)\"\n (keydown.space)=\"handlerSelectItem($any($event), item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span\n [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\"></span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button\n [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null; context: { item: item }\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n", styles: [":host ::ng-deep .libs-ui-buttons-dropdown{max-width:max-content}:host ::ng-deep .libs-ui-buttons-dropdown .libs-ui-button{border-radius:0!important;height:100%}:host ::ng-deep .libs-ui-buttons-dropdown>:first-child libs_ui-components-popover .libs-ui-button{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;padding-right:8px}:host ::ng-deep .libs-ui-buttons-dropdown>:last-child libs_ui-components-popover .libs-ui-button{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important;padding-left:0}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:first-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:last-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4e8cf7)!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:first-child libs_ui-components-popover .libs-ui-button{padding-right:12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent!important;padding:4px 12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:first-child libs_ui-components-popover .libs-ui-button{border-right:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:first-child libs_ui-components-popover .libs-ui-button{border-right:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:last-child libs_ui-components-popover .libs-ui-button{border-left:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover *>[class^=libs-ui-icon]:before{color:var(--libs-ui-color-light-1, #4e8cf7)}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover .libs-ui-button{color:var(--libs-ui-color-light-1, #4e8cf7);background:var(--mo-button-other-color-background-hover, #e9f1fe)!important}\n"] }]
|
|
92
92
|
}] });
|
|
93
93
|
|
|
94
94
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-buttons-dropdown.mjs","sources":["../../../../../../libs-ui/components/buttons/dropdown/src/dropdown.component.ts","../../../../../../libs-ui/components/buttons/dropdown/src/dropdown.component.html","../../../../../../libs-ui/components/buttons/dropdown/src/libs-ui-components-buttons-dropdown.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, model, output, signal } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent, TYPE_BUTTON, TYPE_SIZE_BUTTON } from '@libs-ui/components-buttons-button';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT, TYPE_POPOVER_MODE } from '@libs-ui/components-popover';\nimport { escapeHtml } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IPopupConfigButtonDropdown } from './dropdown.interface';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-buttons-dropdown',\n templateUrl: './dropdown.component.html',\n styleUrl: './dropdown.component.scss',\n standalone: true,\n imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsPopoverComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsButtonsDropdownComponent {\n // #region PROPERTY\n private functionsControlPopover = signal<IPopoverFunctionControlEvent | undefined>(undefined);\n protected labelDisplay = computed(this.labelComputed.bind(this));\n\n // #region INPUT\n readonly label = input<string>();\n readonly fieldClass = input<string>('class'); // change color label item of items\n readonly fieldClassIconLeft = input<string>('classIconLeft'); // iconclass item of items\n readonly items = input.required<Array<any>, Array<any>>({ transform: (data) => data.map((item) => ({ ...item, [this.fieldDisplay()]: escapeHtml(item[this.fieldDisplay()]) })) }); // requried\n readonly fieldDisplay = input<string, string | undefined>('label', { transform: (value) => value ?? 'label' });\n readonly keyField = input<string, string | undefined>('key', { transform: (value) => value ?? 'key' });\n readonly keySelected = model<string>();\n readonly applyNow = input<boolean>(false); // if not applyNow: keyField is requried\n readonly showBorderBottom = input<boolean>(false);\n readonly disable = input<boolean>(false);\n readonly sizeButton = input<TYPE_SIZE_BUTTON>('medium');\n readonly classLabel = input<string>('');\n readonly iconOnlyType = input<boolean>(false);\n readonly classIconRight = input<string>('libs-ui-icon-move-right rotate-[90deg]');\n readonly classIconLeft = input<string>('');\n readonly typeButton = input<TYPE_BUTTON>('button-primary');\n readonly popupConfig = input<IPopupConfigButtonDropdown>({ width: 205, maxWidth: 250, maxHeight: 140, zIndex: 1200, direction: 'top' });\n readonly ignoreHiddenPopoverContentWhenMouseLeave = input<boolean>(true);\n readonly classInclude = input<string>('');\n readonly modePopover = input<TYPE_POPOVER_MODE>('click-toggle');\n readonly classIncludeContainer = input<string>();\n\n // #region OUTPUT\n readonly outSelectItem = output<any>();\n readonly outHover = output<boolean>();\n readonly outApply = output<any>(); // sử dụng cho bấm button left chế độ applyNow = false;\n readonly outPopoverEvent = output<TYPE_POPOVER_EVENT>();\n readonly outFunctionsControl = output<IPopoverFunctionControlEvent>();\n readonly outIconEvent = output<MouseEvent>();\n\n /* FUNCTIONS */\n protected async handlerApply() {\n if (!this.applyNow()) {\n this.outApply.emit(this.items().find((item) => item[this.keyField()] === this.keySelected()));\n }\n }\n\n protected async handlerSelectItem(event: Event, data: any) {\n event.stopPropagation();\n if (data.subTemplate) {\n return;\n }\n if (!this.applyNow()) {\n this.keySelected.set(data[this.keyField()]);\n }\n this.outSelectItem.emit(data);\n this.outHover.emit(false);\n }\n\n protected async handlerPopoverEvent(event: TYPE_POPOVER_EVENT) {\n this.outPopoverEvent.emit(event);\n }\n\n protected async handlerPopoverControlEvent(control: IPopoverFunctionControlEvent) {\n this.outFunctionsControl.emit(control);\n this.functionsControlPopover.set(control);\n }\n\n public get FunctionsControl(): IPopoverFunctionControlEvent | undefined {\n return this.functionsControlPopover();\n }\n\n protected async handlerClickButtonTemplate(event: Event, data: any, items: Array<any>) {\n event.stopPropagation();\n data.buttonTemplateConfig.action(data, items);\n }\n\n private labelComputed() {\n if (!this.keySelected() || !this.items() || !this.items().length || !this.keyField() || this.applyNow()) {\n return this.label();\n }\n for (const item of this.items()) {\n if (item[this.keyField()] === this.keySelected()) {\n return item[this.fieldDisplay()];\n }\n }\n\n return this.label();\n }\n}\n","<div\n #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button\n [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0,\n },\n },\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button\n [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance: 2,\n position: {\n mode: 'start',\n distance: 0,\n },\n },\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2 }\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event, item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span\n [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\"></span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button\n [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null; context: { item: item }\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-buttons-dropdown.mjs","sources":["../../../../../../libs-ui/components/buttons/dropdown/src/dropdown.component.ts","../../../../../../libs-ui/components/buttons/dropdown/src/dropdown.component.html","../../../../../../libs-ui/components/buttons/dropdown/src/libs-ui-components-buttons-dropdown.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, model, output, signal } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent, TYPE_BUTTON, TYPE_SIZE_BUTTON } from '@libs-ui/components-buttons-button';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT, TYPE_POPOVER_MODE } from '@libs-ui/components-popover';\nimport { escapeHtml } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IPopupConfigButtonDropdown } from './dropdown.interface';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-buttons-dropdown',\n templateUrl: './dropdown.component.html',\n styleUrl: './dropdown.component.scss',\n standalone: true,\n imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsPopoverComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsButtonsDropdownComponent {\n // #region PROPERTY\n private readonly functionsControlPopover = signal<IPopoverFunctionControlEvent | undefined>(undefined);\n protected labelDisplay = computed(this.labelComputed.bind(this));\n\n // #region INPUT\n readonly label = input<string>();\n readonly fieldClass = input<string>('class'); // change color label item of items\n readonly fieldClassIconLeft = input<string>('classIconLeft'); // iconclass item of items\n readonly items = input.required<Array<any>, Array<any>>({ transform: (data) => data.map((item) => ({ ...item, [this.fieldDisplay()]: escapeHtml(item[this.fieldDisplay()]) })) }); // requried\n readonly fieldDisplay = input<string, string | undefined>('label', { transform: (value) => value ?? 'label' });\n readonly keyField = input<string, string | undefined>('key', { transform: (value) => value ?? 'key' });\n readonly keySelected = model<string>();\n readonly applyNow = input<boolean>(false); // if not applyNow: keyField is requried\n readonly showBorderBottom = input<boolean>(false);\n readonly disable = input<boolean>(false);\n readonly sizeButton = input<TYPE_SIZE_BUTTON>('medium');\n readonly classLabel = input<string>('');\n readonly iconOnlyType = input<boolean>(false);\n readonly classIconRight = input<string>('libs-ui-icon-move-right rotate-[90deg]');\n readonly classIconLeft = input<string>('');\n readonly typeButton = input<TYPE_BUTTON>('button-primary');\n readonly popupConfig = input<IPopupConfigButtonDropdown>({ width: 205, maxWidth: 250, maxHeight: 140, zIndex: 1200, direction: 'top' });\n readonly ignoreHiddenPopoverContentWhenMouseLeave = input<boolean>(true);\n readonly classInclude = input<string>('');\n readonly modePopover = input<TYPE_POPOVER_MODE>('click-toggle');\n readonly classIncludeContainer = input<string>();\n\n // #region OUTPUT\n readonly outSelectItem = output<any>();\n readonly outHover = output<boolean>();\n readonly outApply = output<any>(); // sử dụng cho bấm button left chế độ applyNow = false;\n readonly outPopoverEvent = output<TYPE_POPOVER_EVENT>();\n readonly outFunctionsControl = output<IPopoverFunctionControlEvent>();\n readonly outIconEvent = output<MouseEvent>();\n\n /* FUNCTIONS */\n protected async handlerApply() {\n if (!this.applyNow()) {\n this.outApply.emit(this.items().find((item) => item[this.keyField()] === this.keySelected()));\n }\n }\n\n protected async handlerSelectItem(event: Event, data: any) {\n event.stopPropagation();\n if (data.subTemplate) {\n return;\n }\n if (!this.applyNow()) {\n this.keySelected.set(data[this.keyField()]);\n }\n this.outSelectItem.emit(data);\n this.outHover.emit(false);\n }\n\n protected async handlerPopoverEvent(event: TYPE_POPOVER_EVENT) {\n this.outPopoverEvent.emit(event);\n }\n\n protected async handlerPopoverControlEvent(control: IPopoverFunctionControlEvent) {\n this.outFunctionsControl.emit(control);\n this.functionsControlPopover.set(control);\n }\n\n public get FunctionsControl(): IPopoverFunctionControlEvent | undefined {\n return this.functionsControlPopover();\n }\n\n protected async handlerClickButtonTemplate(event: Event, data: any, items: Array<any>) {\n event.stopPropagation();\n data.buttonTemplateConfig.action(data, items);\n }\n\n private labelComputed() {\n if (!this.keySelected() || !this.items()?.length || !this.keyField() || this.applyNow()) {\n return this.label();\n }\n for (const item of this.items()) {\n if (item[this.keyField()] === this.keySelected()) {\n return item[this.fieldDisplay()];\n }\n }\n\n return this.label();\n }\n}\n","<div\n #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button\n [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0,\n },\n },\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button\n [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config: {\n animationConfig: {\n time: 0.5,\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance: 2,\n position: {\n mode: 'start',\n distance: 0,\n },\n },\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2 }\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n tabindex=\"0\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event, item)\"\n (keydown.enter)=\"handlerSelectItem($any($event), item)\"\n (keydown.space)=\"handlerSelectItem($any($event), item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span\n [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\"></span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button\n [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null; context: { item: item }\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-buttons-dropdown",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.357-0",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": ">=18.0.0",
|
|
6
6
|
"@angular/core": ">=18.0.0",
|
|
7
|
-
"@libs-ui/components-buttons-button": "0.2.
|
|
8
|
-
"@libs-ui/components-popover": "0.2.
|
|
9
|
-
"@libs-ui/utils": "0.2.
|
|
10
|
-
"@ngx-translate/core": "^15.0.0"
|
|
11
|
-
"@libs-ui/interfaces-types": "0.2.356-9"
|
|
7
|
+
"@libs-ui/components-buttons-button": "0.2.357-0",
|
|
8
|
+
"@libs-ui/components-popover": "0.2.357-0",
|
|
9
|
+
"@libs-ui/utils": "0.2.357-0",
|
|
10
|
+
"@ngx-translate/core": "^15.0.0"
|
|
12
11
|
},
|
|
13
12
|
"sideEffects": false,
|
|
14
13
|
"module": "fesm2022/libs-ui-components-buttons-dropdown.mjs",
|