@libs-ui/components-inputs-emoji 0.2.356-8 → 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,34 +1,33 @@
|
|
|
1
1
|
# @libs-ui/components-inputs-emoji
|
|
2
2
|
|
|
3
|
-
> Component chọn Emoji (Emoji Picker) tích hợp trong Popover với tính năng tìm kiếm và
|
|
3
|
+
> Component chọn Emoji (Emoji Picker) tích hợp trong Popover với tính năng tìm kiếm, phân loại và lazy loading.
|
|
4
4
|
|
|
5
5
|
## Giới thiệu
|
|
6
6
|
|
|
7
|
-
`LibsUiComponentsEmojiComponent` cung cấp
|
|
7
|
+
`LibsUiComponentsEmojiComponent` cung cấp giao diện chọn emoji trực quan ẩn trong một Popover, hỗ trợ duyệt emoji theo nhóm danh mục, tìm kiếm nhanh theo tên, và tối ưu hiệu năng bằng cơ chế lazy loading khi cuộn danh sách. Component phù hợp tích hợp vào mọi giao diện nhập liệu như chat, bình luận, hoặc soạn thảo văn bản.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Tính năng
|
|
10
10
|
|
|
11
|
-
- ✅ Danh sách Emoji đầy đủ, phân loại theo nhóm
|
|
12
|
-
- ✅ Tìm kiếm Emoji nhanh chóng
|
|
13
|
-
- ✅ Tích hợp sẵn Popover
|
|
14
|
-
- ✅ Lazy loading (scroll to load more) tối ưu hiệu năng
|
|
11
|
+
- ✅ Danh sách Emoji đầy đủ, phân loại theo nhóm chuẩn Unicode
|
|
12
|
+
- ✅ Tìm kiếm Emoji nhanh chóng theo tên (có xử lý unicode)
|
|
13
|
+
- ✅ Tích hợp sẵn Popover với animation mượt mà
|
|
14
|
+
- ✅ Lazy loading (scroll to load more) tối ưu hiệu năng với danh sách lớn
|
|
15
15
|
- ✅ Hỗ trợ Custom Trigger qua `ng-content`
|
|
16
|
-
- ✅ Tùy chỉnh linh hoạt kích thước
|
|
16
|
+
- ✅ Tùy chỉnh linh hoạt kích thước, vị trí và z-index của popup
|
|
17
|
+
- ✅ Hỗ trợ điều khiển Popover từ bên ngoài qua `FunctionsControl` getter
|
|
18
|
+
- ✅ Standalone component, tương thích Angular 17+ Signals & OnPush
|
|
17
19
|
|
|
18
20
|
## Khi nào sử dụng
|
|
19
21
|
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
22
|
+
- Tích hợp tính năng chèn emoji trong các ứng dụng chat, bình luận, social media
|
|
23
|
+
- Cần một bộ chọn emoji gọn nhẹ, tiết kiệm diện tích (ẩn trong popover cho đến khi cần)
|
|
24
|
+
- Cần hiệu năng cao với danh sách emoji lớn (lazy loading tự động)
|
|
25
|
+
- Muốn tùy chỉnh trigger button theo thiết kế riêng thay vì dùng icon mặc định
|
|
23
26
|
|
|
24
27
|
## Cài đặt
|
|
25
28
|
|
|
26
29
|
```bash
|
|
27
|
-
# npm
|
|
28
30
|
npm install @libs-ui/components-inputs-emoji
|
|
29
|
-
|
|
30
|
-
# yarn
|
|
31
|
-
yarn add @libs-ui/components-inputs-emoji
|
|
32
31
|
```
|
|
33
32
|
|
|
34
33
|
## Import
|
|
@@ -44,101 +43,256 @@ import { LibsUiComponentsEmojiComponent } from '@libs-ui/components-inputs-emoji
|
|
|
44
43
|
export class YourComponent {}
|
|
45
44
|
```
|
|
46
45
|
|
|
47
|
-
## Ví dụ
|
|
46
|
+
## Ví dụ sử dụng
|
|
47
|
+
|
|
48
|
+
### 1. Cơ bản — Icon mặc định làm trigger
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// component.ts
|
|
52
|
+
import { Component, signal } from '@angular/core';
|
|
53
|
+
import { LibsUiComponentsEmojiComponent } from '@libs-ui/components-inputs-emoji';
|
|
54
|
+
|
|
55
|
+
@Component({
|
|
56
|
+
selector: 'app-chat-input',
|
|
57
|
+
standalone: true,
|
|
58
|
+
imports: [LibsUiComponentsEmojiComponent],
|
|
59
|
+
templateUrl: './chat-input.component.html',
|
|
60
|
+
})
|
|
61
|
+
export class ChatInputComponent {
|
|
62
|
+
protected selectedEmoji = signal('');
|
|
63
|
+
|
|
64
|
+
protected handlerSelectEmoji(emoji: string): void {
|
|
65
|
+
this.selectedEmoji.set(emoji);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```html
|
|
71
|
+
<!-- chat-input.component.html -->
|
|
72
|
+
<div class="flex items-center gap-3">
|
|
73
|
+
<libs_ui-components-emoji (outEventEmoji)="handlerSelectEmoji($event)" />
|
|
74
|
+
<span class="text-gray-600">Emoji đã chọn: {{ selectedEmoji() || '(chưa chọn)' }}</span>
|
|
75
|
+
</div>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 2. Custom Trigger — Dùng nội dung bất kỳ làm trigger
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// component.ts
|
|
82
|
+
import { Component, signal } from '@angular/core';
|
|
83
|
+
import { LibsUiComponentsEmojiComponent } from '@libs-ui/components-inputs-emoji';
|
|
84
|
+
|
|
85
|
+
@Component({
|
|
86
|
+
selector: 'app-comment-box',
|
|
87
|
+
standalone: true,
|
|
88
|
+
imports: [LibsUiComponentsEmojiComponent],
|
|
89
|
+
templateUrl: './comment-box.component.html',
|
|
90
|
+
})
|
|
91
|
+
export class CommentBoxComponent {
|
|
92
|
+
protected message = signal('');
|
|
93
|
+
|
|
94
|
+
protected handlerInsertEmoji(emoji: string): void {
|
|
95
|
+
this.message.update((current) => `${current}${emoji}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
```html
|
|
101
|
+
<!-- comment-box.component.html -->
|
|
102
|
+
<div class="flex items-center gap-2 border rounded-lg p-2">
|
|
103
|
+
<input
|
|
104
|
+
class="flex-1 outline-none text-sm"
|
|
105
|
+
[value]="message()"
|
|
106
|
+
placeholder="Nhập bình luận..." />
|
|
107
|
+
|
|
108
|
+
<libs_ui-components-emoji
|
|
109
|
+
[isNgContent]="true"
|
|
110
|
+
(outEventEmoji)="handlerInsertEmoji($event)">
|
|
111
|
+
<button class="px-3 py-1 bg-blue-500 text-white rounded text-sm hover:bg-blue-600">
|
|
112
|
+
😊 Emoji
|
|
113
|
+
</button>
|
|
114
|
+
</libs_ui-components-emoji>
|
|
115
|
+
</div>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 3. Tùy chỉnh kích thước Popup và vị trí
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// component.ts
|
|
122
|
+
import { Component, signal } from '@angular/core';
|
|
123
|
+
import { LibsUiComponentsEmojiComponent } from '@libs-ui/components-inputs-emoji';
|
|
48
124
|
|
|
49
|
-
|
|
125
|
+
@Component({
|
|
126
|
+
selector: 'app-editor-toolbar',
|
|
127
|
+
standalone: true,
|
|
128
|
+
imports: [LibsUiComponentsEmojiComponent],
|
|
129
|
+
templateUrl: './editor-toolbar.component.html',
|
|
130
|
+
})
|
|
131
|
+
export class EditorToolbarComponent {
|
|
132
|
+
protected selectedEmoji = signal('');
|
|
133
|
+
|
|
134
|
+
protected handlerPickEmoji(emoji: string): void {
|
|
135
|
+
this.selectedEmoji.set(emoji);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
50
139
|
|
|
51
140
|
```html
|
|
52
|
-
|
|
141
|
+
<!-- editor-toolbar.component.html -->
|
|
142
|
+
<libs_ui-components-emoji
|
|
143
|
+
classPopup="w-[400px] h-[350px]"
|
|
144
|
+
modePopoverPosition="center"
|
|
145
|
+
[zIndex]="1500"
|
|
146
|
+
(outEventEmoji)="handlerPickEmoji($event)" />
|
|
53
147
|
```
|
|
54
148
|
|
|
55
|
-
###
|
|
149
|
+
### 4. Điều khiển Popover từ bên ngoài qua ViewChild
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
// component.ts
|
|
153
|
+
import { Component, viewChild } from '@angular/core';
|
|
154
|
+
import { LibsUiComponentsEmojiComponent } from '@libs-ui/components-inputs-emoji';
|
|
155
|
+
import { IPopoverFunctionControlEvent } from '@libs-ui/components-popover';
|
|
156
|
+
|
|
157
|
+
@Component({
|
|
158
|
+
selector: 'app-controlled-emoji',
|
|
159
|
+
standalone: true,
|
|
160
|
+
imports: [LibsUiComponentsEmojiComponent],
|
|
161
|
+
templateUrl: './controlled-emoji.component.html',
|
|
162
|
+
})
|
|
163
|
+
export class ControlledEmojiComponent {
|
|
164
|
+
private readonly emojiRef = viewChild<LibsUiComponentsEmojiComponent>('emojiRef');
|
|
165
|
+
protected selectedEmoji = '';
|
|
166
|
+
|
|
167
|
+
protected handlerSelectEmoji(emoji: string): void {
|
|
168
|
+
this.selectedEmoji = emoji;
|
|
169
|
+
// Đóng popover sau khi chọn
|
|
170
|
+
this.emojiRef()?.FunctionsControl?.removePopoverOverlay();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
openPicker(): void {
|
|
174
|
+
this.emojiRef()?.FunctionsControl?.showPopoverOverlay();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
56
178
|
|
|
57
179
|
```html
|
|
180
|
+
<!-- controlled-emoji.component.html -->
|
|
181
|
+
<button (click)="openPicker()">Mở Emoji Picker</button>
|
|
58
182
|
<libs_ui-components-emoji
|
|
59
|
-
|
|
60
|
-
(outEventEmoji)="
|
|
61
|
-
<button>Chọn Emoji</button>
|
|
62
|
-
</libs_ui-components-emoji>
|
|
183
|
+
#emojiRef
|
|
184
|
+
(outEventEmoji)="handlerSelectEmoji($event)" />
|
|
63
185
|
```
|
|
64
186
|
|
|
65
|
-
##
|
|
187
|
+
## @Input()
|
|
188
|
+
|
|
189
|
+
| Input | Type | Default | Mô tả | Ví dụ |
|
|
190
|
+
|---|---|---|---|---|
|
|
191
|
+
| `[classIconInclude]` | `string` | `'libs-ui-icon-add'` | CSS class cho icon trigger mặc định (khi không dùng ng-content) | `[classIconInclude]="'libs-ui-icon-smile'"` |
|
|
192
|
+
| `[classInclude]` | `string` | `''` | CSS class bổ sung cho container của trigger button | `[classInclude]="'ml-2'"` |
|
|
193
|
+
| `[classPopup]` | `string` | `'w-[290px] h-[245px]'` | CSS class cho container của popup chọn emoji, kiểm soát kích thước | `classPopup="w-[400px] h-[350px]"` |
|
|
194
|
+
| `[configPopover]` | `IPopoverOverlay` | `defaultConfigPopover()` | Cấu hình đầy đủ cho Popover overlay (direction, position, animation,...) | `[configPopover]="myPopoverConfig"` |
|
|
195
|
+
| `[isNgContent]` | `boolean` | `undefined` | Khi `true`, ẩn icon mặc định và dùng nội dung `ng-content` làm trigger | `[isNgContent]="true"` |
|
|
196
|
+
| `[modePopoverPosition]` | `'start' \| 'center' \| 'end'` | `undefined` | Chế độ căn lề ngang của popup so với trigger | `modePopoverPosition="center"` |
|
|
197
|
+
| `[zIndex]` | `number` | `0` | Z-index nền của popup. Content bên trong sẽ tự động được offset thêm `+5` | `[zIndex]="1500"` |
|
|
198
|
+
| `[ignoreShowPopoverText]` | `boolean` | `undefined` | Ẩn tooltip text "Emoji" khi hover trigger | `[ignoreShowPopoverText]="true"` |
|
|
199
|
+
|
|
200
|
+
## @Output()
|
|
66
201
|
|
|
67
|
-
|
|
202
|
+
| Output | Type | Mô tả | Handler TS | Binding HTML |
|
|
203
|
+
|---|---|---|---|---|
|
|
204
|
+
| `(outEventEmoji)` | `string` | Emit ký tự emoji khi người dùng nhấn chọn một emoji trong picker | `handlerSelectEmoji(emoji: string): void { this.selectedEmoji.set(emoji); }` | `(outEventEmoji)="handlerSelectEmoji($event)"` |
|
|
205
|
+
| `(outFunctionsControl)` | `IPopoverFunctionControlEvent` | Emit object chứa các hàm điều khiển Popover (`showPopoverOverlay`, `removePopoverOverlay`) | `handlerFunctionsControl(ctrl: IPopoverFunctionControlEvent): void { this.popoverCtrl = ctrl; }` | `(outFunctionsControl)="handlerFunctionsControl($event)"` |
|
|
206
|
+
| `(outFlagMouse)` | `IFlagMouse` | Emit trạng thái chuột (hover) trên vùng popover | `handlerFlagMouse(flag: IFlagMouse): void { this.mouseFlag = flag; }` | `(outFlagMouse)="handlerFlagMouse($event)"` |
|
|
68
207
|
|
|
69
|
-
|
|
208
|
+
## Methods (FunctionsControl)
|
|
70
209
|
|
|
71
|
-
|
|
72
|
-
| ----------------------- | ------------------------------ | ------------------------ | -------------------------------------------- |
|
|
73
|
-
| `[classIconInclude]` | `string` | `'libs-ui-icon-add'` | CSS class cho icon trigger mặc định |
|
|
74
|
-
| `[classInclude]` | `string` | `''` | CSS class bổ sung cho trigger container |
|
|
75
|
-
| `[classPopup]` | `string` | `'w-[290px] h-[245px]'` | CSS class cho container của popup chọn emoji |
|
|
76
|
-
| `[configPopover]` | `IPopoverOverlay` | `defaultConfigPopover()` | Cấu hình overlay cho Popover |
|
|
77
|
-
| `[isNgContent]` | `boolean` | `false` | Sử dụng ng-content làm trigger thay vì icon |
|
|
78
|
-
| `[modePopoverPosition]` | `'start' \| 'center' \| 'end'` | `undefined` | Chế độ căn lề cho Popover |
|
|
79
|
-
| `[zIndex]` | `number` | `0` | Giá trị Z-index nền của popup |
|
|
210
|
+
Truy cập qua `ViewChild` để điều khiển Popover theo chương trình:
|
|
80
211
|
|
|
81
|
-
|
|
212
|
+
```typescript
|
|
213
|
+
private readonly emojiRef = viewChild<LibsUiComponentsEmojiComponent>('emojiRef');
|
|
214
|
+
|
|
215
|
+
// Mở picker
|
|
216
|
+
this.emojiRef()?.FunctionsControl?.showPopoverOverlay();
|
|
217
|
+
|
|
218
|
+
// Đóng picker
|
|
219
|
+
this.emojiRef()?.FunctionsControl?.removePopoverOverlay();
|
|
220
|
+
```
|
|
82
221
|
|
|
83
|
-
|
|
|
84
|
-
|
|
85
|
-
| `
|
|
86
|
-
| `(outFunctionsControl)` | `IPopoverFunctionControlEvent` | Emit các functions điều khiển Popover (show/remove) |
|
|
222
|
+
| Getter | Return Type | Mô tả |
|
|
223
|
+
|---|---|---|
|
|
224
|
+
| `FunctionsControl` | `IPopoverFunctionControlEvent \| undefined` | Trả về object chứa hàm điều khiển Popover. Có giá trị sau khi Popover đã được khởi tạo. |
|
|
87
225
|
|
|
88
226
|
## Types & Interfaces
|
|
89
227
|
|
|
90
228
|
```typescript
|
|
91
|
-
|
|
229
|
+
import { IPopoverOverlay, IPopoverFunctionControlEvent, IFlagMouse } from '@libs-ui/components-popover';
|
|
230
|
+
import { IEmoji, IGroupEmoji } from '@libs-ui/components-inputs-emoji';
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
/** Cấu hình Popover overlay */
|
|
92
235
|
export interface IPopoverOverlay {
|
|
93
|
-
isAddContentToParentDocument?: boolean;
|
|
94
|
-
classInclude?: string;
|
|
95
|
-
widthByParent?: boolean;
|
|
96
|
-
width?: number;
|
|
97
|
-
minWidth?: number;
|
|
98
|
-
maxWidth?: number;
|
|
99
|
-
maxHeight?: number | null;
|
|
100
|
-
zIndex?: number;
|
|
101
236
|
direction?: 'top' | 'right' | 'bottom' | 'left';
|
|
237
|
+
directionDistance?: number;
|
|
102
238
|
position?: {
|
|
103
239
|
mode: 'start' | 'center' | 'end';
|
|
104
240
|
distance: number;
|
|
105
241
|
};
|
|
106
|
-
|
|
242
|
+
zIndex?: number;
|
|
243
|
+
maxWidth?: number;
|
|
244
|
+
maxHeight?: number | null;
|
|
245
|
+
width?: number;
|
|
246
|
+
minWidth?: number;
|
|
247
|
+
widthByParent?: boolean;
|
|
248
|
+
whiteTheme?: boolean;
|
|
249
|
+
ignoreArrow?: boolean;
|
|
250
|
+
classInclude?: string;
|
|
251
|
+
animationConfig?: object;
|
|
107
252
|
}
|
|
108
253
|
|
|
254
|
+
/** Các hàm điều khiển Popover (nhận qua outFunctionsControl hoặc FunctionsControl getter) */
|
|
109
255
|
export interface IPopoverFunctionControlEvent {
|
|
110
256
|
showPopoverOverlay: () => void;
|
|
111
257
|
removePopoverOverlay: () => void;
|
|
112
258
|
}
|
|
259
|
+
|
|
260
|
+
/** Thông tin một Emoji */
|
|
261
|
+
export interface IEmoji {
|
|
262
|
+
/** Ký tự emoji thực tế (vd: '😀') */
|
|
263
|
+
emoji: string;
|
|
264
|
+
/** Mô tả emoji bằng tiếng Anh (vd: 'grinning face') */
|
|
265
|
+
description: string;
|
|
266
|
+
/** Danh mục (vd: 'Smileys & Emotion') */
|
|
267
|
+
category: string;
|
|
268
|
+
display?: boolean;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** Thông tin một nhóm Emoji */
|
|
272
|
+
export interface IGroupEmoji {
|
|
273
|
+
/** Tên nhóm (vd: 'Smileys & Emotion') */
|
|
274
|
+
group_name: string;
|
|
275
|
+
/** Danh sách emoji trong nhóm */
|
|
276
|
+
emojis: Array<IEmoji>;
|
|
277
|
+
/** Ký tự đại diện cho nhóm */
|
|
278
|
+
iconGroup?: string;
|
|
279
|
+
}
|
|
113
280
|
```
|
|
114
281
|
|
|
115
|
-
##
|
|
282
|
+
## Lưu ý quan trọng
|
|
116
283
|
|
|
117
|
-
|
|
118
|
-
| --------------- | ------- | ---------------- |
|
|
119
|
-
| Angular | 18+ | Framework |
|
|
120
|
-
| Angular Signals | - | State management |
|
|
121
|
-
| TailwindCSS | 3.x | Styling |
|
|
122
|
-
| OnPush | - | Change Detection |
|
|
284
|
+
⚠️ **Z-index offset**: Z-index của nội dung bên trong popup luôn được offset thêm `+5` so với giá trị `[zIndex]` truyền vào. Khi dùng chung với modal hoặc overlay khác, hãy tính toán `zIndex` sao cho tránh bị che khuất.
|
|
123
285
|
|
|
124
|
-
|
|
286
|
+
⚠️ **isNgContent**: Khi truyền `[isNgContent]="true"`, component sẽ ẩn hoàn toàn icon trigger mặc định và hiển thị phần tử con trong `ng-content`. Nếu `ng-content` rỗng, khu vực trigger sẽ không hiển thị gì.
|
|
125
287
|
|
|
126
|
-
|
|
127
|
-
npx nx serve core-ui
|
|
128
|
-
```
|
|
288
|
+
⚠️ **FunctionsControl timing**: Getter `FunctionsControl` trả về `undefined` cho đến khi sự kiện `(outFunctionsControl)` được emit lần đầu tiên (sau khi Popover khởi tạo). Hãy kiểm tra `?.` trước khi gọi.
|
|
129
289
|
|
|
130
|
-
|
|
290
|
+
⚠️ **configPopover mutable**: `IPopoverOverlay` được xử lý theo dạng mutable object bên trong component. Không nên tái sử dụng cùng một object config cho nhiều instance Emoji Picker.
|
|
131
291
|
|
|
132
|
-
##
|
|
292
|
+
## Demo
|
|
133
293
|
|
|
134
294
|
```bash
|
|
135
|
-
|
|
136
|
-
npx nx test components-inputs-emoji
|
|
137
|
-
|
|
138
|
-
# Coverage
|
|
139
|
-
npx nx test components-inputs-emoji --coverage
|
|
295
|
+
npx nx serve core-ui
|
|
140
296
|
```
|
|
141
297
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
MIT
|
|
298
|
+
Truy cập: http://localhost:4500/inputs/emoji
|
package/emoji.component.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import * as i0 from "@angular/core";
|
|
|
7
7
|
* Hỗ trợ hiển thị trong Popover hoàn chỉnh với lazy loading danh sách emoji
|
|
8
8
|
*/
|
|
9
9
|
export declare class LibsUiComponentsEmojiComponent implements AfterViewInit {
|
|
10
|
-
private functionsControl;
|
|
10
|
+
private readonly functionsControl;
|
|
11
11
|
protected emojisCategories: import("@angular/core").WritableSignal<IGroupEmoji[]>;
|
|
12
12
|
protected filter: import("@angular/core").WritableSignal<{
|
|
13
13
|
page: number;
|
|
@@ -19,7 +19,7 @@ export class LibsUiComponentsEmojiComponent {
|
|
|
19
19
|
dataEmojiView = signal({ dataView: [], allData: [] });
|
|
20
20
|
// #region INPUT
|
|
21
21
|
/** Cấu hình overlay cho Popover chứa Emoji Picker */
|
|
22
|
-
configPopover = input(defaultConfigPopover(), { transform: (value) =>
|
|
22
|
+
configPopover = input(defaultConfigPopover(), { transform: (value) => value ?? defaultConfigPopover() });
|
|
23
23
|
/** Sử dụng ng-content làm trigger thay vì icon mặc định */
|
|
24
24
|
isNgContent = input();
|
|
25
25
|
/** Giá trị Z-index cho popup. Tự động offset +5 cho content. */
|
|
@@ -105,10 +105,10 @@ export class LibsUiComponentsEmojiComponent {
|
|
|
105
105
|
this.dataEmojiView.update((item) => ({ ...item, allData: emojiMatch, dataView: page ? [...item.dataView, ...dataInPage] : dataInPage }));
|
|
106
106
|
}
|
|
107
107
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsEmojiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
108
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowPopoverText: { classPropertyName: "ignoreShowPopoverText", publicName: "ignoreShowPopoverText", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", outFunctionsControl: "outFunctionsControl", outFlagMouse: "outFlagMouse" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!--
|
|
108
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowPopoverText: { classPropertyName: "ignoreShowPopoverText", publicName: "ignoreShowPopoverText", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", outFunctionsControl: "outFunctionsControl", outFlagMouse: "outFlagMouse" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keydown.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keydown.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "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"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
109
109
|
}
|
|
110
110
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsEmojiComponent, decorators: [{
|
|
111
111
|
type: Component,
|
|
112
|
-
args: [{ selector: 'libs_ui-components-emoji', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsSearchComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsScrollOverlayDirective], template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!--
|
|
112
|
+
args: [{ selector: 'libs_ui-components-emoji', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsSearchComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsScrollOverlayDirective], template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keydown.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keydown.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n" }]
|
|
113
113
|
}], ctorParameters: () => [] });
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEssT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUYsT0FBTyxFQUE2RCxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFJLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFFdEU7OztHQUdHO0FBU0gsTUFBTSxPQUFPLDhCQUE4QjtJQUN6QyxtQkFBbUI7SUFDWCxnQkFBZ0IsR0FBRyxNQUFNLENBQTJDLFNBQVMsQ0FBQyxDQUFDO0lBRTdFLGdCQUFnQixHQUFHLE1BQU0sQ0FBcUIsSUFBSSxLQUFLLEVBQWUsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxD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RUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxMLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRSxJQUFJLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTlFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0ksQ0FBQzt3R0F4SFUsOEJBQThCOzRGQUE5Qiw4QkFBOEIsZ2xEQ3JCM0MscTZGQTZFQSwyQ0QxRFksZUFBZSw0RkFBRSxxQ0FBcUMsb1ZBQUUsZ0NBQWdDLG9nQkFBRSxzQ0FBc0M7OzRGQUUvSCw4QkFBOEI7a0JBUjFDLFNBQVM7K0JBRUUsMEJBQTBCLGNBRXhCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGVBQWUsRUFBRSxxQ0FBcUMsRUFBRSxnQ0FBZ0MsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCBUZW1wbGF0ZVJlZiwgdW50cmFja2VkLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNTZWFyY2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1zZWFyY2gnO1xuaW1wb3J0IHsgSUZsYWdNb3VzZSwgSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCwgSVBvcG92ZXJPdmVybGF5LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc2Nyb2xsLW92ZXJsYXknO1xuaW1wb3J0IHsgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IGRlbGV0ZVVuaWNvZGUgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGRlZmF1bHRDb25maWdQb3BvdmVyLCBlbW9qaXMgfSBmcm9tICcuL2RlZmluZXMvZW1vamkuZGVmaW5lJztcbmltcG9ydCB7IElFbW9qaSwgSUdyb3VwRW1vamkgfSBmcm9tICcuL2ludGVyZmFjZXMvZW1vamkuaW50ZXJmYWNlJztcbi8qKlxuICogQ29tcG9uZW50IGNo4buNbiBFbW9qaSAoRW1vamkgUGlja2VyKSB24bubaSB0w61uaCBuxINuZyB0w6xtIGtp4bq/bSB2w6AgcGjDom4gbG/huqFpXG4gKiBI4buXIHRy4bujIGhp4buDbiB0aOG7iyB0cm9uZyBQb3BvdmVyIGhvw6BuIGNo4buJbmggduG7m2kgbGF6eSBsb2FkaW5nIGRhbmggc8OhY2ggZW1vamlcbiAqL1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWVtb2ppJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Vtb2ppLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNTZWFyY2hDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZV0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNFbW9qaUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByaXZhdGUgZnVuY3Rpb25zQ29udHJvbCA9IHNpZ25hbDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCBlbW9qaXNDYXRlZ29yaWVzID0gc2lnbmFsPEFycmF5PElHcm91cEVtb2ppPj4obmV3IEFycmF5PElHcm91cEVtb2ppPigpKTtcbiAgcHJvdGVjdGVkIGZpbHRlciA9IHNpZ25hbCh7IHBhZ2U6IDAsIGtleVNlYXJjaDogJycsIGdyb3VwU2VsZWN0ZWQ6ICdTbWlsZXlzICYgRW1vdGlvbicsIHBlclBhZ2U6IDE3MCB9KTtcbiAgcHJvdGVjdGVkIGRhdGFFbW9qaVZpZXcgPSBzaWduYWw8eyBkYXRhVmlldzogQXJyYXk8SUVtb2ppPjsgYWxsRGF0YTogQXJyYXk8SUVtb2ppPiB9Pih7IGRhdGFWaWV3OiBbXSwgYWxsRGF0YTogW10gfSk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICAvKiogQ+G6pXUgaMOsbmggb3ZlcmxheSBjaG8gUG9wb3ZlciBjaOG7qWEgRW1vamkgUGlja2VyICovXG4gIHJlYWRvbmx5IGNvbmZpZ1BvcG92ZXIgPSBpbnB1dDxJUG9wb3Zlck92ZXJsYXksIElQb3BvdmVyT3ZlcmxheSB8IHVuZGVmaW5lZD4oZGVmYXVsdENvbmZpZ1BvcG92ZXIoKSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gKHZhbHVlID8gdmFsdWUgOiBkZWZhdWx0Q29uZmlnUG9wb3ZlcigpKSB9KTtcblxuICAvKiogU+G7rSBk4bulbmcgbmctY29udGVudCBsw6BtIHRyaWdnZXIgdGhheSB2w6wgaWNvbiBt4bq3YyDEkeG7i25oICovXG4gIHJlYWRvbmx5IGlzTmdDb250ZW50ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiogR2nDoSB0cuG7iyBaLWluZGV4IGNobyBwb3B1cC4gVOG7sSDEkeG7mW5nIG9mZnNldCArNSBjaG8gY29udGVudC4gKi9cbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDAsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IDAgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZVNob3dQb3BvdmVyVGV4dCA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgLyoqIENo4bq/IMSR4buZIGPEg24gbOG7gSBjaG8gUG9wb3ZlciAoc3RhcnQgfCBjZW50ZXIgfCBlbmQpICovXG4gIHJlYWRvbmx5IG1vZGVQb3BvdmVyUG9zaXRpb24gPSBpbnB1dDwnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJyB8IHVuZGVmaW5lZD4oKTtcblxuICAvKiogQ1NTIGNsYXNzIGNobyBjb250YWluZXIgY+G7p2EgcG9wdXAgY2jhu41uIGVtb2ppICovXG4gIHJlYWRvbmx5IGNsYXNzUG9wdXAgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ3ctWzI5MHB4XSBoLVsyNDVweF0nLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICd3LVsyOTBweF0gaC1bMjQ1cHhdJyB9KTtcblxuICAvKiogQ1NTIGNsYXNzIGLhu5Ugc3VuZyBjaG8gdHJpZ2dlciBjb250YWluZXIgKi9cbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pO1xuXG4gIC8qKiBDU1MgY2xhc3MgY2hvIGljb24gdHJpZ2dlciAobeG6t2MgxJHhu4tuaDogbGlicy11aS1pY29uLWFkZCkgKi9cbiAgcmVhZG9ubHkgY2xhc3NJY29uSW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignbGlicy11aS1pY29uLWFkZCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ2xpYnMtdWktaWNvbi1hZGQnIH0pO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIC8qKiBFdmVudCBlbWl0IGtoaSBuZ8aw4budaSBkw7luZyBjaOG7jW4gbeG7mXQgZW1vamkuIFRy4bqjIHbhu4Ega8O9IHThu7EgZW1vamkuICovXG4gIHJlYWRvbmx5IG91dEV2ZW50RW1vamkgPSBvdXRwdXQ8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0IGPDoWMgZnVuY3Rpb25zIMSRaeG7gXUga2hp4buDbiBQb3BvdmVyIChzaG93L3JlbW92ZSkgKi9cbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRGbGFnTW91c2UgPSBvdXRwdXQ8SUZsYWdNb3VzZT4oKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZW1vamlSZWYgPSB2aWV3Q2hpbGQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+PignZW1vamlSZWYnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50Vmlld0Vtb2ppID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8VFlQRV9URU1QTEFURV9SRUY+PignZWxlbWVudFZpZXdFbW9qaScpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZW1vamlzQ2F0ZWdvcmllcy5zZXQoXG4gICAgICBlbW9qaXMoKS5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgIC4uLml0ZW0sXG4gICAgICAgIGljb25Hcm91cDogaXRlbS5lbW9qaXNbMF0uZW1vamksXG4gICAgICAgIGVtb2ppczogbmV3IEFycmF5PElFbW9qaT4oKSxcbiAgICAgIH0pKVxuICAgICk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuekluZGV4KCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbmZpZ1BvcG92ZXIoKS56SW5kZXggPSB0aGlzLnpJbmRleCgpICsgNTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1vZGVQb3BvdmVyUG9zaXRpb24oKSAmJiB0aGlzLmNvbmZpZ1BvcG92ZXIoKS5wb3NpdGlvbikge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgKHRoaXMuY29uZmlnUG9wb3ZlcigpIGFzIGFueSkucG9zaXRpb24ubW9kZSA9IHRoaXMubW9kZVBvcG92ZXJQb3NpdGlvbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29uZmlnUG9wb3ZlcigpKSB7XG4gICAgICAgIHRoaXMuY29uZmlnUG9wb3ZlcigpLnRlbXBsYXRlID0gdGhpcy5lbW9qaVJlZigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0RGF0YVZpZXcoKTtcbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckFkZEVtb2ppKGRhdGE6IElFbW9qaSkge1xuICAgIHRoaXMub3V0RXZlbnRFbW9qaS5lbWl0KGRhdGEuZW1vamkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJGdW5jdGlvbnNDb250cm9sKGV2ZW50OiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5mdW5jdGlvbnNDb250cm9sLnNldChldmVudCk7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uc0NvbnRyb2woKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRmxhZ01vdXNlKGZsYWdNb3VzZTogSUZsYWdNb3VzZSkge1xuICAgIHRoaXMub3V0RmxhZ01vdXNlLmVtaXQoZmxhZ01vdXNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ2hvb3NlQ2F0ZWdvcnkoZXZlbnQ6IEV2ZW50LCBjYXRlZ29yeTogSUdyb3VwRW1vamkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmZpbHRlci51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHBhZ2U6IDAsIGdyb3VwU2VsZWN0ZWQ6IGNhdGVnb3J5Lmdyb3VwX25hbWUgfSkpO1xuICAgIHRoaXMuZ2V0RGF0YVZpZXcoKTtcbiAgICB0aGlzLmVsZW1lbnRWaWV3RW1vamkoKT8ubmF0aXZlRWxlbWVudC5zY3JvbGwoeyB0b3A6IDAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlYXJjaEVtb2ppKGtleVNlYXJjaDogc3RyaW5nKSB7XG4gICAgdGhpcy5maWx0ZXIudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBwYWdlOiAwLCBrZXlTZWFyY2g6IGtleVNlYXJjaC50cmltKCkgfSkpO1xuICAgIHRoaXMuZ2V0RGF0YVZpZXcoKTtcbiAgICB0aGlzLmVsZW1lbnRWaWV3RW1vamkoKT8ubmF0aXZlRWxlbWVudC5zY3JvbGwoeyB0b3A6IDAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNjcm9sbEJvdHRvbSgpIHtcbiAgICB0aGlzLmZpbHRlci51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHBhZ2U6IGRhdGEucGFnZSArIDEgfSkpO1xuICAgIHRoaXMuZ2V0RGF0YVZpZXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0YVZpZXcoKSB7XG4gICAgY29uc3QgZW1vamlCeUdyb3VwID0gZW1vamlzKCkuZmluZCgoaXRlbSkgPT4gaXRlbS5ncm91cF9uYW1lID09PSB0aGlzLmZpbHRlcigpLmdyb3VwU2VsZWN0ZWQpIGFzIElHcm91cEVtb2ppO1xuICAgIGNvbnN0IGVtb2ppTWF0Y2ggPSBlbW9qaUJ5R3JvdXAuZW1vamlzLmZpbHRlcigoaXRlbSkgPT4gZGVsZXRlVW5pY29kZShpdGVtLmRlc2NyaXB0aW9uKS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKGRlbGV0ZVVuaWNvZGUodGhpcy5maWx0ZXIoKS5rZXlTZWFyY2gudG9Mb2NhbGVMb3dlckNhc2UoKSkpKTtcblxuICAgIGNvbnN0IHsgcGFnZSwgcGVyUGFnZSB9ID0gdGhpcy5maWx0ZXIoKTtcbiAgICBjb25zdCBkYXRhSW5QYWdlID0gZW1vamlNYXRjaC5zbGljZShwYWdlICogcGVyUGFnZSwgcGFnZSAqIHBlclBhZ2UgKyBwZXJQYWdlKTtcblxuICAgIHRoaXMuZGF0YUVtb2ppVmlldy51cGRhdGUoKGl0ZW0pID0+ICh7IC4uLml0ZW0sIGFsbERhdGE6IGVtb2ppTWF0Y2gsIGRhdGFWaWV3OiBwYWdlID8gWy4uLml0ZW0uZGF0YVZpZXcsIC4uLmRhdGFJblBhZ2VdIDogZGF0YUluUGFnZSB9KSk7XG4gIH1cbn1cbiIsIjxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzSW5jbHVkZSgpXCJcbiAgW2NvbmZpZ109XCJ7XG4gICAgY29udGVudDogJ2kxOG5fdGV4dF9lbW9qaScsXG4gICAgekluZGV4OiAoekluZGV4KCkgfHwgMTIwMCkgKyA0LFxuICB9XCJcbiAgW2lnbm9yZVNob3dQb3BvdmVyXT1cImlnbm9yZVNob3dQb3BvdmVyVGV4dCgpXCJcbiAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uc0NvbnRyb2woJGV2ZW50KVwiPlxuICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICB0eXBlPVwib3RoZXJcIlxuICAgIG1vZGU9XCJjbGljay10b2dnbGVcIlxuICAgIGNsYXNzPVwiZmxleFwiXG4gICAgW2lnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmVdPVwidHJ1ZVwiXG4gICAgW2NvbmZpZ109XCJjb25maWdQb3BvdmVyKClcIlxuICAgIFtkZWJ1Z0lkXT1cIidkZWJ1ZyBpY29uIGVtb2lqJ1wiXG4gICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25zQ29udHJvbCgkZXZlbnQpXCI+XG4gICAgQGlmICghaXNOZ0NvbnRlbnQoKSkge1xuICAgICAgPGkgY2xhc3M9XCJiZWZvcmU6IXRleHQtWzE2cHhdIGJlZm9yZTohdGV4dC1bIzZhNzM4M10ge3sgY2xhc3NJY29uSW5jbHVkZSgpIH19XCI+PC9pPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIH1cbiAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbjwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG48bmctdGVtcGxhdGUgI2Vtb2ppUmVmPlxuICA8ZGl2IGNsYXNzPVwicHktWzEwcHhdIGZsZXggZmxleC1jb2wge3sgY2xhc3NQb3B1cCgpIH19XCI+XG4gICAgPGRpdiBjbGFzcz1cIm14LVsxMHB4XSBtYi1bMTJweF1cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmbGV4XCJcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmU+XG4gICAgICAgIEBmb3IgKGNhdGVnb3J5IG9mIGVtb2ppc0NhdGVnb3JpZXMoKTsgdHJhY2sgY2F0ZWdvcnkpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImdyb3cgcC1bNHB4XSByb3VuZGVkLVs0cHhdIGJnLVsjZmZmZmZmXSBsaWJzLXVpLWJnLWxpc3QtaG92ZXJcIlxuICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYmctbGlzdC1hY3RpdmVdPVwiZmlsdGVyKCkuZ3JvdXBTZWxlY3RlZCA9PT0gY2F0ZWdvcnkuZ3JvdXBfbmFtZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckNob29zZUNhdGVnb3J5KCRldmVudCwgY2F0ZWdvcnkpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtWzFweF0gY3Vyc29yLXBvaW50ZXIgdGV4dC1bMThweF1cIj5cbiAgICAgICAgICAgICAge3sgY2F0ZWdvcnkuaWNvbkdyb3VwIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm14LVsxMHB4XSBtYi1bMTJweF1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXNlYXJjaFxuICAgICAgICBbc2VhcmNoQ29uZmlnXT1cIntcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ2kxOG5fc2VhcmNoJyxcbiAgICAgICAgfVwiXG4gICAgICAgIFtkZWJvdW5jZVRpbWVdPVwiMFwiXG4gICAgICAgIChvdXRTZWFyY2gpPVwiaGFuZGxlclNlYXJjaEVtb2ppKCRldmVudClcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgdy1mdWxsIHJlbGF0aXZlXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNlbGVtZW50Vmlld0Vtb2ppXG4gICAgICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbCBweC1bMTBweF0gYWJzb2x1dGVcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICAob3V0U2Nyb2xsQm90dG9tKT1cImhhbmRsZXJTY3JvbGxCb3R0b20oKVwiPlxuICAgICAgICBAaWYgKGRhdGFFbW9qaVZpZXcoKS5kYXRhVmlldy5sZW5ndGgpIHtcbiAgICAgICAgICBAZm9yIChpdGVtIG9mIGRhdGFFbW9qaVZpZXcoKS5kYXRhVmlldzsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8IS0tIG7hur91IHNhdSBjw7MgecOqdSBjw6J1IGhvdmVyIGhp4buDbiB0aOG7iyB0b29sdGlvIHRow6wgYuG7jyBbaWdub3JlU2hvd1BvcG92ZXJdPVwidHJ1ZVwiIC0tPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogaXRlbS5kZXNjcmlwdGlvbiwgekluZGV4OiAoekluZGV4KCkgfHwgMTIwMCkgKyA1IH1cIlxuICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGZsZXggc2hyaW5rLTAgaC1maXQgbS1bMnB4XSBmbG9hdC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJBZGRFbW9qaShpdGVtKVwiPlxuICAgICAgICAgICAgICB7eyBpdGVtLmVtb2ppIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg1ciB0ZXh0LVsjOWNhMmFkXSBoLWZ1bGwgdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAge3sgJ2kxOG5fbm9fcmVzdWx0JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEssT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUYsT0FBTyxFQUE2RCxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFJLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFFdEU7OztHQUdHO0FBU0gsTUFBTSxPQUFPLDhCQUE4QjtJQUN6QyxtQkFBbUI7SUFDRixnQkFBZ0IsR0FBRyxNQUFNLENBQTJDLFNBQVMsQ0FBQyxDQUFDO0lBRXRGLGdCQUFnQixHQUFHLE1BQU0sQ0FBcUIsSUFBSSxLQUFLLEVBQWUsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxD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LElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxFQUFFLElBQUksR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFOUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzSSxDQUFDO3dHQXhIVSw4QkFBOEI7NEZBQTlCLDhCQUE4QixnbERDckIzQyx3K0ZBK0VBLDJDRDVEWSxlQUFlLDRGQUFFLHFDQUFxQyxvVkFBRSxnQ0FBZ0Msb2dCQUFFLHNDQUFzQzs7NEZBRS9ILDhCQUE4QjtrQkFSMUMsU0FBUzsrQkFFRSwwQkFBMEIsY0FFeEIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsZUFBZSxFQUFFLHFDQUFxQyxFQUFFLGdDQUFnQyxFQUFFLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIFRlbXBsYXRlUmVmLCB1bnRyYWNrZWQsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0lucHV0c1NlYXJjaENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXNlYXJjaCc7XG5pbXBvcnQgeyBJRmxhZ01vdXNlLCBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJUG9wb3Zlck92ZXJsYXksIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBUWVBFX1RFTVBMQVRFX1JFRiB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgZGVsZXRlVW5pY29kZSB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZ1BvcG92ZXIsIGVtb2ppcyB9IGZyb20gJy4vZGVmaW5lcy9lbW9qaS5kZWZpbmUnO1xuaW1wb3J0IHsgSUVtb2ppLCBJR3JvdXBFbW9qaSB9IGZyb20gJy4vaW50ZXJmYWNlcy9lbW9qaS5pbnRlcmZhY2UnO1xuLyoqXG4gKiBDb21wb25lbnQgY2jhu41uIEVtb2ppIChFbW9qaSBQaWNrZXIpIHbhu5tpIHTDrW5oIG7Eg25nIHTDrG0ga2nhur9tIHbDoCBwaMOibiBsb+G6oWlcbiAqIEjhu5cgdHLhu6MgaGnhu4NuIHRo4buLIHRyb25nIFBvcG92ZXIgaG/DoG4gY2jhu4luaCB24bubaSBsYXp5IGxvYWRpbmcgZGFuaCBzw6FjaCBlbW9qaVxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZW1vamknLFxuICB0ZW1wbGF0ZVVybDogJy4vZW1vamkuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0lucHV0c1NlYXJjaENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0Vtb2ppQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSByZWFkb25seSBmdW5jdGlvbnNDb250cm9sID0gc2lnbmFsPElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHJvdGVjdGVkIGVtb2ppc0NhdGVnb3JpZXMgPSBzaWduYWw8QXJyYXk8SUdyb3VwRW1vamk+PihuZXcgQXJyYXk8SUdyb3VwRW1vamk+KCkpO1xuICBwcm90ZWN0ZWQgZmlsdGVyID0gc2lnbmFsKHsgcGFnZTogMCwga2V5U2VhcmNoOiAnJywgZ3JvdXBTZWxlY3RlZDogJ1NtaWxleXMgJiBFbW90aW9uJywgcGVyUGFnZTogMTcwIH0pO1xuICBwcm90ZWN0ZWQgZGF0YUVtb2ppVmlldyA9IHNpZ25hbDx7IGRhdGFWaWV3OiBBcnJheTxJRW1vamk+OyBhbGxEYXRhOiBBcnJheTxJRW1vamk+IH0+KHsgZGF0YVZpZXc6IFtdLCBhbGxEYXRhOiBbXSB9KTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIC8qKiBD4bqldSBow6xuaCBvdmVybGF5IGNobyBQb3BvdmVyIGNo4bupYSBFbW9qaSBQaWNrZXIgKi9cbiAgcmVhZG9ubHkgY29uZmlnUG9wb3ZlciA9IGlucHV0PElQb3BvdmVyT3ZlcmxheSwgSVBvcG92ZXJPdmVybGF5IHwgdW5kZWZpbmVkPihkZWZhdWx0Q29uZmlnUG9wb3ZlcigpLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyBkZWZhdWx0Q29uZmlnUG9wb3ZlcigpIH0pO1xuXG4gIC8qKiBT4butIGThu6VuZyBuZy1jb250ZW50IGzDoG0gdHJpZ2dlciB0aGF5IHbDrCBpY29uIG3hurdjIMSR4buLbmggKi9cbiAgcmVhZG9ubHkgaXNOZ0NvbnRlbnQgPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIC8qKiBHacOhIHRy4buLIFotaW5kZXggY2hvIHBvcHVwLiBU4buxIMSR4buZbmcgb2Zmc2V0ICs1IGNobyBjb250ZW50LiAqL1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMCwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gMCB9KTtcbiAgcmVhZG9ubHkgaWdub3JlU2hvd1BvcG92ZXJUZXh0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiogQ2jhur8gxJHhu5kgY8SDbiBs4buBIGNobyBQb3BvdmVyIChzdGFydCB8IGNlbnRlciB8IGVuZCkgKi9cbiAgcmVhZG9ubHkgbW9kZVBvcG92ZXJQb3NpdGlvbiA9IGlucHV0PCdzdGFydCcgfCAnY2VudGVyJyB8ICdlbmQnIHwgdW5kZWZpbmVkPigpO1xuXG4gIC8qKiBDU1MgY2xhc3MgY2hvIGNvbnRhaW5lciBj4bunYSBwb3B1cCBjaOG7jW4gZW1vamkgKi9cbiAgcmVhZG9ubHkgY2xhc3NQb3B1cCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigndy1bMjkwcHhdIGgtWzI0NXB4XScsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ3ctWzI5MHB4XSBoLVsyNDVweF0nIH0pO1xuXG4gIC8qKiBDU1MgY2xhc3MgYuG7lSBzdW5nIGNobyB0cmlnZ2VyIGNvbnRhaW5lciAqL1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJycgfSk7XG5cbiAgLyoqIENTUyBjbGFzcyBjaG8gaWNvbiB0cmlnZ2VyICht4bq3YyDEkeG7i25oOiBsaWJzLXVpLWljb24tYWRkKSAqL1xuICByZWFkb25seSBjbGFzc0ljb25JbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdsaWJzLXVpLWljb24tYWRkJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnbGlicy11aS1pY29uLWFkZCcgfSk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgLyoqIEV2ZW50IGVtaXQga2hpIG5nxrDhu51pIGTDuW5nIGNo4buNbiBt4buZdCBlbW9qaS4gVHLhuqMgduG7gSBrw70gdOG7sSBlbW9qaS4gKi9cbiAgcmVhZG9ubHkgb3V0RXZlbnRFbW9qaSA9IG91dHB1dDxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgY8OhYyBmdW5jdGlvbnMgxJFp4buBdSBraGnhu4NuIFBvcG92ZXIgKHNob3cvcmVtb3ZlKSAqL1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dEZsYWdNb3VzZSA9IG91dHB1dDxJRmxhZ01vdXNlPigpO1xuXG4gIC8qIFZJRVcgQ0hJTEQgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBlbW9qaVJlZiA9IHZpZXdDaGlsZDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCdlbW9qaVJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRWaWV3RW1vamkgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCdlbGVtZW50Vmlld0Vtb2ppJyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5lbW9qaXNDYXRlZ29yaWVzLnNldChcbiAgICAgIGVtb2ppcygpLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgaWNvbkdyb3VwOiBpdGVtLmVtb2ppc1swXS5lbW9qaSxcbiAgICAgICAgZW1vamlzOiBuZXcgQXJyYXk8SUVtb2ppPigpLFxuICAgICAgfSkpXG4gICAgKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy56SW5kZXgoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29uZmlnUG9wb3ZlcigpLnpJbmRleCA9IHRoaXMuekluZGV4KCkgKyA1O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubW9kZVBvcG92ZXJQb3NpdGlvbigpICYmIHRoaXMuY29uZmlnUG9wb3ZlcigpLnBvc2l0aW9uKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAodGhpcy5jb25maWdQb3BvdmVyKCkgYXMgYW55KS5wb3NpdGlvbi5tb2RlID0gdGhpcy5tb2RlUG9wb3ZlclBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25maWdQb3BvdmVyKCkpIHtcbiAgICAgICAgdGhpcy5jb25maWdQb3BvdmVyKCkudGVtcGxhdGUgPSB0aGlzLmVtb2ppUmVmKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICB9XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQWRkRW1vamkoZGF0YTogSUVtb2ppKSB7XG4gICAgdGhpcy5vdXRFdmVudEVtb2ppLmVtaXQoZGF0YS5lbW9qaSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckZ1bmN0aW9uc0NvbnRyb2woZXZlbnQ6IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmZ1bmN0aW9uc0NvbnRyb2wuc2V0KGV2ZW50KTtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25zQ29udHJvbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJGbGFnTW91c2UoZmxhZ01vdXNlOiBJRmxhZ01vdXNlKSB7XG4gICAgdGhpcy5vdXRGbGFnTW91c2UuZW1pdChmbGFnTW91c2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDaG9vc2VDYXRlZ29yeShldmVudDogRXZlbnQsIGNhdGVnb3J5OiBJR3JvdXBFbW9qaSkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgcGFnZTogMCwgZ3JvdXBTZWxlY3RlZDogY2F0ZWdvcnkuZ3JvdXBfbmFtZSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICAgIHRoaXMuZWxlbWVudFZpZXdFbW9qaSgpPy5uYXRpdmVFbGVtZW50LnNjcm9sbCh7IHRvcDogMCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VhcmNoRW1vamkoa2V5U2VhcmNoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlci51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHBhZ2U6IDAsIGtleVNlYXJjaDoga2V5U2VhcmNoLnRyaW0oKSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICAgIHRoaXMuZWxlbWVudFZpZXdFbW9qaSgpPy5uYXRpdmVFbGVtZW50LnNjcm9sbCh7IHRvcDogMCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm90dG9tKCkge1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgcGFnZTogZGF0YS5wYWdlICsgMSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhVmlldygpIHtcbiAgICBjb25zdCBlbW9qaUJ5R3JvdXAgPSBlbW9qaXMoKS5maW5kKChpdGVtKSA9PiBpdGVtLmdyb3VwX25hbWUgPT09IHRoaXMuZmlsdGVyKCkuZ3JvdXBTZWxlY3RlZCkgYXMgSUdyb3VwRW1vamk7XG4gICAgY29uc3QgZW1vamlNYXRjaCA9IGVtb2ppQnlHcm91cC5lbW9qaXMuZmlsdGVyKChpdGVtKSA9PiBkZWxldGVVbmljb2RlKGl0ZW0uZGVzY3JpcHRpb24pLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoZGVsZXRlVW5pY29kZSh0aGlzLmZpbHRlcigpLmtleVNlYXJjaC50b0xvY2FsZUxvd2VyQ2FzZSgpKSkpO1xuXG4gICAgY29uc3QgeyBwYWdlLCBwZXJQYWdlIH0gPSB0aGlzLmZpbHRlcigpO1xuICAgIGNvbnN0IGRhdGFJblBhZ2UgPSBlbW9qaU1hdGNoLnNsaWNlKHBhZ2UgKiBwZXJQYWdlLCBwYWdlICogcGVyUGFnZSArIHBlclBhZ2UpO1xuXG4gICAgdGhpcy5kYXRhRW1vamlWaWV3LnVwZGF0ZSgoaXRlbSkgPT4gKHsgLi4uaXRlbSwgYWxsRGF0YTogZW1vamlNYXRjaCwgZGF0YVZpZXc6IHBhZ2UgPyBbLi4uaXRlbS5kYXRhVmlldywgLi4uZGF0YUluUGFnZV0gOiBkYXRhSW5QYWdlIH0pKTtcbiAgfVxufVxuIiwiPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlKClcIlxuICBbY29uZmlnXT1cIntcbiAgICBjb250ZW50OiAnaTE4bl90ZXh0X2Vtb2ppJyxcbiAgICB6SW5kZXg6ICh6SW5kZXgoKSB8fCAxMjAwKSArIDQsXG4gIH1cIlxuICBbaWdub3JlU2hvd1BvcG92ZXJdPVwiaWdub3JlU2hvd1BvcG92ZXJUZXh0KClcIlxuICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25zQ29udHJvbCgkZXZlbnQpXCI+XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgIHR5cGU9XCJvdGhlclwiXG4gICAgbW9kZT1cImNsaWNrLXRvZ2dsZVwiXG4gICAgY2xhc3M9XCJmbGV4XCJcbiAgICBbaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZV09XCJ0cnVlXCJcbiAgICBbY29uZmlnXT1cImNvbmZpZ1BvcG92ZXIoKVwiXG4gICAgW2RlYnVnSWRdPVwiJ2RlYnVnIGljb24gZW1vaWonXCJcbiAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9XCJoYW5kbGVyRmxhZ01vdXNlKCRldmVudClcIlxuICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbnNDb250cm9sKCRldmVudClcIj5cbiAgICBAaWYgKCFpc05nQ29udGVudCgpKSB7XG4gICAgICA8aSBjbGFzcz1cImJlZm9yZTohdGV4dC1bMTZweF0gYmVmb3JlOiF0ZXh0LVsjNmE3MzgzXSB7eyBjbGFzc0ljb25JbmNsdWRlKCkgfX1cIj48L2k+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgfVxuICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbjxuZy10ZW1wbGF0ZSAjZW1vamlSZWY+XG4gIDxkaXYgY2xhc3M9XCJweS1bMTBweF0gZmxleCBmbGV4LWNvbCB7eyBjbGFzc1BvcHVwKCkgfX1cIj5cbiAgICA8ZGl2IGNsYXNzPVwibXgtWzEwcHhdIG1iLVsxMnB4XVwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZT5cbiAgICAgICAgQGZvciAoY2F0ZWdvcnkgb2YgZW1vamlzQ2F0ZWdvcmllcygpOyB0cmFjayBjYXRlZ29yeSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JvdyBwLVs0cHhdIHJvdW5kZWQtWzRweF0gYmctWyNmZmZmZmZdIGxpYnMtdWktYmctbGlzdC1ob3ZlclwiXG4gICAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWFjdGl2ZV09XCJmaWx0ZXIoKS5ncm91cFNlbGVjdGVkID09PSBjYXRlZ29yeS5ncm91cF9uYW1lXCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyQ2hvb3NlQ2F0ZWdvcnkoJGV2ZW50LCBjYXRlZ29yeSlcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlckNob29zZUNhdGVnb3J5KCRldmVudCwgY2F0ZWdvcnkpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtWzFweF0gY3Vyc29yLXBvaW50ZXIgdGV4dC1bMThweF1cIj5cbiAgICAgICAgICAgICAge3sgY2F0ZWdvcnkuaWNvbkdyb3VwIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm14LVsxMHB4XSBtYi1bMTJweF1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXNlYXJjaFxuICAgICAgICBbc2VhcmNoQ29uZmlnXT1cIntcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ2kxOG5fc2VhcmNoJyxcbiAgICAgICAgfVwiXG4gICAgICAgIFtkZWJvdW5jZVRpbWVdPVwiMFwiXG4gICAgICAgIChvdXRTZWFyY2gpPVwiaGFuZGxlclNlYXJjaEVtb2ppKCRldmVudClcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgdy1mdWxsIHJlbGF0aXZlXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNlbGVtZW50Vmlld0Vtb2ppXG4gICAgICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbCBweC1bMTBweF0gYWJzb2x1dGVcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICAob3V0U2Nyb2xsQm90dG9tKT1cImhhbmRsZXJTY3JvbGxCb3R0b20oKVwiPlxuICAgICAgICBAaWYgKGRhdGFFbW9qaVZpZXcoKS5kYXRhVmlldy5sZW5ndGgpIHtcbiAgICAgICAgICBAZm9yIChpdGVtIG9mIGRhdGFFbW9qaVZpZXcoKS5kYXRhVmlldzsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8IS0tIHNldCBpZ25vcmVTaG93UG9wb3ZlciB0byBmYWxzZSB0byBlbmFibGUgdG9vbHRpcCBob3ZlciAtLT5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6IGl0ZW0uZGVzY3JpcHRpb24sIHpJbmRleDogKHpJbmRleCgpIHx8IDEyMDApICsgNSB9XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBmbGV4IHNocmluay0wIGgtZml0IG0tWzJweF0gZmxvYXQtbGVmdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyQWRkRW1vamkoaXRlbSlcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVyQWRkRW1vamkoaXRlbSlcIj5cbiAgICAgICAgICAgICAge3sgaXRlbS5lbW9qaSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNXIgdGV4dC1bIzljYTJhZF0gaC1mdWxsIHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIHt7ICdpMThuX25vX3Jlc3VsdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, input, output, viewChild, effect, untracked,
|
|
2
|
+
import { signal, input, output, viewChild, effect, untracked, Component, ChangeDetectionStrategy } from '@angular/core';
|
|
3
3
|
import { LibsUiComponentsInputsSearchComponent } from '@libs-ui/components-inputs-search';
|
|
4
4
|
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
5
5
|
import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';
|
|
@@ -1817,7 +1817,7 @@ class LibsUiComponentsEmojiComponent {
|
|
|
1817
1817
|
dataEmojiView = signal({ dataView: [], allData: [] });
|
|
1818
1818
|
// #region INPUT
|
|
1819
1819
|
/** Cấu hình overlay cho Popover chứa Emoji Picker */
|
|
1820
|
-
configPopover = input(defaultConfigPopover(), { transform: (value) =>
|
|
1820
|
+
configPopover = input(defaultConfigPopover(), { transform: (value) => value ?? defaultConfigPopover() });
|
|
1821
1821
|
/** Sử dụng ng-content làm trigger thay vì icon mặc định */
|
|
1822
1822
|
isNgContent = input();
|
|
1823
1823
|
/** Giá trị Z-index cho popup. Tự động offset +5 cho content. */
|
|
@@ -1903,11 +1903,11 @@ class LibsUiComponentsEmojiComponent {
|
|
|
1903
1903
|
this.dataEmojiView.update((item) => ({ ...item, allData: emojiMatch, dataView: page ? [...item.dataView, ...dataInPage] : dataInPage }));
|
|
1904
1904
|
}
|
|
1905
1905
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsEmojiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1906
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowPopoverText: { classPropertyName: "ignoreShowPopoverText", publicName: "ignoreShowPopoverText", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", outFunctionsControl: "outFunctionsControl", outFlagMouse: "outFlagMouse" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!--
|
|
1906
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowPopoverText: { classPropertyName: "ignoreShowPopoverText", publicName: "ignoreShowPopoverText", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", outFunctionsControl: "outFunctionsControl", outFlagMouse: "outFlagMouse" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keydown.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keydown.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "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"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1907
1907
|
}
|
|
1908
1908
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsEmojiComponent, decorators: [{
|
|
1909
1909
|
type: Component,
|
|
1910
|
-
args: [{ selector: 'libs_ui-components-emoji', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsSearchComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsScrollOverlayDirective], template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!--
|
|
1910
|
+
args: [{ selector: 'libs_ui-components-emoji', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsSearchComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsScrollOverlayDirective], template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keydown.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keydown.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n" }]
|
|
1911
1911
|
}], ctorParameters: () => [] });
|
|
1912
1912
|
|
|
1913
1913
|
/**
|