@libs-ui/components-inputs-valid 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,213 +1,519 @@
1
- # Valid Input Component
2
-
3
- `@libs-ui/components-inputs-valid` là một component cấp cao (high-level component) kết hợp giữa nhãn (label), ô nhập liệu (input) và cơ chế kiểm tra tính hợp lệ (validation). Nó giúp đơn giản hóa việc xây dựng các biểu mẫu (forms) bằng cách tự động quản lý trạng thái lỗi và hiển thị thông báo.
4
-
5
- ## Tính năng nổi bật
6
-
7
- - 🔗 **Auto Binding**: Liên kết trực tiếp với một trường dữ liệu trong đối tượng thông qua `fieldNameBind`.
8
- - 🏷️ **Integrated Label**: Tích hợp sẵn `LibsUiComponentsLabelComponent` với đầy đủ tính năng (required mark, description, popover, buttons).
9
- - ✅ **Comprehensive Validation**: Hỗ trợ nhiều loại kiểm tra:
10
- - `validRequired`: Bắt buộc nhập.
11
- - `validMinLength` / `validMaxLength`: Độ dài chuỗi.
12
- - `validMinValue` / `validMaxValue`: Giá trị số.
13
- - `validPattern`: Kiểm tra theo biểu thức chính quy (Regex).
14
- - `functionValid`: Hàm kiểm tra tùy chỉnh (hỗ trợ Async).
15
- - 🧩 **Flexible Layout**:
16
- - Hỗ trợ đơn vị (units) bên trái và bên phải.
17
- - Chế độ chọn nhanh (Radio/Checkbox) tích hợp.
18
- - Hỗ trợ căn chỉnh `baseline` cho các bố cục phức tạp.
19
- - ⏱️ **Debounced Validation**: Khả năng trì hoãn việc kiểm tra (`debounceTimeValidate`) để tối ưu hiệu năng.
20
- - 🛠️ **Full Control**: Cung cấp các hàm điều khiển như `checkIsValid()`, `setMessageError()`, `focus()`, `blur()`...
1
+ # @libs-ui/components-inputs-valid
21
2
 
22
- ## Cài đặt
3
+ > Component input tích hợp validation, label và binding dữ liệu — giải pháp all-in-one cho form Angular.
4
+
5
+ ## Giới thiệu
6
+
7
+ `@libs-ui/components-inputs-valid` là component cấp cao (high-level) kết hợp ba phần tử: nhãn (`label`), ô nhập liệu (`input`) và cơ chế kiểm tra tính hợp lệ (`validation`) vào một component duy nhất. Component tự động bind dữ liệu hai chiều vào đối tượng thông qua `fieldNameBind`, tự quản lý trạng thái lỗi và hiển thị thông báo — giúp giảm đáng kể boilerplate khi xây dựng form phức tạp. Hỗ trợ nhiều loại validation: bắt buộc nhập, độ dài, giá trị số, regex, và hàm async tùy chỉnh.
8
+
9
+ ## Tính năng
23
10
 
24
- Sử dụng npm hoặc yarn để cài đặt:
11
+ - **Two-way binding tự động**: Bind trực tiếp với trường trong object qua `fieldNameBind` và `item` model
12
+ - ✅ **Label tích hợp**: Hỗ trợ `ILabel` đầy đủ — required mark, popover, buttons, toggle, switch
13
+ - ✅ **Validation toàn diện**: Required, min/max length, min/max value, regex pattern, hàm async tùy chỉnh
14
+ - ✅ **Debounced validation**: Trì hoãn validate qua `debounceTimeValidate` để tối ưu hiệu năng
15
+ - ✅ **Unit bên trái/phải**: Hiển thị dropdown đơn vị kết hợp với input (VD: USD, VND, kg, %)
16
+ - ✅ **Radio/Checkbox tích hợp**: Thêm checkbox hoặc radio bên trái input để chọn/bỏ chọn dòng
17
+ - ✅ **FunctionsControl API**: Truy cập `checkIsValid()`, `setMessageError()`, `focus()`, `blur()`, `resetValue()` qua ViewChild
18
+ - ✅ **Hỗ trợ bigint**: Validate giá trị bigint với giới hạn an toàn tự động
19
+ - ✅ **Template slots**: Hỗ trợ `templateLeftBottomInput` và `templateRightBottomInput` cho nội dung tùy chỉnh
20
+
21
+ ## Khi nào sử dụng
22
+
23
+ - Xây dựng form nhập liệu cần validation tập trung (form thêm mới, chỉnh sửa)
24
+ - Cần hiển thị label + input + error message trong một block đồng nhất
25
+ - Input cần đơn vị (tiền tệ, trọng lượng, phần trăm) bên trái hoặc phải
26
+ - Cần gọi `checkIsValid()` programmatically trước khi submit form
27
+ - Input trong bảng danh sách có checkbox/radio chọn dòng tích hợp
28
+
29
+ ## Cài đặt
25
30
 
26
31
  ```bash
27
32
  npm install @libs-ui/components-inputs-valid
28
33
  ```
29
34
 
30
- ## Cách sử dụng
31
-
32
- ### Import Module
35
+ ## Import
33
36
 
34
37
  ```typescript
35
38
  import { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';
39
+ import {
40
+ IValidRequired,
41
+ IValidPattern,
42
+ IValidLength,
43
+ IInputValidUnitConfig,
44
+ IInputValidFunctionControlEvent,
45
+ TYPE_FUNCTION_INPUT_VALID,
46
+ } from '@libs-ui/components-inputs-valid';
47
+ ```
48
+
49
+ ## Ví dụ sử dụng
50
+
51
+ ### Ví dụ 1 — Input bắt buộc với label và kiểm tra độ dài
52
+
53
+ ```typescript
54
+ // component.ts
55
+ import { Component, signal } from '@angular/core';
56
+ import { LibsUiComponentsInputsValidComponent, IInputValidFunctionControlEvent } from '@libs-ui/components-inputs-valid';
36
57
 
37
58
  @Component({
38
59
  standalone: true,
39
60
  imports: [LibsUiComponentsInputsValidComponent],
40
- // ...
61
+ templateUrl: './create-user.component.html',
62
+ changeDetection: ChangeDetectionStrategy.OnPush,
41
63
  })
42
- export class YourComponent {}
64
+ export class CreateUserComponent {
65
+ protected formData = signal<Record<string, any>>({
66
+ username: '',
67
+ email: '',
68
+ });
69
+
70
+ private usernameControl: IInputValidFunctionControlEvent | undefined;
71
+
72
+ protected handlerUsernameControl(control: IInputValidFunctionControlEvent): void {
73
+ this.usernameControl = control;
74
+ }
75
+
76
+ protected async handlerSubmit(event: Event): Promise<void> {
77
+ event.stopPropagation();
78
+ const isValid = await this.usernameControl?.checkIsValid();
79
+ if (!isValid) return;
80
+ // Gửi form...
81
+ }
82
+ }
43
83
  ```
44
84
 
45
- ### Ví dụ cơ bản (Bắt buộc nhập và Kiểm tra độ dài)
46
-
47
85
  ```html
48
- <libs_ui-components-inputs-input-valid
49
- [(item)]="userData"
86
+ <!-- create-user.component.html -->
87
+ <libs_ui-components-inputs-valid
88
+ [(item)]="formData"
50
89
  [fieldNameBind]="'username'"
51
- [labelConfig]="{ labelLeft: 'Tên đăng nhập', required: true }"
90
+ [labelConfig]="{
91
+ labelLeft: 'Tên đăng nhập',
92
+ required: true
93
+ }"
52
94
  [validRequired]="{ isRequired: true, message: 'Vui lòng nhập tên đăng nhập' }"
53
- [validMinLength]="{ length: 5, message: 'Tối thiểu 5 ký tự' }"></libs_ui-components-inputs-input-valid>
95
+ [validMinLength]="{ length: 6, message: 'Tối thiểu 6 ký tự' }"
96
+ [maxLength]="50"
97
+ [placeholder]="'Nhập tên đăng nhập'"
98
+ (outFunctionsControl)="handlerUsernameControl($event)" />
54
99
  ```
55
100
 
56
- ### Kiểm tra RegexHàm tùy chỉnh
101
+ ### dụ 2 — Validate email bằng regex hàm async tùy chỉnh
102
+
103
+ ```typescript
104
+ // component.ts
105
+ import { Component, signal } from '@angular/core';
106
+ import { LibsUiComponentsInputsValidComponent, TYPE_FUNCTION_INPUT_VALID } from '@libs-ui/components-inputs-valid';
107
+
108
+ @Component({
109
+ standalone: true,
110
+ imports: [LibsUiComponentsInputsValidComponent],
111
+ templateUrl: './register.component.html',
112
+ changeDetection: ChangeDetectionStrategy.OnPush,
113
+ })
114
+ export class RegisterComponent {
115
+ protected formData = signal<Record<string, any>>({ email: '' });
116
+
117
+ protected readonly emailPatterns = [
118
+ {
119
+ pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
120
+ message: 'Email không đúng định dạng',
121
+ },
122
+ ];
123
+
124
+ protected readonly checkEmailExists: TYPE_FUNCTION_INPUT_VALID = async (value) => {
125
+ if (!value) return { message: undefined, interpolateParams: undefined };
126
+ // Giả lập gọi API kiểm tra email
127
+ const exists = await fakeCheckEmailApi(value as string);
128
+ return exists
129
+ ? { message: 'Email này đã được sử dụng', interpolateParams: {} }
130
+ : { message: undefined, interpolateParams: undefined };
131
+ };
132
+
133
+ protected handlerValueChange(value: any): void {
134
+ // Xử lý sau khi value thay đổi
135
+ }
136
+ }
137
+ ```
57
138
 
58
139
  ```html
59
- <libs_ui-components-inputs-input-valid
60
- [(item)]="userData"
140
+ <!-- register.component.html -->
141
+ <libs_ui-components-inputs-valid
142
+ [(item)]="formData"
61
143
  [fieldNameBind]="'email'"
62
- [validPattern]="[{ pattern: /^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$/, message: 'Email không hợp lệ' }]"
63
- [functionValid]="customValidator"></libs_ui-components-inputs-input-valid>
64
- ```
65
-
66
- ## API Reference
67
-
68
- ### Inputs
69
-
70
- | Thuộc tính | Kiểu dữ liệu | Mặc định | Mô tả |
71
- | :------------------------------- | :-------------------------- | :---------- | :-------------------------------------------------------------- |
72
- | `acceptNegativeValue` | `boolean` | `undefined` | Cho phép nhập số âm. |
73
- | `autoAddZeroLessThan10InTypeInt` | `boolean` | `undefined` | Tự động thêm số 0 nếu giá trị < 10 (cho kiểu int). |
74
- | `autoRemoveEmoji` | `boolean` | `undefined` | Tự động loại bỏ emoji khi nhập. |
75
- | `backgroundNone` | `boolean` | `undefined` | Loại bỏ màu nền input. |
76
- | `borderError` | `boolean` | `undefined` | Luôn hiển thị border đỏ bất kể trạng thái lỗi. |
77
- | `classContainerBottomInput` | `string` | `undefined` | Class CSS cho vùng dưới input. |
78
- | `classContainerInput` | `string` | `undefined` | Class CSS cho container bao quanh input. |
79
- | `classInclude` | `string` | `undefined` | Class CSS tổng thể cho component. |
80
- | `classIncludeInput` | `string` | `undefined` | Class CSS cho thẻ input/textarea. |
81
- | `classMessageErrorInclude` | `string` | `undefined` | Class CSS cho thông báo lỗi. |
82
- | `configUnitLeft` | `IInputValidUnitConfig` | `{...}` | Cấu hình cho đơn vị bên trái. |
83
- | `configUnitRight` | `IInputValidUnitConfig` | `{...}` | Cấu hình cho đơn vị bên phải. |
84
- | `dataType` | `TYPE_DATA_TYPE_INPUT` | `'string'` | Loại dữ liệu (string, number, int, bigint...). |
85
- | `debounceTimeValidate` | `number` | `0` | Thời gian chờ trước khi thực hiện validate (ms). |
86
- | `defaultHeight` | `number` | `undefined` | Chiều cao mặc định của input. |
87
- | `disable` | `boolean` | `undefined` | Vô hiệu hóa input. |
88
- | `disableComponentSelectItem` | `boolean` | `undefined` | Vô hiệu hóa checkbox/radio chọn item. |
89
- | `emitEmptyInDataTypeNumber` | `boolean` | `undefined` | Emit giá trị rỗng khi kiểu dữ liệu là number. |
90
- | `fieldNameBind` | `string` | `required` | Tên trường trong `item` để liên kết giá trị. |
91
- | `fixedFloat` | `number` | `undefined` | Số lượng chữ số thập phân cố định. |
92
- | `focusTimeOut` | `number` | `undefined` | Thời gian chờ focus. |
93
- | `functionValid` | `TYPE_FUNCTION_INPUT_VALID` | `undefined` | Hàm kiểm tra tùy chỉnh (trả về Promise hoặc IMessageTranslate). |
94
- | `iconLeftClass` | `string` | `undefined` | Class cho icon bên trái input. |
95
- | `iconRightClass` | `string` | `undefined` | Class cho icon bên phải input. |
96
- | `ignoreBlockInputMaxValue` | `boolean` | `undefined` | Không chặn nhập khi giá trị vượt quá max value. |
97
- | `ignoreContentLeft` | `boolean` | `undefined` | Ẩn nội dung bên trái (label/units). |
98
- | `ignoreContentRight` | `boolean` | `undefined` | Ẩn nội dung bên phải (units). |
99
- | `ignoreShowError` | `boolean` | `undefined` | ⚠️ `@deprecated` — Sử dụng `ignoreShowMessageError` thay thế. |
100
- | `ignoreShowMessageError` | `boolean` | `undefined` | Ẩn message lỗi nhưng vẫn hiển thị border đỏ khi có lỗi. |
101
- | `ignoreStopPropagationEvent` | `boolean` | `undefined` | Ngăn chặn event propagation. |
102
- | `ignoreUnitRightClassReadOnly` | `boolean` | `undefined` | Không thêm class readonly cho unit bên phải. |
103
- | `ignoreWidthInput100` | `boolean` | `undefined` | Không set width 100% cho input. |
104
- | `isBaselineStyle` | `boolean` | `undefined` | Căn align-items-baseline — dùng khi cần căn input thẳng hàng với các phần tử khác dù có validate. |
105
- | `item` | `Record<string, any>` | `{}` | Đối tượng chứa dữ liệu cần bind (model). |
106
- | `keepPlaceholderOnly` | `boolean` | `undefined` | Chỉ hiển thị placeholder. |
107
- | `keySelectedUnitLeft` | `any` | `undefined` | Key của unit bên trái đang được chọn. |
108
- | `keySelectedUnitRight` | `any` | `undefined` | Key của unit bên phải đang được chọn. |
109
- | `labelConfig` | `ILabel` | `undefined` | Cấu hình cho nhãn phía trên input. |
110
- | `maxHeightTextArea` | `number` | `undefined` | Chiều cao tối đa cho textarea. |
111
- | `maxLength` | `number` | `undefined` | Độ dài tối đa của chuỗi. |
112
- | `maxLengthNumberCount` | `number` | `undefined` | Độ dài tối đa của số lượng (count). |
113
- | `maxValueNumber` | `number` | `undefined` | Giá trị số tối đa. |
114
- | `minHeightTextArea` | `number` | `undefined` | Chiều cao tối thiểu cho textarea. |
115
- | `minValueNumber` | `number` | `undefined` | Giá trị số tối thiểu. |
116
- | `modeInput` | `TYPE_MODE_INPUT` | `undefined` | Chế độ nhập (password, text...). |
117
- | `noBorder` | `boolean` | `undefined` | Ẩn viền input. |
118
- | `onlyAcceptNegativeValue` | `boolean` | `undefined` | Chỉ chấp nhận số âm. |
119
- | `paddingRightCustomSpecific` | `number` | `undefined` | Custom padding-right khi count không tự tính được (#52185). |
120
- | `placeholder` | `string` | `undefined` | Placeholder cho input. |
121
- | `popoverContentIconLeft` | `string` | `undefined` | Nội dung popover cho icon trái. |
122
- | `popoverContentIconRight` | `string` | `undefined` | Nội dung popover cho icon phải. |
123
- | `positionMessageErrorStartInput` | `boolean` | `undefined` | Hiển thị message lỗi bắt đầu từ vị trí ô input thay vì từ template trái. |
124
- | `readonly` | `boolean` | `undefined` | Chế độ chỉ đọc. |
125
- | `resetAutoCompletePassword` | `boolean` | `undefined` | Reset autocomplete password. |
126
- | `resize` | `TYPE_INPUT_RESIZE_MODE` | `undefined` | Chế độ resize cho textarea. |
127
- | `showCount` | `boolean` | `undefined` | Hiển thị bộ đếm ký tự. |
128
- | `tagInput` | `TYPE_TAG_INPUT` | `undefined` | Loại thẻ input (input/textarea). |
129
- | `templateLeftBottomInput` | `TemplateRef` | `undefined` | Template hiển thị góc dưới trái input. |
130
- | `templateRightBottomInput` | `TemplateRef` | `undefined` | Template hiển thị góc dưới phải input. |
131
- | `textAreaEnterNotNewLine` | `boolean` | `undefined` | Phím Enter không xuống dòng (trong textarea). |
132
- | `typeComponentSelectItem` | `'radio' \| 'checkbox'` | `undefined` | Hiển thị thêm radio hoặc checkbox bên trái. |
133
- | `typeInput` | `TYPE_INPUT` | `undefined` | Kiểu input (text, number, ...). |
134
- | `unitsLeft` | `any[]` | `[]` | Danh sách đơn vị bên trái. |
135
- | `unitsRight` | `any[]` | `[]` | Danh sách đơn vị bên phải. |
136
- | `useColorModeExist` | `boolean` | `undefined` | Sử dụng màu sắc theo chế độ hiện tại. |
137
- | `validMaxValue` | `IMessageTranslate` | `undefined` | Cấu hình kiểm tra giá trị tối đa. |
138
- | `validMaxLength` | `IMessageTranslate` | `undefined` | Cấu hình kiểm tra độ dài tối đa. |
139
- | `validMinLength` | `IValidLength` | `undefined` | Cấu hình kiểm tra độ dài tối thiểu. |
140
- | `validMinValue` | `IMessageTranslate` | `undefined` | Cấu hình kiểm tra giá trị tối thiểu. |
141
- | `validPattern` | `Array<IValidPattern>` | `undefined` | Danh sách các regex để kiểm tra. |
142
- | `validRequired` | `IValidRequired` | `undefined` | Cấu hình kiểm tra bắt buộc nhập. |
143
- | `valueComponentSelectItem` | `boolean` | `undefined` | Giá trị của checkbox/radio chọn item. |
144
- | `valuePatternShowError` | `boolean` | `false` | Hiển thị lỗi khi pattern match (true) hoặc unmatch (false). |
145
- | `valueUpDownNumber` | `number` | `undefined` | Bước nhảy cho nút up/down number. |
146
- | `zIndexPopoverContent` | `number` | `undefined` | Z-index cho popover content. |
147
-
148
- ### Outputs
149
-
150
- | Sự kiện | Kiểu dữ liệu | Mô tả |
151
- | :----------------------------- | :-------------------------------- | :----------------------------------------------------- |
152
- | `outChangeValueByButtonUpDown` | `void` | Phát ra khi giá trị thay đổi bởi nút tăng/giảm. |
153
- | `outClickButtonLabel` | `IButton` | Phát ra khi click vào button trên label. |
154
- | `outEnterInputEvent` | `IEvent` | Phát ra khi nhấn phím Enter trong ô nhập liệu. |
155
- | `outFocusAndBlur` | `IFocusAndBlurEvent` | Phát ra khi focus hoặc blur input. |
156
- | `outFunctionsControl` | `IInputValidFunctionControlEvent` | Cung cấp các phương thức điều khiển component. |
157
- | `outHeightAreaChange` | `{ isChange: boolean }` | Phát ra khi chiều cao textarea thay đổi (auto resize). |
158
- | `outIconLeft` | `string` | Phát ra khi click icon trái. |
159
- | `outIconRight` | `string` | Phát ra khi click icon phải. |
160
- | `outLabelRightClick` | `boolean` | Phát ra khi click vào label bên phải. |
161
- | `outSelect` | `boolean` | Sự kiện khi click vào checkbox/radio tích hợp. |
162
- | `outSwitchEventLabel` | `ISwitchEvent` | Phát ra khi thay đổi switch trên label. |
163
- | `outValueChange` | `any` | Phát ra giá trị mới sau khi đã qua debounce validate. |
164
-
165
- ### Methods (via outFunctionsControl)
166
-
167
- - `checkIsValid()`: Thực hiện kiểm tra toàn bộ điều kiện và trả về kết quả (Boolean).
168
- - `setMessageError(message)`: Cài đặt thông báo lỗi thủ công.
169
- - `focus()` / `blur()`: Điều khiển tiêu điểm của ô nhập liệu.
170
- - `resetValue()`: Xóa giá trị hiện tại.
144
+ [labelConfig]="{ labelLeft: 'Email', required: true }"
145
+ [validRequired]="{ isRequired: true, message: 'Vui lòng nhập email' }"
146
+ [validPattern]="emailPatterns"
147
+ [functionValid]="checkEmailExists"
148
+ [debounceTimeValidate]="500"
149
+ [placeholder]="'example@company.com'"
150
+ (outValueChange)="handlerValueChange($event)" />
151
+ ```
152
+
153
+ ### dụ 3 Input số với đơn vị và giới hạn giá trị
154
+
155
+ ```typescript
156
+ // component.ts
157
+ import { Component, signal } from '@angular/core';
158
+ import { LibsUiComponentsInputsValidComponent, IInputValidUnitConfig } from '@libs-ui/components-inputs-valid';
159
+
160
+ @Component({
161
+ standalone: true,
162
+ imports: [LibsUiComponentsInputsValidComponent],
163
+ templateUrl: './price-input.component.html',
164
+ changeDetection: ChangeDetectionStrategy.OnPush,
165
+ })
166
+ export class PriceInputComponent {
167
+ protected formData = signal<Record<string, any>>({ price: null, currency: 'vnd' });
168
+
169
+ protected readonly currencies = [
170
+ { id: 'vnd', label: 'VND' },
171
+ { id: 'usd', label: 'USD' },
172
+ ];
173
+
174
+ protected readonly unitConfig: IInputValidUnitConfig = {
175
+ fieldKey: 'id',
176
+ fieldLabel: 'label',
177
+ };
178
+
179
+ protected handlerValueChange(value: any): void {
180
+ // Xử sau khi giá thay đổi
181
+ }
182
+ }
183
+ ```
184
+
185
+ ```html
186
+ <!-- price-input.component.html -->
187
+ <libs_ui-components-inputs-valid
188
+ [(item)]="formData"
189
+ [fieldNameBind]="'price'"
190
+ [labelConfig]="{ labelLeft: 'Giá bán', required: true }"
191
+ [dataType]="'number'"
192
+ [minValueNumber]="0"
193
+ [maxValueNumber]="999999999"
194
+ [validRequired]="{ isRequired: true, message: 'Vui lòng nhập giá' }"
195
+ [validMinValue]="{ message: 'Giá phải lớn hơn 0', interpolateParams: {} }"
196
+ [validMaxValue]="{ message: 'Giá không vượt quá 999,999,999', interpolateParams: {} }"
197
+ [unitsRight]="currencies"
198
+ [configUnitRight]="unitConfig"
199
+ [keySelectedUnitRight]="formData()['currency']"
200
+ (outValueChange)="handlerValueChange($event)" />
201
+ ```
202
+
203
+ ### dụ 4 Textarea với validate đếm ký tự
204
+
205
+ ```typescript
206
+ // component.ts
207
+ import { Component, signal } from '@angular/core';
208
+ import { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';
209
+
210
+ @Component({
211
+ standalone: true,
212
+ imports: [LibsUiComponentsInputsValidComponent],
213
+ templateUrl: './note-form.component.html',
214
+ changeDetection: ChangeDetectionStrategy.OnPush,
215
+ })
216
+ export class NoteFormComponent {
217
+ protected formData = signal<Record<string, any>>({ note: '' });
218
+
219
+ protected handlerHeightChange(event: { isChange: boolean }): void {
220
+ // Xử khi textarea thay đổi chiều cao
221
+ }
222
+ }
223
+ ```
224
+
225
+ ```html
226
+ <!-- note-form.component.html -->
227
+ <libs_ui-components-inputs-valid
228
+ [(item)]="formData"
229
+ [fieldNameBind]="'note'"
230
+ [labelConfig]="{ labelLeft: 'Ghi chú', limitLength: 500, onlyShowCount: true }"
231
+ [tagInput]="'textarea'"
232
+ [maxLength]="500"
233
+ [showCount]="true"
234
+ [minHeightTextArea]="80"
235
+ [maxHeightTextArea]="200"
236
+ [placeholder]="'Nhập ghi chú...'"
237
+ (outHeightAreaChange)="handlerHeightChange($event)" />
238
+ ```
239
+
240
+ ### dụ 5 Validate form nhiều trường với checkIsValid trước khi submit
241
+
242
+ ```typescript
243
+ // component.ts
244
+ import { Component, signal } from '@angular/core';
245
+ import { LibsUiComponentsInputsValidComponent, IInputValidFunctionControlEvent } from '@libs-ui/components-inputs-valid';
246
+
247
+ @Component({
248
+ standalone: true,
249
+ imports: [LibsUiComponentsInputsValidComponent],
250
+ templateUrl: './contact-form.component.html',
251
+ changeDetection: ChangeDetectionStrategy.OnPush,
252
+ })
253
+ export class ContactFormComponent {
254
+ protected formData = signal<Record<string, any>>({
255
+ fullName: '',
256
+ phone: '',
257
+ });
258
+
259
+ private nameControl: IInputValidFunctionControlEvent | undefined;
260
+ private phoneControl: IInputValidFunctionControlEvent | undefined;
261
+
262
+ protected handlerNameControl(control: IInputValidFunctionControlEvent): void {
263
+ this.nameControl = control;
264
+ }
265
+
266
+ protected handlerPhoneControl(control: IInputValidFunctionControlEvent): void {
267
+ this.phoneControl = control;
268
+ }
269
+
270
+ protected async handlerSubmit(event: Event): Promise<void> {
271
+ event.stopPropagation();
272
+ const [isNameValid, isPhoneValid] = await Promise.all([
273
+ this.nameControl?.checkIsValid(),
274
+ this.phoneControl?.checkIsValid(),
275
+ ]);
276
+ if (!isNameValid || !isPhoneValid) return;
277
+ // Submit form...
278
+ }
279
+
280
+ protected readonly phonePatterns = [
281
+ {
282
+ pattern: /^(0|\+84)[0-9]{9}$/,
283
+ message: 'Số điện thoại không đúng định dạng (VD: 0912345678)',
284
+ },
285
+ ];
286
+ }
287
+ ```
288
+
289
+ ```html
290
+ <!-- contact-form.component.html -->
291
+ <libs_ui-components-inputs-valid
292
+ [(item)]="formData"
293
+ [fieldNameBind]="'fullName'"
294
+ [labelConfig]="{ labelLeft: 'Họ và tên', required: true }"
295
+ [validRequired]="{ isRequired: true, message: 'Vui lòng nhập họ và tên' }"
296
+ [validMinLength]="{ length: 2, message: 'Tối thiểu 2 ký tự' }"
297
+ (outFunctionsControl)="handlerNameControl($event)" />
298
+
299
+ <libs_ui-components-inputs-valid
300
+ [(item)]="formData"
301
+ [fieldNameBind]="'phone'"
302
+ [labelConfig]="{ labelLeft: 'Số điện thoại', required: true }"
303
+ [validRequired]="{ isRequired: true, message: 'Vui lòng nhập số điện thoại' }"
304
+ [validPattern]="phonePatterns"
305
+ (outFunctionsControl)="handlerPhoneControl($event)" />
306
+
307
+ <button (click)="handlerSubmit($event)">Gửi</button>
308
+ ```
309
+
310
+ ## @Input()
311
+
312
+ | Input | Type | Default | Mô tả | Ví dụ |
313
+ |---|---|---|---|---|
314
+ | `item` *(model, required)* | `Record<string, any>` | — | Đối tượng chứa dữ liệu. Two-way binding qua `[(item)]` | `[(item)]="formData"` |
315
+ | `fieldNameBind` *(required)* | `string` | — | Tên trường trong `item` cần bind giá trị | `[fieldNameBind]="'email'"` |
316
+ | `labelConfig` | `ILabel` | `undefined` | Cấu hình label phía trên input (text, required mark, popover, buttons) | `[labelConfig]="{ labelLeft: 'Email', required: true }"` |
317
+ | `acceptNegativeValue` | `boolean` | `undefined` | Cho phép nhập số âm | `[acceptNegativeValue]="true"` |
318
+ | `autoAddZeroLessThan10InTypeInt` | `boolean` | `undefined` | Tự động thêm số 0 đứng trước nếu giá trị < 10 (kiểu int) | `[autoAddZeroLessThan10InTypeInt]="true"` |
319
+ | `autoRemoveEmoji` | `boolean` | `undefined` | Tự động xóa emoji khi người dùng nhập | `[autoRemoveEmoji]="true"` |
320
+ | `backgroundNone` | `boolean` | `undefined` | Loại bỏ màu nền mặc định của input | `[backgroundNone]="true"` |
321
+ | `borderError` | `boolean` | `undefined` | Luôn hiển thị border đỏ bất kể trạng thái lỗi | `[borderError]="true"` |
322
+ | `classContainerBottomInput` | `string` | `undefined` | Class CSS cho vùng container phía dưới input | `[classContainerBottomInput]="'mt-2'"` |
323
+ | `classContainerInput` | `string` | `undefined` | Class CSS cho container bao quanh thẻ input | `[classContainerInput]="'relative'"` |
324
+ | `classInclude` | `string` | `undefined` | Class CSS tổng thể cho toàn bộ component | `[classInclude]="'mb-4'"` |
325
+ | `classIncludeInput` | `string` | `undefined` | Class CSS cho thẻ input/textarea | `[classIncludeInput]="'text-right'"` |
326
+ | `classMessageErrorInclude` | `string` | `undefined` | Class CSS bổ sung cho block thông báo lỗi | `[classMessageErrorInclude]="'mt-1'"` |
327
+ | `configUnitLeft` | `IInputValidUnitConfig` | `{ fieldKey: 'id', fieldLabel: 'label' }` | Cấu hình mapping trường key/label cho đơn vị trái | `[configUnitLeft]="{ fieldKey: 'id', fieldLabel: 'name' }"` |
328
+ | `configUnitRight` | `IInputValidUnitConfig` | `{ fieldKey: 'id', fieldLabel: 'label' }` | Cấu hình mapping trường key/label cho đơn vị phải | `[configUnitRight]="{ fieldKey: 'id', fieldLabel: 'name' }"` |
329
+ | `dataType` | `TYPE_DATA_TYPE_INPUT` | `'string'` | Kiểu dữ liệu: `'string'`, `'number'`, `'int'`, `'bigint'`, ... | `[dataType]="'number'"` |
330
+ | `debounceTimeValidate` | `number` | `0` | Thời gian chờ (ms) trước khi kích hoạt validate sau khi nhập | `[debounceTimeValidate]="300"` |
331
+ | `defaultHeight` | `number` | `undefined` | Chiều cao mặc định của input (px) | `[defaultHeight]="40"` |
332
+ | `disable` | `boolean` | `undefined` | Vô hiệu hóa toàn bộ input | `[disable]="isDisabled()"` |
333
+ | `disableComponentSelectItem` | `boolean` | `undefined` | Vô hiệu hóa checkbox/radio tích hợp bên trái | `[disableComponentSelectItem]="true"` |
334
+ | `emitEmptyInDataTypeNumber` | `boolean` | `undefined` | Emit giá trị rỗng thay vì null khi xóa input kiểu number | `[emitEmptyInDataTypeNumber]="true"` |
335
+ | `fixedFloat` | `number` | `undefined` | Số chữ số thập phân cố định cho kiểu number | `[fixedFloat]="2"` |
336
+ | `focusTimeOut` | `number` | `undefined` | Độ trễ (ms) trước khi focus vào input | `[focusTimeOut]="100"` |
337
+ | `functionValid` | `TYPE_FUNCTION_INPUT_VALID` | `undefined` | Hàm validate tùy chỉnh, hỗ trợ async, trả về `IMessageTranslate` | `[functionValid]="checkEmailExists"` |
338
+ | `iconLeftClass` | `string` | `undefined` | Class CSS cho icon bên trái bên trong input | `[iconLeftClass]="'icon-search'"` |
339
+ | `iconRightClass` | `string` | `undefined` | Class CSS cho icon bên phải bên trong input | `[iconRightClass]="'icon-calendar'"` |
340
+ | `ignoreBlockInputMaxValue` | `boolean` | `undefined` | Cho phép nhập quá maxValueNumber (chỉ hiển thị lỗi, không chặn) | `[ignoreBlockInputMaxValue]="true"` |
341
+ | `ignoreContentLeft` | `boolean` | `undefined` | Ẩn toàn bộ vùng bên trái (units, checkbox/radio) | `[ignoreContentLeft]="true"` |
342
+ | `ignoreContentRight` | `boolean` | `undefined` | Ẩn toàn bộ vùng bên phải (units) | `[ignoreContentRight]="true"` |
343
+ | `ignoreShowError` | `boolean` | `undefined` | **@deprecated** — Dùng `ignoreShowMessageError` thay thế | — |
344
+ | `ignoreShowMessageError` | `boolean` | `undefined` | Ẩn text thông báo lỗi nhưng vẫn hiển thị border đỏ khi có lỗi | `[ignoreShowMessageError]="true"` |
345
+ | `ignoreStopPropagationEvent` | `boolean` | `undefined` | Bỏ qua stopPropagation trong các event handler | `[ignoreStopPropagationEvent]="true"` |
346
+ | `ignoreUnitRightClassReadOnly` | `boolean` | `undefined` | Không áp dụng class readonly cho đơn vị bên phải | `[ignoreUnitRightClassReadOnly]="true"` |
347
+ | `ignoreWidthInput100` | `boolean` | `undefined` | Không đặt `width: 100%` cho thẻ input bên trong | `[ignoreWidthInput100]="true"` |
348
+ | `isBaselineStyle` | `boolean` | `undefined` | Căn `align-items: baseline` — dùng khi cần căn input thẳng hàng với label/text cùng dòng | `[isBaselineStyle]="true"` |
349
+ | `keepPlaceholderOnly` | `boolean` | `undefined` | Chỉ hiển thị placeholder, không hiển thị giá trị thực | `[keepPlaceholderOnly]="true"` |
350
+ | `keySelectedUnitLeft` | `any` | `undefined` | Key của đơn vị bên trái đang được active | `[keySelectedUnitLeft]="formData()['unitLeft']"` |
351
+ | `keySelectedUnitRight` | `any` | `undefined` | Key của đơn vị bên phải đang được active | `[keySelectedUnitRight]="formData()['currency']"` |
352
+ | `maxHeightTextArea` | `number` | `250` | Chiều cao tối đa (px) cho textarea khi auto-resize | `[maxHeightTextArea]="300"` |
353
+ | `maxLength` | `number` | `undefined` | Độ dài ký tự tối đa, hiển thị lỗi khi vượt quá | `[maxLength]="255"` |
354
+ | `maxLengthNumberCount` | `number` | `undefined` | Giới hạn số lượng chữ số hiển thị trong bộ đếm | `[maxLengthNumberCount]="10"` |
355
+ | `maxValueNumber` | `number` | `undefined` | Giá trị số tối đa được phép nhập | `[maxValueNumber]="100"` |
356
+ | `minHeightTextArea` | `number` | `undefined` | Chiều cao tối thiểu (px) cho textarea | `[minHeightTextArea]="80"` |
357
+ | `minValueNumber` | `number` | `undefined` | Giá trị số tối thiểu được phép nhập | `[minValueNumber]="0"` |
358
+ | `modeInput` | `TYPE_MODE_INPUT` | `undefined` | Chế độ nhập: `'password'`, `'text'`, ... | `[modeInput]="'password'"` |
359
+ | `noBorder` | `boolean` | `undefined` | Ẩn viền của input | `[noBorder]="true"` |
360
+ | `onlyAcceptNegativeValue` | `boolean` | `undefined` | Chỉ chấp nhận giá trị âm | `[onlyAcceptNegativeValue]="true"` |
361
+ | `paddingRightCustomSpecific` | `number` | `undefined` | Custom padding-right khi showCount không tự tính được (workaround cho #52185) | `[paddingRightCustomSpecific]="60"` |
362
+ | `placeholder` | `string` | `undefined` | Văn bản placeholder của input | `[placeholder]="'Nhập nội dung...'"` |
363
+ | `popoverContentIconLeft` | `string` | `undefined` | Nội dung tooltip/popover khi hover icon trái | `[popoverContentIconLeft]="'Tìm kiếm'"` |
364
+ | `popoverContentIconRight` | `string` | `undefined` | Nội dung tooltip/popover khi hover icon phải | `[popoverContentIconRight]="'Chọn ngày'"` |
365
+ | `positionMessageErrorStartInput` | `boolean` | `undefined` | Hiển thị thông báo lỗi thẳng hàng với input thay vì từ lề trái | `[positionMessageErrorStartInput]="true"` |
366
+ | `readonly` | `boolean` | `undefined` | Chế độ chỉ đọc — không cho phép chỉnh sửa | `[readonly]="isReadOnly()"` |
367
+ | `resetAutoCompletePassword` | `boolean` | `undefined` | Reset trạng thái autocomplete cho input password | `[resetAutoCompletePassword]="true"` |
368
+ | `resize` | `TYPE_INPUT_RESIZE_MODE` | `undefined` | Chế độ resize cho textarea: `'none'`, `'vertical'`, ... | `[resize]="'none'"` |
369
+ | `showCount` | `boolean` | `undefined` | Hiển thị bộ đếm ký tự hiện tại / maxLength | `[showCount]="true"` |
370
+ | `tagInput` | `TYPE_TAG_INPUT` | `undefined` | Loại thẻ: `'input'` (mặc định) hoặc `'textarea'` | `[tagInput]="'textarea'"` |
371
+ | `templateLeftBottomInput` | `TemplateRef` | `undefined` | Template tùy chỉnh hiển thị ở góc dưới trái input | `[templateLeftBottomInput]="myTpl"` |
372
+ | `templateRightBottomInput` | `TemplateRef` | `undefined` | Template tùy chỉnh hiển thị ở góc dưới phải input | `[templateRightBottomInput]="myTpl"` |
373
+ | `textAreaEnterNotNewLine` | `boolean` | `undefined` | Phím Enter không xuống dòng trong textarea | `[textAreaEnterNotNewLine]="true"` |
374
+ | `typeComponentSelectItem` | `'radio' \| 'checkbox'` | `undefined` | Thêm radio hoặc checkbox tích hợp bên trái input | `[typeComponentSelectItem]="'checkbox'"` |
375
+ | `typeInput` | `TYPE_INPUT` | `undefined` | Kiểu HTML input: `'text'`, `'number'`, ... | `[typeInput]="'text'"` |
376
+ | `unitsLeft` | `any[]` | `undefined` | Danh sách đơn vị hiển thị bên trái input | `[unitsLeft]="currencies"` |
377
+ | `unitsRight` | `any[]` | `undefined` | Danh sách đơn vị hiển thị bên phải input | `[unitsRight]="currencies"` |
378
+ | `useColorModeExist` | `boolean` | `undefined` | Dùng màu sắc theo theme hiện tại của hệ thống | `[useColorModeExist]="true"` |
379
+ | `validMaxLength` | `IMessageTranslate` | `undefined` | Thông báo lỗi khi vượt quá `maxLength` | `[validMaxLength]="{ message: 'Tối đa 255 ký tự' }"` |
380
+ | `validMaxValue` | `IMessageTranslate` | `undefined` | Thông báo lỗi khi vượt quá `maxValueNumber` | `[validMaxValue]="{ message: 'Giá trị quá lớn' }"` |
381
+ | `validMinLength` | `IValidLength` | `undefined` | Kiểm tra độ dài tối thiểu của chuỗi | `[validMinLength]="{ length: 6, message: 'Tối thiểu 6 ký tự' }"` |
382
+ | `validMinValue` | `IMessageTranslate` | `undefined` | Thông báo lỗi khi giá trị nhỏ hơn `minValueNumber` | `[validMinValue]="{ message: 'Giá trị quá nhỏ' }"` |
383
+ | `validPattern` | `IValidPattern[]` | `undefined` | Danh sách regex validate, hiển thị lỗi khi không khớp | `[validPattern]="emailPatterns"` |
384
+ | `validRequired` | `IValidRequired` | `undefined` | Cấu hình trường bắt buộc nhập | `[validRequired]="{ isRequired: true, message: 'Bắt buộc nhập' }"` |
385
+ | `valueComponentSelectItem` | `boolean` | `undefined` | Trạng thái checked của checkbox/radio tích hợp | `[valueComponentSelectItem]="isSelected()"` |
386
+ | `valuePatternShowError` | `boolean` | `false` | Khi `true`: báo lỗi khi pattern match; khi `false`: báo lỗi khi pattern không match | `[valuePatternShowError]="false"` |
387
+ | `valueUpDownNumber` | `number` | `undefined` | Bước nhảy khi nhấn nút tăng/giảm số | `[valueUpDownNumber]="10"` |
388
+ | `zIndexPopoverContent` | `number` | `undefined` | Z-index của popover icon trái/phải | `[zIndexPopoverContent]="1050"` |
389
+
390
+ ## @Output()
391
+
392
+ | Output | Type | Mô tả | Handler TS | Binding HTML |
393
+ |---|---|---|---|---|
394
+ | `(outChangeValueByButtonUpDown)` | `void` | Phát ra khi giá trị thay đổi bởi nút tăng/giảm | `handlerChangeByUpDown(): void { event?.stopPropagation(); }` | `(outChangeValueByButtonUpDown)="handlerChangeByUpDown()"` |
395
+ | `(outClickButtonLabel)` | `IButton` | Phát ra khi người dùng click vào button trong label | `handlerClickButtonLabel(button: IButton): void { button; }` | `(outClickButtonLabel)="handlerClickButtonLabel($event)"` |
396
+ | `(outEnterInputEvent)` | `IEvent` | Phát ra khi nhấn phím Enter trong ô nhập liệu | `handlerEnterInput(e: IEvent): void { e; }` | `(outEnterInputEvent)="handlerEnterInput($event)"` |
397
+ | `(outFocusAndBlur)` | `IFocusAndBlurEvent` | Phát ra khi input được focus hoặc blur | `handlerFocusAndBlur(e: IFocusAndBlurEvent): void { e; }` | `(outFocusAndBlur)="handlerFocusAndBlur($event)"` |
398
+ | `(outFunctionsControl)` | `IInputValidFunctionControlEvent` | Cung cấp các phương thức điều khiển programmatic | `handlerFunctionsControl(ctrl: IInputValidFunctionControlEvent): void { this.ctrl = ctrl; }` | `(outFunctionsControl)="handlerFunctionsControl($event)"` |
399
+ | `(outHeightAreaChange)` | `{ isChange: boolean }` | Phát ra khi chiều cao textarea thay đổi (auto-resize) | `handlerHeightChange(e: { isChange: boolean }): void { e; }` | `(outHeightAreaChange)="handlerHeightChange($event)"` |
400
+ | `(outIconLeft)` | `string` | Phát ra tên sự kiện khi click icon bên trái | `handlerIconLeft(eventName: string): void { eventName; }` | `(outIconLeft)="handlerIconLeft($event)"` |
401
+ | `(outIconRight)` | `string` | Phát ra tên sự kiện khi click icon bên phải | `handlerIconRight(eventName: string): void { eventName; }` | `(outIconRight)="handlerIconRight($event)"` |
402
+ | `(outLabelRightClick)` | `boolean` | Phát ra khi click vào label bên phải | `handlerLabelRightClick(value: boolean): void { value; }` | `(outLabelRightClick)="handlerLabelRightClick($event)"` |
403
+ | `(outSelect)` | `boolean` | Phát ra khi thay đổi trạng thái checkbox/radio tích hợp | `handlerSelect(checked: boolean): void { checked; }` | `(outSelect)="handlerSelect($event)"` |
404
+ | `(outSwitchEventLabel)` | `ISwitchEvent` | Phát ra khi thay đổi trạng thái switch trong label | `handlerSwitchLabel(e: ISwitchEvent): void { e; }` | `(outSwitchEventLabel)="handlerSwitchLabel($event)"` |
405
+ | `(outValueChange)` | `any` | Phát ra giá trị mới sau khi validate (có debounce nếu cấu hình) | `handlerValueChange(value: any): void { value; }` | `(outValueChange)="handlerValueChange($event)"` |
406
+
407
+ ## FunctionsControl API
408
+
409
+ Nhận về thông qua `(outFunctionsControl)` hoặc `viewChild`. Sử dụng để điều khiển programmatic.
410
+
411
+ ```typescript
412
+ import { IInputValidFunctionControlEvent } from '@libs-ui/components-inputs-valid';
413
+
414
+ // Nhận control
415
+ private emailControl: IInputValidFunctionControlEvent | undefined;
416
+
417
+ handlerEmailControl(control: IInputValidFunctionControlEvent): void {
418
+ this.emailControl = control;
419
+ }
420
+
421
+ // Gọi trước khi submit
422
+ async handlerSubmit(event: Event): Promise<void> {
423
+ event.stopPropagation();
424
+ const isValid = await this.emailControl?.checkIsValid();
425
+ if (!isValid) return;
426
+ }
427
+
428
+ // Set lỗi từ server
429
+ async handlerApiError(message: string): Promise<void> {
430
+ await this.emailControl?.setMessageError(message);
431
+ }
432
+ ```
433
+
434
+ | Method | Signature | Mô tả |
435
+ |---|---|---|
436
+ | `checkIsValid()` | `() => Promise<boolean>` | Chạy toàn bộ validate và trả về `true` nếu hợp lệ, `false` nếu có lỗi |
437
+ | `setMessageError()` | `(message: string) => Promise<void>` | Đặt thông báo lỗi thủ công (VD: lỗi từ API server) |
438
+ | `currentStateIsValid()` | `() => Promise<boolean>` | Trả về trạng thái lỗi hiện tại mà không chạy lại validate |
439
+ | `focus()` | `() => Promise<void>` | Focus vào ô input |
440
+ | `blur()` | `() => Promise<void>` | Blur khỏi ô input |
441
+ | `resetValue()` | `() => Promise<void>` | Xóa giá trị hiện tại trong input |
442
+ | `insertContent()` | `(data: string \| number) => Promise<void>` | Chèn nội dung vào vị trí con trỏ hiện tại |
443
+ | `selectAllContent()` | `() => Promise<void>` | Chọn toàn bộ nội dung trong input |
444
+ | `getElementValue()` | `() => any` | Lấy giá trị hiện tại từ DOM element |
445
+ | `checkAndDisableUpDownButton()` | `(value: any) => Promise<void>` | Kiểm tra và disable nút tăng/giảm theo giá trị |
171
446
 
172
447
  ## Types & Interfaces
173
448
 
449
+ ```typescript
450
+ import {
451
+ IValidRequired,
452
+ IValidPattern,
453
+ IValidLength,
454
+ IInputValidUnitConfig,
455
+ IInputValidFunctionControlEvent,
456
+ IInputUnit,
457
+ IValidConfirmPassword,
458
+ TYPE_FUNCTION_INPUT_VALID,
459
+ } from '@libs-ui/components-inputs-valid';
460
+ ```
461
+
174
462
  ### IValidRequired
175
463
 
176
- Giao diện cho cấu hình kiểm tra bắt buộc nhập.
464
+ Cấu hình validate trường bắt buộc.
177
465
 
178
466
  ```typescript
179
- export interface IValidRequired extends IMessageTranslate {
467
+ interface IValidRequired {
180
468
  isRequired: boolean;
469
+ message?: string; // Thông báo lỗi (i18n key hoặc text thuần)
470
+ interpolateParams?: object; // Tham số nội suy cho i18n
181
471
  }
182
472
  ```
183
473
 
184
474
  ### IValidPattern
185
475
 
186
- Giao diện cho cấu hình kiểm tra theo Regex.
476
+ Cấu hình validate theo regex.
187
477
 
188
478
  ```typescript
189
- export interface IValidPattern extends IMessageTranslate {
190
- pattern: any; // RegExp object
191
- valuePatternShowError?: boolean; // Mặc định false (báo lỗi khi test() trả về false)
479
+ interface IValidPattern {
480
+ pattern: RegExp | string; // Biểu thức chính quy
481
+ message?: string; // Thông báo lỗi khi không khớp
482
+ interpolateParams?: object;
483
+ valuePatternShowError?: boolean; // Override global valuePatternShowError cho rule này
192
484
  }
193
485
  ```
194
486
 
195
487
  ### IValidLength
196
488
 
197
- Giao diện cho cấu hình kiểm tra độ dài.
489
+ Cấu hình validate độ dài tối thiểu.
198
490
 
199
491
  ```typescript
200
- export interface IValidLength extends IMessageTranslate {
201
- length: number;
492
+ interface IValidLength {
493
+ length: number; // Số ký tự tối thiểu
494
+ message?: string;
495
+ interpolateParams?: object;
496
+ }
497
+ ```
498
+
499
+ ### IInputValidUnitConfig
500
+
501
+ Cấu hình mapping field cho danh sách đơn vị.
502
+
503
+ ```typescript
504
+ interface IInputValidUnitConfig {
505
+ fieldKey: string; // Tên field dùng làm key (VD: 'id')
506
+ fieldLabel: string; // Tên field dùng làm label hiển thị (VD: 'label')
507
+ classInclude?: string; // Class CSS bổ sung cho block đơn vị
202
508
  }
203
509
  ```
204
510
 
205
511
  ### IInputValidFunctionControlEvent
206
512
 
207
- Giao diện điều khiển component, kế thừa từ `IInputFunctionControlEvent`.
513
+ API điều khiển programmatic, kế thừa từ `IInputFunctionControlEvent`.
208
514
 
209
515
  ```typescript
210
- export interface IInputValidFunctionControlEvent extends IInputFunctionControlEvent {
516
+ interface IInputValidFunctionControlEvent extends IInputFunctionControlEvent {
211
517
  checkIsValid: () => Promise<boolean>;
212
518
  setMessageError: (message: string) => Promise<void>;
213
519
  currentStateIsValid?: () => Promise<boolean>;
@@ -216,17 +522,51 @@ export interface IInputValidFunctionControlEvent extends IInputFunctionControlEv
216
522
 
217
523
  ### TYPE_FUNCTION_INPUT_VALID
218
524
 
219
- Kiểu cho hàm validate tùy chỉnh.
525
+ Kiểu cho hàm validate async tùy chỉnh.
220
526
 
221
527
  ```typescript
222
- export type TYPE_FUNCTION_INPUT_VALID = (value: any) => Promise<IMessageTranslate>;
528
+ type TYPE_FUNCTION_INPUT_VALID = (value: any) => Promise<IMessageTranslate>;
529
+
530
+ // IMessageTranslate từ @libs-ui/interfaces-types:
531
+ // { message: string | undefined; interpolateParams?: object; }
223
532
  ```
224
533
 
225
- ## Tech Stack
534
+ **Ví dụ hàm validate async:**
226
535
 
227
- - **Core**: Angular 18+, Signals, RxJS
228
- - **Dependencies**: `@libs-ui/components-inputs-input`, `@libs-ui/components-label`.
536
+ ```typescript
537
+ import { TYPE_FUNCTION_INPUT_VALID } from '@libs-ui/components-inputs-valid';
538
+
539
+ protected readonly checkUsernameAvailable: TYPE_FUNCTION_INPUT_VALID = async (value) => {
540
+ if (!value) return { message: undefined, interpolateParams: undefined };
541
+ const isTaken = await this.userService.checkUsername(value as string).toPromise();
542
+ return isTaken
543
+ ? { message: 'Tên đăng nhập đã tồn tại', interpolateParams: {} }
544
+ : { message: undefined, interpolateParams: undefined };
545
+ };
546
+ ```
229
547
 
230
- ## License
548
+ ## Lưu ý quan trọng
549
+
550
+ ⚠️ **`item` là required model**: Bắt buộc truyền `[(item)]` với two-way binding. Không dùng `[item]` một chiều vì component ghi trực tiếp vào object thông qua `set()`.
551
+
552
+ ⚠️ **`fieldNameBind` là required**: Bắt buộc phải khớp với tên trường trong object `item`. Sai tên sẽ không bind được giá trị.
553
+
554
+ ⚠️ **`ignoreShowError` đã deprecated**: Dùng `ignoreShowMessageError` thay thế. `ignoreShowError` sẽ bị xóa trong phiên bản tương lai.
555
+
556
+ ⚠️ **`checkIsValid()` bỏ qua validate khi readonly/disable**: Nếu `readonly` hoặc `disable` là `true`, `checkIsValid()` luôn trả về `true` mà không chạy validate.
557
+
558
+ ⚠️ **Thứ tự validate**: Validate chạy theo thứ tự: required → minLength → pattern → minValue → maxValue → bigint range → maxLength → functionValid. Dừng lại ở lỗi đầu tiên.
559
+
560
+ ⚠️ **`valuePatternShowError` logic ngược**: Mặc định `false` — báo lỗi khi regex KHÔNG match. Đặt `true` để báo lỗi khi regex CÓ match (VD: detect ký tự không được phép).
561
+
562
+ ⚠️ **`debounceTimeValidate` chỉ áp dụng cho `outValueChange`**: Validate vẫn chạy ngay khi gọi `checkIsValid()` programmatically, bất kể debounce.
563
+
564
+ ⚠️ **Selector đúng là `libs_ui-components-inputs-valid`**: Lưu ý dùng dấu gạch dưới `_` không phải gạch ngang `-` sau `libs_ui`.
565
+
566
+ ## Demo
567
+
568
+ ```bash
569
+ npx nx serve core-ui
570
+ ```
231
571
 
232
- MIT
572
+ Truy cập: http://localhost:4500 và tìm phần demo của `inputs-valid` trong menu Components.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, model, input, output, viewChild, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { signal, model, input, output, viewChild, effect, untracked, Component, ChangeDetectionStrategy } from '@angular/core';
3
3
  import { LibsUiComponentsCheckboxSingleComponent } from '@libs-ui/components-checkbox-single';
4
4
  import { LibsUiComponentsInputsInputComponent } from '@libs-ui/components-inputs-input';
5
5
  import { LibsUiComponentsLabelComponent } from '@libs-ui/components-label';
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-components-inputs-valid.mjs","sources":["../../../../../../libs-ui/components/inputs/valid/src/valid.component.ts","../../../../../../libs-ui/components/inputs/valid/src/valid.component.html","../../../../../../libs-ui/components/inputs/valid/src/libs-ui-components-inputs-valid.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ChangeDetectionStrategy, Component, ElementRef, OnDestroy, OnInit, TemplateRef, effect, input, model, output, signal, untracked, viewChild } from '@angular/core';\nimport { IButton } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsCheckboxSingleComponent } from '@libs-ui/components-checkbox-single';\nimport { IFocusAndBlurEvent, IInputFunctionControlEvent, LibsUiComponentsInputsInputComponent, TYPE_DATA_TYPE_INPUT, TYPE_INPUT, TYPE_INPUT_RESIZE_MODE, TYPE_MODE_INPUT, TYPE_TAG_INPUT } from '@libs-ui/components-inputs-input';\nimport { ILabel, LibsUiComponentsLabelComponent } from '@libs-ui/components-label';\nimport { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { LibsUiComponentsRadioSingleComponent } from '@libs-ui/components-radio-single';\nimport { ISwitchEvent } from '@libs-ui/components-switch';\nimport { IBoundingClientRect, IEvent, IMessageTranslate, TYPE_TEMPLATE_REF } from '@libs-ui/interfaces-types';\nimport { ERROR_MESSAGE_EMPTY_VALID, ERROR_MESSAGE_MAX_LENGTH, ERROR_MESSAGE_MAX_VALID, ERROR_MESSAGE_MIN_LENGTH, ERROR_MESSAGE_MIN_VALID, ERROR_MESSAGE_PATTEN_VALID, get, isNil, set, viewDataNumberByLanguage } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IInputValidFunctionControlEvent } from './interfaces/function-control-event.interface';\nimport { IInputValidUnitConfig, IValidLength, IValidPattern, IValidRequired, TYPE_FUNCTION_INPUT_VALID } from './interfaces/valid.interface';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-valid',\n templateUrl: './valid.component.html',\n styleUrls: ['./valid.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, LibsUiComponentsInputsInputComponent, LibsUiComponentsLabelComponent, LibsUiComponentsCheckboxSingleComponent, LibsUiComponentsRadioSingleComponent, LibsUiComponentsPopoverComponent],\n})\nexport class LibsUiComponentsInputsValidComponent implements OnInit, OnDestroy {\n // #region PROPERTY\n protected value = signal<any>(null);\n protected singleError = signal<IMessageTranslate>({ message: undefined, interpolateParams: undefined });\n protected rectLeft = signal<IBoundingClientRect | undefined>(undefined);\n protected calledEffect = signal<boolean>(false);\n private readonly timer = signal<number>(0);\n private readonly timerValueChange = signal<number>(0);\n private functionControlInput: IInputFunctionControlEvent | undefined;\n\n // #region INPUT\n readonly item = model.required<Record<string, any>>({});\n readonly labelConfig = input<ILabel>();\n readonly emitEmptyInDataTypeNumber = input<boolean>();\n readonly ignoreBlockInputMaxValue = input<boolean>();\n readonly fieldNameBind = input.required<string>();\n readonly showCount = input<boolean>();\n\n readonly typeComponentSelectItem = input<'radio' | 'checkbox' | undefined>();\n readonly valueComponentSelectItem = input<boolean>();\n readonly disableComponentSelectItem = input<boolean>();\n\n readonly tagInput = input<TYPE_TAG_INPUT>();\n readonly dataType = input<TYPE_DATA_TYPE_INPUT>();\n readonly typeInput = input<TYPE_INPUT>();\n readonly modeInput = input<TYPE_MODE_INPUT>();\n readonly resetAutoCompletePassword = input<boolean>();\n readonly textAreaEnterNotNewLine = input<boolean>();\n readonly fixedFloat = input<number>();\n readonly acceptNegativeValue = input<boolean>();\n readonly valueUpDownNumber = input<number | undefined>();\n readonly ignoreWidthInput100 = input<boolean>();\n readonly classIncludeInput = input<string>();\n readonly classContainerInput = input<string>();\n readonly readonly = input<boolean>();\n readonly disable = input<boolean>();\n readonly noBorder = input<boolean>();\n readonly backgroundNone = input<boolean>();\n readonly useColorModeExist = input<boolean>();\n readonly placeholder = input<string>();\n readonly keepPlaceholderOnly = input<boolean>();\n\n readonly classContainerBottomInput = input<string>();\n readonly autoRemoveEmoji = input<boolean>();\n readonly defaultHeight = input<number>();\n readonly maxHeightTextArea = input<number>();\n readonly minHeightTextArea = input<number>();\n /**\n * @deprecated Không sử dụng input này. Sử dụng {@link ignoreShowMessageError} thay thế\n * nếu vẫn muốn hiển thị border đỏ nhưng không show message lỗi.\n */\n readonly ignoreShowError = input<boolean>();\n /** Ẩn message lỗi nhưng vẫn hiển thị border đỏ khi có lỗi */\n readonly ignoreShowMessageError = input<boolean>();\n /** Luôn hiển thị border đỏ bất kể trạng thái lỗi */\n readonly borderError = input<boolean>();\n\n readonly iconLeftClass = input<string>();\n readonly popoverContentIconLeft = input<string>();\n readonly iconRightClass = input<string>();\n readonly popoverContentIconRight = input<string>();\n readonly zIndexPopoverContent = input<number>();\n\n readonly unitsLeft = input<Array<any>>();\n readonly configUnitLeft = input<IInputValidUnitConfig>({\n fieldKey: 'id',\n fieldLabel: 'label',\n });\n readonly keySelectedUnitLeft = input<any>();\n\n readonly unitsRight = input<Array<any>>();\n readonly configUnitRight = input<IInputValidUnitConfig, IInputValidUnitConfig | undefined>(\n {\n fieldKey: 'id',\n fieldLabel: 'label',\n },\n {\n transform: (value) =>\n value ?? {\n fieldKey: 'id',\n fieldLabel: 'label',\n },\n }\n );\n readonly keySelectedUnitRight = input<any>();\n\n readonly maxValueNumber = input<number>();\n readonly minValueNumber = input<number>();\n\n readonly ignoreContentLeft = input<boolean>();\n readonly ignoreContentRight = input<boolean>();\n /** Căn align-items-baseline — dùng khi cần căn input thẳng hàng với các phần tử khác dù có validate */\n readonly isBaselineStyle = input<boolean>();\n\n /** Mặc định khi test pattern trả về giá trị bằng false sẽ báo lỗi */\n readonly valuePatternShowError = input<boolean, boolean | undefined>(false, { transform: (value) => value ?? false });\n readonly validPattern = input<Array<IValidPattern>>();\n readonly validRequired = input<IValidRequired>();\n readonly validMinLength = input<IValidLength>();\n readonly validMinValue = input<IMessageTranslate>();\n readonly validMaxValue = input<IMessageTranslate>();\n readonly validMaxLength = input<IMessageTranslate>();\n readonly functionValid = input<TYPE_FUNCTION_INPUT_VALID>();\n readonly maxLength = input<number>();\n /** Hiển thị message lỗi bắt đầu từ vị trí ô input thay vì từ template trái */\n readonly positionMessageErrorStartInput = input<boolean>();\n readonly classInclude = input<string>();\n readonly resize = input<TYPE_INPUT_RESIZE_MODE>();\n readonly templateLeftBottomInput = input<TemplateRef<TYPE_TEMPLATE_REF>>();\n readonly templateRightBottomInput = input<TemplateRef<TYPE_TEMPLATE_REF>>();\n readonly onlyAcceptNegativeValue = input<boolean>();\n readonly autoAddZeroLessThan10InTypeInt = input<boolean>();\n readonly maxLengthNumberCount = input<number>();\n readonly classMessageErrorInclude = input<string>();\n readonly ignoreStopPropagationEvent = input<boolean>();\n readonly ignoreUnitRightClassReadOnly = input<boolean>();\n /** Custom padding-right khi count không tự tính được (#52185) */\n readonly paddingRightCustomSpecific = input<number>();\n readonly focusTimeOut = input<number>();\n readonly debounceTimeValidate = input<number, number | undefined>(0, { transform: (value) => value ?? 0 });\n\n // #region OUTPUT\n readonly outValueChange = output<any>();\n readonly outSelect = output<boolean>();\n readonly outIconLeft = output<string>();\n readonly outIconRight = output<string>();\n readonly outClickButtonLabel = output<IButton>();\n readonly outSwitchEventLabel = output<ISwitchEvent>();\n readonly outLabelRightClick = output<boolean>();\n readonly outEnterInputEvent = output<IEvent>();\n readonly outHeightAreaChange = output<{ isChange: boolean }>();\n readonly outFunctionsControl = output<IInputValidFunctionControlEvent>();\n readonly outFocusAndBlur = output<IFocusAndBlurEvent>();\n readonly outChangeValueByButtonUpDown = output<void>();\n\n /* VIEW CHILD */\n readonly elementLeftRef = viewChild<ElementRef>('elementLeftRef');\n\n constructor() {\n effect(() => {\n const dataItem = get(this.item(), '');\n if (!dataItem || typeof dataItem !== 'object' || dataItem instanceof Array || (dataItem instanceof Map && dataItem instanceof WeakMap) || dataItem instanceof Set || dataItem instanceof WeakSet) {\n return;\n }\n untracked(() => {\n this.value.set(get(this.item(), this.fieldNameBind()));\n this.getRectLeft();\n });\n });\n\n const effectClearUpEffect = effect(() => {\n untracked(() => {\n this.calledEffect.set(true);\n });\n effectClearUpEffect.destroy();\n });\n }\n\n ngOnInit() {\n this.outFunctionsControl.emit(this.FunctionsControl);\n }\n\n /* FUNCTIONS */\n public get FunctionsControl(): IInputValidFunctionControlEvent {\n return {\n checkIsValid: this.checkIsValid.bind(this),\n setMessageError: this.setMessageError.bind(this),\n blur: async () => await this.functionControlInput?.blur(),\n focus: async () => await this.functionControlInput?.focus(),\n insertContent: async (data: string | number) => await this.functionControlInput?.insertContent(data),\n resetValue: async () => await this.functionControlInput?.resetValue(),\n currentStateIsValid: this.currentStateIsValid.bind(this),\n getElementValue: this.getElementValue.bind(this),\n checkAndDisableUpDownButton: async (value) => await this.functionControlInput?.checkAndDisableUpDownButton(value),\n selectAllContent: async () => await this.functionControlInput?.selectAllContent(),\n };\n }\n\n private async currentStateIsValid() {\n return !this.singleError().message;\n }\n\n private getElementValue() {\n return this.functionControlInput?.getElementValue();\n }\n\n protected handlerSelect(value: boolean) {\n this.outSelect.emit(value);\n }\n protected handlerValueChange(value: string | number) {\n set(this.item(), this.fieldNameBind(), value);\n\n // Support trường hợp call API hoặc validate cần xử lý check tốn nhiều thời gian thì cần debound time để tránh call liên tục\n clearTimeout(this.timerValueChange());\n this.timerValueChange.set(\n setTimeout(() => {\n this.validate(value);\n this.outValueChange.emit(value);\n }, this.debounceTimeValidate())\n );\n }\n\n protected handlerEventIconLeft(eventName: string) {\n this.outIconLeft.emit(eventName);\n }\n\n protected handlerEventIconRight(eventName: string) {\n this.outIconRight.emit(eventName);\n }\n\n protected handlerClickButtonLabel(button: IButton) {\n this.outClickButtonLabel.emit(button);\n }\n\n protected handlerSwitchLabel(toggleEvent: ISwitchEvent) {\n this.outSwitchEventLabel.emit(toggleEvent);\n }\n\n protected handlerEventLabelRightLabel() {\n this.outLabelRightClick.emit(true);\n }\n\n protected handlerEnterInput(e: IEvent) {\n this.outEnterInputEvent.emit(e);\n }\n\n protected handlerHeightAreaChange(event: { isChange: boolean }) {\n this.outHeightAreaChange.emit(event);\n }\n\n private async validate(value: string | number) {\n this.getRectLeft();\n this.singleError.update((obj) => ({ ...obj, message: undefined }));\n if (this.validRequired() && this.validRequired()?.isRequired && ((typeof value === 'string' && !value.trim()) || (typeof value !== 'string' && isNil(value)))) {\n this.singleError.set({ message: this.validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID, interpolateParams: this.validRequired()?.interpolateParams || {} });\n\n return;\n }\n if (typeof value === 'string' && this.validMinLength()?.message && (this.validMinLength()?.length || 0) > value.length) {\n this.singleError.set({ message: this.validMinLength()?.message || ERROR_MESSAGE_MIN_LENGTH, interpolateParams: this.validMinLength()?.interpolateParams || {} });\n\n return;\n }\n if (typeof value === 'string' && this.validPattern()?.length && value?.trim()) {\n for (const valid of this.validPattern() || []) {\n if (!valid.pattern) {\n continue;\n }\n const pattern = `${valid.pattern}`;\n const indexOfSlash = pattern.lastIndexOf('/');\n\n if (!indexOfSlash) {\n continue;\n }\n const patternStr = pattern.substring(1, indexOfSlash);\n const patternFlag = pattern.substring(indexOfSlash + 1, pattern.length);\n\n if (new RegExp(patternStr, patternFlag).test(value) === (valid.valuePatternShowError ?? this.valuePatternShowError())) {\n this.singleError.set({ message: valid.message || ERROR_MESSAGE_PATTEN_VALID, interpolateParams: valid.interpolateParams || {} });\n return;\n }\n }\n }\n if (this.validMinValue() && typeof value === 'number' && typeof this.minValueNumber() === 'number' && value < (this.minValueNumber() ?? Number.MIN_SAFE_INTEGER)) {\n this.singleError.set({ message: this.validMinValue()?.message || ERROR_MESSAGE_MIN_VALID, interpolateParams: this.validMinValue()?.interpolateParams || { value: this.minValueNumber() } });\n return;\n }\n\n if ((this.ignoreBlockInputMaxValue() || this.validMaxValue()?.message) && typeof value === 'number' && typeof this.maxValueNumber() === 'number' && value > (this.maxValueNumber() ?? Number.MAX_SAFE_INTEGER)) {\n this.singleError.set({ message: this.validMaxValue()?.message || ERROR_MESSAGE_MAX_VALID, interpolateParams: this.validMaxValue()?.interpolateParams || { value: this.maxValueNumber() } });\n return;\n }\n\n if (this.dataType() === 'bigint' && typeof value === 'string') {\n const maxMinValue = (BigInt(922) * BigInt(10) ** BigInt(18)) / BigInt(100);\n const [int, decimal] = value.split('.');\n let valueDivided = BigInt(1);\n for (let index = 0; index < (decimal?.length || 0); index++) {\n valueDivided *= BigInt(10);\n }\n\n const valueCompare = BigInt(`${int}${decimal || ''}`) * (BigInt(10000) / valueDivided);\n\n if (valueCompare < -maxMinValue) {\n this.singleError.set({\n message: this.validMinValue()?.message || ERROR_MESSAGE_MIN_VALID,\n interpolateParams: this.validMinValue()?.interpolateParams || { value: viewDataNumberByLanguage(`-${maxMinValue / BigInt(10000)}`, true, 4, true, true) },\n });\n return;\n }\n\n if (valueCompare > maxMinValue) {\n this.singleError.set({\n message: this.validMaxValue()?.message || ERROR_MESSAGE_MAX_VALID,\n interpolateParams: this.validMaxValue()?.interpolateParams || { value: viewDataNumberByLanguage(`${maxMinValue / BigInt(10000)}`, true, 4, true, true) },\n });\n return;\n }\n }\n\n if (this.maxLength && typeof value === 'string' && (this.maxLength() || Number.MAX_SAFE_INTEGER) < value.length) {\n this.singleError.set({ message: this.validMaxLength()?.message || ERROR_MESSAGE_MAX_LENGTH, interpolateParams: this.validMaxLength()?.interpolateParams || { number: this.maxLength() } });\n\n return;\n }\n\n if (!this.functionValid()) {\n return;\n }\n\n const result: any = this.functionValid()?.(value);\n\n if (result?.then) {\n this.singleError.set(await result);\n\n return;\n }\n this.singleError.set(result);\n }\n\n private async checkIsValid() {\n if (this.item() && (this.readonly() || this.disable())) {\n return true;\n }\n clearTimeout(this.timerValueChange());\n await this.validate(get(this.item, this.fieldNameBind()));\n\n return !this.singleError().message;\n }\n\n private async setMessageError(message: string) {\n this.singleError.update((obj) => ({ ...obj, message }));\n }\n\n protected handlerControlFunctionInput(event: IInputFunctionControlEvent) {\n this.functionControlInput = event;\n }\n\n protected handlerFocusAndBlur(event: IFocusAndBlurEvent) {\n this.outFocusAndBlur.emit(event);\n }\n\n private getRectLeft() {\n if (!this.rectLeft() || this.positionMessageErrorStartInput()) {\n this.timer.set(\n setTimeout(() => {\n this.rectLeft.set(this.elementLeftRef()?.nativeElement.getBoundingClientRect());\n })\n );\n }\n }\n\n protected handlerChangeValueByButtonUpDown() {\n this.outChangeValueByButtonUpDown.emit();\n }\n\n ngOnDestroy() {\n clearTimeout(this.timer());\n clearTimeout(this.timerValueChange());\n }\n}\n","@if (fieldNameBind() && item(); as item) {\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"disable() || labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsRight]=\"disable() || labelConfig.disableButtonsRight\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"disable() || labelConfig.toggleDisable\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"value()?.length\"\n (outClickButton)=\"handlerClickButtonLabel($event)\"\n (outSwitchEvent)=\"handlerSwitchLabel($event)\"\n (outLabelRightClick)=\"handlerEventLabelRightLabel()\" />\n }\n <div\n [class]=\"'libs-ui-input-valid w-full ' + (classInclude() ?? '')\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (!ignoreContentLeft()) {\n <div\n #elementLeftRef\n class=\"libs-ui-input-valid-left\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (typeComponentSelectItem(); as typeComponentSelectItem) {\n <div class=\"mr-[8px]\">\n @if (typeComponentSelectItem === 'checkbox') {\n <libs_ui-components-checkbox-single\n [checked]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.checked)\" />\n }\n @if (typeComponentSelectItem === 'radio') {\n <libs_ui-components-radio-single\n [active]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.active)\" />\n }\n </div>\n }\n\n <ng-content select=\".libs-ui-input-valid-left-content-custom\" />\n @for (unit of unitsLeft(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-left !rounded-tr-none !rounded-br-none libs-ui-font-h5r {{ configUnitLeft().classInclude || '' }}\"\n [class.!flex]=\"unit[configUnitLeft().fieldKey] === keySelectedUnitLeft()\"\n [class.libs-ui-readonly]=\"readonly() || false\"\n [class.libs-ui-disable]=\"disable() || false\">\n @let constHtmlLabel = unit[configUnitLeft().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n </div>\n }\n @if (calledEffect() === true) {\n <libs_ui-components-inputs-input\n [tagInput]=\"tagInput()\"\n [dataType]=\"dataType() || 'string'\"\n [typeInput]=\"typeInput()\"\n [modeInput]=\"modeInput()\"\n [class.w-full]=\"!ignoreWidthInput100()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [textAreaEnterNotNewLine]=\"textAreaEnterNotNewLine() || false\"\n [classInclude]=\"(classIncludeInput() || '') + (unitsLeft() && unitsLeft()?.length ? ' !rounded-tl-none !rounded-bl-none' : '') + (unitsRight()?.length ? ' !rounded-tr-none !rounded-br-none' : '')\"\n [maxValueNumber]=\"maxValueNumber()\"\n [minValueNumber]=\"minValueNumber()\"\n [fixedFloat]=\"fixedFloat() ?? 1\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxLength]=\"maxLength()\"\n [showCount]=\"showCount()\"\n [readonly]=\"readonly()\"\n [disable]=\"disable()\"\n [autoAddZeroLessThan10InTypeInt]=\"autoAddZeroLessThan10InTypeInt()\"\n [noBorder]=\"noBorder()\"\n [backgroundNone]=\"backgroundNone()\"\n [useColorModeExist]=\"useColorModeExist()\"\n [placeholder]=\"placeholder() || ''\"\n [keepPlaceholderOnly]=\"keepPlaceholderOnly()\"\n [autoRemoveEmoji]=\"autoRemoveEmoji()\"\n [defaultHeight]=\"defaultHeight()\"\n [maxHeightTextArea]=\"maxHeightTextArea() || 250\"\n [minHeightTextArea]=\"minHeightTextArea()\"\n [borderError]=\"borderError() || (!!singleError().message && !ignoreShowError())\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconLeft]=\"popoverContentIconLeft()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [iconRightClass]=\"iconRightClass()\"\n [zIndexPopoverContent]=\"zIndexPopoverContent()\"\n [emitEmptyInDataTypeNumber]=\"emitEmptyInDataTypeNumber()\"\n [ignoreBlockInputMaxValue]=\"!!ignoreBlockInputMaxValue() ? ignoreBlockInputMaxValue() : validMaxValue()?.message ? true : false\"\n [(value)]=\"value\"\n [classContainerInput]=\"classContainerInput()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n [resize]=\"resize()\"\n [classContainerBottomInput]=\"classContainerBottomInput()\"\n [templateLeftBottomInput]=\"templateLeftBottomInput()\"\n [templateRightBottomInput]=\"templateRightBottomInput()\"\n [maxLengthNumberCount]=\"maxLengthNumberCount()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [focusTimeOut]=\"focusTimeOut()\"\n (valueChange)=\"handlerValueChange($event)\"\n (outEnterEvent)=\"handlerEnterInput($event)\"\n (outIconLeft)=\"handlerEventIconLeft($event)\"\n (outIconRight)=\"handlerEventIconRight($event)\"\n (outHeightAreaChange)=\"handlerHeightAreaChange($event)\"\n (outFunctionsControl)=\"handlerControlFunctionInput($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlur($event)\"\n (outChangeValueByButtonUpDown)=\"handlerChangeValueByButtonUpDown()\" />\n }\n @if (!ignoreContentRight()) {\n <div\n class=\"libs-ui-input-valid-right\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @for (unit of unitsRight(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-right !rounded-tl-none !rounded-bl-none libs-ui-font-h5r {{ configUnitRight().classInclude || 'libs-ui-border-general' }}\"\n [class.!flex]=\"unit[configUnitRight().fieldKey] === keySelectedUnitRight()\"\n [class.libs-ui-readonly]=\"!ignoreUnitRightClassReadOnly() && (readonly() || false)\">\n @let constHtmlLabel = unit[configUnitRight().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n <ng-content select=\".libs-ui-input-valid-right-content-custom\"></ng-content>\n </div>\n }\n </div>\n @if (!!singleError().message && !ignoreShowError() && !ignoreShowMessageError()) {\n <div class=\"libs-ui-input-valid-error {{ classMessageErrorInclude() || '' }}\">\n @let constHtmlMessage = singleError().message || ' ';\n <span\n class=\"libs-ui-message-error libs-ui-font-h7r libs-ui-text-error\"\n [style.marginLeft.px]=\"rectLeft()?.width\"\n [innerHtml]=\"constHtmlMessage | translate: singleError().interpolateParams\"></span>\n </div>\n }\n}\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-valid.mjs","sources":["../../../../../../libs-ui/components/inputs/valid/src/valid.component.ts","../../../../../../libs-ui/components/inputs/valid/src/valid.component.html","../../../../../../libs-ui/components/inputs/valid/src/libs-ui-components-inputs-valid.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ChangeDetectionStrategy, Component, ElementRef, OnDestroy, OnInit, TemplateRef, effect, input, model, output, signal, untracked, viewChild } from '@angular/core';\nimport { IButton } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsCheckboxSingleComponent } from '@libs-ui/components-checkbox-single';\nimport { IFocusAndBlurEvent, IInputFunctionControlEvent, LibsUiComponentsInputsInputComponent, TYPE_DATA_TYPE_INPUT, TYPE_INPUT, TYPE_INPUT_RESIZE_MODE, TYPE_MODE_INPUT, TYPE_TAG_INPUT } from '@libs-ui/components-inputs-input';\nimport { ILabel, LibsUiComponentsLabelComponent } from '@libs-ui/components-label';\nimport { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { LibsUiComponentsRadioSingleComponent } from '@libs-ui/components-radio-single';\nimport { ISwitchEvent } from '@libs-ui/components-switch';\nimport { IBoundingClientRect, IEvent, IMessageTranslate, TYPE_TEMPLATE_REF } from '@libs-ui/interfaces-types';\nimport { ERROR_MESSAGE_EMPTY_VALID, ERROR_MESSAGE_MAX_LENGTH, ERROR_MESSAGE_MAX_VALID, ERROR_MESSAGE_MIN_LENGTH, ERROR_MESSAGE_MIN_VALID, ERROR_MESSAGE_PATTEN_VALID, get, isNil, set, viewDataNumberByLanguage } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IInputValidFunctionControlEvent } from './interfaces/function-control-event.interface';\nimport { IInputValidUnitConfig, IValidLength, IValidPattern, IValidRequired, TYPE_FUNCTION_INPUT_VALID } from './interfaces/valid.interface';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-valid',\n templateUrl: './valid.component.html',\n styleUrls: ['./valid.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, LibsUiComponentsInputsInputComponent, LibsUiComponentsLabelComponent, LibsUiComponentsCheckboxSingleComponent, LibsUiComponentsRadioSingleComponent, LibsUiComponentsPopoverComponent],\n})\nexport class LibsUiComponentsInputsValidComponent implements OnInit, OnDestroy {\n // #region PROPERTY\n protected value = signal<any>(null);\n protected singleError = signal<IMessageTranslate>({ message: undefined, interpolateParams: undefined });\n protected rectLeft = signal<IBoundingClientRect | undefined>(undefined);\n protected calledEffect = signal<boolean>(false);\n private readonly timer = signal<number>(0);\n private readonly timerValueChange = signal<number>(0);\n private functionControlInput: IInputFunctionControlEvent | undefined;\n\n // #region INPUT\n readonly item = model.required<Record<string, any>>({});\n readonly labelConfig = input<ILabel>();\n readonly emitEmptyInDataTypeNumber = input<boolean>();\n readonly ignoreBlockInputMaxValue = input<boolean>();\n readonly fieldNameBind = input.required<string>();\n readonly showCount = input<boolean>();\n\n readonly typeComponentSelectItem = input<'radio' | 'checkbox' | undefined>();\n readonly valueComponentSelectItem = input<boolean>();\n readonly disableComponentSelectItem = input<boolean>();\n\n readonly tagInput = input<TYPE_TAG_INPUT>();\n readonly dataType = input<TYPE_DATA_TYPE_INPUT>();\n readonly typeInput = input<TYPE_INPUT>();\n readonly modeInput = input<TYPE_MODE_INPUT>();\n readonly resetAutoCompletePassword = input<boolean>();\n readonly textAreaEnterNotNewLine = input<boolean>();\n readonly fixedFloat = input<number>();\n readonly acceptNegativeValue = input<boolean>();\n readonly valueUpDownNumber = input<number | undefined>();\n readonly ignoreWidthInput100 = input<boolean>();\n readonly classIncludeInput = input<string>();\n readonly classContainerInput = input<string>();\n readonly readonly = input<boolean>();\n readonly disable = input<boolean>();\n readonly noBorder = input<boolean>();\n readonly backgroundNone = input<boolean>();\n readonly useColorModeExist = input<boolean>();\n readonly placeholder = input<string>();\n readonly keepPlaceholderOnly = input<boolean>();\n\n readonly classContainerBottomInput = input<string>();\n readonly autoRemoveEmoji = input<boolean>();\n readonly defaultHeight = input<number>();\n readonly maxHeightTextArea = input<number>();\n readonly minHeightTextArea = input<number>();\n /**\n * @deprecated Không sử dụng input này. Sử dụng {@link ignoreShowMessageError} thay thế\n * nếu vẫn muốn hiển thị border đỏ nhưng không show message lỗi.\n */\n readonly ignoreShowError = input<boolean>();\n /** Ẩn message lỗi nhưng vẫn hiển thị border đỏ khi có lỗi */\n readonly ignoreShowMessageError = input<boolean>();\n /** Luôn hiển thị border đỏ bất kể trạng thái lỗi */\n readonly borderError = input<boolean>();\n\n readonly iconLeftClass = input<string>();\n readonly popoverContentIconLeft = input<string>();\n readonly iconRightClass = input<string>();\n readonly popoverContentIconRight = input<string>();\n readonly zIndexPopoverContent = input<number>();\n\n readonly unitsLeft = input<Array<any>>();\n readonly configUnitLeft = input<IInputValidUnitConfig>({\n fieldKey: 'id',\n fieldLabel: 'label',\n });\n readonly keySelectedUnitLeft = input<any>();\n\n readonly unitsRight = input<Array<any>>();\n readonly configUnitRight = input<IInputValidUnitConfig, IInputValidUnitConfig | undefined>(\n {\n fieldKey: 'id',\n fieldLabel: 'label',\n },\n {\n transform: (value) =>\n value ?? {\n fieldKey: 'id',\n fieldLabel: 'label',\n },\n }\n );\n readonly keySelectedUnitRight = input<any>();\n\n readonly maxValueNumber = input<number>();\n readonly minValueNumber = input<number>();\n\n readonly ignoreContentLeft = input<boolean>();\n readonly ignoreContentRight = input<boolean>();\n /** Căn align-items-baseline — dùng khi cần căn input thẳng hàng với các phần tử khác dù có validate */\n readonly isBaselineStyle = input<boolean>();\n\n /** Mặc định khi test pattern trả về giá trị bằng false sẽ báo lỗi */\n readonly valuePatternShowError = input<boolean, boolean | undefined>(false, { transform: (value) => value ?? false });\n readonly validPattern = input<Array<IValidPattern>>();\n readonly validRequired = input<IValidRequired>();\n readonly validMinLength = input<IValidLength>();\n readonly validMinValue = input<IMessageTranslate>();\n readonly validMaxValue = input<IMessageTranslate>();\n readonly validMaxLength = input<IMessageTranslate>();\n readonly functionValid = input<TYPE_FUNCTION_INPUT_VALID>();\n readonly maxLength = input<number>();\n /** Hiển thị message lỗi bắt đầu từ vị trí ô input thay vì từ template trái */\n readonly positionMessageErrorStartInput = input<boolean>();\n readonly classInclude = input<string>();\n readonly resize = input<TYPE_INPUT_RESIZE_MODE>();\n readonly templateLeftBottomInput = input<TemplateRef<TYPE_TEMPLATE_REF>>();\n readonly templateRightBottomInput = input<TemplateRef<TYPE_TEMPLATE_REF>>();\n readonly onlyAcceptNegativeValue = input<boolean>();\n readonly autoAddZeroLessThan10InTypeInt = input<boolean>();\n readonly maxLengthNumberCount = input<number>();\n readonly classMessageErrorInclude = input<string>();\n readonly ignoreStopPropagationEvent = input<boolean>();\n readonly ignoreUnitRightClassReadOnly = input<boolean>();\n /** Custom padding-right khi count không tự tính được (#52185) */\n readonly paddingRightCustomSpecific = input<number>();\n readonly focusTimeOut = input<number>();\n readonly debounceTimeValidate = input<number, number | undefined>(0, { transform: (value) => value ?? 0 });\n\n // #region OUTPUT\n readonly outValueChange = output<any>();\n readonly outSelect = output<boolean>();\n readonly outIconLeft = output<string>();\n readonly outIconRight = output<string>();\n readonly outClickButtonLabel = output<IButton>();\n readonly outSwitchEventLabel = output<ISwitchEvent>();\n readonly outLabelRightClick = output<boolean>();\n readonly outEnterInputEvent = output<IEvent>();\n readonly outHeightAreaChange = output<{ isChange: boolean }>();\n readonly outFunctionsControl = output<IInputValidFunctionControlEvent>();\n readonly outFocusAndBlur = output<IFocusAndBlurEvent>();\n readonly outChangeValueByButtonUpDown = output<void>();\n\n /* VIEW CHILD */\n readonly elementLeftRef = viewChild<ElementRef>('elementLeftRef');\n\n constructor() {\n effect(() => {\n const dataItem = get(this.item(), '');\n if (!dataItem || typeof dataItem !== 'object' || dataItem instanceof Array || (dataItem instanceof Map && dataItem instanceof WeakMap) || dataItem instanceof Set || dataItem instanceof WeakSet) {\n return;\n }\n untracked(() => {\n this.value.set(get(this.item(), this.fieldNameBind()));\n this.getRectLeft();\n });\n });\n\n const effectClearUpEffect = effect(() => {\n untracked(() => {\n this.calledEffect.set(true);\n });\n effectClearUpEffect.destroy();\n });\n }\n\n ngOnInit() {\n this.outFunctionsControl.emit(this.FunctionsControl);\n }\n\n /* FUNCTIONS */\n public get FunctionsControl(): IInputValidFunctionControlEvent {\n return {\n checkIsValid: this.checkIsValid.bind(this),\n setMessageError: this.setMessageError.bind(this),\n blur: async () => await this.functionControlInput?.blur(),\n focus: async () => await this.functionControlInput?.focus(),\n insertContent: async (data: string | number) => await this.functionControlInput?.insertContent(data),\n resetValue: async () => await this.functionControlInput?.resetValue(),\n currentStateIsValid: this.currentStateIsValid.bind(this),\n getElementValue: this.getElementValue.bind(this),\n checkAndDisableUpDownButton: async (value) => await this.functionControlInput?.checkAndDisableUpDownButton(value),\n selectAllContent: async () => await this.functionControlInput?.selectAllContent(),\n };\n }\n\n private async currentStateIsValid() {\n return !this.singleError().message;\n }\n\n private getElementValue() {\n return this.functionControlInput?.getElementValue();\n }\n\n protected handlerSelect(value: boolean) {\n this.outSelect.emit(value);\n }\n protected handlerValueChange(value: string | number) {\n set(this.item(), this.fieldNameBind(), value);\n\n // Support trường hợp call API hoặc validate cần xử lý check tốn nhiều thời gian thì cần debound time để tránh call liên tục\n clearTimeout(this.timerValueChange());\n this.timerValueChange.set(\n setTimeout(() => {\n this.validate(value);\n this.outValueChange.emit(value);\n }, this.debounceTimeValidate())\n );\n }\n\n protected handlerEventIconLeft(eventName: string) {\n this.outIconLeft.emit(eventName);\n }\n\n protected handlerEventIconRight(eventName: string) {\n this.outIconRight.emit(eventName);\n }\n\n protected handlerClickButtonLabel(button: IButton) {\n this.outClickButtonLabel.emit(button);\n }\n\n protected handlerSwitchLabel(toggleEvent: ISwitchEvent) {\n this.outSwitchEventLabel.emit(toggleEvent);\n }\n\n protected handlerEventLabelRightLabel() {\n this.outLabelRightClick.emit(true);\n }\n\n protected handlerEnterInput(e: IEvent) {\n this.outEnterInputEvent.emit(e);\n }\n\n protected handlerHeightAreaChange(event: { isChange: boolean }) {\n this.outHeightAreaChange.emit(event);\n }\n\n private async validate(value: string | number) {\n this.getRectLeft();\n this.singleError.update((obj) => ({ ...obj, message: undefined }));\n if (this.validRequired() && this.validRequired()?.isRequired && ((typeof value === 'string' && !value.trim()) || (typeof value !== 'string' && isNil(value)))) {\n this.singleError.set({ message: this.validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID, interpolateParams: this.validRequired()?.interpolateParams || {} });\n\n return;\n }\n if (typeof value === 'string' && this.validMinLength()?.message && (this.validMinLength()?.length || 0) > value.length) {\n this.singleError.set({ message: this.validMinLength()?.message || ERROR_MESSAGE_MIN_LENGTH, interpolateParams: this.validMinLength()?.interpolateParams || {} });\n\n return;\n }\n if (typeof value === 'string' && this.validPattern()?.length && value?.trim()) {\n for (const valid of this.validPattern() || []) {\n if (!valid.pattern) {\n continue;\n }\n const pattern = `${valid.pattern}`;\n const indexOfSlash = pattern.lastIndexOf('/');\n\n if (!indexOfSlash) {\n continue;\n }\n const patternStr = pattern.substring(1, indexOfSlash);\n const patternFlag = pattern.substring(indexOfSlash + 1, pattern.length);\n\n if (new RegExp(patternStr, patternFlag).test(value) === (valid.valuePatternShowError ?? this.valuePatternShowError())) {\n this.singleError.set({ message: valid.message || ERROR_MESSAGE_PATTEN_VALID, interpolateParams: valid.interpolateParams || {} });\n return;\n }\n }\n }\n if (this.validMinValue() && typeof value === 'number' && typeof this.minValueNumber() === 'number' && value < (this.minValueNumber() ?? Number.MIN_SAFE_INTEGER)) {\n this.singleError.set({ message: this.validMinValue()?.message || ERROR_MESSAGE_MIN_VALID, interpolateParams: this.validMinValue()?.interpolateParams || { value: this.minValueNumber() } });\n return;\n }\n\n if ((this.ignoreBlockInputMaxValue() || this.validMaxValue()?.message) && typeof value === 'number' && typeof this.maxValueNumber() === 'number' && value > (this.maxValueNumber() ?? Number.MAX_SAFE_INTEGER)) {\n this.singleError.set({ message: this.validMaxValue()?.message || ERROR_MESSAGE_MAX_VALID, interpolateParams: this.validMaxValue()?.interpolateParams || { value: this.maxValueNumber() } });\n return;\n }\n\n if (this.dataType() === 'bigint' && typeof value === 'string') {\n const maxMinValue = (BigInt(922) * BigInt(10) ** BigInt(18)) / BigInt(100);\n const [int, decimal] = value.split('.');\n let valueDivided = BigInt(1);\n for (let index = 0; index < (decimal?.length || 0); index++) {\n valueDivided *= BigInt(10);\n }\n\n const valueCompare = BigInt(`${int}${decimal || ''}`) * (BigInt(10000) / valueDivided);\n\n if (valueCompare < -maxMinValue) {\n this.singleError.set({\n message: this.validMinValue()?.message || ERROR_MESSAGE_MIN_VALID,\n interpolateParams: this.validMinValue()?.interpolateParams || { value: viewDataNumberByLanguage(`-${maxMinValue / BigInt(10000)}`, true, 4, true, true) },\n });\n return;\n }\n\n if (valueCompare > maxMinValue) {\n this.singleError.set({\n message: this.validMaxValue()?.message || ERROR_MESSAGE_MAX_VALID,\n interpolateParams: this.validMaxValue()?.interpolateParams || { value: viewDataNumberByLanguage(`${maxMinValue / BigInt(10000)}`, true, 4, true, true) },\n });\n return;\n }\n }\n\n if (this.maxLength && typeof value === 'string' && (this.maxLength() || Number.MAX_SAFE_INTEGER) < value.length) {\n this.singleError.set({ message: this.validMaxLength()?.message || ERROR_MESSAGE_MAX_LENGTH, interpolateParams: this.validMaxLength()?.interpolateParams || { number: this.maxLength() } });\n\n return;\n }\n\n if (!this.functionValid()) {\n return;\n }\n\n const result: any = this.functionValid()?.(value);\n\n if (result?.then) {\n this.singleError.set(await result);\n\n return;\n }\n this.singleError.set(result);\n }\n\n private async checkIsValid() {\n if (this.item() && (this.readonly() || this.disable())) {\n return true;\n }\n clearTimeout(this.timerValueChange());\n await this.validate(get(this.item, this.fieldNameBind()));\n\n return !this.singleError().message;\n }\n\n private async setMessageError(message: string) {\n this.singleError.update((obj) => ({ ...obj, message }));\n }\n\n protected handlerControlFunctionInput(event: IInputFunctionControlEvent) {\n this.functionControlInput = event;\n }\n\n protected handlerFocusAndBlur(event: IFocusAndBlurEvent) {\n this.outFocusAndBlur.emit(event);\n }\n\n private getRectLeft() {\n if (!this.rectLeft() || this.positionMessageErrorStartInput()) {\n this.timer.set(\n setTimeout(() => {\n this.rectLeft.set(this.elementLeftRef()?.nativeElement.getBoundingClientRect());\n })\n );\n }\n }\n\n protected handlerChangeValueByButtonUpDown() {\n this.outChangeValueByButtonUpDown.emit();\n }\n\n ngOnDestroy() {\n clearTimeout(this.timer());\n clearTimeout(this.timerValueChange());\n }\n}\n","@if (fieldNameBind() && item(); as item) {\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"disable() || labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsRight]=\"disable() || labelConfig.disableButtonsRight\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"disable() || labelConfig.toggleDisable\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"value()?.length\"\n (outClickButton)=\"handlerClickButtonLabel($event)\"\n (outSwitchEvent)=\"handlerSwitchLabel($event)\"\n (outLabelRightClick)=\"handlerEventLabelRightLabel()\" />\n }\n <div\n [class]=\"'libs-ui-input-valid w-full ' + (classInclude() ?? '')\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (!ignoreContentLeft()) {\n <div\n #elementLeftRef\n class=\"libs-ui-input-valid-left\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @if (typeComponentSelectItem(); as typeComponentSelectItem) {\n <div class=\"mr-[8px]\">\n @if (typeComponentSelectItem === 'checkbox') {\n <libs_ui-components-checkbox-single\n [checked]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.checked)\" />\n }\n @if (typeComponentSelectItem === 'radio') {\n <libs_ui-components-radio-single\n [active]=\"valueComponentSelectItem() || false\"\n [disable]=\"disable() || disableComponentSelectItem() || false\"\n (outChange)=\"handlerSelect($event.active)\" />\n }\n </div>\n }\n\n <ng-content select=\".libs-ui-input-valid-left-content-custom\" />\n @for (unit of unitsLeft(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-left !rounded-tr-none !rounded-br-none libs-ui-font-h5r {{ configUnitLeft().classInclude || '' }}\"\n [class.!flex]=\"unit[configUnitLeft().fieldKey] === keySelectedUnitLeft()\"\n [class.libs-ui-readonly]=\"readonly() || false\"\n [class.libs-ui-disable]=\"disable() || false\">\n @let constHtmlLabel = unit[configUnitLeft().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n </div>\n }\n @if (calledEffect() === true) {\n <libs_ui-components-inputs-input\n [tagInput]=\"tagInput()\"\n [dataType]=\"dataType() || 'string'\"\n [typeInput]=\"typeInput()\"\n [modeInput]=\"modeInput()\"\n [class.w-full]=\"!ignoreWidthInput100()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [textAreaEnterNotNewLine]=\"textAreaEnterNotNewLine() || false\"\n [classInclude]=\"(classIncludeInput() || '') + (unitsLeft() && unitsLeft()?.length ? ' !rounded-tl-none !rounded-bl-none' : '') + (unitsRight()?.length ? ' !rounded-tr-none !rounded-br-none' : '')\"\n [maxValueNumber]=\"maxValueNumber()\"\n [minValueNumber]=\"minValueNumber()\"\n [fixedFloat]=\"fixedFloat() ?? 1\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxLength]=\"maxLength()\"\n [showCount]=\"showCount()\"\n [readonly]=\"readonly()\"\n [disable]=\"disable()\"\n [autoAddZeroLessThan10InTypeInt]=\"autoAddZeroLessThan10InTypeInt()\"\n [noBorder]=\"noBorder()\"\n [backgroundNone]=\"backgroundNone()\"\n [useColorModeExist]=\"useColorModeExist()\"\n [placeholder]=\"placeholder() || ''\"\n [keepPlaceholderOnly]=\"keepPlaceholderOnly()\"\n [autoRemoveEmoji]=\"autoRemoveEmoji()\"\n [defaultHeight]=\"defaultHeight()\"\n [maxHeightTextArea]=\"maxHeightTextArea() || 250\"\n [minHeightTextArea]=\"minHeightTextArea()\"\n [borderError]=\"borderError() || (!!singleError().message && !ignoreShowError())\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconLeft]=\"popoverContentIconLeft()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [iconRightClass]=\"iconRightClass()\"\n [zIndexPopoverContent]=\"zIndexPopoverContent()\"\n [emitEmptyInDataTypeNumber]=\"emitEmptyInDataTypeNumber()\"\n [ignoreBlockInputMaxValue]=\"!!ignoreBlockInputMaxValue() ? ignoreBlockInputMaxValue() : validMaxValue()?.message ? true : false\"\n [(value)]=\"value\"\n [classContainerInput]=\"classContainerInput()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n [resize]=\"resize()\"\n [classContainerBottomInput]=\"classContainerBottomInput()\"\n [templateLeftBottomInput]=\"templateLeftBottomInput()\"\n [templateRightBottomInput]=\"templateRightBottomInput()\"\n [maxLengthNumberCount]=\"maxLengthNumberCount()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [focusTimeOut]=\"focusTimeOut()\"\n (valueChange)=\"handlerValueChange($event)\"\n (outEnterEvent)=\"handlerEnterInput($event)\"\n (outIconLeft)=\"handlerEventIconLeft($event)\"\n (outIconRight)=\"handlerEventIconRight($event)\"\n (outHeightAreaChange)=\"handlerHeightAreaChange($event)\"\n (outFunctionsControl)=\"handlerControlFunctionInput($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlur($event)\"\n (outChangeValueByButtonUpDown)=\"handlerChangeValueByButtonUpDown()\" />\n }\n @if (!ignoreContentRight()) {\n <div\n class=\"libs-ui-input-valid-right\"\n [class.items-baseline]=\"isBaselineStyle()\">\n @for (unit of unitsRight(); track unit) {\n <div\n class=\"libs-ui-input-valid-unit libs-ui-input-valid-unit-right !rounded-tl-none !rounded-bl-none libs-ui-font-h5r {{ configUnitRight().classInclude || 'libs-ui-border-general' }}\"\n [class.!flex]=\"unit[configUnitRight().fieldKey] === keySelectedUnitRight()\"\n [class.libs-ui-readonly]=\"!ignoreUnitRightClassReadOnly() && (readonly() || false)\">\n @let constHtmlLabel = unit[configUnitRight().fieldLabel || 'label'] || ' ';\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{ maxWidth: 250, direction: 'bottom', zIndex: zIndexPopoverContent() }\"\n [innerHtml]=\"constHtmlLabel | translate\" />\n </div>\n }\n <ng-content select=\".libs-ui-input-valid-right-content-custom\"></ng-content>\n </div>\n }\n </div>\n @if (!!singleError().message && !ignoreShowError() && !ignoreShowMessageError()) {\n <div class=\"libs-ui-input-valid-error {{ classMessageErrorInclude() || '' }}\">\n @let constHtmlMessage = singleError().message || ' ';\n <span\n class=\"libs-ui-message-error libs-ui-font-h7r libs-ui-text-error\"\n [style.marginLeft.px]=\"rectLeft()?.width\"\n [innerHtml]=\"constHtmlMessage | translate: singleError().interpolateParams\"></span>\n </div>\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@libs-ui/components-inputs-valid",
3
- "version": "0.2.356-42",
3
+ "version": "0.2.356-43",
4
4
  "peerDependencies": {
5
5
  "@angular/core": ">=18.0.0",
6
- "@libs-ui/components-inputs-input": "0.2.356-42",
7
- "@libs-ui/interfaces-types": "0.2.356-42",
8
- "@libs-ui/components-buttons-button": "0.2.356-42",
9
- "@libs-ui/components-checkbox-single": "0.2.356-42",
10
- "@libs-ui/components-label": "0.2.356-42",
11
- "@libs-ui/components-popover": "0.2.356-42",
12
- "@libs-ui/components-radio-single": "0.2.356-42",
13
- "@libs-ui/components-switch": "0.2.356-42",
14
- "@libs-ui/utils": "0.2.356-42",
6
+ "@libs-ui/components-inputs-input": "0.2.356-43",
7
+ "@libs-ui/interfaces-types": "0.2.356-43",
8
+ "@libs-ui/components-buttons-button": "0.2.356-43",
9
+ "@libs-ui/components-checkbox-single": "0.2.356-43",
10
+ "@libs-ui/components-label": "0.2.356-43",
11
+ "@libs-ui/components-popover": "0.2.356-43",
12
+ "@libs-ui/components-radio-single": "0.2.356-43",
13
+ "@libs-ui/components-switch": "0.2.356-43",
14
+ "@libs-ui/utils": "0.2.356-43",
15
15
  "@ngx-translate/core": "^15.0.0"
16
16
  },
17
17
  "sideEffects": false,