@libs-ui/components-inputs-password 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,147 +1,422 @@
1
- # Password Input Component
1
+ # @libs-ui/components-inputs-password
2
2
 
3
- `@libs-ui/components-inputs-password` một component nhập liệu mật khẩu chuyên dụng, cung cấp các tính năng bảo mật như ẩn/hiện mật khẩu, kiểm tra độ mạnh của mật khẩu (validation rules) và tự động tạo mật khẩu ngẫu nhiên.
3
+ > Component nhập liệu mật khẩu với tính năng ẩn/hiện, kiểm tra quy tắc bảo mật và tự động tạo mật khẩu ngẫu nhiên.
4
4
 
5
- ## Tính năng nổi bật
5
+ ## Giới thiệu
6
6
 
7
- - 👁️ **Ẩn/Hiện mật khẩu**: Cho phép người dùng chuyển đổi chế độ xem mật khẩu dễ dàng.
8
- - ✅ **Validation phức tạp**: Kiểm tra các quy tắc như độ dài tối thiểu/tối đa, sự xuất hiện của chữ hoa, chữ thường, số và ký tự đặc biệt.
9
- - 🎲 **Tạo mật khẩu ngẫu nhiên**: Hỗ trợ generate mật khẩu dựa trên cấu hình bảo mật được thiết lập.
10
- - 🛠️ **Tích hợp Validation**: Sử dụng `LibsUiComponentsInputsValidComponent` để hiển thị lỗi và quản lý trạng thái hợp lệ.
11
- - 🎨 **Tùy biến cao**: Cho phép tùy chỉnh icon, placeholder, label và các thuộc tính CSS.
7
+ `@libs-ui/components-inputs-password` component chuyên dụng để nhận input mật khẩu trong Angular. Component cung cấp tính năng chuyển đổi ẩn/hiện mật khẩu, hiển thị trực quan trạng thái đáp ứng từng quy tắc bảo mật (độ dài, ký tự hoa, thường, số, ký tự đặc biệt), và hỗ trợ tự động sinh mật khẩu ngẫu nhiên thỏa mãn cấu hình đã định.
12
8
 
13
- ## Cài đặt
9
+ ## Tính năng
10
+
11
+ - ✅ Ẩn/hiện mật khẩu với icon mắt chuyển đổi động
12
+ - ✅ Kiểm tra quy tắc bảo mật: độ dài tối thiểu/tối đa, chữ hoa, chữ thường, chữ số, ký tự đặc biệt
13
+ - ✅ Hiển thị trực quan từng quy tắc đã thỏa mãn hay chưa (màu xanh/xám)
14
+ - ✅ Hỗ trợ 2 chế độ kiểm tra: `key: 'all'` (phải đáp ứng toàn bộ) hoặc theo số lượng quy tắc tối thiểu
15
+ - ✅ Tự động sinh mật khẩu ngẫu nhiên theo cấu hình bảo mật
16
+ - ✅ Tích hợp với `LibsUiComponentsInputsValidComponent` — hỗ trợ required, minLength, pattern validation
17
+ - ✅ Hỗ trợ chế độ readonly, label, placeholder, icon tùy chỉnh
18
+ - ✅ Ngăn tự động điền mật khẩu của trình duyệt (autocomplete)
19
+ - ✅ Cung cấp `FunctionsControl` getter để parent gọi `checkIsValid()` qua ViewChild
20
+
21
+ ## Khi nào sử dụng
14
22
 
15
- Sử dụng npm hoặc yarn để cài đặt:
23
+ - Form đăng nhập, đăng tài khoản cần trường nhập mật khẩu tiêu chuẩn
24
+ - Trang đổi mật khẩu cần hiển thị checklist quy tắc bảo mật trực quan
25
+ - Form tạo tài khoản có nút sinh mật khẩu ngẫu nhiên cho admin
26
+ - Bất kỳ trường nhập liệu nào cần giao diện ẩn/hiện mật khẩu nhất quán trong toàn ứng dụng
27
+
28
+ ## Cài đặt
16
29
 
17
30
  ```bash
18
31
  npm install @libs-ui/components-inputs-password
19
32
  ```
20
33
 
21
- ## Cách sử dụng
22
-
23
- ### Import Module
34
+ ## Import
24
35
 
25
36
  ```typescript
26
37
  import { LibsUiComponentsInputsPasswordComponent } from '@libs-ui/components-inputs-password';
38
+ import { IConfig, IContentWhenHiddenOrShowPassword } from '@libs-ui/components-inputs-password';
27
39
 
28
40
  @Component({
29
41
  standalone: true,
30
42
  imports: [LibsUiComponentsInputsPasswordComponent],
31
- // ...
32
43
  })
33
44
  export class YourComponent {}
34
45
  ```
35
46
 
36
- ### Ví dụ bản (Input mật khẩu thông thường)
47
+ ## Ví dụ sử dụng
48
+
49
+ ### 1. Input mật khẩu cơ bản (đăng nhập)
50
+
51
+ ```typescript
52
+ // login.component.ts
53
+ import { LibsUiComponentsInputsPasswordComponent } from '@libs-ui/components-inputs-password';
54
+ import { signal } from '@angular/core';
55
+
56
+ @Component({
57
+ standalone: true,
58
+ imports: [LibsUiComponentsInputsPasswordComponent],
59
+ templateUrl: './login.component.html',
60
+ })
61
+ export class LoginComponent {
62
+ protected loginData = signal<Record<string, string>>({ password: '' });
63
+ }
64
+ ```
37
65
 
38
66
  ```html
67
+ <!-- login.component.html -->
39
68
  <libs_ui-components-inputs-password
40
69
  [fieldNameBind]="'password'"
41
70
  [(item)]="loginData"
42
71
  [isPassword]="true"
43
- [placeholder]="'Nhập mật khẩu của bạn'"></libs_ui-components-inputs-password>
72
+ [placeholder]="'Nhập mật khẩu của bạn'">
73
+ </libs_ui-components-inputs-password>
44
74
  ```
45
75
 
46
- ### dụ nâng cao (Kiểm tra độ mạnh mật khẩu)
76
+ ### 2. Input mật khẩu bảo mật mạnh (đăng / đổi mật khẩu)
77
+
78
+ ```typescript
79
+ // register.component.ts
80
+ import { LibsUiComponentsInputsPasswordComponent, IConfig } from '@libs-ui/components-inputs-password';
81
+ import { signal } from '@angular/core';
82
+
83
+ @Component({
84
+ standalone: true,
85
+ imports: [LibsUiComponentsInputsPasswordComponent],
86
+ templateUrl: './register.component.html',
87
+ })
88
+ export class RegisterComponent {
89
+ protected accountData = signal<Record<string, string>>({ newPassword: '' });
90
+
91
+ readonly secureConfig: IConfig = {
92
+ length_min: 8,
93
+ length_max: 16,
94
+ uppercase: 1,
95
+ lowercase: 1,
96
+ number: 1,
97
+ symbol: 1,
98
+ key: 'all', // phải thỏa mãn toàn bộ quy tắc
99
+ value: '4',
100
+ };
101
+ }
102
+ ```
47
103
 
48
104
  ```html
105
+ <!-- register.component.html -->
49
106
  <libs_ui-components-inputs-password
50
107
  [fieldNameBind]="'newPassword'"
51
108
  [(item)]="accountData"
52
109
  [isPassword]="true"
53
- [config]="passwordSecurityConfig"
54
- [placeholder]="'Tạo mật khẩu mạnh'"></libs_ui-components-inputs-password>
110
+ [config]="secureConfig"
111
+ [placeholder]="'Tối thiểu 8 ký tự, đủ hoa, thường, số, ký tự đặc biệt'">
112
+ </libs_ui-components-inputs-password>
55
113
  ```
56
114
 
115
+ ### 3. Input mật khẩu ở chế độ chỉ đọc (xem thông tin)
116
+
57
117
  ```typescript
58
- passwordSecurityConfig = {
59
- length_min: 8,
118
+ // profile.component.ts
119
+ import { LibsUiComponentsInputsPasswordComponent } from '@libs-ui/components-inputs-password';
120
+ import { signal } from '@angular/core';
121
+
122
+ @Component({
123
+ standalone: true,
124
+ imports: [LibsUiComponentsInputsPasswordComponent],
125
+ templateUrl: './profile.component.html',
126
+ })
127
+ export class ProfileComponent {
128
+ protected profileData = signal<Record<string, string>>({ pass: 'secret123' });
129
+ }
130
+ ```
131
+
132
+ ```html
133
+ <!-- profile.component.html -->
134
+ <libs_ui-components-inputs-password
135
+ [fieldNameBind]="'pass'"
136
+ [(item)]="profileData"
137
+ [readonly]="true"
138
+ [labelConfig]="{ labelLeft: 'Mật khẩu hiện tại' }">
139
+ </libs_ui-components-inputs-password>
140
+ ```
141
+
142
+ ### 4. Kiểm tra hợp lệ từ component cha qua ViewChild
143
+
144
+ ```typescript
145
+ // parent.component.ts
146
+ import { LibsUiComponentsInputsPasswordComponent, IConfig } from '@libs-ui/components-inputs-password';
147
+ import { IInputValidFunctionControlEvent } from '@libs-ui/components-inputs-valid';
148
+ import { signal, viewChild } from '@angular/core';
149
+
150
+ @Component({
151
+ standalone: true,
152
+ imports: [LibsUiComponentsInputsPasswordComponent],
153
+ templateUrl: './parent.component.html',
154
+ })
155
+ export class ParentComponent {
156
+ protected formData = signal<Record<string, string>>({ password: '' });
157
+ private passwordRef = viewChild<LibsUiComponentsInputsPasswordComponent>('passwordRef');
158
+
159
+ protected handlerFunctionsControl(event: IInputValidFunctionControlEvent): void {
160
+ event.stopPropagation();
161
+ // Lưu lại để gọi checkIsValid khi submit
162
+ }
163
+
164
+ protected async handlerSubmit(): Promise<void> {
165
+ const isValid = await this.passwordRef()?.FunctionsControl?.checkIsValid();
166
+ if (!isValid) return;
167
+ // Xử lý submit...
168
+ }
169
+ }
170
+ ```
171
+
172
+ ```html
173
+ <!-- parent.component.html -->
174
+ <libs_ui-components-inputs-password
175
+ #passwordRef
176
+ [fieldNameBind]="'password'"
177
+ [(item)]="formData"
178
+ [isPassword]="true"
179
+ [placeholder]="'Nhập mật khẩu'"
180
+ (outFunctionsControl)="handlerFunctionsControl($event)">
181
+ </libs_ui-components-inputs-password>
182
+
183
+ <button (click)="handlerSubmit()">Xác nhận</button>
184
+ ```
185
+
186
+ ### 5. Cấu hình tùy chọn số quy tắc tối thiểu (không cần thỏa mãn toàn bộ)
187
+
188
+ ```typescript
189
+ // Chỉ cần thỏa mãn ít nhất 2 trong 4 loại ký tự
190
+ readonly flexConfig: IConfig = {
191
+ length_min: 6,
60
192
  length_max: 20,
61
- uppercase: 1, // Ít nhất 1 chữ hoa
62
- number: 1, // Ít nhất 1 chữ số
63
- symbol: 1, // Ít nhất 1 ký tự đặc biệt
64
- key: 'all', // Yêu cầu thỏa mãn tất cả quy tắc
193
+ uppercase: 1,
194
+ lowercase: 1,
195
+ number: 1,
196
+ symbol: 1,
197
+ key: '', // không phải 'all' → dùng value để đếm
198
+ value: '2', // đủ 2 loại ký tự là được
65
199
  };
66
200
  ```
67
201
 
68
- ## API Reference
69
-
70
- ### Inputs
71
-
72
- | Thuộc tính | Kiểu dữ liệu | Mặc định | Mô tả |
73
- | :------------------------------------------ | :--------------------------------- | :----------------------------------------- | :-------------------------------------------------------- |
74
- | `classIncludeInput` | `string` | `undefined` | Class bao ngoài input. |
75
- | `config` | `IConfig` | `defaultConfig()` | Cấu hình các quy tắc bảo mật (độ dài, ký tự đặc biệt...). |
76
- | `configUnitRight` | `IInputValidUnitConfig` | `undefined` | Cấu hình hiển thị đơn vị bên phải. |
77
- | `contentPopoverOverlayIconShowOrHiddenPass` | `IContentWhenHiddenOrShowPassword` | `defaultContentWhenHiddenOrShowPassword()` | Nội dung tooltip khi hover vào icon ẩn/hiện password. |
78
- | `defaultHeight` | `number` | `undefined` | Chiều cao mặc định của input. |
79
- | `fieldNameBind` | `string` | **(Required)** | Tên trường dữ liệu trong object `item` để bind giá trị. |
80
- | `iconLeftClass` | `string` | `undefined` | Class cho icon bên trái. |
81
- | `iconRightClass` | `string` | `undefined` | Class cho icon bên phải. |
82
- | `ignoreWidthInput100` | `boolean` | `undefined` | Không set width 100% cho input. |
83
- | `isPassword` | `boolean` | `false` | Nếu `true`, hiển thị icon ẩn/hiện mật khẩu. |
84
- | `item` | `Record<string, any>` | **(Model)** `{}` | Object chứa dữ liệu nhập liệu. |
85
- | `keySelectedUnitRight` | `unknown` | `undefined` | Key của đơn vị được chọn mặc định bên phải. |
86
- | `labelConfig` | `ILabel` | `undefined` | Cấu hình label cho input. |
87
- | `maxLength` | `number` | `20` | Giới hạn độ dài tối đa của chuỗi nhập vào. |
88
- | `placeholder` | `string` | `undefined` | Văn bản gợi ý trong ô input. |
89
- | `popoverContentIconRight` | `string` | `undefined` | Nội dung popover khi hover/click icon phải. |
90
- | `readonly` | `boolean` | `false` | Chế độ chỉ đọc. |
91
- | `resetAutoCompletePassword` | `boolean` | `undefined` | Tắt tính năng tự động điền mật khẩu của trình duyệt. |
92
- | `unitsRight` | `Array<Record<string, unknown>>` | `undefined` | Danh sách các đơn vị hiển thị bên phải. |
93
- | `validMinLength` | `IValidLength` | `defaultValidMinLength()` | Cấu hình thông báo khi không đủ độ dài tối thiểu. |
94
- | `validPattern` | `Array<IValidPattern>` | `undefined` | Danh sách pattern validation tùy chỉnh. |
95
- | `validRequired` | `IValidRequired` | `defaultValidRequired()` | Cấu hình thông báo khi trường bị bỏ trống. |
96
- | `zIndexPopoverOverlay` | `number` | `undefined` | Z-index của popover overlay. |
97
-
98
- ### Outputs
99
-
100
- | Sự kiện | Kiểu dữ liệu | tả |
101
- | :-------------------- | :-------------------------------- | :-------------------------------------------------------- |
102
- | Sự kiện | Kiểu dữ liệu | tả |
103
- | :-------------------- | :-------------------------------- | :-------------------------------------------------------- |
104
- | `outClickIconRight` | `void` | Phát ra khi click vào icon bên phải (thường icon mắt). |
105
- | `outFunctionsControl` | `IInputValidFunctionControlEvent` | Cung cấp phương thức điều khiển (`checkIsValid`). |
106
- | `outGeneratePassword` | `string` | Phát ra khi một mật khẩu ngẫu nhiên được tạo tự động. |
107
- | `outValueChange` | `string \| number` | Phát ra khi giá trị mật khẩu thay đổi. |
202
+ ```html
203
+ <libs_ui-components-inputs-password
204
+ [fieldNameBind]="'password'"
205
+ [(item)]="formData"
206
+ [isPassword]="true"
207
+ [config]="flexConfig"
208
+ [placeholder]="'Ít nhất 2 trong 4 loại tự'">
209
+ </libs_ui-components-inputs-password>
210
+ ```
211
+
212
+ ## @Input()
213
+
214
+ | Input | Type | Default | tả | dụ |
215
+ |---|---|---|---|---|
216
+ | `fieldNameBind` | `string` | **(Bắt buộc)** | Tên key trong object `item` dùng để bind giá trị | `[fieldNameBind]="'password'"` |
217
+ | `item` | `Record<string, any>` | **(Bắt buộc, model)** | Object chứa dữ liệu nhập liệu, dùng two-way binding | `[(item)]="loginData"` |
218
+ | `isPassword` | `boolean` | `false` | Nếu `true`, hiển thị icon mắt để ẩn/hiện mật khẩu và mặc định type là `password` | `[isPassword]="true"` |
219
+ | `config` | `IConfig` | `defaultConfig()` | Cấu hình quy tắc bảo mật: độ dài, số lượng từng loại ký tự, chế độ kiểm tra | `[config]="secureConfig"` |
220
+ | `classIncludeInput` | `string` | `undefined` | Class CSS bổ sung cho wrapper bao ngoài input | `[classIncludeInput]="'mt-4'"` |
221
+ | `configUnitRight` | `IInputValidUnitConfig` | `undefined` | Cấu hình hiển thị đơn vị bên phải input | `[configUnitRight]="unitConfig"` |
222
+ | `contentPopoverOverlayIconShowOrHiddenPass` | `IContentWhenHiddenOrShowPassword` | `defaultContentWhenHiddenOrShowPassword()` | Nội dung tooltip hiển thị khi hover icon ẩn/hiện mật khẩu | `[contentPopoverOverlayIconShowOrHiddenPass]="{ show: 'Hiện', hidden: 'Ẩn' }"` |
223
+ | `defaultHeight` | `number` | `undefined` | Chiều cao mặc định (px) của input | `[defaultHeight]="40"` |
224
+ | `iconLeftClass` | `string` | `undefined` (model) | Class icon hiển thị bên trái input | `[(iconLeftClass)]="leftIcon"` |
225
+ | `iconRightClass` | `string` | Auto khi `isPassword=true` (model) | Class icon hiển thị bên phải input. Tự động set icon mắt khi `isPassword=true` | `[(iconRightClass)]="rightIcon"` |
226
+ | `ignoreWidthInput100` | `boolean` | `undefined` | Khi `true`, input không chiếm 100% chiều rộng | `[ignoreWidthInput100]="true"` |
227
+ | `keySelectedUnitRight` | `unknown` | `undefined` | Key của đơn vị mặc định được chọn bên phải | `[keySelectedUnitRight]="'vnd'"` |
228
+ | `labelConfig` | `ILabel` | `undefined` | Cấu hình label hiển thị trên hoặc bên trái input | `[labelConfig]="{ labelLeft: 'Mật khẩu' }"` |
229
+ | `maxLength` | `number` | `20` | Giới hạn số tự tối đa người dùng có thể nhập | `[maxLength]="32"` |
230
+ | `placeholder` | `string` | `undefined` | Văn bản gợi ý hiển thị khi input rỗng | `[placeholder]="'Nhập mật khẩu'"` |
231
+ | `popoverContentIconRight` | `string` | `undefined` | Nội dung tooltip hiển thị khi hover/click icon bên phải | `[popoverContentIconRight]="'Tạo mật khẩu'"` |
232
+ | `readonly` | `boolean` | `undefined` | Khi `true`, input chỉ hiển thị, không cho phép chỉnh sửa | `[readonly]="true"` |
233
+ | `resetAutoCompletePassword` | `boolean` | `undefined` | Khi `true`, vô hiệu hóa tính năng tự động điền mật khẩu của trình duyệt | `[resetAutoCompletePassword]="true"` |
234
+ | `typeInput` | `TYPE_INPUT` | `undefined` (model) | Kiểu input (`'text'` hoặc `'password'`), tự chuyển đổi khi click icon mắt | `[(typeInput)]="inputType"` |
235
+ | `unitsRight` | `Array<Record<string, unknown>>` | `undefined` | Danh sách các tùy chọn đơn vị hiển thị ở bên phải input | `[unitsRight]="currencyList"` |
236
+ | `validMinLength` | `IValidLength` | `defaultValidMinLength()` | Cấu hình thông báo lỗi khi mật khẩu chưa đủ độ dài tối thiểu | `[validMinLength]="{ length: 8, message: 'i18n_min_8' }"` |
237
+ | `validPattern` | `Array<IValidPattern>` | `undefined` | Danh sách các pattern regex validation tùy chỉnh bổ sung | `[validPattern]="customPatterns"` |
238
+ | `validRequired` | `IValidRequired` | `defaultValidRequired()` | Cấu hình validation khi trường bị để trống | `[validRequired]="{ isRequired: true, message: 'i18n_required' }"` |
239
+ | `zIndexPopoverOverlay` | `number` | `undefined` | Z-index của lớp overlay popover (dùng khi bị che bởi modal/dialog) | `[zIndexPopoverOverlay]="1050"` |
240
+
241
+ ## @Output()
242
+
243
+ | Output | Type | Mô tả | Handler TS | Binding HTML |
244
+ |---|---|---|---|---|
245
+ | `(outClickIconRight)` | `void` | Phát ra khi người dùng click vào icon bên phải | `handlerClickIconRight(): void { event.stopPropagation(); }` | `(outClickIconRight)="handlerClickIconRight()"` |
246
+ | `(outFunctionsControl)` | `IInputValidFunctionControlEvent` | Cung cấp đối tượng điều khiển gồm `checkIsValid()` để validate từ bên ngoài | `handlerFunctionsControl(e: IInputValidFunctionControlEvent): void { e.stopPropagation(); this.controlRef = e; }` | `(outFunctionsControl)="handlerFunctionsControl($event)"` |
247
+ | `(outGeneratePassword)` | `string` | Phát ra mật khẩu ngẫu nhiên vừa được sinh ra | `handlerGeneratePassword(pass: string): void { event.stopPropagation(); console.log(pass); }` | `(outGeneratePassword)="handlerGeneratePassword($event)"` |
248
+ | `(outValueChange)` | `string \| number` | Phát ra giá trị mật khẩu mỗi khi người dùng nhập liệu | `handlerValueChange(value: string \| number): void { event.stopPropagation(); }` | `(outValueChange)="handlerValueChange($event)"` |
108
249
 
109
250
  ## Types & Interfaces
110
251
 
111
252
  ```typescript
112
- export interface IConfig {
113
- length_max: number;
114
- length_min: number;
115
- uppercase: number;
116
- lowercase: number;
117
- symbol: number;
118
- number: number;
119
- key: string; // 'all' hoặc các giá trị khác để xác định mức độ ưu tiên
120
- value: string; // Số lượng quy tắc cần thỏa mãn nếu key không phải 'all'
253
+ import { IConfig, IContentWhenHiddenOrShowPassword } from '@libs-ui/components-inputs-password';
254
+ ```
255
+
256
+ ### IConfig
257
+
258
+ Cấu hình quy tắc bảo mật mật khẩu:
259
+
260
+ ```typescript
261
+ interface IConfig {
262
+ length_min: number; // Độ dài tối thiểu (default: 4)
263
+ length_max: number; // Độ dài tối đa (default: 20)
264
+ uppercase: number; // Số chữ hoa tối thiểu (0 = không yêu cầu)
265
+ lowercase: number; // Số chữ thường tối thiểu (0 = không yêu cầu)
266
+ number: number; // Số chữ số tối thiểu (0 = không yêu cầu)
267
+ symbol: number; // Số ký tự đặc biệt tối thiểu (0 = không yêu cầu)
268
+ key: string; // 'all' = phải thỏa mãn tất cả loại, '' = dùng value
269
+ value: string; // Số lượng loại ký tự cần thỏa mãn (khi key !== 'all')
121
270
  }
271
+ ```
122
272
 
123
- export interface IValidStatus {
124
- upper?: boolean;
125
- number?: boolean;
126
- lower?: boolean;
127
- symbol?: boolean;
128
- length_max?: boolean;
129
- length_min?: boolean;
273
+ **Giá trị mặc định (`defaultConfig()`):**
274
+
275
+ ```typescript
276
+ {
277
+ length_max: 20,
278
+ length_min: 4,
279
+ uppercase: 0,
280
+ lowercase: 0,
281
+ symbol: 0,
282
+ key: '',
283
+ number: 0,
284
+ value: '0',
130
285
  }
286
+ ```
287
+
288
+ **Ví dụ cấu hình phổ biến:**
289
+
290
+ ```typescript
291
+ // Mật khẩu mạnh — bắt buộc đủ 4 loại ký tự
292
+ const strongConfig: IConfig = {
293
+ length_min: 8,
294
+ length_max: 20,
295
+ uppercase: 1,
296
+ lowercase: 1,
297
+ number: 1,
298
+ symbol: 1,
299
+ key: 'all',
300
+ value: '4',
301
+ };
131
302
 
132
- export interface IContentWhenHiddenOrShowPassword {
133
- show: string;
134
- hidden: string;
303
+ // Mật khẩu trung bình — chỉ cần 2 trong 4 loại
304
+ const mediumConfig: IConfig = {
305
+ length_min: 6,
306
+ length_max: 20,
307
+ uppercase: 1,
308
+ lowercase: 1,
309
+ number: 1,
310
+ symbol: 1,
311
+ key: '',
312
+ value: '2',
313
+ };
314
+
315
+ // Chỉ kiểm tra độ dài, không giới hạn ký tự
316
+ const lengthOnlyConfig: IConfig = {
317
+ length_min: 8,
318
+ length_max: 32,
319
+ uppercase: 0,
320
+ lowercase: 0,
321
+ number: 0,
322
+ symbol: 0,
323
+ key: '',
324
+ value: '0',
325
+ };
326
+ ```
327
+
328
+ ### IContentWhenHiddenOrShowPassword
329
+
330
+ Nội dung tooltip cho icon ẩn/hiện mật khẩu:
331
+
332
+ ```typescript
333
+ interface IContentWhenHiddenOrShowPassword {
334
+ show: string; // Tooltip khi mật khẩu đang bị ẩn (icon mắt mở)
335
+ hidden: string; // Tooltip khi mật khẩu đang hiện (icon mắt gạch)
135
336
  }
337
+
338
+ // Giá trị mặc định (dùng i18n key):
339
+ const defaultContent: IContentWhenHiddenOrShowPassword = {
340
+ show: 'i18n_show',
341
+ hidden: 'i18n_hidden',
342
+ };
136
343
  ```
137
344
 
138
- ## Tech Stack
345
+ ### IValidStatus (internal)
139
346
 
140
- - **Framework**: Angular 18+
141
- - **I18n**: `@ngx-translate/core`
142
- - **Validation**: `@libs-ui/components-inputs-valid`
143
- - **Styling**: Vanilla SCSS + Tailwind CSS class support
347
+ Trạng thái kiểm tra từng quy tắc bảo mật — dùng nội bộ để render checklist:
144
348
 
145
- ## License
349
+ ```typescript
350
+ interface IValidStatus {
351
+ upper?: boolean; // Đủ chữ hoa
352
+ number?: boolean; // Đủ chữ số
353
+ lower?: boolean; // Đủ chữ thường
354
+ symbol?: boolean; // Đủ ký tự đặc biệt
355
+ numberOfChar?: boolean; // Đủ số loại ký tự
356
+ length_max?: boolean; // Không vượt quá độ dài tối đa
357
+ length_min?: boolean; // Đạt độ dài tối thiểu
358
+ }
359
+ ```
360
+
361
+ ## FunctionsControl (Getter API)
362
+
363
+ Component expose getter `FunctionsControl` để component cha có thể gọi `checkIsValid()` qua ViewChild:
364
+
365
+ ```typescript
366
+ // Định nghĩa trong component:
367
+ get FunctionsControl(): IInputValidFunctionControlEvent | undefined
368
+
369
+ // Trong IInputValidFunctionControlEvent:
370
+ interface IInputValidFunctionControlEvent {
371
+ checkIsValid: () => Promise<boolean>;
372
+ }
373
+ ```
374
+
375
+ **Ví dụ sử dụng từ component cha:**
376
+
377
+ ```typescript
378
+ // parent.component.ts
379
+ import { LibsUiComponentsInputsPasswordComponent } from '@libs-ui/components-inputs-password';
380
+ import { viewChild } from '@angular/core';
381
+
382
+ export class ParentComponent {
383
+ private passwordRef = viewChild<LibsUiComponentsInputsPasswordComponent>('passwordRef');
384
+
385
+ protected async handlerSubmit(): Promise<void> {
386
+ const isValid = await this.passwordRef()?.FunctionsControl?.checkIsValid();
387
+ if (!isValid) return;
388
+ // Tiến hành submit...
389
+ }
390
+ }
391
+ ```
392
+
393
+ ```html
394
+ <libs_ui-components-inputs-password
395
+ #passwordRef
396
+ [fieldNameBind]="'password'"
397
+ [(item)]="formData"
398
+ [isPassword]="true">
399
+ </libs_ui-components-inputs-password>
400
+ ```
401
+
402
+ ## Lưu ý quan trọng
403
+
404
+ ⚠️ **fieldNameBind phải khớp với key trong item**: Nếu `fieldNameBind="'password'"` thì object `item` phải có key `password`. Sai tên key sẽ khiến validation và generate password không hoạt động.
405
+
406
+ ⚠️ **isPassword mặc định là false**: Nếu không truyền `[isPassword]="true"`, icon mắt sẽ không hiển thị và input sẽ render dưới dạng text thông thường thay vì password.
407
+
408
+ ⚠️ **config.key = 'all' yêu cầu thỏa mãn toàn bộ**: Khi `key: 'all'`, tất cả các loại ký tự có số lượng > 0 đều phải đáp ứng. Nếu chỉ cần thỏa mãn một phần, đặt `key: ''` và dùng `value` để chỉ định số lượng tối thiểu.
409
+
410
+ ⚠️ **validRequired mặc định isRequired = true**: Component mặc định kiểm tra trường bắt buộc. Nếu trường không bắt buộc, truyền `[validRequired]="{ isRequired: false, message: '' }"`.
411
+
412
+ ⚠️ **Generate password dựa trên config**: Chức năng tự sinh mật khẩu chỉ hoạt động đúng khi label config có nút "Generate" (`outClickButtonLabel`) được kích hoạt từ `LibsUiComponentsInputsValidComponent`. Mật khẩu sinh ra sẽ tự điền vào `item[fieldNameBind]`.
413
+
414
+ ⚠️ **Ký tự đặc biệt được hỗ trợ**: Bộ ký tự đặc biệt mặc định gồm: `~\`!@#$%^&*()_=+}{";:.,?|/<>-`. Không hỗ trợ tùy chỉnh bộ ký tự này.
415
+
416
+ ## Demo
417
+
418
+ ```bash
419
+ npx nx serve core-ui
420
+ ```
146
421
 
147
- MIT
422
+ Truy cập: http://localhost:4500/components/inputs/password
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, model, input, output, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { signal, model, input, output, Component, ChangeDetectionStrategy } from '@angular/core';
3
3
  import { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';
4
4
  import { set } from '@libs-ui/utils';
5
5
  import * as i1 from '@ngx-translate/core';
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-components-inputs-password.mjs","sources":["../../../../../../libs-ui/components/inputs/password/src/utils/password.ts","../../../../../../libs-ui/components/inputs/password/src/inputs-password.component.ts","../../../../../../libs-ui/components/inputs/password/src/inputs-password.component.html","../../../../../../libs-ui/components/inputs/password/src/libs-ui-components-inputs-password.ts"],"sourcesContent":["import { IValidLength, IValidRequired } from '@libs-ui/components-inputs-valid';\nimport { ICharacter, IConfig, IContentWhenHiddenOrShowPassword, IValidStatus } from '../interfaces/password.interface';\n\nexport const getValidStatus = (status: boolean): IValidStatus => {\n return {\n length_min: status,\n length_max: status,\n upper: status,\n lower: status,\n number: status,\n numberOfChar: status,\n symbol: status,\n };\n};\n\nexport const getCharacter = (): ICharacter => {\n return {\n numberCharacter: '0123456789',\n upperCharacter: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n lowerCharacter: 'abcdefghijklmnopqrstuvwxyz',\n specialCharacter: '~`!@#$%^&*()_=+}{\";:.,?|/<>-',\n };\n};\n\nexport const defaultConfig = (): IConfig => {\n return {\n length_max: 20,\n length_min: 4,\n uppercase: 0,\n lowercase: 0,\n symbol: 0,\n key: '',\n number: 0,\n value: '0',\n };\n};\n\nexport const defaultContentWhenHiddenOrShowPassword = (): IContentWhenHiddenOrShowPassword => {\n return {\n show: 'i18n_show',\n hidden: 'i18n_hidden',\n };\n};\n\nexport const defaultValidRequired = (): IValidRequired => {\n return {\n isRequired: true,\n message: 'i18n_password_is_required',\n };\n};\n\nexport const defaultValidMinLength = (): IValidLength => {\n return {\n length: 4,\n message: 'i18n_password_min_length',\n interpolateParams: { length: 4 },\n };\n};\n","import { ChangeDetectionStrategy, Component, input, model, OnInit, output, signal } from '@angular/core';\nimport { IInputValidFunctionControlEvent, IInputValidUnitConfig, IValidLength, IValidPattern, IValidRequired, LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';\nimport { ILabel } from '@libs-ui/components-label';\nimport { set } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ICharacter, IConfig, IContentWhenHiddenOrShowPassword, IValidStatus } from './interfaces/password.interface';\nimport { defaultConfig, defaultContentWhenHiddenOrShowPassword, defaultValidMinLength, defaultValidRequired, getCharacter, getValidStatus } from './utils/password';\nimport { TYPE_INPUT } from '@libs-ui/components-inputs-input';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-password',\n templateUrl: './inputs-password.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, LibsUiComponentsInputsValidComponent],\n})\nexport class LibsUiComponentsInputsPasswordComponent implements OnInit {\n // #region PROPERTY\n protected validStatus = signal<IValidStatus>(getValidStatus(false));\n protected validCharacters = signal<boolean>(false);\n\n private readonly character = signal<ICharacter>(getCharacter());\n private readonly inputValidFunctionControl = signal<IInputValidFunctionControlEvent | undefined>(undefined);\n\n // #region INPUT\n readonly typeInput = model<TYPE_INPUT>();\n readonly config = input<IConfig, IConfig | undefined>(defaultConfig(), { transform: (value) => value ?? defaultConfig() });\n readonly isPassword = input<boolean>(false);\n readonly readonly = input<boolean>();\n readonly labelConfig = input<ILabel>();\n readonly placeholder = input<string>();\n readonly iconLeftClass = model<string>();\n readonly iconRightClass = model<string>();\n readonly popoverContentIconRight = input<string>();\n readonly zIndexPopoverOverlay = input<number>();\n readonly item = model.required<Record<string, any>>({});\n readonly fieldNameBind = input.required<string>();\n readonly unitsRight = input<Array<Record<string, unknown>>>();\n readonly configUnitRight = input<IInputValidUnitConfig>();\n readonly keySelectedUnitRight = input<unknown>();\n readonly classIncludeInput = input<string>();\n readonly ignoreWidthInput100 = input<boolean>();\n readonly contentPopoverOverlayIconShowOrHiddenPass = input<IContentWhenHiddenOrShowPassword, IContentWhenHiddenOrShowPassword | undefined>(defaultContentWhenHiddenOrShowPassword(), {\n transform: (value) => value ?? defaultContentWhenHiddenOrShowPassword(),\n });\n readonly maxLength = input<number>(20);\n readonly validRequired = input<IValidRequired, IValidRequired | undefined>(defaultValidRequired(), { transform: (value) => value ?? defaultValidRequired() });\n readonly validMinLength = input<IValidLength, IValidLength | undefined>(defaultValidMinLength(), { transform: (value) => value ?? defaultValidMinLength() });\n readonly validPattern = input<Array<IValidPattern>>();\n readonly defaultHeight = input<number>();\n readonly resetAutoCompletePassword = input<boolean>();\n\n // #region OUTPUT\n readonly outGeneratePassword = output<string>();\n readonly outClickIconRight = output<void>();\n readonly outValueChange = output<string | number>();\n readonly outFunctionsControl = output<IInputValidFunctionControlEvent>();\n\n ngOnInit() {\n if (this.isPassword()) {\n this.iconRightClass.set('libs-ui-icon-eye-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n }\n }\n\n /* FUNCTIONS */\n private async setValidStatus(status: boolean) {\n this.validCharacters.set(status);\n this.validStatus.set(getValidStatus(status));\n }\n\n protected async handlerFunctionControl(event: IInputValidFunctionControlEvent) {\n this.inputValidFunctionControl.set(event);\n this.outFunctionsControl.emit({ ...event, checkIsValid: async () => (await event.checkIsValid()) && (await this.checkValid()) });\n }\n\n public get FunctionsControl(): IInputValidFunctionControlEvent | undefined {\n return this.inputValidFunctionControl();\n }\n\n protected async handleValueChange(value: string | number) {\n this.checkValid();\n this.outValueChange.emit(value);\n }\n\n protected async checkValid() {\n const password = this.item()[this.fieldNameBind()] as string;\n this.setValidStatus(false);\n if (!password) {\n return true;\n }\n const length = password.length;\n if (length > this.config().length_max) {\n this.validStatus().length_max = false;\n }\n if (length > 0) {\n this.validStatus().length_max = true;\n }\n if (length >= this.config().length_min) {\n this.validStatus().length_min = true;\n }\n let symbol = 0,\n number = 0,\n upper = 0,\n lower = 0,\n total = 0;\n for (let i = 0; i < length; i++) {\n if (this.character().numberCharacter.includes(password.charAt(i))) {\n number++;\n }\n if (this.character().upperCharacter.includes(password.charAt(i))) {\n upper++;\n }\n if (this.character().lowerCharacter.includes(password.charAt(i))) {\n lower++;\n }\n if (this.character().specialCharacter.includes(password.charAt(i))) {\n symbol++;\n }\n }\n if (number >= this.config().number || !this.config().number) {\n this.validStatus().number = true;\n if (this.config().number) {\n total++;\n }\n }\n if (upper >= this.config().uppercase || !this.config().uppercase) {\n this.validStatus().upper = true;\n if (this.config().uppercase) {\n total++;\n }\n }\n if (lower >= this.config().lowercase || !this.config().lowercase) {\n this.validStatus().lower = true;\n if (this.config().lowercase) {\n total++;\n }\n }\n if (symbol >= this.config().symbol || !this.config().symbol) {\n this.validStatus().symbol = true;\n if (this.config().symbol) {\n total++;\n }\n }\n switch (this.config().key) {\n case 'all':\n if (this.validStatus().symbol && this.validStatus().lower && this.validStatus().upper && this.validStatus().number) {\n this.validCharacters.set(true);\n }\n break;\n default:\n if (total >= +this.config().value) {\n this.validCharacters.set(true);\n }\n break;\n }\n if (!this.validCharacters() || !this.validStatus().length_min || !this.validStatus().length_max) {\n this.validStatus.update((value) => ({ ...value }));\n return false;\n }\n this.validStatus.update((value) => ({ ...value }));\n return true;\n }\n\n protected async handleClickIconRight() {\n this.outClickIconRight.emit();\n if (this.isPassword()) {\n this.typeInput.update((value) => (value === 'password' ? 'text' : 'password'));\n if (this.typeInput() !== 'password') {\n this.iconRightClass.set('libs-ui-icon-eye-slash-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n return;\n }\n this.iconRightClass.set('libs-ui-icon-eye-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n }\n }\n\n protected async handlerGeneratePassword() {\n const words: Array<string> = [];\n if (this.config().number) {\n this.randomIndex(this.config().number, this.character().numberCharacter, words);\n }\n if (this.config().uppercase) {\n this.randomIndex(this.config().uppercase, this.character().upperCharacter, words);\n }\n if (this.config().lowercase) {\n this.randomIndex(this.config().lowercase, this.character().lowerCharacter, words);\n }\n if (this.config().symbol) {\n this.randomIndex(this.config().symbol, this.character().specialCharacter, words);\n }\n const length = +this.config().length_min + Math.floor((+this.config().length_max - +this.config().length_min) / 2) - words.length;\n if (length > 0) {\n this.randomIndex(length, this.character().lowerCharacter, words);\n }\n set(this.item, this.fieldNameBind(), words.join(''));\n this.inputValidFunctionControl()?.checkIsValid();\n this.outGeneratePassword.emit(words.join(''));\n this.setValidStatus(true);\n }\n\n protected async randomIndex(number: number, character: string, words: Array<string>) {\n for (let i = 1; i <= number; i++) {\n const randomIndex = Math.floor(Math.random() * character.length);\n words.push(character[randomIndex]);\n }\n }\n}\n","<libs_ui-components-inputs-valid\n [(item)]=\"item\"\n [labelConfig]=\"labelConfig()\"\n [fieldNameBind]=\"fieldNameBind()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validPattern]=\"validPattern()\"\n [dataType]=\"'string'\"\n [typeInput]=\"typeInput()\"\n [iconRightClass]=\"iconRightClass()\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [maxLength]=\"maxLength()\"\n [readonly]=\"readonly()\"\n [defaultHeight]=\"defaultHeight()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [popoverContentIconRight]=\"typeInput() === 'password' ? contentPopoverOverlayIconShowOrHiddenPass().show : contentPopoverOverlayIconShowOrHiddenPass().hidden\"\n [placeholder]=\"placeholder()\"\n [unitsRight]=\"unitsRight()\"\n [configUnitRight]=\"configUnitRight()\"\n [keySelectedUnitRight]=\"keySelectedUnitRight()\"\n [zIndexPopoverContent]=\"zIndexPopoverOverlay()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n (outClickButtonLabel)=\"handlerGeneratePassword()\"\n (outValueChange)=\"handleValueChange($event)\"\n (outIconRight)=\"handleClickIconRight()\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\" />\n<ng-content select=\".libs-ui-inputs-password-content-custom\"></ng-content>\n<div class=\"mt-[8px]\">\n <div\n class=\"flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_min\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_minimum_length_number' | translate: { number: config().length_min } }}</span>\n </div>\n <div\n class=\"pt-[4px] flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_max\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_maximum_length_number' | translate: { number: config().length_max } }}</span>\n </div>\n @if (config().uppercase || config().lowercase || config().number || config().symbol) {\n <div\n class=\"mt-[4px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\">\n <div class=\"flex items-center\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validCharacters()\"></i>\n @if (config().key === 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_all_types_of_characters_below' | translate }}</span>\n }\n @if (config().key !== 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_number_types_of_characters_below' | translate: { number: config().value } }}</span>\n }\n </div>\n @if (config().uppercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().upper\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().upper\">\n {{ 'i18n_uppercase_minimum' | translate: { number: config().uppercase } }}\n </div>\n }\n @if (config().lowercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().lower\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().lower\">\n {{ 'i18n_lowercase_minimum' | translate: { number: config().lowercase } }}\n </div>\n }\n @if (config().number) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().number\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().number\">\n {{ 'i18n_number_minimum' | translate: { number: config().number } }}\n </div>\n }\n @if (config().symbol) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().symbol\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().symbol\">\n {{ 'i18n_symbol_minimum' | translate: { number: config().symbol } }}\n </div>\n }\n </div>\n }\n</div>\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-password.mjs","sources":["../../../../../../libs-ui/components/inputs/password/src/utils/password.ts","../../../../../../libs-ui/components/inputs/password/src/inputs-password.component.ts","../../../../../../libs-ui/components/inputs/password/src/inputs-password.component.html","../../../../../../libs-ui/components/inputs/password/src/libs-ui-components-inputs-password.ts"],"sourcesContent":["import { IValidLength, IValidRequired } from '@libs-ui/components-inputs-valid';\nimport { ICharacter, IConfig, IContentWhenHiddenOrShowPassword, IValidStatus } from '../interfaces/password.interface';\n\nexport const getValidStatus = (status: boolean): IValidStatus => {\n return {\n length_min: status,\n length_max: status,\n upper: status,\n lower: status,\n number: status,\n numberOfChar: status,\n symbol: status,\n };\n};\n\nexport const getCharacter = (): ICharacter => {\n return {\n numberCharacter: '0123456789',\n upperCharacter: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n lowerCharacter: 'abcdefghijklmnopqrstuvwxyz',\n specialCharacter: '~`!@#$%^&*()_=+}{\";:.,?|/<>-',\n };\n};\n\nexport const defaultConfig = (): IConfig => {\n return {\n length_max: 20,\n length_min: 4,\n uppercase: 0,\n lowercase: 0,\n symbol: 0,\n key: '',\n number: 0,\n value: '0',\n };\n};\n\nexport const defaultContentWhenHiddenOrShowPassword = (): IContentWhenHiddenOrShowPassword => {\n return {\n show: 'i18n_show',\n hidden: 'i18n_hidden',\n };\n};\n\nexport const defaultValidRequired = (): IValidRequired => {\n return {\n isRequired: true,\n message: 'i18n_password_is_required',\n };\n};\n\nexport const defaultValidMinLength = (): IValidLength => {\n return {\n length: 4,\n message: 'i18n_password_min_length',\n interpolateParams: { length: 4 },\n };\n};\n","import { ChangeDetectionStrategy, Component, input, model, OnInit, output, signal } from '@angular/core';\nimport { IInputValidFunctionControlEvent, IInputValidUnitConfig, IValidLength, IValidPattern, IValidRequired, LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';\nimport { ILabel } from '@libs-ui/components-label';\nimport { set } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ICharacter, IConfig, IContentWhenHiddenOrShowPassword, IValidStatus } from './interfaces/password.interface';\nimport { defaultConfig, defaultContentWhenHiddenOrShowPassword, defaultValidMinLength, defaultValidRequired, getCharacter, getValidStatus } from './utils/password';\nimport { TYPE_INPUT } from '@libs-ui/components-inputs-input';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-password',\n templateUrl: './inputs-password.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, LibsUiComponentsInputsValidComponent],\n})\nexport class LibsUiComponentsInputsPasswordComponent implements OnInit {\n // #region PROPERTY\n protected validStatus = signal<IValidStatus>(getValidStatus(false));\n protected validCharacters = signal<boolean>(false);\n\n private readonly character = signal<ICharacter>(getCharacter());\n private readonly inputValidFunctionControl = signal<IInputValidFunctionControlEvent | undefined>(undefined);\n\n // #region INPUT\n readonly typeInput = model<TYPE_INPUT>();\n readonly config = input<IConfig, IConfig | undefined>(defaultConfig(), { transform: (value) => value ?? defaultConfig() });\n readonly isPassword = input<boolean>(false);\n readonly readonly = input<boolean>();\n readonly labelConfig = input<ILabel>();\n readonly placeholder = input<string>();\n readonly iconLeftClass = model<string>();\n readonly iconRightClass = model<string>();\n readonly popoverContentIconRight = input<string>();\n readonly zIndexPopoverOverlay = input<number>();\n readonly item = model.required<Record<string, any>>({});\n readonly fieldNameBind = input.required<string>();\n readonly unitsRight = input<Array<Record<string, unknown>>>();\n readonly configUnitRight = input<IInputValidUnitConfig>();\n readonly keySelectedUnitRight = input<unknown>();\n readonly classIncludeInput = input<string>();\n readonly ignoreWidthInput100 = input<boolean>();\n readonly contentPopoverOverlayIconShowOrHiddenPass = input<IContentWhenHiddenOrShowPassword, IContentWhenHiddenOrShowPassword | undefined>(defaultContentWhenHiddenOrShowPassword(), {\n transform: (value) => value ?? defaultContentWhenHiddenOrShowPassword(),\n });\n readonly maxLength = input<number>(20);\n readonly validRequired = input<IValidRequired, IValidRequired | undefined>(defaultValidRequired(), { transform: (value) => value ?? defaultValidRequired() });\n readonly validMinLength = input<IValidLength, IValidLength | undefined>(defaultValidMinLength(), { transform: (value) => value ?? defaultValidMinLength() });\n readonly validPattern = input<Array<IValidPattern>>();\n readonly defaultHeight = input<number>();\n readonly resetAutoCompletePassword = input<boolean>();\n\n // #region OUTPUT\n readonly outGeneratePassword = output<string>();\n readonly outClickIconRight = output<void>();\n readonly outValueChange = output<string | number>();\n readonly outFunctionsControl = output<IInputValidFunctionControlEvent>();\n\n ngOnInit() {\n if (this.isPassword()) {\n this.iconRightClass.set('libs-ui-icon-eye-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n }\n }\n\n /* FUNCTIONS */\n private async setValidStatus(status: boolean) {\n this.validCharacters.set(status);\n this.validStatus.set(getValidStatus(status));\n }\n\n protected async handlerFunctionControl(event: IInputValidFunctionControlEvent) {\n this.inputValidFunctionControl.set(event);\n this.outFunctionsControl.emit({ ...event, checkIsValid: async () => (await event.checkIsValid()) && (await this.checkValid()) });\n }\n\n public get FunctionsControl(): IInputValidFunctionControlEvent | undefined {\n return this.inputValidFunctionControl();\n }\n\n protected async handleValueChange(value: string | number) {\n this.checkValid();\n this.outValueChange.emit(value);\n }\n\n protected async checkValid() {\n const password = this.item()[this.fieldNameBind()] as string;\n this.setValidStatus(false);\n if (!password) {\n return true;\n }\n const length = password.length;\n if (length > this.config().length_max) {\n this.validStatus().length_max = false;\n }\n if (length > 0) {\n this.validStatus().length_max = true;\n }\n if (length >= this.config().length_min) {\n this.validStatus().length_min = true;\n }\n let symbol = 0,\n number = 0,\n upper = 0,\n lower = 0,\n total = 0;\n for (let i = 0; i < length; i++) {\n if (this.character().numberCharacter.includes(password.charAt(i))) {\n number++;\n }\n if (this.character().upperCharacter.includes(password.charAt(i))) {\n upper++;\n }\n if (this.character().lowerCharacter.includes(password.charAt(i))) {\n lower++;\n }\n if (this.character().specialCharacter.includes(password.charAt(i))) {\n symbol++;\n }\n }\n if (number >= this.config().number || !this.config().number) {\n this.validStatus().number = true;\n if (this.config().number) {\n total++;\n }\n }\n if (upper >= this.config().uppercase || !this.config().uppercase) {\n this.validStatus().upper = true;\n if (this.config().uppercase) {\n total++;\n }\n }\n if (lower >= this.config().lowercase || !this.config().lowercase) {\n this.validStatus().lower = true;\n if (this.config().lowercase) {\n total++;\n }\n }\n if (symbol >= this.config().symbol || !this.config().symbol) {\n this.validStatus().symbol = true;\n if (this.config().symbol) {\n total++;\n }\n }\n switch (this.config().key) {\n case 'all':\n if (this.validStatus().symbol && this.validStatus().lower && this.validStatus().upper && this.validStatus().number) {\n this.validCharacters.set(true);\n }\n break;\n default:\n if (total >= +this.config().value) {\n this.validCharacters.set(true);\n }\n break;\n }\n if (!this.validCharacters() || !this.validStatus().length_min || !this.validStatus().length_max) {\n this.validStatus.update((value) => ({ ...value }));\n return false;\n }\n this.validStatus.update((value) => ({ ...value }));\n return true;\n }\n\n protected async handleClickIconRight() {\n this.outClickIconRight.emit();\n if (this.isPassword()) {\n this.typeInput.update((value) => (value === 'password' ? 'text' : 'password'));\n if (this.typeInput() !== 'password') {\n this.iconRightClass.set('libs-ui-icon-eye-slash-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n return;\n }\n this.iconRightClass.set('libs-ui-icon-eye-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n }\n }\n\n protected async handlerGeneratePassword() {\n const words: Array<string> = [];\n if (this.config().number) {\n this.randomIndex(this.config().number, this.character().numberCharacter, words);\n }\n if (this.config().uppercase) {\n this.randomIndex(this.config().uppercase, this.character().upperCharacter, words);\n }\n if (this.config().lowercase) {\n this.randomIndex(this.config().lowercase, this.character().lowerCharacter, words);\n }\n if (this.config().symbol) {\n this.randomIndex(this.config().symbol, this.character().specialCharacter, words);\n }\n const length = +this.config().length_min + Math.floor((+this.config().length_max - +this.config().length_min) / 2) - words.length;\n if (length > 0) {\n this.randomIndex(length, this.character().lowerCharacter, words);\n }\n set(this.item, this.fieldNameBind(), words.join(''));\n this.inputValidFunctionControl()?.checkIsValid();\n this.outGeneratePassword.emit(words.join(''));\n this.setValidStatus(true);\n }\n\n protected async randomIndex(number: number, character: string, words: Array<string>) {\n for (let i = 1; i <= number; i++) {\n const randomIndex = Math.floor(Math.random() * character.length);\n words.push(character[randomIndex]);\n }\n }\n}\n","<libs_ui-components-inputs-valid\n [(item)]=\"item\"\n [labelConfig]=\"labelConfig()\"\n [fieldNameBind]=\"fieldNameBind()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validPattern]=\"validPattern()\"\n [dataType]=\"'string'\"\n [typeInput]=\"typeInput()\"\n [iconRightClass]=\"iconRightClass()\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [maxLength]=\"maxLength()\"\n [readonly]=\"readonly()\"\n [defaultHeight]=\"defaultHeight()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [popoverContentIconRight]=\"typeInput() === 'password' ? contentPopoverOverlayIconShowOrHiddenPass().show : contentPopoverOverlayIconShowOrHiddenPass().hidden\"\n [placeholder]=\"placeholder()\"\n [unitsRight]=\"unitsRight()\"\n [configUnitRight]=\"configUnitRight()\"\n [keySelectedUnitRight]=\"keySelectedUnitRight()\"\n [zIndexPopoverContent]=\"zIndexPopoverOverlay()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n (outClickButtonLabel)=\"handlerGeneratePassword()\"\n (outValueChange)=\"handleValueChange($event)\"\n (outIconRight)=\"handleClickIconRight()\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\" />\n<ng-content select=\".libs-ui-inputs-password-content-custom\"></ng-content>\n<div class=\"mt-[8px]\">\n <div\n class=\"flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_min\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_minimum_length_number' | translate: { number: config().length_min } }}</span>\n </div>\n <div\n class=\"pt-[4px] flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_max\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_maximum_length_number' | translate: { number: config().length_max } }}</span>\n </div>\n @if (config().uppercase || config().lowercase || config().number || config().symbol) {\n <div\n class=\"mt-[4px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\">\n <div class=\"flex items-center\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validCharacters()\"></i>\n @if (config().key === 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_all_types_of_characters_below' | translate }}</span>\n }\n @if (config().key !== 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_number_types_of_characters_below' | translate: { number: config().value } }}</span>\n }\n </div>\n @if (config().uppercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().upper\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().upper\">\n {{ 'i18n_uppercase_minimum' | translate: { number: config().uppercase } }}\n </div>\n }\n @if (config().lowercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().lower\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().lower\">\n {{ 'i18n_lowercase_minimum' | translate: { number: config().lowercase } }}\n </div>\n }\n @if (config().number) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().number\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().number\">\n {{ 'i18n_number_minimum' | translate: { number: config().number } }}\n </div>\n }\n @if (config().symbol) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().symbol\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().symbol\">\n {{ 'i18n_symbol_minimum' | translate: { number: config().symbol } }}\n </div>\n }\n </div>\n }\n</div>\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,13 +1,13 @@
1
1
  {
2
2
  "name": "@libs-ui/components-inputs-password",
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-valid": "0.2.356-42",
7
- "@libs-ui/components-label": "0.2.356-42",
8
- "@libs-ui/utils": "0.2.356-42",
6
+ "@libs-ui/components-inputs-valid": "0.2.356-43",
7
+ "@libs-ui/components-label": "0.2.356-43",
8
+ "@libs-ui/utils": "0.2.356-43",
9
9
  "@ngx-translate/core": "^15.0.0",
10
- "@libs-ui/components-inputs-input": "0.2.356-42"
10
+ "@libs-ui/components-inputs-input": "0.2.356-43"
11
11
  },
12
12
  "sideEffects": false,
13
13
  "module": "fesm2022/libs-ui-components-inputs-password.mjs",