@libs-ui/components-inputs-calculator 0.2.356-42 → 0.2.356-43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,37 +1,47 @@
1
1
  # @libs-ui/components-inputs-calculator
2
2
 
3
- > Component Calculator nâng cao hỗ trợ nhập liệu biểu thức toán học kết hợp với các trường dữ liệu động.
3
+ > Component Calculator nâng cao cho phép xây dựng biểu thức toán học dạng token, kết hợp số, toán tử và trường dữ liệu động.
4
4
 
5
5
  ## Giới thiệu
6
6
 
7
- `LibsUiComponentsInputsCalculatorComponent` là một standalone Angular component cho phép người dùng xây dựng các công thức tính toán phức tạp bằng cách kết hợp các phím số, toán tử và các trường dữ liệu từ hệ thống.
7
+ `LibsUiComponentsInputsCalculatorComponent` là một Angular standalone component dùng để soạn thảo công thức tính toán theo dạng token trực quan. Người dùng thể nhập số, chọn toán tử (+, -, *, /) chèn các trường dữ liệu động từ hệ thống (fields) vào biểu thức. Component hỗ trợ đầy đủ thao tác bàn phím, xóa thông minh theo vị trí cursor, validation và cung cấp interface điều khiển từ bên ngoài qua `outFunctionControl`.
8
8
 
9
- ### Tính năng
9
+ ## Tính năng
10
10
 
11
- - ✅ **Token-based Input**: Hiển thị biểu thức dưới dạng các khối (tokens) trực quan.
12
- - ✅ **Dynamic Fields**: Tích hợp với Popover List để chọn tham số động.
13
- - ✅ **Keyboard Shortcuts**: Hỗ trợ đầy đủ phím sốphím toán tử.
14
- - ✅ **Smart Editing**: chế xóa thông minh (Backspace/Delete) tại vị trí cursor.
15
- - ✅ **OnPush Change Detection**: Tối ưu hiệu năng.
16
- - ✅ **Angular Signals**: Quản state hiện đại.
11
+ - ✅ **Token-based Input**: Hiển thị biểu thức dưới dạng các khối token trực quan (giá trị, toán tử, field).
12
+ - ✅ **Dynamic Fields**: Tích hợp Popover + List để chọn trường dữ liệu động từ hệ thống.
13
+ - ✅ **Keyboard Shortcuts**: Hỗ trợ phím số, phím toán tử (+, -, *, /) Enter để xác nhận từng token.
14
+ - ✅ **Smart Editing**: Backspace xóa token phía trước, Delete xóa token phía sau so với vị trí cursor.
15
+ - ✅ **Dynamic Input Width**: Tự động co giãn độ rộng ô nhập theo nội dung đang gõ.
16
+ - ✅ **FunctionControl API**: Cung cấp `checkIsValid()` `getData()` để điều khiển từ component cha.
17
+ - ✅ **Validation**: Hỗ trợ hiển thị lỗi khi biểu thức trống qua `validRequired`.
18
+ - ✅ **OnPush + Signals**: Tối ưu hiệu năng với Angular Signals và `ChangeDetectionStrategy.OnPush`.
17
19
 
18
20
  ## Khi nào sử dụng
19
21
 
20
- - Xây dựng trình soạn thảo công thức (Formula Editor).
21
- - Cấu hình các biểu thức tính toán lương, doanh thu, hoặc các chỉ số kinh doanh.
22
- - Khi cần một giao diện nhập liệu toán học an toàn, ngăn chặn nhập text tự do không hợp lệ.
22
+ - Cần cho phép người dùng xây dựng công thức tính toán tùy chỉnh (formula editor).
23
+ - Cấu hình biểu thức tính lương, doanh thu, KPI hoặc các chỉ số nghiệp vụ.
24
+ - Kết hợp các trường dữ liệu từ hệ thống (fields) vào biểu thức toán học.
25
+ - Yêu cầu giao diện nhập liệu toán học an toàn, ngăn chặn nhập text tự do không hợp lệ.
26
+ - Cần validator và lấy dữ liệu biểu thức từ bên ngoài component qua FunctionControl.
23
27
 
24
28
  ## Cài đặt
25
29
 
26
30
  ```bash
27
- # npm
28
31
  npm install @libs-ui/components-inputs-calculator
29
32
  ```
30
33
 
31
34
  ## Import
32
35
 
33
36
  ```typescript
34
- import { LibsUiComponentsInputsCalculatorComponent } from '@libs-ui/components-inputs-calculator';
37
+ import {
38
+ LibsUiComponentsInputsCalculatorComponent,
39
+ IInputCalculatorConfigField,
40
+ IInputCalculatorExpression,
41
+ IInputCalculatorFunctionControlEvent,
42
+ IInputCalculatorValid,
43
+ IInputCalculatorField,
44
+ } from '@libs-ui/components-inputs-calculator';
35
45
 
36
46
  @Component({
37
47
  standalone: true,
@@ -41,86 +51,284 @@ import { LibsUiComponentsInputsCalculatorComponent } from '@libs-ui/components-i
41
51
  export class YourComponent {}
42
52
  ```
43
53
 
44
- ## Ví dụ
54
+ ## Ví dụ sử dụng
45
55
 
46
- ### Cơ bản
56
+ ### Ví dụ 1 — Cơ bản (chỉ cần configField)
57
+
58
+ ```typescript
59
+ // your.component.ts
60
+ import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
61
+ import {
62
+ LibsUiComponentsInputsCalculatorComponent,
63
+ IInputCalculatorConfigField,
64
+ IInputCalculatorExpression,
65
+ } from '@libs-ui/components-inputs-calculator';
66
+ import { returnListObject } from '@libs-ui/services-http-request';
67
+ import { escapeHtml } from '@libs-ui/utils';
68
+
69
+ @Component({
70
+ selector: 'app-your',
71
+ templateUrl: './your.component.html',
72
+ standalone: true,
73
+ changeDetection: ChangeDetectionStrategy.OnPush,
74
+ imports: [LibsUiComponentsInputsCalculatorComponent],
75
+ })
76
+ export class YourComponent {
77
+ private readonly fields = [
78
+ { key: 'revenue', name: 'Doanh thu', icon: 'libs-ui-icon-coin' },
79
+ { key: 'cost', name: 'Chi phí', icon: 'libs-ui-icon-calculator' },
80
+ { key: 'quantity', name: 'Số lượng', icon: 'libs-ui-icon-archive' },
81
+ ];
82
+
83
+ readonly calculatorConfig: IInputCalculatorConfigField = {
84
+ label: 'Chọn trường dữ liệu',
85
+ placeholderInputList: 'Tìm kiếm tham số...',
86
+ listConfig: {
87
+ type: 'group',
88
+ httpRequestData: signal({
89
+ objectInstance: returnListObject(this.fields),
90
+ argumentsValue: [],
91
+ functionName: 'list',
92
+ }),
93
+ configTemplateGroup: signal({
94
+ fieldKey: 'key',
95
+ getLabelItem: (item) => escapeHtml(item.name),
96
+ singleSelectItem: true,
97
+ }),
98
+ },
99
+ getFieldSelected: (key: string) => this.fields.find((f) => f.key === key),
100
+ };
101
+
102
+ protected handlerSaveExpressions(event: Event): void {
103
+ event.stopPropagation();
104
+ // xử lý dữ liệu biểu thức
105
+ }
106
+
107
+ protected handlerChangeExpressions(expressions: IInputCalculatorExpression[]): void {
108
+ console.log('Biểu thức đã lưu:', expressions);
109
+ }
110
+ }
111
+ ```
47
112
 
48
113
  ```html
114
+ <!-- your.component.html -->
49
115
  <libs_ui-components-inputs-calculator
50
116
  [configField]="calculatorConfig"
51
- (outChangeExpressions)="onSave($event)" />
117
+ (outChangeExpressions)="handlerChangeExpressions($event)" />
52
118
  ```
53
119
 
54
- ### Với giá trị khởi tạo
120
+ ---
121
+
122
+ ### Ví dụ 2 — Khởi tạo với biểu thức có sẵn
123
+
124
+ ```typescript
125
+ // your.component.ts
126
+ readonly initialExpressions: IInputCalculatorExpression[] = [
127
+ { type: 'field', data: 'revenue' },
128
+ { type: 'operation', data: '-' },
129
+ { type: 'field', data: 'cost' },
130
+ ];
131
+ ```
55
132
 
56
133
  ```html
134
+ <!-- your.component.html -->
57
135
  <libs_ui-components-inputs-calculator
58
136
  [configField]="calculatorConfig"
59
- [expressions]="initialExpressions" />
137
+ [expressions]="initialExpressions"
138
+ [placeholder]="'Nhập công thức của bạn...'"
139
+ (outChangeExpressions)="handlerChangeExpressions($event)" />
60
140
  ```
61
141
 
62
- ## API
142
+ ---
143
+
144
+ ### Ví dụ 3 — Điều khiển từ bên ngoài qua FunctionControl
145
+
146
+ ```typescript
147
+ // your.component.ts
148
+ import { signal } from '@angular/core';
149
+ import {
150
+ IInputCalculatorFunctionControlEvent,
151
+ IInputCalculatorExpression,
152
+ } from '@libs-ui/components-inputs-calculator';
153
+
154
+ readonly calculatorControls = signal<IInputCalculatorFunctionControlEvent | null>(null);
155
+
156
+ protected handlerFunctionControl(event: IInputCalculatorFunctionControlEvent): void {
157
+ event.stopPropagation?.();
158
+ this.calculatorControls.set(event);
159
+ }
160
+
161
+ protected async handlerValidate(event: Event): Promise<void> {
162
+ event.stopPropagation();
163
+ const isValid = await this.calculatorControls()?.checkIsValid();
164
+ console.log('Biểu thức hợp lệ:', isValid);
165
+ }
166
+
167
+ protected handlerGetData(event: Event): void {
168
+ event.stopPropagation();
169
+ const data: IInputCalculatorExpression[] | undefined = this.calculatorControls()?.getData();
170
+ console.log('Dữ liệu hiện tại:', data);
171
+ }
172
+ ```
63
173
 
64
- ### libs_ui-components-inputs-calculator
174
+ ```html
175
+ <!-- your.component.html -->
176
+ <libs_ui-components-inputs-calculator
177
+ [configField]="calculatorConfig"
178
+ [ignoreButtonSave]="true"
179
+ (outFunctionControl)="calculatorControls.set($event)" />
65
180
 
66
- #### Inputs
181
+ <button (click)="handlerValidate($event)">Kiểm tra hợp lệ</button>
182
+ <button (click)="handlerGetData($event)">Lấy dữ liệu</button>
183
+ ```
67
184
 
68
- | Property | Type | Default | Description |
69
- | ------------------------ | ----------------------------------- | ------------------------- | ----------------------------------------- |
70
- | `[classContainerButton]` | `string` | `''` | Class CSS cho container chứa các nút bấm. |
71
- | `[classContainerInput]` | `string` | `''` | Class CSS cho vùng hiển thị biểu thức. |
72
- | `[classInclude]` | `string` | `''` | Class CSS cho wrapper ngoài cùng. |
73
- | `[configField]` | `IInputCalculatorConfigField` | - | **Bắt buộc**. Cấu hình chọn field. |
74
- | `[expressions]` | `Array<IInputCalculatorExpression>` | `[]` | Danh sách biểu thức mặc định. |
75
- | `[ignoreButtonSave]` | `boolean` | `false` | Ẩn/hiện nút Save mặc định. |
76
- | `[labelButtonSave]` | `string` | `'i18n_save_calculation'` | Nhãn nút Save. |
77
- | `[placeholder]` | `string` | `'i18n_enter_params'` | Placeholder khi trống. |
78
- | `[validRequired]` | `IInputCalculatorValid` | - | Cấu hình validation rỗng. |
79
- | `[zIndex]` | `number` | `10` | Z-index cho popover list. |
185
+ ---
80
186
 
81
- #### Outputs
187
+ ### Ví dụ 4 — Validation bắt buộc nhập
82
188
 
83
- | Property | Type | Description |
84
- | ------------------------ | ---------------------------------------------------- | ------------------------------ |
85
- | `(outChangeExpressions)` | `EventEmitter<Array<IInputCalculatorExpression>>` | Phát ra khi nhấn Save. |
86
- | `(outFunctionControl)` | `EventEmitter<IInputCalculatorFunctionControlEvent>` | Cung cấp interface điều khiển. |
189
+ ```typescript
190
+ // your.component.ts
191
+ readonly requiredValidation = { message: 'i18n_expression_required' };
192
+ ```
87
193
 
88
- #### Methods (via outFunctionControl)
194
+ ```html
195
+ <!-- your.component.html -->
196
+ <libs_ui-components-inputs-calculator
197
+ [configField]="calculatorConfig"
198
+ [validRequired]="requiredValidation"
199
+ (outChangeExpressions)="handlerChangeExpressions($event)" />
200
+ ```
89
201
 
90
- | Method | Parameters | Description |
91
- | ---------------- | ---------- | ---------------------------------------------------- |
92
- | `checkIsValid()` | - | Kiểm tra xem biểu thức hợp lệ (không rỗng) không. |
93
- | `getData()` | - | Trả về danh sách biểu thức hiện tại. |
202
+ ---
203
+
204
+ ### dụ 5 Ẩn nút Save, tùy chỉnh class
205
+
206
+ ```html
207
+ <libs_ui-components-inputs-calculator
208
+ [configField]="calculatorConfig"
209
+ [ignoreButtonSave]="true"
210
+ [classInclude]="'shadow-md'"
211
+ [classContainerInput]="'min-h-[200px]'"
212
+ [classContainerButton]="'mt-4'"
213
+ (outChangeExpressions)="handlerChangeExpressions($event)" />
214
+ ```
215
+
216
+ ## @Input()
217
+
218
+ | Input | Type | Default | Mô tả | Ví dụ |
219
+ |---|---|---|---|---|
220
+ | `[classContainerButton]` | `string` | `''` | Class CSS bổ sung cho container chứa các nút bấm (bàn phím số và toán tử). | `[classContainerButton]="'mt-4'"` |
221
+ | `[classContainerInput]` | `string` | `''` | Class CSS bổ sung cho vùng hiển thị và nhập biểu thức. | `[classContainerInput]="'min-h-[200px]'"` |
222
+ | `[classInclude]` | `string` | `''` | Class CSS bổ sung cho wrapper ngoài cùng của toàn bộ component. | `[classInclude]="'shadow-md rounded-xl'"` |
223
+ | `[configField]` | `IInputCalculatorConfigField` | `undefined` | Cấu hình cho việc hiển thị và chọn các trường dữ liệu động. Bao gồm listConfig và hàm `getFieldSelected`. | `[configField]="calculatorConfig"` |
224
+ | `[expressions]` | `IInputCalculatorExpression[]` | `[]` | Danh sách biểu thức khởi tạo ban đầu. Component sẽ clone sâu array này khi `ngOnInit`. | `[expressions]="initialExpressions"` |
225
+ | `[ignoreButtonSave]` | `boolean` | `false` | Khi `true`, ẩn nút Save mặc định ở cuối component. Dùng khi muốn lưu theo cách khác qua FunctionControl. | `[ignoreButtonSave]="true"` |
226
+ | `[labelButtonSave]` | `string` | `'i18n_save_calculation'` | Nhãn hiển thị trên nút Save. Hỗ trợ i18n key. | `[labelButtonSave]="'Lưu công thức'"` |
227
+ | `[placeholder]` | `string` | `'i18n_enter_params'` | Văn bản placeholder hiển thị khi biểu thức còn trống. Hỗ trợ i18n key. | `[placeholder]="'Nhập công thức...'"` |
228
+ | `[validRequired]` | `IInputCalculatorValid` | `undefined` | Cấu hình validation: hiển thị thông báo lỗi khi biểu thức rỗng. | `[validRequired]="{ message: 'i18n_required' }"` |
229
+ | `[zIndex]` | `number` | `10` | Z-index cho Popover hiển thị danh sách fields khi chọn trường dữ liệu. | `[zIndex]="100"` |
230
+
231
+ ## @Output()
232
+
233
+ | Output | Type | Mô tả | Handler TS | Binding HTML |
234
+ |---|---|---|---|---|
235
+ | `(outChangeExpressions)` | `IInputCalculatorExpression[]` | Phát ra danh sách biểu thức hiện tại khi người dùng nhấn nút Save. Chỉ phát khi có thay đổi so với lần Save trước. | `handlerChangeExpressions(expressions: IInputCalculatorExpression[]): void { event.stopPropagation(); this.savedExpressions.set(expressions); }` | `(outChangeExpressions)="handlerChangeExpressions($event)"` |
236
+ | `(outFunctionControl)` | `IInputCalculatorFunctionControlEvent` | Phát ra ngay khi component khởi tạo (`ngOnInit`), cung cấp interface để điều khiển component từ bên ngoài. | `handlerFunctionControl(control: IInputCalculatorFunctionControlEvent): void { this.calculatorControls.set(control); }` | `(outFunctionControl)="calculatorControls.set($event)"` |
237
+
238
+ ## FunctionControl Methods
239
+
240
+ Nhận về qua output `(outFunctionControl)`. Lưu vào signal rồi gọi khi cần:
241
+
242
+ ```typescript
243
+ readonly calculatorControls = signal<IInputCalculatorFunctionControlEvent | null>(null);
244
+ ```
245
+
246
+ | Method | Signature | Mô tả |
247
+ |---|---|---|
248
+ | `checkIsValid()` | `() => Promise<boolean>` | Kiểm tra tính hợp lệ của biểu thức. Trả về `false` nếu biểu thức rỗng và `validRequired` được cấu hình. Đồng thời hiển thị thông báo lỗi trên UI. |
249
+ | `getData()` | `() => IInputCalculatorExpression[]` | Lấy bản sao sâu (deep clone) của danh sách biểu thức hiện tại mà không cần nhấn nút Save. |
94
250
 
95
251
  ## Types & Interfaces
96
252
 
97
253
  ```typescript
98
- export interface IInputCalculatorExpression {
254
+ import {
255
+ IInputCalculatorExpression,
256
+ IInputCalculatorConfigField,
257
+ IInputCalculatorFunctionControlEvent,
258
+ IInputCalculatorValid,
259
+ IInputCalculatorField,
260
+ } from '@libs-ui/components-inputs-calculator';
261
+ ```
262
+
263
+ ```typescript
264
+ /**
265
+ * Một phần tử trong biểu thức toán học.
266
+ * - type 'value': giá trị số hoặc text được nhập trực tiếp (VD: "100", "2.5")
267
+ * - type 'field': tham chiếu đến một trường dữ liệu động từ hệ thống (VD: key "revenue")
268
+ * - type 'operation': toán tử toán học ('+', '-', '*', '/', '(', ')')
269
+ */
270
+ interface IInputCalculatorExpression {
99
271
  type: 'value' | 'field' | 'operation';
100
272
  data: string | number;
101
273
  }
102
274
 
103
- export interface IInputCalculatorConfigField {
275
+ /**
276
+ * Cấu hình cho việc chọn và hiển thị các trường dữ liệu động.
277
+ */
278
+ interface IInputCalculatorConfigField {
279
+ /** Nhãn nút chọn field, hiển thị ở dưới vùng nhập. Mặc định: 'i18n_select_field' */
104
280
  label?: string;
281
+ /** Placeholder cho ô tìm kiếm trong danh sách field */
105
282
  placeholderInputList?: string;
283
+ /** Cấu hình danh sách hiển thị từ @libs-ui/components-list */
106
284
  listConfig: IListConfigItem;
285
+ /** Callback lấy thông tin hiển thị (name, icon) của field theo key */
107
286
  getFieldSelected: (field: string) => IInputCalculatorField | undefined;
108
287
  }
109
288
 
110
- export interface IInputCalculatorFunctionControlEvent {
289
+ /**
290
+ * Thông tin hiển thị của một field trong biểu thức.
291
+ */
292
+ interface IInputCalculatorField {
293
+ key?: string;
294
+ name?: string;
295
+ icon?: string;
296
+ }
297
+
298
+ /**
299
+ * Interface điều khiển component từ bên ngoài (nhận qua outFunctionControl).
300
+ */
301
+ interface IInputCalculatorFunctionControlEvent {
111
302
  checkIsValid: () => Promise<boolean>;
112
303
  getData: () => Array<IInputCalculatorExpression>;
113
304
  }
114
305
 
115
- export interface IInputCalculatorValid {
116
- message: string;
306
+ /**
307
+ * Cấu hình validation cho biểu thức.
308
+ */
309
+ interface IInputCalculatorValid {
310
+ message?: string;
117
311
  }
118
312
  ```
119
313
 
120
- ## Demo
314
+ ## Lưu ý quan trọng
315
+
316
+ ⚠️ **`configField` là cấu hình cốt lõi**: Mặc dù không bắt buộc về mặt TypeScript, component sẽ không hiển thị đúng nút chọn field và không resolve được tên/icon của field trong biểu thức nếu thiếu `configField`. Luôn truyền vào khi dùng trong production.
317
+
318
+ ⚠️ **`outFunctionControl` phát ngay khi ngOnInit**: Output này được emit ngay trong `ngOnInit`, không phải do tương tác người dùng. Cần lưu vào signal hoặc biến class ngay khi nhận. Không dùng `async pipe` hay subscribe muộn.
121
319
 
122
- Truy cập: `http://localhost:4500/inputs/calculator`
320
+ ⚠️ **`outChangeExpressions` chỉ phát khi nhấn nút Save**: Component không phát liên tục khi người dùng chỉnh sửa. Nếu muốn lấy dữ liệu tức thời mà không cần nhấn Save, dùng `getData()` từ FunctionControl. Để ẩn nút Save và tự quản lý, đặt `[ignoreButtonSave]="true"`.
123
321
 
124
- ## License
322
+ ⚠️ **Xóa token bằng bàn phím**: Khi ô nhập đang trống và focus, `Backspace` xóa token ngay phía trước vị trí cursor, `Delete` xóa token ngay phía sau. Đây là hành vi có chủ đích để tối ưu trải nghiệm chỉnh sửa.
323
+
324
+ ⚠️ **Toán tử qua bàn phím**: Gõ `+`, `-`, `*`, `/` trong ô nhập sẽ tự động được chuyển thành token toán tử (type: `'operation'`) thay vì nhập text. Component dùng `keyup` event để bắt và xử lý.
325
+
326
+ ⚠️ **Deep clone `expressions`**: Component thực hiện `cloneDeep` trên `expressions` input khi khởi tạo. Thay đổi array gốc bên ngoài sau khi component đã init sẽ không có tác dụng — cần re-render component nếu muốn reset.
327
+
328
+ ## Demo
329
+
330
+ ```bash
331
+ npx nx serve core-ui
332
+ ```
125
333
 
126
- MIT
334
+ Truy cập: `http://localhost:4500/components/inputs/calculator`
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Pipe, signal, viewChildren, input, output, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { Pipe, signal, viewChildren, input, output, Component, ChangeDetectionStrategy } from '@angular/core';
3
3
  import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
4
4
  import { LibsUiComponentsListComponent } from '@libs-ui/components-list';
5
5
  import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-components-inputs-calculator.mjs","sources":["../../../../../../libs-ui/components/inputs/calculator/src/pipes/get-field-selected.pipe.ts","../../../../../../libs-ui/components/inputs/calculator/src/pipes/get-width-input.pipe.ts","../../../../../../libs-ui/components/inputs/calculator/src/calculator.component.ts","../../../../../../libs-ui/components/inputs/calculator/src/calculator.component.html","../../../../../../libs-ui/components/inputs/calculator/src/libs-ui-components-inputs-calculator.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { IInputCalculatorField } from '../interfaces';\n\n@Pipe({\n name: 'LibsUiComponentsInputsCalculatorGetFieldSelectedPipe',\n standalone: true,\n})\nexport class LibsUiComponentsInputsCalculatorGetFieldSelectedPipe implements PipeTransform {\n transform(fieldId: string | number, getFieldSelected?: (key: string) => IInputCalculatorField | undefined): IInputCalculatorField | undefined {\n return getFieldSelected?.(typeof fieldId === 'number' ? fieldId.toString() : fieldId);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'LibsUiComponentsInputsCalculatorGetWidthInputPipe',\n standalone: true,\n})\nexport class LibsUiComponentsInputsCalculatorGetWidthInputPipe implements PipeTransform {\n transform(text: string, element: HTMLDivElement): number {\n if (!text) {\n return 8;\n }\n const div = document.createElement('span');\n\n div.textContent = text;\n element.appendChild(div);\n const width = div.offsetWidth + 8;\n\n div.remove();\n\n return width;\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, input, OnInit, output, signal, viewChildren } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IListDataEmitMultiKey, LibsUiComponentsListComponent } from '@libs-ui/components-list';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { IEvent } from '@libs-ui/interfaces-types';\nimport { cloneDeep, UtilsKeyCodeConstant } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IInputCalculatorConfigField, IInputCalculatorExpression, IInputCalculatorFunctionControlEvent, IInputCalculatorValid } from './interfaces';\nimport { LibsUiComponentsInputsCalculatorGetFieldSelectedPipe } from './pipes/get-field-selected.pipe';\nimport { LibsUiComponentsInputsCalculatorGetWidthInputPipe } from './pipes/get-width-input.pipe';\n\n/**\n * Component Calculator nâng cao hỗ trợ nhập liệu biểu thức toán học.\n * Kết hợp giữa các trường dữ liệu động (fields), giá trị tĩnh và toán tử.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-calculator',\n templateUrl: './calculator.component.html',\n standalone: true,\n imports: [TranslateModule, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsListComponent, LibsUiComponentsInputsCalculatorGetFieldSelectedPipe, LibsUiComponentsPopoverComponent, LibsUiComponentsInputsCalculatorGetWidthInputPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsInputsCalculatorComponent implements OnInit {\n protected indexFocus = signal<number | undefined>(undefined);\n protected isFocus = signal<boolean>(false);\n protected listExpressions = signal<Array<IInputCalculatorExpression>>([]);\n protected isChangeExpression = signal<boolean>(false);\n protected error = signal<IInputCalculatorValid | undefined>(undefined);\n\n private readonly inputRef = viewChildren<ElementRef>('inputRef');\n private readonly timeOut = signal<number | undefined>(undefined);\n private readonly tooltipFunctionControl = signal<Map<number, IPopoverFunctionControlEvent>>(new Map());\n\n readonly expressions = input<Array<IInputCalculatorExpression>>([]);\n readonly zIndex = input<number>(10);\n readonly placeholder = input<string>('i18n_enter_params');\n readonly labelButtonSave = input<string>('i18n_save_calculation');\n readonly configField = input<IInputCalculatorConfigField>();\n readonly ignoreButtonSave = input<boolean>(false);\n readonly classInclude = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly classContainerInput = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly classContainerButton = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly validRequired = input<IInputCalculatorValid>();\n\n readonly outChangeExpressions = output<Array<IInputCalculatorExpression>>();\n readonly outFunctionControl = output<IInputCalculatorFunctionControlEvent>();\n\n ngOnInit() {\n this.listExpressions.set(cloneDeep(this.expressions()));\n this.outFunctionControl.emit(this.FunctionsControl);\n }\n\n public get FunctionsControl(): IInputCalculatorFunctionControlEvent {\n return {\n checkIsValid: this.validate.bind(this),\n getData: () => {\n return cloneDeep(this.listExpressions());\n },\n };\n }\n\n protected handlerClick(event: Event, button: '+' | '-' | '*' | '/' | 'c' | '.' | '(' | ')' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') {\n event.stopPropagation();\n const expression: IInputCalculatorExpression = { type: 'field', data: button };\n\n if (button === 'c') {\n if (!this.listExpressions().length || this.indexFocus() === 0) {\n return;\n }\n return this.updateExpressions(undefined, typeof this.indexFocus() !== 'undefined' ? (this.indexFocus() || 1) - 1 : this.listExpressions().length - 1);\n }\n switch (button) {\n case '+':\n case '-':\n case '*':\n case '/':\n expression.type = 'operation';\n break;\n default:\n expression.type = 'value';\n }\n this.updateExpressions(expression, typeof this.indexFocus() !== 'undefined' ? this.indexFocus() || 0 : this.listExpressions().length);\n }\n\n private updateExpressions(item: IInputCalculatorExpression | undefined, position: number, isDelete?: boolean) {\n this.isChangeExpression.set(true);\n this.listExpressions.update((value) => {\n if (item) {\n value.splice(position || 0, 0, item);\n }\n if (!item) {\n value.splice(position || 0, 1);\n }\n\n return [...value];\n });\n\n this.indexFocus.update((value) => {\n if (!item) {\n if (value) {\n value = isDelete ? value : value - 1;\n }\n\n return value || position;\n }\n if (typeof value === 'undefined') {\n value = this.listExpressions().length;\n\n return value;\n }\n value++;\n\n return value;\n });\n const indexFocus = this.indexFocus();\n\n setTimeout(() => {\n if (typeof indexFocus !== 'undefined') {\n this.inputRef()[indexFocus]?.nativeElement.focus();\n }\n }, 100);\n this.validate();\n }\n\n protected handlerEventKeyUpInput(event: Event) {\n const keyCode = (event as IEvent).keyCode;\n const value = (event as IEvent).target.value;\n const shiftKey = (event as IEvent).shiftKey;\n\n if ((([UtilsKeyCodeConstant.EQUALS, UtilsKeyCodeConstant.EIGHT].includes(keyCode) && shiftKey) || ([UtilsKeyCodeConstant.DASH, UtilsKeyCodeConstant.SLASH].includes(keyCode) && !shiftKey)) && value.length === 1) {\n (event as IEvent).target.value = '';\n\n return this.updateExpressions({ type: 'operation', data: value }, this.indexFocus() || this.listExpressions().length);\n }\n }\n\n protected handlerEventKeyInput(event: Event) {\n const keyCode = (event as IEvent).keyCode;\n const value = (event as IEvent).target.value;\n\n if (keyCode === UtilsKeyCodeConstant.BACKSPACE) {\n if (!value && this.listExpressions().length && (this.indexFocus() || 0) > 0) {\n return this.updateExpressions(undefined, (this.indexFocus() || 0) - 1);\n }\n }\n if (keyCode === UtilsKeyCodeConstant.DELETE) {\n if (!value && this.listExpressions().length && (this.indexFocus() || 0) < this.listExpressions().length) {\n return this.updateExpressions(undefined, this.indexFocus() || 0, true);\n }\n }\n if (keyCode === UtilsKeyCodeConstant.ENTER) {\n if (value) {\n (event as IEvent).target.value = '';\n\n return this.updateExpressions({ type: 'value', data: value }, this.indexFocus() || this.listExpressions().length);\n }\n }\n }\n\n protected handlerFocusAndBlurInput(index: number | undefined) {\n if (typeof index !== 'undefined') {\n this.indexFocus.set(index);\n this.isFocus.set(true);\n clearTimeout(this.timeOut());\n\n return;\n }\n this.timeOut.set(\n setTimeout(() => {\n this.isFocus.set(false);\n }, 250)\n );\n }\n\n protected handlerClickInput(event: Event) {\n event.stopPropagation();\n if (!this.isFocus()) {\n this.inputRef()[this.inputRef().length - 1].nativeElement.focus();\n }\n }\n\n protected handlerSave(event: Event) {\n event.stopPropagation();\n this.isChangeExpression.set(false);\n this.outChangeExpressions.emit(cloneDeep(this.listExpressions()));\n }\n\n protected handlerSelectedField(event: IListDataEmitMultiKey | undefined, index: number) {\n if (!event?.keys.length) {\n return;\n }\n if (index >= 0) {\n this.listExpressions.update((value) => {\n value.forEach((item, i) => {\n if (i === index) {\n if (item.data !== event.keys[0]) {\n this.tooltipFunctionControl().get(index)?.removePopoverOverlay();\n }\n item.data = event.keys[0] as string;\n }\n });\n\n return [...value];\n });\n this.isChangeExpression.set(true);\n\n return;\n }\n this.updateExpressions({ type: 'field', data: event.keys[0] as string }, typeof this.indexFocus() !== 'undefined' ? this.indexFocus() || 0 : this.listExpressions().length);\n this.tooltipFunctionControl().get(index)?.removePopoverOverlay();\n }\n\n protected handlerFunctionControlButton(event: IPopoverFunctionControlEvent, index: number) {\n this.tooltipFunctionControl.update((value) => {\n value.set(index, event);\n\n return value;\n });\n }\n\n private async validate() {\n this.error.set(undefined);\n if (!this.validRequired()?.message) {\n return true;\n }\n if (!this.listExpressions().length) {\n this.error.set({ message: this.validRequired()?.message });\n }\n\n return !!this.listExpressions().length;\n }\n}\n","<div class=\"w-full\">\n <div class=\"p-[8px] rounded-[12px] bg-[#f8f9fa] {{ classInclude() }}\">\n <div class=\"mb-[8px] {{ classContainerInput() }}\">\n <div\n #calculatorInput\n class=\"py-[10px] px-[12px] libs-ui-font-h5r rounded-[8px] bg-[#ffffff] min-h-[160px] h-full border-[1px] {{ error()?.message ? 'libs-ui-border-error-general' : isFocus() ? 'border-[var(--libs-ui-color-light-1)]' : 'border-[#ffffff]' }}\"\n (mouseup)=\"handlerClickInput($event)\">\n <ul class=\"before:content-[''] before:table after:content-[''] after:table after:clear-both\">\n @for (item of listExpressions(); track $index; let i = $index) {\n <li class=\"float-left mb-[8px]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none text-center\"\n [class.ml-[-8px]]=\"i === 0\"\n [style.width.px]=\"inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(i)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n @switch (item.type) {\n @case ('operation') {\n <li class=\"float-left mb-[8px] text-center w-[24px] h-[24px] rounded-[4px] p-[4px] bg-[var(--libs-ui-color-light-2)]\">\n @switch (item.data) {\n @case ('/') {\n <i class=\"libs-ui-icon-divide text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('-') {\n <i class=\"libs-ui-icon-minus text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('+') {\n <i class=\"libs-ui-icon-add text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('*') {\n <i class=\"libs-ui-icon-close text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n }\n </li>\n }\n @case ('value') {\n <li class=\"float-left mb-[8px] text-center rounded-[4px] h-[24px] px-[8px] bg-[#E6E7EA] flex items-center max-w-[calc(100%-8px)]\">\n <libs_ui-components-popover [type]=\"'text'\">{{ item.data }}</libs_ui-components-popover>\n </li>\n }\n @case ('field') {\n @if ({ fieldSelected: item.data | LibsUiComponentsInputsCalculatorGetFieldSelectedPipe: configField()?.getFieldSelected }; as data) {\n <li class=\"float-left mb-[8px]\">\n <libs_ui-components-buttons-button\n class=\"max-w-[172px] block\"\n [label]=\"data.fieldSelected?.name || 'i18n_field_error'\"\n [classInclude]=\"'!justify-center !py-[2px] !px-[7px] !w-full'\"\n [classIconLeft]=\"data.fieldSelected?.icon || 'libs-ui-icon-tooltip-outline'\"\n [classIconRight]=\"'libs-ui-icon-move-right rotate-90'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [zIndex]=\"zIndex()\"\n [type]=\"data.fieldSelected ? 'button-primary' : 'button-danger-high'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: false,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: i, key: item.data },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, i)\" />\n </li>\n }\n }\n }\n }\n <li class=\"float-left mb-[8px] max-w-[100%]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none max-w-[100%] {{ listExpressions().length ? 'text-center' : '' }}\"\n [style.width.px]=\"listExpressions().length ? (inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput) : 150\"\n [placeholder]=\"!listExpressions().length ? (placeholder() | translate) : ''\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(listExpressions().length)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n </ul>\n </div>\n @if (error()?.message) {\n <div class=\"libs-ui-text-error mt-[8px] libs-ui-font-h7r\">\n @let constHtmlMessage = error()?.message || ' ';\n {{ constHtmlMessage | translate }}\n </div>\n }\n </div>\n <div class=\"grid grid-cols-4 gap-[8px] {{ classContainerButton() }}\">\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"configField()?.label || 'i18n_select_field'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: true,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: -1 },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, -1)\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-violet'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'Fx'\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-danger-high'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'C'\"\n (outClick)=\"handlerClick($event, 'c')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'('\"\n (outClick)=\"handlerClick($event, '(')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"')'\"\n (outClick)=\"handlerClick($event, ')')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-divide'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '/')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'1'\"\n (outClick)=\"handlerClick($event, '1')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'2'\"\n (outClick)=\"handlerClick($event, '2')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'3'\"\n (outClick)=\"handlerClick($event, '3')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-close'\"\n (outClick)=\"handlerClick($event, '*')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'4'\"\n (outClick)=\"handlerClick($event, '4')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'5'\"\n (outClick)=\"handlerClick($event, '5')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'6'\"\n (outClick)=\"handlerClick($event, '6')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-minus'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '-')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'7'\"\n (outClick)=\"handlerClick($event, '7')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'8'\"\n (outClick)=\"handlerClick($event, '8')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'9'\"\n (outClick)=\"handlerClick($event, '9')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n (outClick)=\"handlerClick($event, '+')\" />\n </div>\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"'0'\"\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n (outClick)=\"handlerClick($event, '0')\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'.'\"\n (outClick)=\"handlerClick($event, '.')\" />\n </div>\n </div>\n </div>\n @if (!ignoreButtonSave()) {\n <div class=\"mt-[16px]\">\n <libs_ui-components-buttons-button\n [label]=\"labelButtonSave()\"\n [disable]=\"!isChangeExpression()\"\n [classInclude]=\"'justify-center w-full'\"\n (outClick)=\"handlerSave($event)\" />\n </div>\n }\n</div>\n\n<ng-template\n #listViewRef\n let-data=\"itemContext\">\n <libs_ui-components-list\n [zIndex]=\"zIndex()\"\n [config]=\"configField()?.listConfig\"\n [maxItemShow]=\"6\"\n [clickExactly]=\"false\"\n [searchConfig]=\"{ noBorder: true, placeholder: configField()?.placeholderInputList || 'i18n_search' }\"\n [multiKeySelected]=\"data.key ? [data.key] : []\"\n (outSelectMultiKey)=\"handlerSelectedField($event, data.index)\"></libs_ui-components-list>\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-inputs-calculator.mjs","sources":["../../../../../../libs-ui/components/inputs/calculator/src/pipes/get-field-selected.pipe.ts","../../../../../../libs-ui/components/inputs/calculator/src/pipes/get-width-input.pipe.ts","../../../../../../libs-ui/components/inputs/calculator/src/calculator.component.ts","../../../../../../libs-ui/components/inputs/calculator/src/calculator.component.html","../../../../../../libs-ui/components/inputs/calculator/src/libs-ui-components-inputs-calculator.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { IInputCalculatorField } from '../interfaces';\n\n@Pipe({\n name: 'LibsUiComponentsInputsCalculatorGetFieldSelectedPipe',\n standalone: true,\n})\nexport class LibsUiComponentsInputsCalculatorGetFieldSelectedPipe implements PipeTransform {\n transform(fieldId: string | number, getFieldSelected?: (key: string) => IInputCalculatorField | undefined): IInputCalculatorField | undefined {\n return getFieldSelected?.(typeof fieldId === 'number' ? fieldId.toString() : fieldId);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'LibsUiComponentsInputsCalculatorGetWidthInputPipe',\n standalone: true,\n})\nexport class LibsUiComponentsInputsCalculatorGetWidthInputPipe implements PipeTransform {\n transform(text: string, element: HTMLDivElement): number {\n if (!text) {\n return 8;\n }\n const div = document.createElement('span');\n\n div.textContent = text;\n element.appendChild(div);\n const width = div.offsetWidth + 8;\n\n div.remove();\n\n return width;\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, input, OnInit, output, signal, viewChildren } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IListDataEmitMultiKey, LibsUiComponentsListComponent } from '@libs-ui/components-list';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { IEvent } from '@libs-ui/interfaces-types';\nimport { cloneDeep, UtilsKeyCodeConstant } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IInputCalculatorConfigField, IInputCalculatorExpression, IInputCalculatorFunctionControlEvent, IInputCalculatorValid } from './interfaces';\nimport { LibsUiComponentsInputsCalculatorGetFieldSelectedPipe } from './pipes/get-field-selected.pipe';\nimport { LibsUiComponentsInputsCalculatorGetWidthInputPipe } from './pipes/get-width-input.pipe';\n\n/**\n * Component Calculator nâng cao hỗ trợ nhập liệu biểu thức toán học.\n * Kết hợp giữa các trường dữ liệu động (fields), giá trị tĩnh và toán tử.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-calculator',\n templateUrl: './calculator.component.html',\n standalone: true,\n imports: [TranslateModule, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsListComponent, LibsUiComponentsInputsCalculatorGetFieldSelectedPipe, LibsUiComponentsPopoverComponent, LibsUiComponentsInputsCalculatorGetWidthInputPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsInputsCalculatorComponent implements OnInit {\n protected indexFocus = signal<number | undefined>(undefined);\n protected isFocus = signal<boolean>(false);\n protected listExpressions = signal<Array<IInputCalculatorExpression>>([]);\n protected isChangeExpression = signal<boolean>(false);\n protected error = signal<IInputCalculatorValid | undefined>(undefined);\n\n private readonly inputRef = viewChildren<ElementRef>('inputRef');\n private readonly timeOut = signal<number | undefined>(undefined);\n private readonly tooltipFunctionControl = signal<Map<number, IPopoverFunctionControlEvent>>(new Map());\n\n readonly expressions = input<Array<IInputCalculatorExpression>>([]);\n readonly zIndex = input<number>(10);\n readonly placeholder = input<string>('i18n_enter_params');\n readonly labelButtonSave = input<string>('i18n_save_calculation');\n readonly configField = input<IInputCalculatorConfigField>();\n readonly ignoreButtonSave = input<boolean>(false);\n readonly classInclude = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly classContainerInput = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly classContainerButton = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly validRequired = input<IInputCalculatorValid>();\n\n readonly outChangeExpressions = output<Array<IInputCalculatorExpression>>();\n readonly outFunctionControl = output<IInputCalculatorFunctionControlEvent>();\n\n ngOnInit() {\n this.listExpressions.set(cloneDeep(this.expressions()));\n this.outFunctionControl.emit(this.FunctionsControl);\n }\n\n public get FunctionsControl(): IInputCalculatorFunctionControlEvent {\n return {\n checkIsValid: this.validate.bind(this),\n getData: () => {\n return cloneDeep(this.listExpressions());\n },\n };\n }\n\n protected handlerClick(event: Event, button: '+' | '-' | '*' | '/' | 'c' | '.' | '(' | ')' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') {\n event.stopPropagation();\n const expression: IInputCalculatorExpression = { type: 'field', data: button };\n\n if (button === 'c') {\n if (!this.listExpressions().length || this.indexFocus() === 0) {\n return;\n }\n return this.updateExpressions(undefined, typeof this.indexFocus() !== 'undefined' ? (this.indexFocus() || 1) - 1 : this.listExpressions().length - 1);\n }\n switch (button) {\n case '+':\n case '-':\n case '*':\n case '/':\n expression.type = 'operation';\n break;\n default:\n expression.type = 'value';\n }\n this.updateExpressions(expression, typeof this.indexFocus() !== 'undefined' ? this.indexFocus() || 0 : this.listExpressions().length);\n }\n\n private updateExpressions(item: IInputCalculatorExpression | undefined, position: number, isDelete?: boolean) {\n this.isChangeExpression.set(true);\n this.listExpressions.update((value) => {\n if (item) {\n value.splice(position || 0, 0, item);\n }\n if (!item) {\n value.splice(position || 0, 1);\n }\n\n return [...value];\n });\n\n this.indexFocus.update((value) => {\n if (!item) {\n if (value) {\n value = isDelete ? value : value - 1;\n }\n\n return value || position;\n }\n if (typeof value === 'undefined') {\n value = this.listExpressions().length;\n\n return value;\n }\n value++;\n\n return value;\n });\n const indexFocus = this.indexFocus();\n\n setTimeout(() => {\n if (typeof indexFocus !== 'undefined') {\n this.inputRef()[indexFocus]?.nativeElement.focus();\n }\n }, 100);\n this.validate();\n }\n\n protected handlerEventKeyUpInput(event: Event) {\n const keyCode = (event as IEvent).keyCode;\n const value = (event as IEvent).target.value;\n const shiftKey = (event as IEvent).shiftKey;\n\n if ((([UtilsKeyCodeConstant.EQUALS, UtilsKeyCodeConstant.EIGHT].includes(keyCode) && shiftKey) || ([UtilsKeyCodeConstant.DASH, UtilsKeyCodeConstant.SLASH].includes(keyCode) && !shiftKey)) && value.length === 1) {\n (event as IEvent).target.value = '';\n\n return this.updateExpressions({ type: 'operation', data: value }, this.indexFocus() || this.listExpressions().length);\n }\n }\n\n protected handlerEventKeyInput(event: Event) {\n const keyCode = (event as IEvent).keyCode;\n const value = (event as IEvent).target.value;\n\n if (keyCode === UtilsKeyCodeConstant.BACKSPACE) {\n if (!value && this.listExpressions().length && (this.indexFocus() || 0) > 0) {\n return this.updateExpressions(undefined, (this.indexFocus() || 0) - 1);\n }\n }\n if (keyCode === UtilsKeyCodeConstant.DELETE) {\n if (!value && this.listExpressions().length && (this.indexFocus() || 0) < this.listExpressions().length) {\n return this.updateExpressions(undefined, this.indexFocus() || 0, true);\n }\n }\n if (keyCode === UtilsKeyCodeConstant.ENTER) {\n if (value) {\n (event as IEvent).target.value = '';\n\n return this.updateExpressions({ type: 'value', data: value }, this.indexFocus() || this.listExpressions().length);\n }\n }\n }\n\n protected handlerFocusAndBlurInput(index: number | undefined) {\n if (typeof index !== 'undefined') {\n this.indexFocus.set(index);\n this.isFocus.set(true);\n clearTimeout(this.timeOut());\n\n return;\n }\n this.timeOut.set(\n setTimeout(() => {\n this.isFocus.set(false);\n }, 250)\n );\n }\n\n protected handlerClickInput(event: Event) {\n event.stopPropagation();\n if (!this.isFocus()) {\n this.inputRef()[this.inputRef().length - 1].nativeElement.focus();\n }\n }\n\n protected handlerSave(event: Event) {\n event.stopPropagation();\n this.isChangeExpression.set(false);\n this.outChangeExpressions.emit(cloneDeep(this.listExpressions()));\n }\n\n protected handlerSelectedField(event: IListDataEmitMultiKey | undefined, index: number) {\n if (!event?.keys.length) {\n return;\n }\n if (index >= 0) {\n this.listExpressions.update((value) => {\n value.forEach((item, i) => {\n if (i === index) {\n if (item.data !== event.keys[0]) {\n this.tooltipFunctionControl().get(index)?.removePopoverOverlay();\n }\n item.data = event.keys[0] as string;\n }\n });\n\n return [...value];\n });\n this.isChangeExpression.set(true);\n\n return;\n }\n this.updateExpressions({ type: 'field', data: event.keys[0] as string }, typeof this.indexFocus() !== 'undefined' ? this.indexFocus() || 0 : this.listExpressions().length);\n this.tooltipFunctionControl().get(index)?.removePopoverOverlay();\n }\n\n protected handlerFunctionControlButton(event: IPopoverFunctionControlEvent, index: number) {\n this.tooltipFunctionControl.update((value) => {\n value.set(index, event);\n\n return value;\n });\n }\n\n private async validate() {\n this.error.set(undefined);\n if (!this.validRequired()?.message) {\n return true;\n }\n if (!this.listExpressions().length) {\n this.error.set({ message: this.validRequired()?.message });\n }\n\n return !!this.listExpressions().length;\n }\n}\n","<div class=\"w-full\">\n <div class=\"p-[8px] rounded-[12px] bg-[#f8f9fa] {{ classInclude() }}\">\n <div class=\"mb-[8px] {{ classContainerInput() }}\">\n <div\n #calculatorInput\n class=\"py-[10px] px-[12px] libs-ui-font-h5r rounded-[8px] bg-[#ffffff] min-h-[160px] h-full border-[1px] {{ error()?.message ? 'libs-ui-border-error-general' : isFocus() ? 'border-[var(--libs-ui-color-light-1)]' : 'border-[#ffffff]' }}\"\n (mouseup)=\"handlerClickInput($event)\">\n <ul class=\"before:content-[''] before:table after:content-[''] after:table after:clear-both\">\n @for (item of listExpressions(); track $index; let i = $index) {\n <li class=\"float-left mb-[8px]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none text-center\"\n [class.ml-[-8px]]=\"i === 0\"\n [style.width.px]=\"inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(i)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n @switch (item.type) {\n @case ('operation') {\n <li class=\"float-left mb-[8px] text-center w-[24px] h-[24px] rounded-[4px] p-[4px] bg-[var(--libs-ui-color-light-2)]\">\n @switch (item.data) {\n @case ('/') {\n <i class=\"libs-ui-icon-divide text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('-') {\n <i class=\"libs-ui-icon-minus text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('+') {\n <i class=\"libs-ui-icon-add text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('*') {\n <i class=\"libs-ui-icon-close text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n }\n </li>\n }\n @case ('value') {\n <li class=\"float-left mb-[8px] text-center rounded-[4px] h-[24px] px-[8px] bg-[#E6E7EA] flex items-center max-w-[calc(100%-8px)]\">\n <libs_ui-components-popover [type]=\"'text'\">{{ item.data }}</libs_ui-components-popover>\n </li>\n }\n @case ('field') {\n @if ({ fieldSelected: item.data | LibsUiComponentsInputsCalculatorGetFieldSelectedPipe: configField()?.getFieldSelected }; as data) {\n <li class=\"float-left mb-[8px]\">\n <libs_ui-components-buttons-button\n class=\"max-w-[172px] block\"\n [label]=\"data.fieldSelected?.name || 'i18n_field_error'\"\n [classInclude]=\"'!justify-center !py-[2px] !px-[7px] !w-full'\"\n [classIconLeft]=\"data.fieldSelected?.icon || 'libs-ui-icon-tooltip-outline'\"\n [classIconRight]=\"'libs-ui-icon-move-right rotate-90'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [zIndex]=\"zIndex()\"\n [type]=\"data.fieldSelected ? 'button-primary' : 'button-danger-high'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: false,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: i, key: item.data },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, i)\" />\n </li>\n }\n }\n }\n }\n <li class=\"float-left mb-[8px] max-w-[100%]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none max-w-[100%] {{ listExpressions().length ? 'text-center' : '' }}\"\n [style.width.px]=\"listExpressions().length ? (inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput) : 150\"\n [placeholder]=\"!listExpressions().length ? (placeholder() | translate) : ''\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(listExpressions().length)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n </ul>\n </div>\n @if (error()?.message) {\n <div class=\"libs-ui-text-error mt-[8px] libs-ui-font-h7r\">\n @let constHtmlMessage = error()?.message || ' ';\n {{ constHtmlMessage | translate }}\n </div>\n }\n </div>\n <div class=\"grid grid-cols-4 gap-[8px] {{ classContainerButton() }}\">\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"configField()?.label || 'i18n_select_field'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: true,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: -1 },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, -1)\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-violet'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'Fx'\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-danger-high'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'C'\"\n (outClick)=\"handlerClick($event, 'c')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'('\"\n (outClick)=\"handlerClick($event, '(')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"')'\"\n (outClick)=\"handlerClick($event, ')')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-divide'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '/')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'1'\"\n (outClick)=\"handlerClick($event, '1')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'2'\"\n (outClick)=\"handlerClick($event, '2')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'3'\"\n (outClick)=\"handlerClick($event, '3')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-close'\"\n (outClick)=\"handlerClick($event, '*')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'4'\"\n (outClick)=\"handlerClick($event, '4')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'5'\"\n (outClick)=\"handlerClick($event, '5')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'6'\"\n (outClick)=\"handlerClick($event, '6')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-minus'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '-')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'7'\"\n (outClick)=\"handlerClick($event, '7')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'8'\"\n (outClick)=\"handlerClick($event, '8')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'9'\"\n (outClick)=\"handlerClick($event, '9')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n (outClick)=\"handlerClick($event, '+')\" />\n </div>\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"'0'\"\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n (outClick)=\"handlerClick($event, '0')\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'.'\"\n (outClick)=\"handlerClick($event, '.')\" />\n </div>\n </div>\n </div>\n @if (!ignoreButtonSave()) {\n <div class=\"mt-[16px]\">\n <libs_ui-components-buttons-button\n [label]=\"labelButtonSave()\"\n [disable]=\"!isChangeExpression()\"\n [classInclude]=\"'justify-center w-full'\"\n (outClick)=\"handlerSave($event)\" />\n </div>\n }\n</div>\n\n<ng-template\n #listViewRef\n let-data=\"itemContext\">\n <libs_ui-components-list\n [zIndex]=\"zIndex()\"\n [config]=\"configField()?.listConfig\"\n [maxItemShow]=\"6\"\n [clickExactly]=\"false\"\n [searchConfig]=\"{ noBorder: true, placeholder: configField()?.placeholderInputList || 'i18n_search' }\"\n [multiKeySelected]=\"data.key ? [data.key] : []\"\n (outSelectMultiKey)=\"handlerSelectedField($event, data.index)\"></libs_ui-components-list>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;MAOa,oDAAoD,CAAA;IAC/D,SAAS,CAAC,OAAwB,EAAE,gBAAqE,EAAA;AACvG,QAAA,OAAO,gBAAgB,GAAG,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,CAAC;KACvF;wGAHU,oDAAoD,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;sGAApD,oDAAoD,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,sDAAA,EAAA,CAAA,CAAA;;4FAApD,oDAAoD,EAAA,UAAA,EAAA,CAAA;kBAJhE,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,sDAAsD;AAC5D,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;;MCAY,iDAAiD,CAAA;IAC5D,SAAS,CAAC,IAAY,EAAE,OAAuB,EAAA;QAC7C,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,CAAC,CAAC;SACV;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAE3C,QAAA,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;AACvB,QAAA,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AACzB,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC;QAElC,GAAG,CAAC,MAAM,EAAE,CAAC;AAEb,QAAA,OAAO,KAAK,CAAC;KACd;wGAdU,iDAAiD,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;sGAAjD,iDAAiD,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,mDAAA,EAAA,CAAA,CAAA;;4FAAjD,iDAAiD,EAAA,UAAA,EAAA,CAAA;kBAJ7D,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,mDAAmD;AACzD,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;;ACMD;;;AAGG;MASU,yCAAyC,CAAA;AAC1C,IAAA,UAAU,GAAG,MAAM,CAAqB,SAAS,CAAC,CAAC;AACnD,IAAA,OAAO,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AACjC,IAAA,eAAe,GAAG,MAAM,CAAoC,EAAE,CAAC,CAAC;AAChE,IAAA,kBAAkB,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AAC5C,IAAA,KAAK,GAAG,MAAM,CAAoC,SAAS,CAAC,CAAC;AAEtD,IAAA,QAAQ,GAAG,YAAY,CAAa,UAAU,CAAC,CAAC;AAChD,IAAA,OAAO,GAAG,MAAM,CAAqB,SAAS,CAAC,CAAC;AAChD,IAAA,sBAAsB,GAAG,MAAM,CAA4C,IAAI,GAAG,EAAE,CAAC,CAAC;AAE9F,IAAA,WAAW,GAAG,KAAK,CAAoC,EAAE,CAAC,CAAC;AAC3D,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,CAAC,CAAC;AAC3B,IAAA,WAAW,GAAG,KAAK,CAAS,mBAAmB,CAAC,CAAC;AACjD,IAAA,eAAe,GAAG,KAAK,CAAS,uBAAuB,CAAC,CAAC;IACzD,WAAW,GAAG,KAAK,EAA+B,CAAC;AACnD,IAAA,gBAAgB,GAAG,KAAK,CAAU,KAAK,CAAC,CAAC;AACzC,IAAA,YAAY,GAAG,KAAK,CAA6B,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;AAC5F,IAAA,mBAAmB,GAAG,KAAK,CAA6B,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;AACnG,IAAA,oBAAoB,GAAG,KAAK,CAA6B,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;IACpG,aAAa,GAAG,KAAK,EAAyB,CAAC;IAE/C,oBAAoB,GAAG,MAAM,EAAqC,CAAC;IACnE,kBAAkB,GAAG,MAAM,EAAwC,CAAC;IAE7E,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACrD;AAED,IAAA,IAAW,gBAAgB,GAAA;QACzB,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YACtC,OAAO,EAAE,MAAK;AACZ,gBAAA,OAAO,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;aAC1C;SACF,CAAC;KACH;IAES,YAAY,CAAC,KAAY,EAAE,MAAiH,EAAA;QACpJ,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,UAAU,GAA+B,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAE/E,QAAA,IAAI,MAAM,KAAK,GAAG,EAAE;AAClB,YAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE;gBAC7D,OAAO;aACR;AACD,YAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,WAAW,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACvJ;QACD,QAAQ,MAAM;AACZ,YAAA,KAAK,GAAG,CAAC;AACT,YAAA,KAAK,GAAG,CAAC;AACT,YAAA,KAAK,GAAG,CAAC;AACT,YAAA,KAAK,GAAG;AACN,gBAAA,UAAU,CAAC,IAAI,GAAG,WAAW,CAAC;gBAC9B,MAAM;AACR,YAAA;AACE,gBAAA,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC;SAC7B;AACD,QAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;KACvI;AAEO,IAAA,iBAAiB,CAAC,IAA4C,EAAE,QAAgB,EAAE,QAAkB,EAAA;AAC1G,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,KAAI;YACpC,IAAI,IAAI,EAAE;gBACR,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;aACtC;YACD,IAAI,CAAC,IAAI,EAAE;gBACT,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAChC;AAED,YAAA,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,KAAI;YAC/B,IAAI,CAAC,IAAI,EAAE;gBACT,IAAI,KAAK,EAAE;AACT,oBAAA,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;iBACtC;gBAED,OAAO,KAAK,IAAI,QAAQ,CAAC;aAC1B;AACD,YAAA,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;AAChC,gBAAA,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC;AAEtC,gBAAA,OAAO,KAAK,CAAC;aACd;AACD,YAAA,KAAK,EAAE,CAAC;AAER,YAAA,OAAO,KAAK,CAAC;AACf,SAAC,CAAC,CAAC;AACH,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAErC,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE;gBACrC,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;aACpD;SACF,EAAE,GAAG,CAAC,CAAC;QACR,IAAI,CAAC,QAAQ,EAAE,CAAC;KACjB;AAES,IAAA,sBAAsB,CAAC,KAAY,EAAA;AAC3C,QAAA,MAAM,OAAO,GAAI,KAAgB,CAAC,OAAO,CAAC;AAC1C,QAAA,MAAM,KAAK,GAAI,KAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;AAC7C,QAAA,MAAM,QAAQ,GAAI,KAAgB,CAAC,QAAQ,CAAC;QAE5C,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAChN,YAAA,KAAgB,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;YAEpC,OAAO,IAAI,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;SACvH;KACF;AAES,IAAA,oBAAoB,CAAC,KAAY,EAAA;AACzC,QAAA,MAAM,OAAO,GAAI,KAAgB,CAAC,OAAO,CAAC;AAC1C,QAAA,MAAM,KAAK,GAAI,KAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;AAE7C,QAAA,IAAI,OAAO,KAAK,oBAAoB,CAAC,SAAS,EAAE;YAC9C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;AAC3E,gBAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;aACxE;SACF;AACD,QAAA,IAAI,OAAO,KAAK,oBAAoB,CAAC,MAAM,EAAE;YAC3C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE;AACvG,gBAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;aACxE;SACF;AACD,QAAA,IAAI,OAAO,KAAK,oBAAoB,CAAC,KAAK,EAAE;YAC1C,IAAI,KAAK,EAAE;AACR,gBAAA,KAAgB,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;gBAEpC,OAAO,IAAI,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;aACnH;SACF;KACF;AAES,IAAA,wBAAwB,CAAC,KAAyB,EAAA;AAC1D,QAAA,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;AAChC,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvB,YAAA,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAE7B,OAAO;SACR;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CACd,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC1B,SAAC,EAAE,GAAG,CAAC,CACR,CAAC;KACH;AAES,IAAA,iBAAiB,CAAC,KAAY,EAAA;QACtC,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;AACnB,YAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;SACnE;KACF;AAES,IAAA,WAAW,CAAC,KAAY,EAAA;QAChC,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;KACnE;IAES,oBAAoB,CAAC,KAAwC,EAAE,KAAa,EAAA;AACpF,QAAA,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;YACvB,OAAO;SACR;AACD,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,KAAI;gBACpC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;AACxB,oBAAA,IAAI,CAAC,KAAK,KAAK,EAAE;wBACf,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;4BAC/B,IAAI,CAAC,sBAAsB,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAC;yBAClE;wBACD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAW,CAAC;qBACrC;AACH,iBAAC,CAAC,CAAC;AAEH,gBAAA,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,aAAC,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAElC,OAAO;SACR;QACD,IAAI,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAW,EAAE,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;QAC5K,IAAI,CAAC,sBAAsB,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAC;KAClE;IAES,4BAA4B,CAAC,KAAmC,EAAE,KAAa,EAAA;QACvF,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,KAAK,KAAI;AAC3C,YAAA,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAExB,YAAA,OAAO,KAAK,CAAC;AACf,SAAC,CAAC,CAAC;KACJ;AAEO,IAAA,MAAM,QAAQ,GAAA;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE;AAClC,YAAA,OAAO,IAAI,CAAC;SACb;QACD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE;AAClC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;SAC5D;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC;KACxC;wGAhNU,yCAAyC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yCAAyC,ECvBtD,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,2mZAoSA,EDhRY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EAAE,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,sCAAsC,EAAE,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,MAAA,EAAA,cAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,yBAAA,EAAA,+BAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,mCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,iBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,6BAA6B,EAAE,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,wCAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,aAAA,EAAA,cAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,yBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,2CAAA,EAAA,6BAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,4BAAA,EAAA,kCAAA,EAAA,iDAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,+BAAA,EAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,oDAAoD,EAAE,IAAA,EAAA,sDAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,gCAAgC,+fAAE,iDAAiD,EAAA,IAAA,EAAA,mDAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGhO,yCAAyC,EAAA,UAAA,EAAA,CAAA;kBARrD,SAAS;AAEE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sCAAsC,cAEpC,IAAI,EAAA,OAAA,EACP,CAAC,eAAe,EAAE,sCAAsC,EAAE,6BAA6B,EAAE,oDAAoD,EAAE,gCAAgC,EAAE,iDAAiD,CAAC,EAC3N,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2mZAAA,EAAA,CAAA;;;AErBjD;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@libs-ui/components-inputs-calculator",
3
- "version": "0.2.356-42",
3
+ "version": "0.2.356-43",
4
4
  "peerDependencies": {
5
5
  "@angular/core": ">=18.0.0",
6
6
  "@ngx-translate/core": "^15.0.0",
7
- "@libs-ui/components-buttons-button": "0.2.356-42",
8
- "@libs-ui/components-list": "0.2.356-42",
9
- "@libs-ui/interfaces-types": "0.2.356-42",
10
- "@libs-ui/utils": "0.2.356-42",
11
- "@libs-ui/components-popover": "0.2.356-42"
7
+ "@libs-ui/components-buttons-button": "0.2.356-43",
8
+ "@libs-ui/components-list": "0.2.356-43",
9
+ "@libs-ui/interfaces-types": "0.2.356-43",
10
+ "@libs-ui/utils": "0.2.356-43",
11
+ "@libs-ui/components-popover": "0.2.356-43"
12
12
  },
13
13
  "sideEffects": false,
14
14
  "module": "fesm2022/libs-ui-components-inputs-calculator.mjs",