@libs-ui/pipes-call-function-in-template 0.2.355-10 → 0.2.355-11

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,35 +1,33 @@
1
1
  # @libs-ui/pipes-call-function-in-template
2
2
 
3
+ > Version: `0.2.355-10`
4
+ >
3
5
  > Pipe đa năng giúp gọi function xử lý logic ngay trong template, hỗ trợ truyền tham số và xử lý kết quả Async (Observable).
4
6
 
5
7
  ## Giới thiệu
6
8
 
7
- `LibsUiPipesCallFunctionInTemplatePipe` cho phép bạn thực thi một hàm TypeScript bất kỳ trực tiếp từ template HTML, với khả năng truyền tham số xử kết quả trả về dưới dạng `Observable`. Đây là giải pháp thay thế gọn nhẹ cho việc tạo Pipe riêng biệt cho các logic đơn giản hoặc dùng một lần.
9
+ `LibsUiPipesCallFunctionInTemplatePipe` một giải pháp linh hoạt cho phép bạn thực hiện các phép biến đổi dữ liệu phức tạp ngay trong template HTML của Angular thông qua các hàm helper trong Component, thay phải tạo nhiều Pipe đơn lẻ cho từng mục đích cụ thể.
8
10
 
9
11
  ### Tính năng
10
12
 
11
- - ✅ Gọi function trực tiếp từ template.
12
- - ✅ Truyền thêm tham số phụ (`item`, `otherData`).
13
- - ✅ Xử lý kết quả Async (trả về Observable, kết hợp tốt với `AsyncPipe`).
14
- - ✅ Tự động xử lý giá trị rỗng/null/undefined.
15
- - ✅ Standalone Pipe.
13
+ - ✅ Gọi function xử logic ngay trong template
14
+ - ✅ Hỗ trợ truyền tham số phụ (item, otherData)
15
+ - ✅ Xử lý bất đồng bộ (Async) với Observable
16
+ - ✅ Tự động xử lý giá trị rỗng (null, undefined, 0)
17
+ - ✅ Tùy chỉnh giá trị mặc định cho các trường hợp đặc biệt
18
+ - ✅ Standalone pipe (Angular 16+)
16
19
 
17
20
  ## Khi nào sử dụng
18
21
 
19
- - Khi bạn cần transform dữ liệu trong template bằng một logic phức tạp hơn pipe sẵn, nhưng chưa đủ lớn để viết Pipe riêng.
20
- - Khi logic transform phụ thuộc vào các biến ngữ cảnh trong template (ví dụ: `ngFor` item).
21
- - Khi muốn tái sử dụng các hàm utility có sẵn trong component.
22
-
23
- **Lưu ý:** Không nên lạm dụng pipe này cho mọi logic. Nếu logic phức tạp và được dùng ở nhiều nơi, hãy cân nhắc tạo một Pipe chuyên biệt để performance tốt hơn và dễ test hơn.
22
+ - Khi cần xử logic phức tạp để hiển thị dữ liệu không muốn tạo Pipe riêng biệt cho từng trường hợp.
23
+ - Khi cần truyền thêm tham số phụ (item, otherData) vào hàm xử lý.
24
+ - Khi logic xử lý có thể tái sử dụng dưới dạng function helper.
25
+ - Hỗ trợ xử lý bất đồng bộ (Async) đơn giản trong template.
24
26
 
25
27
  ## Cài đặt
26
28
 
27
29
  ```bash
28
- # npm
29
30
  npm install @libs-ui/pipes-call-function-in-template
30
-
31
- # yarn
32
- yarn add @libs-ui/pipes-call-function-in-template
33
31
  ```
34
32
 
35
33
  ## Import
@@ -42,69 +40,116 @@ import { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-funct
42
40
  imports: [LibsUiPipesCallFunctionInTemplatePipe],
43
41
  // ...
44
42
  })
45
- export class YourComponent {}
46
43
  ```
47
44
 
48
- ## dụ
45
+ ## Cách sử dụng
49
46
 
50
- ### bản: Transform String
47
+ ### 1. Transform String Cơ bản
51
48
 
52
49
  ```html
53
- <!-- Component TS -->
54
- transformUppercase = (data: { value: string }) => of(data.value.toUpperCase());
50
+ {{ 'hello world' | LibsUiPipesCallFunctionInTemplatePipe : transformUppercase | async }}
51
+ ```
55
52
 
56
- <!-- Template HTML -->
57
- {{ 'hello' | LibsUiPipesCallFunctionInTemplatePipe : transformUppercase | async }}
58
- <!-- Output: 'HELLO' -->
53
+ ```typescript
54
+ transformUppercase = (data: { value: string }): Observable<string> => {
55
+ return of((data.value || '').toUpperCase());
56
+ };
59
57
  ```
60
58
 
61
- ### Truyền tham số phụ
59
+ ### 2. Truyền tham số nâng cao
62
60
 
63
61
  ```html
64
- <!-- Component TS -->
65
- calculateTotal = (data: { value: number, item: number }) => of(data.value * data.item);
62
+ {{ 100 | LibsUiPipesCallFunctionInTemplatePipe : calculateTotal : 5 : 20 | async }}
63
+ ```
66
64
 
67
- <!-- Template HTML -->
68
- <!-- Price: 100, Qty: 5 -->
69
- {{ 100 | LibsUiPipesCallFunctionInTemplatePipe : calculateTotal : 5 | async }}
70
- <!-- Output: 500 -->
65
+ ```typescript
66
+ calculateTotal = (data: { value: number; item?: number; otherData?: number }): Observable<string> => {
67
+ const qty = data.item || 0;
68
+ const discount = data.otherData || 0;
69
+ const total = (data.value * qty) - discount;
70
+ return of(`$${total.toFixed(2)}`);
71
+ };
71
72
  ```
72
73
 
73
- ## API
74
+ ### 3. Xử lý giá trị rỗng/mặc định
74
75
 
75
- ### Transform Method
76
+ ```html
77
+ <!-- Case 1: Null Input -->
78
+ {{ null | LibsUiPipesCallFunctionInTemplatePipe : undefined : undefined : undefined : { valueIsEmpty: 'Empty Data' } | async }}
79
+
80
+ <!-- Case 2: Zero Input -->
81
+ {{ 0 | LibsUiPipesCallFunctionInTemplatePipe : undefined : undefined : undefined : { valueIs0: 'Zero Value' } | async }}
82
+ ```
83
+
84
+ ### 4. Async Data (Mock API)
85
+
86
+ ```html
87
+ @if (('active' | LibsUiPipesCallFunctionInTemplatePipe : fetchStatus | async) as status) {
88
+ {{ status }}
89
+ } @else {
90
+ <span>Loading status...</span>
91
+ }
92
+ ```
76
93
 
77
94
  ```typescript
78
- transform(
79
- value: any,
80
- functionCall?: TYPE_FUNCTION,
81
- item?: any,
82
- otherData?: any,
83
- defaultValueEmpty?: { valueIs0?: any; valueIsEmpty?: any }
84
- ): Observable<any>
95
+ fetchStatus = (data: { value: string }): Observable<string> => {
96
+ const statusMap: Record<string, string> = {
97
+ 'active': 'Đang hoạt động (Online)',
98
+ 'inactive': 'Ngừng kích hoạt (Offline)',
99
+ 'pending': 'Đang chờ xử lý'
100
+ };
101
+ return of(statusMap[data.value] || 'Unknown').pipe(delay(1000));
102
+ };
85
103
  ```
86
104
 
87
- | Parameter | Type | Default | Description |
88
- | ------------------- | --------------------------- | ----------- | ---------------------------------------------------------- | --- |
89
- | `value` | `any` | - | Giá trị đầu vào cần xử lý (bên trái dấu ` | `). |
90
- | `functionCall` | `(data) => Observable<any>` | `undefined` | Hàm xử lý logic. Nhận object `{ value, item, otherData }`. |
91
- | `item` | `any` | `undefined` | Tham số phụ thứ nhất (Optional). |
92
- | `otherData` | `any` | `undefined` | Tham số phụ thứ hai (Optional). |
93
- | `defaultValueEmpty` | `Object` | `undefined` | Cấu hình giá trị mặc định khi kết quả là 0 hoặc rỗng. |
105
+ ## API Reference
94
106
 
95
- ### Type Definition
107
+ ### LibsUiPipesCallFunctionInTemplatePipe
108
+
109
+ #### Parameters
110
+
111
+ | Property | Type | Default | Description |
112
+ | ------------------ | ------------------------------------ | ----------- | ------------------------------------------------ |
113
+ | `value` | `any` | `-` | Giá trị đầu vào cần xử lý. |
114
+ | `functionCall` | `TYPE_FUNCTION` | `undefined` | Hàm xử lý logic chính. Nhận object chứa input và params, trả về Observable. |
115
+ | `item` | `any` | `undefined` | Tham số phụ thứ nhất truyền vào functionCall. |
116
+ | `otherData` | `any` | `undefined` | Tham số phụ thứ hai truyền vào functionCall. |
117
+ | `defaultValueEmpty`| `{ valueIs0?: any; valueIsEmpty?: any }` | `undefined` | Cấu hình giá trị trả về mặc định khi kết quả là 0 hoặc rỗng/null. |
118
+
119
+ ## Types & Interfaces
120
+
121
+ ### TYPE_FUNCTION
96
122
 
97
123
  ```typescript
98
- type TYPE_FUNCTION = (data: { value: any; item?: any; otherData?: any }) => Observable<any>;
124
+ export type TYPE_FUNCTION<T = any> = (
125
+ data: { value: any; item?: any; otherData?: any }
126
+ ) => Observable<T>;
99
127
  ```
100
128
 
129
+ **Mô tả**: Type cho function xử lý logic. Nhận object chứa value, item, otherData và trả về Observable.
130
+
131
+ ## Lưu ý quan trọng (Important Notes)
132
+
133
+ > ⚠️ **Caveats**:
134
+ >
135
+ > - **Yêu cầu `async` pipe**: Pipe này trả về một `Observable`. Bạn **BẮT BUỘC** phải sử dụng thêm `async` pipe trong template để hiển thị giá trị cuối cùng (ví dụ: `value | LibsUiPipesCallFunctionInTemplatePipe : fn | async`).
136
+ > - **Cơ chế SwitchMap**: Pipe sử dụng `switchMap` bên trong, do đó hàm xử lý của bạn phải trả về một Observable hoặc Promise.
137
+ > - **Xử lý giá trị rỗng**: Pipe tích hợp sẵn logic để handle `null`, `undefined` hoặc `0`. Bạn có thể tùy chỉnh thông qua tham số cuối cùng.
138
+ > - **Tham số truyền vào**: Hàm xử lý (`functionCall`) sẽ nhận một object duy nhất chứa `{ value, item, otherData }` để thuận tiện cho việc giải nén (destructuring).
139
+
140
+ ## Công nghệ sử dụng
141
+
142
+ - Angular 18+
143
+ - RxJS 7.8+
144
+ - TypeScript 5+
145
+
101
146
  ## Demo
102
147
 
103
- ```bash
104
- npx nx serve core-ui
105
- ```
148
+ - **Local Development**: [http://localhost:4500/pipes/call-function-in-template](http://localhost:4500/pipes/call-function-in-template)
149
+
150
+ ## Unit Tests
106
151
 
107
- Truy cập: `http://localhost:4200/pipes/call-function-in-template`
152
+ Xem file `test-commands.md` để biết cách chạy unit tests.
108
153
 
109
154
  ## License
110
155
 
@@ -13,7 +13,7 @@ export class LibsUiPipesCallFunctionInTemplatePipe {
13
13
  }
14
14
  getValueOfType(value, defaultValueEmpty) {
15
15
  if ('object' === typeof value || value instanceof Array || typeof value === 'boolean') {
16
- return value || defaultValueEmpty?.valueIsEmpty || CHARACTER_DATA_EMPTY;
16
+ return value ?? defaultValueEmpty?.valueIsEmpty ?? CHARACTER_DATA_EMPTY;
17
17
  }
18
18
  if (value) {
19
19
  return `${value}`;
@@ -37,4 +37,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
37
37
  standalone: true,
38
38
  }]
39
39
  }] });
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9waXBlcy9jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlL3NyYy9jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBYSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBYyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQU8xRSxNQUFNLE9BQU8scUNBQXFDO0lBQ3hDLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQ3hDLFNBQVMsQ0FBQyxLQUFVLEVBQUUsWUFBNEIsRUFBRSxJQUFVLEVBQUUsU0FBZSxFQUFFLGlCQUEwRDtRQUN6SSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3hDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFDdkIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLEVBQzNELFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCLENBQUM7SUFDSixDQUFDO0lBRU8sY0FBYyxDQUFDLEtBQVUsRUFBRSxpQkFBNkQ7UUFDOUYsSUFBSSxRQUFRLEtBQUssT0FBTyxLQUFLLElBQUksS0FBSyxZQUFZLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0RixPQUFPLEtBQUssSUFBSSxpQkFBaUIsRUFBRSxZQUFZLElBQUksb0JBQW9CLENBQUM7UUFDMUUsQ0FBQztRQUNELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixPQUFPLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUVELElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hCLE9BQU8saUJBQWlCLEVBQUUsUUFBUSxJQUFJLEdBQUcsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxpQkFBaUIsRUFBRSxZQUFZLElBQUksb0JBQW9CLENBQUM7SUFDakUsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0EvQlUscUNBQXFDO3NHQUFyQyxxQ0FBcUM7OzRGQUFyQyxxQ0FBcUM7a0JBSmpELElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLHVDQUF1QztvQkFDN0MsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgT25EZXN0cm95LCBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDSEFSQUNURVJfREFUQV9FTVBUWSB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG1hcCwgb2YsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUWVBFX0ZVTkNUSU9OIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ0xpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICB0cmFuc2Zvcm0odmFsdWU6IGFueSwgZnVuY3Rpb25DYWxsPzogVFlQRV9GVU5DVElPTiwgaXRlbT86IGFueSwgb3RoZXJEYXRhPzogYW55LCBkZWZhdWx0VmFsdWVFbXB0eT86IHsgdmFsdWVJczA/OiBhbnk7IHZhbHVlSXNFbXB0eT86IGFueSB9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAoIWZ1bmN0aW9uQ2FsbCkge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2V0VmFsdWVPZlR5cGUodmFsdWUsIGRlZmF1bHRWYWx1ZUVtcHR5KSk7XG4gICAgfVxuICAgIHJldHVybiBvZih7IHZhbHVlLCBpdGVtLCBvdGhlckRhdGEgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcChmdW5jdGlvbkNhbGwpLFxuICAgICAgbWFwKChkYXRhKSA9PiB0aGlzLmdldFZhbHVlT2ZUeXBlKGRhdGEsIGRlZmF1bHRWYWx1ZUVtcHR5KSksXG4gICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVPZlR5cGUodmFsdWU6IGFueSwgZGVmYXVsdFZhbHVlRW1wdHk/OiB7IHZhbHVlSXMwPzogYW55OyB2YWx1ZUlzRW1wdHk/OiBzdHJpbmcgfSkge1xuICAgIGlmICgnb2JqZWN0JyA9PT0gdHlwZW9mIHZhbHVlIHx8IHZhbHVlIGluc3RhbmNlb2YgQXJyYXkgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiB2YWx1ZSB8fCBkZWZhdWx0VmFsdWVFbXB0eT8udmFsdWVJc0VtcHR5IHx8IENIQVJBQ1RFUl9EQVRBX0VNUFRZO1xuICAgIH1cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZUVtcHR5Py52YWx1ZUlzMCA/PyAnMCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZUVtcHR5Py52YWx1ZUlzRW1wdHkgfHwgQ0hBUkFDVEVSX0RBVEFfRU1QVFk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIl19
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9waXBlcy9jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlL3NyYy9jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBYSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBYyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQU8xRSxNQUFNLE9BQU8scUNBQXFDO0lBQ3hDLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQ3hDLFNBQVMsQ0FBQyxLQUFVLEVBQUUsWUFBNEIsRUFBRSxJQUFVLEVBQUUsU0FBZSxFQUFFLGlCQUEwRDtRQUN6SSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3hDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFDdkIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLEVBQzNELFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCLENBQUM7SUFDSixDQUFDO0lBRU8sY0FBYyxDQUFDLEtBQVUsRUFBRSxpQkFBNkQ7UUFDOUYsSUFBSSxRQUFRLEtBQUssT0FBTyxLQUFLLElBQUksS0FBSyxZQUFZLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0RixPQUFPLEtBQUssSUFBSSxpQkFBaUIsRUFBRSxZQUFZLElBQUksb0JBQW9CLENBQUM7UUFDMUUsQ0FBQztRQUVELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixPQUFPLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUVELElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hCLE9BQU8saUJBQWlCLEVBQUUsUUFBUSxJQUFJLEdBQUcsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxpQkFBaUIsRUFBRSxZQUFZLElBQUksb0JBQW9CLENBQUM7SUFDakUsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0FoQ1UscUNBQXFDO3NHQUFyQyxxQ0FBcUM7OzRGQUFyQyxxQ0FBcUM7a0JBSmpELElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLHVDQUF1QztvQkFDN0MsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgT25EZXN0cm95LCBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDSEFSQUNURVJfREFUQV9FTVBUWSB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG1hcCwgb2YsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUWVBFX0ZVTkNUSU9OIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ0xpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICB0cmFuc2Zvcm0odmFsdWU6IGFueSwgZnVuY3Rpb25DYWxsPzogVFlQRV9GVU5DVElPTiwgaXRlbT86IGFueSwgb3RoZXJEYXRhPzogYW55LCBkZWZhdWx0VmFsdWVFbXB0eT86IHsgdmFsdWVJczA/OiBhbnk7IHZhbHVlSXNFbXB0eT86IGFueSB9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAoIWZ1bmN0aW9uQ2FsbCkge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2V0VmFsdWVPZlR5cGUodmFsdWUsIGRlZmF1bHRWYWx1ZUVtcHR5KSk7XG4gICAgfVxuICAgIHJldHVybiBvZih7IHZhbHVlLCBpdGVtLCBvdGhlckRhdGEgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcChmdW5jdGlvbkNhbGwpLFxuICAgICAgbWFwKChkYXRhKSA9PiB0aGlzLmdldFZhbHVlT2ZUeXBlKGRhdGEsIGRlZmF1bHRWYWx1ZUVtcHR5KSksXG4gICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVPZlR5cGUodmFsdWU6IGFueSwgZGVmYXVsdFZhbHVlRW1wdHk/OiB7IHZhbHVlSXMwPzogYW55OyB2YWx1ZUlzRW1wdHk/OiBzdHJpbmcgfSkge1xuICAgIGlmICgnb2JqZWN0JyA9PT0gdHlwZW9mIHZhbHVlIHx8IHZhbHVlIGluc3RhbmNlb2YgQXJyYXkgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/PyBkZWZhdWx0VmFsdWVFbXB0eT8udmFsdWVJc0VtcHR5ID8/IENIQVJBQ1RFUl9EQVRBX0VNUFRZO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlRW1wdHk/LnZhbHVlSXMwID8/ICcwJztcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlRW1wdHk/LnZhbHVlSXNFbXB0eSB8fCBDSEFSQUNURVJfREFUQV9FTVBUWTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=
@@ -14,7 +14,7 @@ class LibsUiPipesCallFunctionInTemplatePipe {
14
14
  }
15
15
  getValueOfType(value, defaultValueEmpty) {
16
16
  if ('object' === typeof value || value instanceof Array || typeof value === 'boolean') {
17
- return value || defaultValueEmpty?.valueIsEmpty || CHARACTER_DATA_EMPTY;
17
+ return value ?? defaultValueEmpty?.valueIsEmpty ?? CHARACTER_DATA_EMPTY;
18
18
  }
19
19
  if (value) {
20
20
  return `${value}`;
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-pipes-call-function-in-template.mjs","sources":["../../../../../libs-ui/pipes/call-function-in-template/src/call-function-in-template.pipe.ts","../../../../../libs-ui/pipes/call-function-in-template/src/libs-ui-pipes-call-function-in-template.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { CHARACTER_DATA_EMPTY } from '@libs-ui/utils';\nimport { Observable, Subject, map, of, switchMap, takeUntil } from 'rxjs';\nimport { TYPE_FUNCTION } from '@libs-ui/interfaces-types';\n\n@Pipe({\n name: 'LibsUiPipesCallFunctionInTemplatePipe',\n standalone: true,\n})\nexport class LibsUiPipesCallFunctionInTemplatePipe implements PipeTransform, OnDestroy {\n private onDestroy = new Subject<void>();\n transform(value: any, functionCall?: TYPE_FUNCTION, item?: any, otherData?: any, defaultValueEmpty?: { valueIs0?: any; valueIsEmpty?: any }): Observable<any> {\n if (!functionCall) {\n return of(this.getValueOfType(value, defaultValueEmpty));\n }\n return of({ value, item, otherData }).pipe(\n switchMap(functionCall),\n map((data) => this.getValueOfType(data, defaultValueEmpty)),\n takeUntil(this.onDestroy)\n );\n }\n\n private getValueOfType(value: any, defaultValueEmpty?: { valueIs0?: any; valueIsEmpty?: string }) {\n if ('object' === typeof value || value instanceof Array || typeof value === 'boolean') {\n return value || defaultValueEmpty?.valueIsEmpty || CHARACTER_DATA_EMPTY;\n }\n if (value) {\n return `${value}`;\n }\n\n if (value === 0) {\n return defaultValueEmpty?.valueIs0 ?? '0';\n }\n\n return defaultValueEmpty?.valueIsEmpty || CHARACTER_DATA_EMPTY;\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAAA;MAUa,qCAAqC,CAAA;AACxC,IAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;IACvC,SAAS,CAAC,KAAU,EAAE,YAA4B,EAAE,IAAU,EAAE,SAAe,EAAE,iBAA0D,EAAA;QACzI,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC1D;AACA,QAAA,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CACxC,SAAS,CAAC,YAAY,CAAC,EACvB,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,EAC3D,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAC1B;IACH;IAEQ,cAAc,CAAC,KAAU,EAAE,iBAA6D,EAAA;AAC9F,QAAA,IAAI,QAAQ,KAAK,OAAO,KAAK,IAAI,KAAK,YAAY,KAAK,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;AACrF,YAAA,OAAO,KAAK,IAAI,iBAAiB,EAAE,YAAY,IAAI,oBAAoB;QACzE;QACA,IAAI,KAAK,EAAE;YACT,OAAO,CAAA,EAAG,KAAK,CAAA,CAAE;QACnB;AAEA,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,YAAA,OAAO,iBAAiB,EAAE,QAAQ,IAAI,GAAG;QAC3C;AAEA,QAAA,OAAO,iBAAiB,EAAE,YAAY,IAAI,oBAAoB;IAChE;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;IAC3B;wGA/BW,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAArC,qCAAqC,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,uCAAA,EAAA,CAAA;;4FAArC,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBAJjD,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,uCAAuC;AAC7C,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACTD;;AAEG;;;;"}
1
+ {"version":3,"file":"libs-ui-pipes-call-function-in-template.mjs","sources":["../../../../../libs-ui/pipes/call-function-in-template/src/call-function-in-template.pipe.ts","../../../../../libs-ui/pipes/call-function-in-template/src/libs-ui-pipes-call-function-in-template.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { CHARACTER_DATA_EMPTY } from '@libs-ui/utils';\nimport { Observable, Subject, map, of, switchMap, takeUntil } from 'rxjs';\nimport { TYPE_FUNCTION } from '@libs-ui/interfaces-types';\n\n@Pipe({\n name: 'LibsUiPipesCallFunctionInTemplatePipe',\n standalone: true,\n})\nexport class LibsUiPipesCallFunctionInTemplatePipe implements PipeTransform, OnDestroy {\n private onDestroy = new Subject<void>();\n transform(value: any, functionCall?: TYPE_FUNCTION, item?: any, otherData?: any, defaultValueEmpty?: { valueIs0?: any; valueIsEmpty?: any }): Observable<any> {\n if (!functionCall) {\n return of(this.getValueOfType(value, defaultValueEmpty));\n }\n return of({ value, item, otherData }).pipe(\n switchMap(functionCall),\n map((data) => this.getValueOfType(data, defaultValueEmpty)),\n takeUntil(this.onDestroy)\n );\n }\n\n private getValueOfType(value: any, defaultValueEmpty?: { valueIs0?: any; valueIsEmpty?: string }) {\n if ('object' === typeof value || value instanceof Array || typeof value === 'boolean') {\n return value ?? defaultValueEmpty?.valueIsEmpty ?? CHARACTER_DATA_EMPTY;\n }\n\n if (value) {\n return `${value}`;\n }\n\n if (value === 0) {\n return defaultValueEmpty?.valueIs0 ?? '0';\n }\n\n return defaultValueEmpty?.valueIsEmpty || CHARACTER_DATA_EMPTY;\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAAA;MAUa,qCAAqC,CAAA;AACxC,IAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;IACvC,SAAS,CAAC,KAAU,EAAE,YAA4B,EAAE,IAAU,EAAE,SAAe,EAAE,iBAA0D,EAAA;QACzI,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC1D;AACA,QAAA,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CACxC,SAAS,CAAC,YAAY,CAAC,EACvB,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,EAC3D,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAC1B;IACH;IAEQ,cAAc,CAAC,KAAU,EAAE,iBAA6D,EAAA;AAC9F,QAAA,IAAI,QAAQ,KAAK,OAAO,KAAK,IAAI,KAAK,YAAY,KAAK,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;AACrF,YAAA,OAAO,KAAK,IAAI,iBAAiB,EAAE,YAAY,IAAI,oBAAoB;QACzE;QAEA,IAAI,KAAK,EAAE;YACT,OAAO,CAAA,EAAG,KAAK,CAAA,CAAE;QACnB;AAEA,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,YAAA,OAAO,iBAAiB,EAAE,QAAQ,IAAI,GAAG;QAC3C;AAEA,QAAA,OAAO,iBAAiB,EAAE,YAAY,IAAI,oBAAoB;IAChE;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;IAC3B;wGAhCW,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAArC,qCAAqC,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,uCAAA,EAAA,CAAA;;4FAArC,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBAJjD,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,uCAAuC;AAC7C,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACTD;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@libs-ui/pipes-call-function-in-template",
3
- "version": "0.2.355-10",
3
+ "version": "0.2.355-11",
4
4
  "peerDependencies": {
5
5
  "@angular/core": ">=18.0.0",
6
- "@libs-ui/utils": "0.2.355-10",
6
+ "@libs-ui/utils": "0.2.355-11",
7
7
  "rxjs": "~7.8.0"
8
8
  },
9
9
  "sideEffects": false,