@libs-ui/pipes-check-selected-by-key 0.2.355-9 → 0.2.356-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +192 -2
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,3 +1,193 @@
1
- # pipes-check-selected-by-key
1
+ # @libs-ui/pipes-check-selected-by-key
2
2
 
3
- This library was generated with [Nx](https://nx.dev).
3
+ > Pipe kiểm tra xem một giá trị có tồn tại trong mảng các key đã chọn hay không.
4
+
5
+ **Version:** 0.2.355-14
6
+
7
+ ## Giới thiệu
8
+
9
+ `LibsUiPipesCheckSelectedByKeyPipe` là một Angular pipe đơn giản nhưng hữu ích để kiểm tra xem một giá trị có tồn tại trong mảng các key đã được chọn hay không. Pipe này thường được sử dụng trong các trường hợp multi-select, checkbox lists, hoặc bất kỳ tình huống nào cần kiểm tra trạng thái "đã chọn" của một item.
10
+
11
+ ### Tính năng
12
+
13
+ - ✅ Kiểm tra nhanh sự tồn tại của giá trị trong mảng
14
+ - ✅ Hỗ trợ mọi kiểu dữ liệu (string, number, object)
15
+ - ✅ Validation an toàn với null/undefined
16
+ - ✅ Pure pipe - hiệu suất cao
17
+ - ✅ Standalone - dễ dàng import
18
+
19
+ ## Khi nào sử dụng
20
+
21
+ - Kiểm tra xem một item có được chọn trong danh sách multi-select hay không
22
+ - Hiển thị trạng thái selected/unselected trong UI (checkbox, highlight)
23
+ - Filter hoặc validate dữ liệu dựa trên danh sách keys đã chọn
24
+ - Xác định xem một key có trong collection hay không
25
+
26
+ ## ⚠️ Important Notes
27
+
28
+ - **🔄 Tham số length - Pure Pipe Trigger**: Đây là pattern quan trọng để đảm bảo pipe chạy lại khi mảng thay đổi. Vì đây là pure pipe, nó chỉ chạy lại khi reference thay đổi. Nếu bạn `push`/`pop` phần tử vào mảng (mutate) mà giữ nguyên reference, pipe sẽ không tự chạy lại. Tham số `length` buộc pipe phải re-run khi số lượng phần tử thay đổi.
29
+ - **Kiểm tra null/undefined**: Pipe trả về `false` nếu `multiKeys` là `null`, `undefined`, không phải array, hoặc array rỗng.
30
+ - **So sánh strict**: Sử dụng `===` để so sánh, không có type coercion.
31
+
32
+ ## Cài đặt
33
+
34
+ ```bash
35
+ npm install @libs-ui/pipes-check-selected-by-key
36
+ ```
37
+
38
+ ## Import
39
+
40
+ ```typescript
41
+ import { LibsUiPipesCheckSelectedByKeyPipe } from '@libs-ui/pipes-check-selected-by-key';
42
+
43
+ @Component({
44
+ standalone: true,
45
+ imports: [LibsUiPipesCheckSelectedByKeyPipe],
46
+ // ...
47
+ })
48
+ export class YourComponent {}
49
+ ```
50
+
51
+ ## Ví dụ
52
+
53
+ ### Cách sử dụng cơ bản
54
+
55
+ ```html
56
+ <!-- Kiểm tra xem 'apple' có trong selectedFruits không -->
57
+ <div [class.selected]="'apple' | LibsUiPipesCheckSelectedByKeyPipe : selectedFruits : selectedFruits.length">Apple {{ ('apple' | LibsUiPipesCheckSelectedByKeyPipe : selectedFruits : selectedFruits.length) ? '✓' : '' }}</div>
58
+ ```
59
+
60
+ ```typescript
61
+ selectedFruits = ['apple', 'banana'];
62
+ // Kết quả: true (vì 'apple' có trong mảng)
63
+ ```
64
+
65
+ ### Sử dụng với \*ngFor
66
+
67
+ ```html
68
+ <div *ngFor="let fruit of allFruits">
69
+ <div [class.active]="fruit.id | LibsUiPipesCheckSelectedByKeyPipe : selectedIds : selectedIds.length">{{ fruit.name }}</div>
70
+ </div>
71
+ ```
72
+
73
+ ### Sử dụng với số
74
+
75
+ ```html
76
+ <div [class.active]="42 | LibsUiPipesCheckSelectedByKeyPipe : selectedIds : selectedIds.length">Item 42</div>
77
+ ```
78
+
79
+ ```typescript
80
+ selectedIds = [1, 42, 100];
81
+ // Kết quả: true
82
+ ```
83
+
84
+ ### Edge Cases
85
+
86
+ ```html
87
+ <!-- Mảng rỗng -->
88
+ {{ 'apple' | LibsUiPipesCheckSelectedByKeyPipe : [] : 0 }}
89
+ <!-- Kết quả: false -->
90
+
91
+ <!-- multiKeys undefined -->
92
+ {{ 'apple' | LibsUiPipesCheckSelectedByKeyPipe : undefined : undefined }}
93
+ <!-- Kết quả: false -->
94
+ ```
95
+
96
+ ## API
97
+
98
+ ### LibsUiPipesCheckSelectedByKeyPipe
99
+
100
+ ```typescript
101
+ value | LibsUiPipesCheckSelectedByKeyPipe : multiKeys : length
102
+ ```
103
+
104
+ #### Parameters
105
+
106
+ | Property | Type | Default | Description |
107
+ | ----------- | ------------------------- | ------- | ------------------------------------------------------------------ |
108
+ | `value` | `any` | - | Giá trị cần kiểm tra |
109
+ | `multiKeys` | `Array<any> \| undefined` | - | Mảng các key đã được chọn |
110
+ | `length` | `number \| undefined` | - | **Pure Pipe Trigger** - Truyền `multiKeys.length` để đảm bảo pipe chạy lại khi mảng thay đổi số lượng phần tử |
111
+
112
+ #### Returns
113
+
114
+ `boolean` - `true` nếu `value` tồn tại trong `multiKeys`, ngược lại `false`
115
+
116
+ ## Hidden Logic
117
+
118
+ ### 1. 🔄 Pure Pipe Trigger Pattern (Tham số `length`)
119
+
120
+ Tham số `length` là một **trigger parameter** quan trọng để giải quyết vấn đề của pure pipe trong Angular:
121
+
122
+ **Vấn đề**: Angular pure pipe chỉ chạy lại khi reference của input thay đổi. Nếu bạn mutate mảng (dùng `push`, `pop`, `splice`) mà vẫn giữ nguyên reference, pipe sẽ không tự động chạy lại.
123
+
124
+ **Giải pháp**: Truyền `length` như một tham số riêng. Khi số lượng phần tử thay đổi, Angular detect change và buộc pipe phải chạy lại.
125
+
126
+ **🔴 QUAN TRỌNG - `length` PHẢI được trích xuất chính xác từ `multiKeys.length`:**
127
+
128
+ ```typescript
129
+ // ✅ Đúng: Truyền multiKeys.length
130
+ 'apple' | LibsUiPipesCheckSelectedByKeyPipe : selectedFruits : selectedFruits.length
131
+
132
+ // ❌ Sai: Truyền sai length
133
+ 'apple' | LibsUiPipesCheckSelectedByKeyPipe : selectedFruits : 0
134
+ // => false (mặc dù 'apple' có trong mảng!)
135
+ ```
136
+
137
+ **Cách hoạt động:**
138
+
139
+ ```typescript
140
+ // 1. Khi mutate array (push/pop), reference không đổi
141
+ this.selectedKeys.push('new-key'); // Cùng reference
142
+
143
+ // 2. Nhưng nhờ truyền selectedKeys.length, Angular detect change
144
+ // Template: value | pipe : selectedKeys : selectedKeys.length
145
+ // => Pipe chạy lại vì length thay đổi
146
+
147
+ // 3. Validation trong source code
148
+ if (!multiKeys || !(multiKeys instanceof Array) || !multiKeys.length || !length) {
149
+ return false; // ❌ Return false nếu length không khớp
150
+ }
151
+ ```
152
+
153
+ ### 2. Validation đầu vào
154
+
155
+ Pipe có logic validation phức tạp để đảm bảo an toàn khi xử lý các giá trị null/undefined:
156
+
157
+ ```typescript
158
+ // Các trường hợp trả về false:
159
+ // 1. multiKeys là null hoặc undefined
160
+ // 2. multiKeys không phải là Array
161
+ // 3. multiKeys.length === 0
162
+ // 4. length parameter là falsy (0, null, undefined)
163
+
164
+ // Edge case:
165
+ // Nếu length = 0 nhưng multiKeys có phần tử
166
+ // Pipe vẫn trả về false (do check !length)
167
+ const result = 'apple' | pipe : ['apple'] : 0;
168
+ // => false (mặc dù 'apple' có trong array)
169
+ ```
170
+
171
+ ### 3. So sánh Strict Equality
172
+
173
+ Pipe sử dụng strict equality (`===`) để so sánh, không có type coercion:
174
+
175
+ ```typescript
176
+ // String vs Number
177
+ '42' | pipe : [42] : 1 // => false
178
+
179
+ // Object reference
180
+ const obj = { id: 1 };
181
+ obj | pipe : [obj] : 1 // => true
182
+ obj | pipe : [{ id: 1 }] : 1 // => false (khác reference)
183
+ ```
184
+
185
+ ## Demo
186
+
187
+ **Local:** http://localhost:4500/pipes/check-selected-by-key
188
+
189
+ **Production:** https://your-domain.com/pipes/check-selected-by-key
190
+
191
+ ## License
192
+
193
+ MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libs-ui/pipes-check-selected-by-key",
3
- "version": "0.2.355-9",
3
+ "version": "0.2.356-0",
4
4
  "peerDependencies": {
5
5
  "@angular/core": ">=18.0.0"
6
6
  },