@libs-ui/components-line-clamp 0.2.356-41 → 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,102 +1,300 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @libs-ui/components-line-clamp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> Component giới hạn số dòng văn bản, hỗ trợ nút Xem thêm / Thu gọn và Tooltip tích hợp sẵn.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Giới thiệu
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
- 🔗 **View More / Collapse**: Tự động hiển thị nút điều khiển khi nội dung vượt quá giới hạn.
|
|
9
|
-
- 💬 **Tooltip Support**: Tích hợp sẵn Tooltip để người dùng xem nhanh nội dung đầy đủ khi hover mà không cần mở rộng.
|
|
10
|
-
- 🎨 **Custom Styling**: Dễ dàng tùy chỉnh class cho nội dung và các nút điều khiển thông qua `ngClassObject`.
|
|
11
|
-
- 🔒 **Security**: Hỗ trợ lọc XSS thông qua `useXssFilter` và hỗ trợ cả `innerHTML` lẫn `innerText`.
|
|
12
|
-
- 🌈 **Gradient Effect**: Tùy chọn hiển thị hiệu ứng mờ dần (gradient) ở cuối đoạn văn bản bị cắt.
|
|
7
|
+
`@libs-ui/components-line-clamp` là component Angular dùng để cắt ngắn đoạn văn bản dài theo chiều cao tối đa (px) và tự động hiển thị nút điều khiển "Xem thêm" / "Thu gọn" khi nội dung vượt giới hạn. Component hỗ trợ render cả HTML (có lọc XSS) lẫn plain text, tích hợp Tooltip khi hover, hiệu ứng gradient mờ dần, và cung cấp `FunctionsControl` để component cha điều khiển trực tiếp qua `ViewChild`.
|
|
13
8
|
|
|
14
|
-
##
|
|
9
|
+
## Tính năng
|
|
10
|
+
|
|
11
|
+
- Giới hạn chiều cao hiển thị dựa trên `maxHeight` (px) — tính toán thực tế từ DOM
|
|
12
|
+
- Tự động hiển thị / ẩn nút "Xem thêm" và "Thu gọn" khi nội dung thay đổi
|
|
13
|
+
- Hỗ trợ render HTML an toàn qua `useXssFilter` hoặc plain text qua `isInnerText`
|
|
14
|
+
- Tích hợp Tooltip (Popover) hiển thị nội dung đầy đủ khi hover
|
|
15
|
+
- Hiệu ứng gradient mờ dần ở cuối đoạn văn bị cắt (`hasBackgroundGradient`)
|
|
16
|
+
- Tự động refresh khi cửa sổ trình duyệt resize (`window:resize`)
|
|
17
|
+
- Cho phép tùy chỉnh nhãn nút, CSS class nội dung và nút điều khiển
|
|
18
|
+
- Cung cấp `FunctionsControl` (refresh, viewMore, hiddenMore, checkIsDisplayLineClamp) để điều khiển từ bên ngoài
|
|
19
|
+
- Hỗ trợ i18n thông qua `@ngx-translate/core`
|
|
20
|
+
|
|
21
|
+
## Khi nào sử dụng
|
|
15
22
|
|
|
16
|
-
|
|
23
|
+
- Hiển thị phần giới thiệu ngắn trong danh sách thẻ (Card list) khi không đủ không gian
|
|
24
|
+
- Cắt bớt bình luận, mô tả sản phẩm hoặc ghi chú dài trong giao diện Dashboard
|
|
25
|
+
- Cần render HTML từ backend nhưng vẫn đảm bảo an toàn XSS và hỗ trợ rút gọn
|
|
26
|
+
- Muốn người dùng xem nhanh nội dung đầy đủ qua Tooltip mà không cần mở rộng trang
|
|
27
|
+
|
|
28
|
+
## Cài đặt
|
|
17
29
|
|
|
18
30
|
```bash
|
|
19
31
|
npm install @libs-ui/components-line-clamp
|
|
20
32
|
```
|
|
21
33
|
|
|
22
|
-
##
|
|
23
|
-
|
|
24
|
-
### Import Module
|
|
34
|
+
## Import
|
|
25
35
|
|
|
26
36
|
```typescript
|
|
27
37
|
import { LibsUiComponentsLineClampComponent } from '@libs-ui/components-line-clamp';
|
|
38
|
+
import { ILineClampFunctionControlEvent, ILineClampConfig } from '@libs-ui/components-line-clamp';
|
|
28
39
|
|
|
29
40
|
@Component({
|
|
30
41
|
standalone: true,
|
|
31
42
|
imports: [LibsUiComponentsLineClampComponent],
|
|
32
|
-
// ...
|
|
33
43
|
})
|
|
34
44
|
export class YourComponent {}
|
|
35
45
|
```
|
|
36
46
|
|
|
37
|
-
|
|
47
|
+
## Ví dụ sử dụng
|
|
38
48
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
49
|
+
### Cắt dòng cơ bản (2 dòng, line-height 20px)
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
// your.component.ts
|
|
53
|
+
import { Component } from '@angular/core';
|
|
54
|
+
import { LibsUiComponentsLineClampComponent } from '@libs-ui/components-line-clamp';
|
|
55
|
+
|
|
56
|
+
@Component({
|
|
57
|
+
standalone: true,
|
|
58
|
+
imports: [LibsUiComponentsLineClampComponent],
|
|
59
|
+
template: `
|
|
60
|
+
<libs_ui-components-line_clamp
|
|
61
|
+
[content]="longText"
|
|
62
|
+
[maxHeight]="40"
|
|
63
|
+
[labelButtonViewMore]="'Xem thêm nội dung'"
|
|
64
|
+
[labelButtonCollapse]="'Thu gọn lại'">
|
|
65
|
+
</libs_ui-components-line_clamp>
|
|
66
|
+
`,
|
|
67
|
+
})
|
|
68
|
+
export class BasicExampleComponent {
|
|
69
|
+
readonly longText = `Angular là một nền tảng và framework để xây dựng các ứng dụng khách đơn trang
|
|
70
|
+
sử dụng HTML và TypeScript. Nó triển khai chức năng cốt lõi và tùy chọn dưới dạng
|
|
71
|
+
một tập hợp các thư viện TypeScript mà bạn import vào ứng dụng của mình.`;
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Tooltip và hiệu ứng gradient
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// your.component.ts
|
|
79
|
+
import { Component } from '@angular/core';
|
|
80
|
+
import { LibsUiComponentsLineClampComponent } from '@libs-ui/components-line-clamp';
|
|
81
|
+
|
|
82
|
+
@Component({
|
|
83
|
+
standalone: true,
|
|
84
|
+
imports: [LibsUiComponentsLineClampComponent],
|
|
85
|
+
template: `
|
|
86
|
+
<libs_ui-components-line_clamp
|
|
87
|
+
[content]="htmlContent"
|
|
88
|
+
[maxHeight]="60"
|
|
89
|
+
[showTooltip]="true"
|
|
90
|
+
[hasBackgroundGradient]="true"
|
|
91
|
+
[maxWidthTooltip]="350"
|
|
92
|
+
[directionTooltip]="'bottom'">
|
|
93
|
+
</libs_ui-components-line_clamp>
|
|
94
|
+
`,
|
|
95
|
+
})
|
|
96
|
+
export class TooltipExampleComponent {
|
|
97
|
+
readonly htmlContent = `
|
|
98
|
+
<p style="color: #ef4444; font-weight: bold;">Nội dung HTML quan trọng:</p>
|
|
99
|
+
<ul>
|
|
100
|
+
<li>Signal là một cách mới để quản lý state.</li>
|
|
101
|
+
<li>Control Flow Syntax giúp template sạch hơn.</li>
|
|
102
|
+
<li>Deferrable Views giúp tối ưu lazy loading.</li>
|
|
103
|
+
</ul>
|
|
104
|
+
`;
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Plain text mode (không render HTML)
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
// your.component.ts
|
|
112
|
+
import { Component } from '@angular/core';
|
|
113
|
+
import { LibsUiComponentsLineClampComponent } from '@libs-ui/components-line-clamp';
|
|
114
|
+
|
|
115
|
+
@Component({
|
|
116
|
+
standalone: true,
|
|
117
|
+
imports: [LibsUiComponentsLineClampComponent],
|
|
118
|
+
template: `
|
|
119
|
+
<libs_ui-components-line_clamp
|
|
120
|
+
[content]="plainText"
|
|
121
|
+
[maxHeight]="40"
|
|
122
|
+
[isInnerText]="true"
|
|
123
|
+
[ngClassObject]="{ 'text-gray-500 italic': true }">
|
|
124
|
+
</libs_ui-components-line_clamp>
|
|
125
|
+
`,
|
|
126
|
+
})
|
|
127
|
+
export class PlainTextExampleComponent {
|
|
128
|
+
readonly plainText = `Đây là văn bản thuần túy, sẽ được render bằng innerText.
|
|
129
|
+
Mọi thẻ HTML trong chuỗi này sẽ hiển thị dưới dạng ký tự thay vì được phân tích cú pháp.`;
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Điều khiển từ component cha qua FunctionsControl
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
// parent.component.ts
|
|
137
|
+
import { Component, signal, viewChild } from '@angular/core';
|
|
138
|
+
import {
|
|
139
|
+
LibsUiComponentsLineClampComponent,
|
|
140
|
+
ILineClampFunctionControlEvent,
|
|
141
|
+
} from '@libs-ui/components-line-clamp';
|
|
142
|
+
|
|
143
|
+
@Component({
|
|
144
|
+
standalone: true,
|
|
145
|
+
imports: [LibsUiComponentsLineClampComponent],
|
|
146
|
+
template: `
|
|
147
|
+
<libs_ui-components-line_clamp
|
|
148
|
+
[content]="description"
|
|
149
|
+
[maxHeight]="60"
|
|
150
|
+
(outFunctionControl)="handlerFunctionControl($event)"
|
|
151
|
+
(outAction)="handlerAction($event)"
|
|
152
|
+
(outDisplayLineClamp)="handlerDisplayLineClamp($event)">
|
|
153
|
+
</libs_ui-components-line_clamp>
|
|
154
|
+
|
|
155
|
+
<button (click)="handlerRefresh()">Refresh</button>
|
|
156
|
+
<button (click)="handlerExpandAll()">Mở rộng tất cả</button>
|
|
157
|
+
`,
|
|
158
|
+
})
|
|
159
|
+
export class ParentExampleComponent {
|
|
160
|
+
protected description = `Mô tả dài của sản phẩm sẽ được cắt sau 3 dòng (60px với line-height 20px).
|
|
161
|
+
Nhấn nút bên dưới để điều khiển trạng thái từ component cha.`;
|
|
162
|
+
|
|
163
|
+
private lineClampControl: ILineClampFunctionControlEvent | undefined;
|
|
164
|
+
|
|
165
|
+
protected handlerFunctionControl(control: ILineClampFunctionControlEvent): void {
|
|
166
|
+
this.lineClampControl = control;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
protected handlerAction(action: string): void {
|
|
170
|
+
// action: 'view-more' | 'hidden-more'
|
|
171
|
+
console.log('Line clamp action:', action);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
protected handlerDisplayLineClamp(isCollapsed: boolean): void {
|
|
175
|
+
console.log('Is collapsed:', isCollapsed);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
protected handlerRefresh(): void {
|
|
179
|
+
this.lineClampControl?.refresh();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
protected handlerExpandAll(): void {
|
|
183
|
+
this.lineClampControl?.viewMore();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
45
186
|
```
|
|
46
187
|
|
|
47
|
-
###
|
|
188
|
+
### Ẩn nút thu gọn (chỉ hiển thị "Xem thêm")
|
|
48
189
|
|
|
49
190
|
```html
|
|
50
191
|
<libs_ui-components-line_clamp
|
|
51
|
-
[content]="
|
|
52
|
-
[maxHeight]="
|
|
53
|
-
[
|
|
54
|
-
[
|
|
55
|
-
|
|
192
|
+
[content]="shortDescription"
|
|
193
|
+
[maxHeight]="40"
|
|
194
|
+
[ignoreShowButtonCollapse]="true"
|
|
195
|
+
[labelButtonViewMore]="'Đọc thêm'">
|
|
196
|
+
</libs_ui-components-line_clamp>
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## @Input()
|
|
200
|
+
|
|
201
|
+
| Input | Type | Default | Mô tả | Ví dụ |
|
|
202
|
+
|---|---|---|---|---|
|
|
203
|
+
| `classClassIncludeButtonCollapseExpand` | `string` | `'!p-0'` | Class CSS cho container wrapper của nút collapse/expand | `[classClassIncludeButtonCollapseExpand]="'mt-2 !p-0'"` |
|
|
204
|
+
| `classClassLabelButtonCollapseExpand` | `string` | `'libs-ui-font-h5r'` | Class CSS typography cho nhãn nút collapse/expand | `[classClassLabelButtonCollapseExpand]="'libs-ui-font-h6r'"` |
|
|
205
|
+
| `content` | `string` | **bắt buộc** | Nội dung văn bản hoặc HTML cần hiển thị và cắt ngắn | `[content]="description"` |
|
|
206
|
+
| `defaultIsCollapse` | `boolean` | `true` | Trạng thái thu gọn mặc định khi nội dung vượt `maxHeight` | `[defaultIsCollapse]="false"` |
|
|
207
|
+
| `directionTooltip` | `TYPE_POPOVER_DIRECTION` | `'top'` | Hướng xuất hiện của Tooltip (top, bottom, left, right) | `[directionTooltip]="'bottom'"` |
|
|
208
|
+
| `hasBackgroundGradient` | `boolean` | `false` | Hiển thị hiệu ứng mờ dần gradient ở cuối đoạn văn bị cắt | `[hasBackgroundGradient]="true"` |
|
|
209
|
+
| `ignoreShowButtonCollapse` | `boolean` | `undefined` | Ẩn nút "Thu gọn", chỉ giữ lại nút "Xem thêm" | `[ignoreShowButtonCollapse]="true"` |
|
|
210
|
+
| `ignoreShowButtonCollapseExpand` | `boolean` | `false` | Ẩn hoàn toàn cả hai nút Xem thêm và Thu gọn | `[ignoreShowButtonCollapseExpand]="true"` |
|
|
211
|
+
| `ignoreStopPropagationTooltipEvent` | `boolean` | `false` | Cho phép sự kiện Tooltip nổi bọt lên component cha | `[ignoreStopPropagationTooltipEvent]="true"` |
|
|
212
|
+
| `isInnerText` | `boolean` | `undefined` | Render nội dung bằng `innerText` thay vì `innerHTML`, mọi thẻ HTML sẽ hiển thị dạng ký tự | `[isInnerText]="true"` |
|
|
213
|
+
| `labelButtonCollapse` | `string` | `undefined` (dùng i18n `i18n_collapse`) | Nhãn tùy chỉnh cho nút Thu gọn | `[labelButtonCollapse]="'Thu gọn lại'"` |
|
|
214
|
+
| `labelButtonViewMore` | `string` | `undefined` (dùng i18n `i18n_view_more`) | Nhãn tùy chỉnh cho nút Xem thêm | `[labelButtonViewMore]="'Xem thêm nội dung'"` |
|
|
215
|
+
| `lengthLimitDisplay` | `number` | `200` | Giới hạn số ký tự dùng để tính toán cắt chuỗi ban đầu trước khi đo DOM | `[lengthLimitDisplay]="300"` |
|
|
216
|
+
| `maxHeight` | `number` | **bắt buộc** | Chiều cao tối đa (px) trước khi cắt. Công thức: `line-height × số dòng`. Ví dụ: `20px × 3 dòng = 60` | `[maxHeight]="60"` |
|
|
217
|
+
| `maxHeightTooltip` | `number` | `150` | Chiều cao tối đa (px) của Tooltip | `[maxHeightTooltip]="200"` |
|
|
218
|
+
| `maxWidthTooltip` | `number` | `250` | Chiều rộng tối đa (px) của Tooltip | `[maxWidthTooltip]="350"` |
|
|
219
|
+
| `ngClassObject` | `TYPE_OBJECT` | `{ 'libs-ui-line-clamp-content libs-ui-font-h5r': true }` | Object `ngClass` để apply class CSS vào div chứa nội dung | `[ngClassObject]="{ 'libs-ui-font-h6r text-gray-700': true }"` |
|
|
220
|
+
| `showTooltip` | `boolean` | `undefined` | Bật Tooltip hiển thị toàn bộ nội dung khi hover vào vùng văn bản đã cắt | `[showTooltip]="true"` |
|
|
221
|
+
| `timeHidePopoverOnMouseout` | `number` | `50` | Thời gian delay (ms) trước khi ẩn Tooltip sau sự kiện `mouseout` | `[timeHidePopoverOnMouseout]="100"` |
|
|
222
|
+
| `useXssFilter` | `boolean` | `true` | Bật bộ lọc XSS cho nội dung HTML (chỉ có hiệu lực khi `isInnerText` là `false`) | `[useXssFilter]="false"` |
|
|
223
|
+
| `zIndexPopover` | `number` | `1001` | Giá trị `z-index` của Tooltip/Popover | `[zIndexPopover]="1050"` |
|
|
224
|
+
|
|
225
|
+
## @Output()
|
|
226
|
+
|
|
227
|
+
| Output | Type | Mô tả | Handler TS | Binding HTML |
|
|
228
|
+
|---|---|---|---|---|
|
|
229
|
+
| `(outAction)` | `string` | Phát ra chuỗi `'view-more'` khi nhấn nút Xem thêm, hoặc `'hidden-more'` khi nhấn nút Thu gọn | `handlerAction(action: string): void { action.stopPropagation?.(); console.log(action); }` | `(outAction)="handlerAction($event)"` |
|
|
230
|
+
| `(outClick)` | `Event \| TYPE_POPOVER_EVENT` | Phát ra khi người dùng click vào vùng nội dung hoặc Tooltip được click | `handlerClick(event: Event): void { event.stopPropagation(); }` | `(outClick)="handlerClick($event)"` |
|
|
231
|
+
| `(outDisplayLineClamp)` | `boolean` | Phát ra trạng thái thu gọn hiện tại (`true` = đang thu gọn, `false` = đã mở rộng). Kích hoạt khi nội dung vượt `maxHeight` | `handlerDisplayLineClamp(isCollapsed: boolean): void { this.isCollapsed.set(isCollapsed); }` | `(outDisplayLineClamp)="handlerDisplayLineClamp($event)"` |
|
|
232
|
+
| `(outFunctionControl)` | `ILineClampFunctionControlEvent` | Phát ra ngay khi component khởi tạo (`ngOnInit`), cung cấp các method điều khiển để component cha gọi từ bên ngoài | `handlerFunctionControl(control: ILineClampFunctionControlEvent): void { this.lineClampControl = control; }` | `(outFunctionControl)="handlerFunctionControl($event)"` |
|
|
233
|
+
|
|
234
|
+
## Types & Interfaces
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
import {
|
|
238
|
+
ILineClampFunctionControlEvent,
|
|
239
|
+
ILineClampConfig,
|
|
240
|
+
} from '@libs-ui/components-line-clamp';
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### ILineClampFunctionControlEvent
|
|
244
|
+
|
|
245
|
+
Interface nhận được qua event `(outFunctionControl)`, dùng để điều khiển component từ bên ngoài:
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
export interface ILineClampFunctionControlEvent {
|
|
249
|
+
/** Làm mới trạng thái, tính toán lại từ đầu */
|
|
250
|
+
refresh: () => Promise<void>;
|
|
251
|
+
|
|
252
|
+
/** Kiểm tra component có đang ở trạng thái clamp (nội dung bị cắt) không */
|
|
253
|
+
checkIsDisplayLineClamp: () => Promise<boolean>;
|
|
254
|
+
|
|
255
|
+
/** Mở rộng nội dung (tương đương nhấn nút "Xem thêm") */
|
|
256
|
+
viewMore: () => Promise<void>;
|
|
257
|
+
|
|
258
|
+
/** Thu gọn nội dung (tương đương nhấn nút "Thu gọn") */
|
|
259
|
+
hiddenMore: () => Promise<void>;
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### ILineClampConfig
|
|
264
|
+
|
|
265
|
+
Interface cấu hình tùy chọn (dùng cho các trường hợp cần type hóa config object):
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
import { TYPE_OBJECT } from '@libs-ui/interfaces-types';
|
|
269
|
+
|
|
270
|
+
export interface ILineClampConfig {
|
|
271
|
+
maxHeight?: number;
|
|
272
|
+
class?: string;
|
|
273
|
+
ignoreShowButtonCollapseExpand?: boolean;
|
|
274
|
+
showTooltip?: boolean;
|
|
275
|
+
maxWidthTooltip?: number;
|
|
276
|
+
maxHeightTooltip?: number;
|
|
277
|
+
ngClassObject?: TYPE_OBJECT;
|
|
278
|
+
isInnerText?: boolean;
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
## Lưu ý quan trọng
|
|
283
|
+
|
|
284
|
+
⚠️ **Tính toán maxHeight**: `maxHeight` phải bằng `line-height (px) × số dòng mong muốn`. Ví dụ: text có `line-height: 20px`, muốn hiển thị 3 dòng thì set `[maxHeight]="60"`. Sai giá trị này sẽ khiến việc phát hiện clamp không chính xác.
|
|
285
|
+
|
|
286
|
+
⚠️ **isInnerText và useXssFilter**: Khi bật `[isInnerText]="true"`, nội dung được render bằng `innerText` — mọi thẻ HTML đều hiển thị dưới dạng ký tự. Trong trường hợp này `useXssFilter` không có tác dụng. Chỉ dùng `useXssFilter` khi render HTML (mặc định).
|
|
287
|
+
|
|
288
|
+
⚠️ **ngClassObject — CSS typography**: Object `ngClassObject` được apply vào thẻ div bao quanh nội dung. Mặc định là `{ 'libs-ui-line-clamp-content libs-ui-font-h5r': true }`. Khi ghi đè, cần bao gồm cả class layout cần thiết, không chỉ class typography.
|
|
289
|
+
|
|
290
|
+
⚠️ **outFunctionControl phát ra khi ngOnInit**: Event `(outFunctionControl)` chỉ phát ra một lần duy nhất khi component khởi tạo. Cần lưu lại reference để dùng sau: `private lineClampControl: ILineClampFunctionControlEvent | undefined`.
|
|
291
|
+
|
|
292
|
+
⚠️ **Resize tự động**: Component lắng nghe sự kiện `window:resize` và tự động gọi `refresh()`. Việc này đảm bảo trạng thái clamp luôn chính xác khi kích thước viewport thay đổi.
|
|
293
|
+
|
|
294
|
+
## Demo
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
npx nx serve core-ui
|
|
56
298
|
```
|
|
57
299
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
### Inputs
|
|
61
|
-
|
|
62
|
-
| Thuộc tính | Kiểu dữ liệu | Mặc định | Mô tả |
|
|
63
|
-
| :-------------------------------------- | :----------------------- | :----------------- | :------------------------------------------------------------ |
|
|
64
|
-
| `classClassIncludeButtonCollapseExpand` | `string` | `'!p-0'` | Class CSS cho container nút collapse/expand. |
|
|
65
|
-
| `classClassLabelButtonCollapseExpand` | `string` | `libs-...` | Class CSS cho nhãn nút collapse/expand. |
|
|
66
|
-
| `content` | `string` | `required` | Nội dung văn bản hoặc HTML cần hiển thị. |
|
|
67
|
-
| `defaultIsCollapse` | `boolean` | `true` | Mặc định thu gọn khi khởi tạo. |
|
|
68
|
-
| `directionTooltip` | `TYPE_POPOVER_DIRECTION` | `'top'` | Hướng hiển thị tooltip. |
|
|
69
|
-
| `hasBackgroundGradient` | `boolean` | `false` | Hiển thị hiệu ứng mờ dần ở phía dưới khi bị cắt. |
|
|
70
|
-
| `ignoreShowButtonCollapse` | `boolean` | `undefined` | Ẩn nút Thu gọn (chỉ hiện nút Xem thêm). |
|
|
71
|
-
| `ignoreShowButtonCollapseExpand` | `boolean` | `false` | Ẩn hoàn toàn nút Xem thêm / Thu gọn. |
|
|
72
|
-
| `ignoreStopPropagationTooltipEvent` | `boolean` | `false` | Ngăn chặn nổi bọt sự kiện tooltip. |
|
|
73
|
-
| `isInnerText` | `boolean` | `false` | Nếu true, sẽ render dưới dạng `innerText` (không xử lý HTML). |
|
|
74
|
-
| `labelButtonCollapse` | `string` | `'i18n_collapse'` | Nhãn cho nút Thu gọn. |
|
|
75
|
-
| `labelButtonViewMore` | `string` | `'i18n_view_more'` | Nhãn cho nút Xem thêm. |
|
|
76
|
-
| `lengthLimitDisplay` | `number` | `200` | Giới hạn số ký tự để tính toán cắt chuỗi ban đầu. |
|
|
77
|
-
| `maxHeight` | `number` | `required` | Độ cao tối đa (px). Công thức: (line-height) \* (số dòng). |
|
|
78
|
-
| `maxHeightTooltip` | `number` | `150` | Chiều cao tối đa của tooltip. |
|
|
79
|
-
| `maxWidthTooltip` | `number` | `250` | Chiều rộng tối đa của tooltip. |
|
|
80
|
-
| `ngClassObject` | `TYPE_OBJECT` | `...` | Đối tượng class CSS để apply vào div chứa nội dung. |
|
|
81
|
-
| `showTooltip` | `boolean` | `false` | Bật/tắt hiển thị tooltip khi nội dung bị cắt. |
|
|
82
|
-
| `timeHidePopoverOnMouseout` | `number` | `50` | Thời gian ẩn tooltip sau khi mouseout (ms). |
|
|
83
|
-
| `useXssFilter` | `boolean` | `true` | Bật bộ lọc XSS cho nội dung HTML. |
|
|
84
|
-
| `zIndexPopover` | `number` | `1001` | Z-index của tooltip. |
|
|
85
|
-
|
|
86
|
-
### Outputs
|
|
87
|
-
|
|
88
|
-
| Sự kiện | Kiểu dữ liệu | Mô tả |
|
|
89
|
-
| :-------------------- | :------------------------------- | :----------------------------------------------------------- |
|
|
90
|
-
| `outAction` | `string` | Phát ra khi người dùng nhấn 'view-more' hoặc 'hidden-more'. |
|
|
91
|
-
| `outClick` | `Event \| TYPE_POPOVER_EVENT` | Phát ra khi người dùng click vào vùng nội dung hoặc tooltip. |
|
|
92
|
-
| `outDisplayLineClamp` | `boolean` | Phát ra trạng thái đang thu gọn hay mở rộng. |
|
|
93
|
-
| `outFunctionControl` | `ILineClampFunctionControlEvent` | Cung cấp các phương thức điều khiển component (refresh). |
|
|
94
|
-
|
|
95
|
-
## Tech Stack
|
|
96
|
-
|
|
97
|
-
- **Core**: Angular 18+, Signals
|
|
98
|
-
- **Dependencies**: `@libs-ui/components-popover`, `@libs-ui/components-buttons-button`, `@libs-ui/pipes-security-trust`.
|
|
99
|
-
|
|
100
|
-
## License
|
|
101
|
-
|
|
102
|
-
MIT
|
|
300
|
+
Truy cập: http://localhost:4500/components/line-clamp
|
|
@@ -106,13 +106,13 @@ export class LibsUiComponentsLineClampComponent {
|
|
|
106
106
|
this.displayLineClamp.set(false);
|
|
107
107
|
}
|
|
108
108
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsLineClampComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
109
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsLineClampComponent, isStandalone: true, selector: "libs_ui-components-line_clamp", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, lengthLimitDisplay: { classPropertyName: "lengthLimitDisplay", publicName: "lengthLimitDisplay", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: true, transformFunction: null }, ignoreShowButtonCollapseExpand: { classPropertyName: "ignoreShowButtonCollapseExpand", publicName: "ignoreShowButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowButtonCollapse: { classPropertyName: "ignoreShowButtonCollapse", publicName: "ignoreShowButtonCollapse", isSignal: true, isRequired: false, transformFunction: null }, showTooltip: { classPropertyName: "showTooltip", publicName: "showTooltip", isSignal: true, isRequired: false, transformFunction: null }, timeHidePopoverOnMouseout: { classPropertyName: "timeHidePopoverOnMouseout", publicName: "timeHidePopoverOnMouseout", isSignal: true, isRequired: false, transformFunction: null }, maxWidthTooltip: { classPropertyName: "maxWidthTooltip", publicName: "maxWidthTooltip", isSignal: true, isRequired: false, transformFunction: null }, maxHeightTooltip: { classPropertyName: "maxHeightTooltip", publicName: "maxHeightTooltip", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopover: { classPropertyName: "zIndexPopover", publicName: "zIndexPopover", isSignal: true, isRequired: false, transformFunction: null }, isInnerText: { classPropertyName: "isInnerText", publicName: "isInnerText", isSignal: true, isRequired: false, transformFunction: null }, classClassLabelButtonCollapseExpand: { classPropertyName: "classClassLabelButtonCollapseExpand", publicName: "classClassLabelButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, classClassIncludeButtonCollapseExpand: { classPropertyName: "classClassIncludeButtonCollapseExpand", publicName: "classClassIncludeButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationTooltipEvent: { classPropertyName: "ignoreStopPropagationTooltipEvent", publicName: "ignoreStopPropagationTooltipEvent", isSignal: true, isRequired: false, transformFunction: null }, ngClassObject: { classPropertyName: "ngClassObject", publicName: "ngClassObject", isSignal: true, isRequired: false, transformFunction: null }, hasBackgroundGradient: { classPropertyName: "hasBackgroundGradient", publicName: "hasBackgroundGradient", isSignal: true, isRequired: false, transformFunction: null }, labelButtonViewMore: { classPropertyName: "labelButtonViewMore", publicName: "labelButtonViewMore", isSignal: true, isRequired: false, transformFunction: null }, labelButtonCollapse: { classPropertyName: "labelButtonCollapse", publicName: "labelButtonCollapse", isSignal: true, isRequired: false, transformFunction: null }, directionTooltip: { classPropertyName: "directionTooltip", publicName: "directionTooltip", isSignal: true, isRequired: false, transformFunction: null }, useXssFilter: { classPropertyName: "useXssFilter", publicName: "useXssFilter", isSignal: true, isRequired: false, transformFunction: null }, defaultIsCollapse: { classPropertyName: "defaultIsCollapse", publicName: "defaultIsCollapse", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outDisplayLineClamp: "outDisplayLineClamp", outAction: "outAction", outClick: "outClick", outFunctionControl: "outFunctionControl" }, host: { listeners: { "window:resize": "resize($event)" } }, ngImport: i0, template: "@if (!displayLineClamp()) {\n @if (!isInnerText()) {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerHTML\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerHtml]=\"content() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n (click)=\"handlerClick($event)\"\n (
|
|
109
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsLineClampComponent, isStandalone: true, selector: "libs_ui-components-line_clamp", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, lengthLimitDisplay: { classPropertyName: "lengthLimitDisplay", publicName: "lengthLimitDisplay", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: true, transformFunction: null }, ignoreShowButtonCollapseExpand: { classPropertyName: "ignoreShowButtonCollapseExpand", publicName: "ignoreShowButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowButtonCollapse: { classPropertyName: "ignoreShowButtonCollapse", publicName: "ignoreShowButtonCollapse", isSignal: true, isRequired: false, transformFunction: null }, showTooltip: { classPropertyName: "showTooltip", publicName: "showTooltip", isSignal: true, isRequired: false, transformFunction: null }, timeHidePopoverOnMouseout: { classPropertyName: "timeHidePopoverOnMouseout", publicName: "timeHidePopoverOnMouseout", isSignal: true, isRequired: false, transformFunction: null }, maxWidthTooltip: { classPropertyName: "maxWidthTooltip", publicName: "maxWidthTooltip", isSignal: true, isRequired: false, transformFunction: null }, maxHeightTooltip: { classPropertyName: "maxHeightTooltip", publicName: "maxHeightTooltip", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopover: { classPropertyName: "zIndexPopover", publicName: "zIndexPopover", isSignal: true, isRequired: false, transformFunction: null }, isInnerText: { classPropertyName: "isInnerText", publicName: "isInnerText", isSignal: true, isRequired: false, transformFunction: null }, classClassLabelButtonCollapseExpand: { classPropertyName: "classClassLabelButtonCollapseExpand", publicName: "classClassLabelButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, classClassIncludeButtonCollapseExpand: { classPropertyName: "classClassIncludeButtonCollapseExpand", publicName: "classClassIncludeButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationTooltipEvent: { classPropertyName: "ignoreStopPropagationTooltipEvent", publicName: "ignoreStopPropagationTooltipEvent", isSignal: true, isRequired: false, transformFunction: null }, ngClassObject: { classPropertyName: "ngClassObject", publicName: "ngClassObject", isSignal: true, isRequired: false, transformFunction: null }, hasBackgroundGradient: { classPropertyName: "hasBackgroundGradient", publicName: "hasBackgroundGradient", isSignal: true, isRequired: false, transformFunction: null }, labelButtonViewMore: { classPropertyName: "labelButtonViewMore", publicName: "labelButtonViewMore", isSignal: true, isRequired: false, transformFunction: null }, labelButtonCollapse: { classPropertyName: "labelButtonCollapse", publicName: "labelButtonCollapse", isSignal: true, isRequired: false, transformFunction: null }, directionTooltip: { classPropertyName: "directionTooltip", publicName: "directionTooltip", isSignal: true, isRequired: false, transformFunction: null }, useXssFilter: { classPropertyName: "useXssFilter", publicName: "useXssFilter", isSignal: true, isRequired: false, transformFunction: null }, defaultIsCollapse: { classPropertyName: "defaultIsCollapse", publicName: "defaultIsCollapse", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outDisplayLineClamp: "outDisplayLineClamp", outAction: "outAction", outClick: "outClick", outFunctionControl: "outFunctionControl" }, host: { listeners: { "window:resize": "resize($event)" } }, ngImport: i0, template: "@if (!displayLineClamp()) {\n @if (!isInnerText()) {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerHTML\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerHtml]=\"content() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n (click)=\"handlerClick($event)\"\n (keydown.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n } @else {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerText\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerText]=\"content() | translate\"\n (click)=\"handlerClick($event)\"\n (keydown.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n }\n} @else {\n <libs_ui-components-popover\n class=\"relative\"\n type=\"other\"\n [ignoreShowPopover]=\"!showTooltip()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationTooltipEvent()\"\n [config]=\"{\n timerDestroy: timeHidePopoverOnMouseout(),\n maxWidth: maxWidthTooltip(),\n maxHeight: maxHeightTooltip(),\n direction: directionTooltip(),\n content: isInnerText() ? (this.content() | LibsUiPipesEscapeHtmlPipe) : this.content(),\n zIndex: zIndexPopover(),\n }\"\n (outEvent)=\"handlerClick($event)\">\n @if (isCollapse() && hasBackgroundGradient()) {\n <div class=\"h-[40px] libs-ui-line-clamp-bg-gradient\"></div>\n }\n @if (!isInnerText()) {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerHtml]=\"contentDisplay() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"></div>\n } @else {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerText]=\"contentDisplay() | translate\"></div>\n }\n </libs_ui-components-popover>\n\n @if (!ignoreShowButtonCollapseExpand()) {\n @if (isCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonViewMore() || 'i18n_view_more'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"viewMore($event)\" />\n } @else {\n @if (!ignoreShowButtonCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonCollapse() || 'i18n_collapse'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"hiddenMore($event)\" />\n }\n }\n }\n}\n", styles: [".libs-ui-line-clamp-content{font-weight:400;text-align:start}.libs-ui-line-clamp-bg-gradient{opacity:.5;background:linear-gradient(180deg,#fff0,#fffffff2 51.56%,#fff);position:absolute;width:100%;bottom:0}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: LibsUiComponentsLineClampDirective, selector: "[LibsUiComponentsLineClampDirective]", inputs: ["lengthLimitDisplay", "methodDisplay", "content", "ignoreThreeDots"], outputs: ["outContentSub"] }, { kind: "pipe", type: LibsUiPipesSecurityTrustPipe, name: "LibsUiPipesSecurityTrustPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
110
110
|
}
|
|
111
111
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsLineClampComponent, decorators: [{
|
|
112
112
|
type: Component,
|
|
113
|
-
args: [{ selector: 'libs_ui-components-line_clamp', standalone: true, imports: [NgClass, TranslateModule, AsyncPipe, LibsUiComponentsLineClampDirective, LibsUiPipesSecurityTrustPipe, LibsUiPipesEscapeHtmlPipe, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!displayLineClamp()) {\n @if (!isInnerText()) {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerHTML\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerHtml]=\"content() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n (click)=\"handlerClick($event)\"\n (
|
|
113
|
+
args: [{ selector: 'libs_ui-components-line_clamp', standalone: true, imports: [NgClass, TranslateModule, AsyncPipe, LibsUiComponentsLineClampDirective, LibsUiPipesSecurityTrustPipe, LibsUiPipesEscapeHtmlPipe, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!displayLineClamp()) {\n @if (!isInnerText()) {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerHTML\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerHtml]=\"content() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n (click)=\"handlerClick($event)\"\n (keydown.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n } @else {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerText\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerText]=\"content() | translate\"\n (click)=\"handlerClick($event)\"\n (keydown.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n }\n} @else {\n <libs_ui-components-popover\n class=\"relative\"\n type=\"other\"\n [ignoreShowPopover]=\"!showTooltip()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationTooltipEvent()\"\n [config]=\"{\n timerDestroy: timeHidePopoverOnMouseout(),\n maxWidth: maxWidthTooltip(),\n maxHeight: maxHeightTooltip(),\n direction: directionTooltip(),\n content: isInnerText() ? (this.content() | LibsUiPipesEscapeHtmlPipe) : this.content(),\n zIndex: zIndexPopover(),\n }\"\n (outEvent)=\"handlerClick($event)\">\n @if (isCollapse() && hasBackgroundGradient()) {\n <div class=\"h-[40px] libs-ui-line-clamp-bg-gradient\"></div>\n }\n @if (!isInnerText()) {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerHtml]=\"contentDisplay() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"></div>\n } @else {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerText]=\"contentDisplay() | translate\"></div>\n }\n </libs_ui-components-popover>\n\n @if (!ignoreShowButtonCollapseExpand()) {\n @if (isCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonViewMore() || 'i18n_view_more'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"viewMore($event)\" />\n } @else {\n @if (!ignoreShowButtonCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonCollapse() || 'i18n_collapse'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"hiddenMore($event)\" />\n }\n }\n }\n}\n", styles: [".libs-ui-line-clamp-content{font-weight:400;text-align:start}.libs-ui-line-clamp-bg-gradient{opacity:.5;background:linear-gradient(180deg,#fff0,#fffffff2 51.56%,#fff);position:absolute;width:100%;bottom:0}\n"] }]
|
|
114
114
|
}], ctorParameters: () => [], propDecorators: { resize: [{
|
|
115
115
|
type: HostListener,
|
|
116
116
|
args: ['window:resize', ['$event']]
|
|
117
117
|
}] } });
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jbGFtcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGluZS1jbGFtcC9zcmMvbGluZS1jbGFtcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGluZS1jbGFtcC9zcmMvbGluZS1jbGFtcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlJLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBOEMsTUFBTSw2QkFBNkIsQ0FBQztBQUUzSCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFVNUUsTUFBTSxPQUFPLGtDQUFrQztJQUM3QyxlQUFlO0lBQ0wsZ0JBQWdCLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzFDLFVBQVUsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDcEMsWUFBWSxHQUFHLE1BQU0sQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUNsQyxjQUFjLEdB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TUFBTTt3REEyRi9CLE1BQU07c0JBRHJCLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95LCBPbkluaXQsIGVmZmVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0RJUkVDVElPTiwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IFRZUEVfT0JKRUNUIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLXNlY3VyaXR5LXRydXN0JztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJTGluZUNsYW1wRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpbmVDbGFtcERpcmVjdGl2ZSB9IGZyb20gJy4vbGluZS1jbGFtcC5kaXJlY3RpdmUnO1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWxpbmVfY2xhbXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGluZS1jbGFtcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xpbmUtY2xhbXAuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nQ2xhc3MsIFRyYW5zbGF0ZU1vZHVsZSwgQXN5bmNQaXBlLCBMaWJzVWlDb21wb25lbnRzTGluZUNsYW1wRGlyZWN0aXZlLCBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlLCBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0xpbmVDbGFtcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIFBST1BFUlRZICovXG4gIHByb3RlY3RlZCBkaXNwbGF5TGluZUNsYW1wID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGlzQ29sbGFwc2UgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgY29udGVudENsYW1wID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgY29udGVudERpc3BsYXkgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgLyoqIElOUFVUICovXG4gIHJlYWRvbmx5IGNvbnRlbnQgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxlbmd0aExpbWl0RGlzcGxheSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigyMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgfHwgMjAwIH0pO1xuICByZWFkb25seSBtYXhIZWlnaHQgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXI+KCk7IC8vIG1heEhlaWdodCA9IChsaW5lLWhlaWdodCBj4bunYSB0ZXh0KSooc+G7kSBkw7JuZyBtb25nIG114buRbilcbiAgcmVhZG9ubHkgaWdub3JlU2hvd0J1dHRvbkNvbGxhcHNlRXhwYW5kID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlU2hvd0J1dHRvbkNvbGxhcHNlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgc2hvd1Rvb2x0aXAgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB0aW1lSGlkZVBvcG92ZXJPbk1vdXNlb3V0ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDUwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDUwIH0pO1xuICByZWFkb25seSBtYXhXaWR0aFRvb2x0aXAgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMjUwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDI1MCB9KTtcbiAgcmVhZG9ubHkgbWF4SGVpZ2h0VG9vbHRpcCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxNTAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTUwIH0pO1xuICByZWFkb25seSB6SW5kZXhQb3BvdmVyID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMDEsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAwMSB9KTtcbiAgcmVhZG9ubHkgaXNJbm5lclRleHQgPSBpbnB1dDxib29sZWFuPigpOyAvLyBraMO0bmcgY+G6p24gZXNjYXBlSFRNTCBjb250ZW50IGtoaSBiaeG6v24gYuG6sW5nIHRydWVcbiAgcmVhZG9ubHkgY2xhc3NDbGFzc0xhYmVsQnV0dG9uQ29sbGFwc2VFeHBhbmQgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2xpYnMtdWktZm9udC1oNXInLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICdsaWJzLXVpLWZvbnQtaDVyJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NDbGFzc0luY2x1ZGVCdXR0b25Db2xsYXBzZUV4cGFuZCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignIXAtMCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJyFwLTAnIH0pO1xuICByZWFkb25seSBpZ25vcmVTdG9wUHJvcGFnYXRpb25Ub29sdGlwRXZlbnQgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgbmdDbGFzc09iamVjdCA9IGlucHV0PFRZUEVfT0JKRUNULCBUWVBFX09CSkVDVCB8IHVuZGVmaW5lZD4oeyAnbGlicy11aS1saW5lLWNsYW1wLWNvbnRlbnQgbGlicy11aS1mb250LWg1cic6IHRydWUgfSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCB8fCB7ICdsaWJzLXVpLWxpbmUtY2xhbXAtY29udGVudCBsaWItdWktZm9udC1oNXInOiB0cnVlIH0gfSk7IC8vIG9iamVjdCBuZ0NsYXNzXG4gIHJlYWRvbmx5IGhhc0JhY2tncm91bmRHcmFkaWVudCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBsYWJlbEJ1dHRvblZpZXdNb3JlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsYWJlbEJ1dHRvbkNvbGxhcHNlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBkaXJlY3Rpb25Ub29sdGlwID0gaW5wdXQ8VFlQRV9QT1BPVkVSX0RJUkVDVElPTiwgVFlQRV9QT1BPVkVSX0RJUkVDVElPTiB8IHVuZGVmaW5lZD4oJ3RvcCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ3RvcCcgfSk7XG4gIHJlYWRvbmx5IHVzZVhzc0ZpbHRlciA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KHRydWUsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgZGVmYXVsdElzQ29sbGFwc2UgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IHRydWUgfSk7XG5cbiAgLyoqIE9VVFBVVCAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3V0RGlzcGxheUxpbmVDbGFtcCA9IG91dHB1dDxib29sZWFuPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3V0QWN0aW9uID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG91dENsaWNrID0gb3V0cHV0PEV2ZW50IHwgVFlQRV9QT1BPVkVSX0VWRU5UPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3V0RnVuY3Rpb25Db250cm9sID0gb3V0cHV0PElMaW5lQ2xhbXBGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCFpc05pbCh0aGlzLmNvbnRlbnQoKSkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnREaXNwbGF5LnNldCgnJyk7XG4gICAgICAgICAgdGhpcy5kaXNwbGF5TGluZUNsYW1wLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5pc0NvbGxhcHNlLnNldChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbkNvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuICB9XG5cbiAgLyoqIEZVTkNUSU9OUyAqL1xuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUxpbmVDbGFtcEZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmcmVzaDogdGhpcy5yZWZyZXNoLmJpbmQodGhpcyksXG4gICAgICBjaGVja0lzRGlzcGxheUxpbmVDbGFtcDogYXN5bmMgKCkgPT4gdGhpcy5kaXNwbGF5TGluZUNsYW1wKCksXG4gICAgICB2aWV3TW9yZTogdGhpcy52aWV3TW9yZS5iaW5kKHRoaXMpLFxuICAgICAgaGlkZGVuTW9yZTogdGhpcy5oaWRkZW5Nb3JlLmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ29udGVudFN1Yihjb250ZW50OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KCkgIT09IGNvbnRlbnQpIHtcbiAgICAgIHRoaXMuZGlzcGxheUxpbmVDbGFtcC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmlzQ29sbGFwc2Uuc2V0KHRoaXMuZGVmYXVsdElzQ29sbGFwc2UoKSk7XG4gICAgICB0aGlzLmNvbnRlbnRDbGFtcC5zZXQoY29udGVudCk7XG4gICAgICB0aGlzLmNvbnRlbnREaXNwbGF5LnNldCh0aGlzLmlzQ29sbGFwc2UoKSA/IGNvbnRlbnQgOiB0aGlzLmNvbnRlbnQoKSk7XG4gICAgICB0aGlzLm91dERpc3BsYXlMaW5lQ2xhbXAuZW1pdCh0aGlzLmlzQ29sbGFwc2UoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHZpZXdNb3JlKGU/OiBFdmVudCkge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNDb2xsYXBzZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuY29udGVudERpc3BsYXkuc2V0KHRoaXMuY29udGVudCgpKTtcbiAgICBlPy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3V0QWN0aW9uLmVtaXQoJ3ZpZXctbW9yZScpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhpZGRlbk1vcmUoZT86IEV2ZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0NvbGxhcHNlLnNldCh0cnVlKTtcbiAgICB0aGlzLmNvbnRlbnREaXNwbGF5LnNldCh0aGlzLmNvbnRlbnRDbGFtcCgpKTtcbiAgICBlPy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3V0QWN0aW9uLmVtaXQoJ2hpZGRlbi1tb3JlJyk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgcHJvdGVjdGVkIGFzeW5jIHJlc2l6ZSgpIHtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZWZyZXNoKCkge1xuICAgIHRoaXMuY29udGVudERpc3BsYXkuc2V0KHRoaXMuY29udGVudCgpKTtcbiAgICB0aGlzLmRpc3BsYXlMaW5lQ2xhbXAuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmlzQ29sbGFwc2Uuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ2xpY2soZXZlbnQ6IEV2ZW50IHwgVFlQRV9QT1BPVkVSX0VWRU5UKSB7XG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycgJiYgZXZlbnQgIT09ICdjbGljaycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGlzcGxheUxpbmVDbGFtcC5zZXQoZmFsc2UpO1xuICB9XG59XG4iLCJAaWYgKCFkaXNwbGF5TGluZUNsYW1wKCkpIHtcbiAgQGlmICghaXNJbm5lclRleHQoKSkge1xuICAgIDxkaXZcbiAgICAgIExpYnNVaUNvbXBvbmVudHNMaW5lQ2xhbXBEaXJlY3RpdmVcbiAgICAgIFtsZW5ndGhMaW1pdERpc3BsYXldPVwibGVuZ3RoTGltaXREaXNwbGF5KClcIlxuICAgICAgW2lnbm9yZVRocmVlRG90c109XCJoYXNCYWNrZ3JvdW5kR3JhZGllbnQoKVwiXG4gICAgICBtZXRob2REaXNwbGF5PVwiaW5uZXJIVE1MXCJcbiAgICAgIGNsYXNzPVwib3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgIFtjb250ZW50XT1cImNvbnRlbnQoKVwiXG4gICAgICBbbmdDbGFzc109XCJuZ0NsYXNzT2JqZWN0KClcIlxuICAgICAgW3N0eWxlLm1heEhlaWdodC5weF09XCJtYXhIZWlnaHQoKVwiXG4gICAgICBbaW5uZXJIdG1sXT1cImNvbnRlbnQoKSB8IHRyYW5zbGF0ZSB8IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGU6ICdodG1sJyA6IHVzZVhzc0ZpbHRlcigpIHwgYXN5bmNcIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQpXCJcbiAgICAgIChrZXl1cC5lbnRlcik9XCJoYW5kbGVyQ2xpY2soJGV2ZW50KVwiXG4gICAgICAob3V0Q29udGVudFN1Yik9XCJoYW5kbGVyQ29udGVudFN1YigkZXZlbnQpXCI+PC9kaXY+XG4gIH0gQGVsc2Uge1xuICAgIDxkaXZcbiAgICAgIExpYnNVaUNvbXBvbmVudHNMaW5lQ2xhbXBEaXJlY3RpdmVcbiAgICAgIFtsZW5ndGhMaW1pdERpc3BsYXldPVwibGVuZ3RoTGltaXREaXNwbGF5KClcIlxuICAgICAgW2lnbm9yZVRocmVlRG90c109XCJoYXNCYWNrZ3JvdW5kR3JhZGllbnQoKVwiXG4gICAgICBtZXRob2REaXNwbGF5PVwiaW5uZXJUZXh0XCJcbiAgICAgIGNsYXNzPVwib3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgIFtjb250ZW50XT1cImNvbnRlbnQoKVwiXG4gICAgICBbbmdDbGFzc109XCJuZ0NsYXNzT2JqZWN0KClcIlxuICAgICAgW3N0eWxlLm1heEhlaWdodC5weF09XCJtYXhIZWlnaHQoKVwiXG4gICAgICBbaW5uZXJUZXh0XT1cImNvbnRlbnQoKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudClcIlxuICAgICAgKGtleXVwLmVudGVyKT1cImhhbmRsZXJDbGljaygkZXZlbnQpXCJcbiAgICAgIChvdXRDb250ZW50U3ViKT1cImhhbmRsZXJDb250ZW50U3ViKCRldmVudClcIj48L2Rpdj5cbiAgfVxufSBAZWxzZSB7XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgIGNsYXNzPVwicmVsYXRpdmVcIlxuICAgIHR5cGU9XCJvdGhlclwiXG4gICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cIiFzaG93VG9vbHRpcCgpXCJcbiAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwiaWdub3JlU3RvcFByb3BhZ2F0aW9uVG9vbHRpcEV2ZW50KClcIlxuICAgIFtjb25maWddPVwie1xuICAgICAgdGltZXJEZXN0cm95OiB0aW1lSGlkZVBvcG92ZXJPbk1vdXNlb3V0KCksXG4gICAgICBtYXhXaWR0aDogbWF4V2lkdGhUb29sdGlwKCksXG4gICAgICBtYXhIZWlnaHQ6IG1heEhlaWdodFRvb2x0aXAoKSxcbiAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uVG9vbHRpcCgpLFxuICAgICAgY29udGVudDogaXNJbm5lclRleHQoKSA/ICh0aGlzLmNvbnRlbnQoKSB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUpIDogdGhpcy5jb250ZW50KCksXG4gICAgICB6SW5kZXg6IHpJbmRleFBvcG92ZXIoKSxcbiAgICB9XCJcbiAgICAob3V0RXZlbnQpPVwiaGFuZGxlckNsaWNrKCRldmVudClcIj5cbiAgICBAaWYgKGlzQ29sbGFwc2UoKSAmJiBoYXNCYWNrZ3JvdW5kR3JhZGllbnQoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImgtWzQwcHhdIGxpYnMtdWktbGluZS1jbGFtcC1iZy1ncmFkaWVudFwiPjwvZGl2PlxuICAgIH1cbiAgICBAaWYgKCFpc0lubmVyVGV4dCgpKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIFtuZ0NsYXNzXT1cIm5nQ2xhc3NPYmplY3QoKVwiXG4gICAgICAgIFtpbm5lckh0bWxdPVwiY29udGVudERpc3BsYXkoKSB8IHRyYW5zbGF0ZSB8IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGU6ICdodG1sJyA6IHVzZVhzc0ZpbHRlcigpIHwgYXN5bmNcIj48L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxkaXZcbiAgICAgICAgW25nQ2xhc3NdPVwibmdDbGFzc09iamVjdCgpXCJcbiAgICAgICAgW2lubmVyVGV4dF09XCJjb250ZW50RGlzcGxheSgpIHwgdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgfVxuICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuXG4gIEBpZiAoIWlnbm9yZVNob3dCdXR0b25Db2xsYXBzZUV4cGFuZCgpKSB7XG4gICAgQGlmIChpc0NvbGxhcHNlKCkpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvbi1saW5rLXByaW1hcnlcIlxuICAgICAgICBbbGFiZWxdPVwibGFiZWxCdXR0b25WaWV3TW9yZSgpIHx8ICdpMThuX3ZpZXdfbW9yZSdcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzQ2xhc3NJbmNsdWRlQnV0dG9uQ29sbGFwc2VFeHBhbmQoKVwiXG4gICAgICAgIFtjbGFzc0xhYmVsXT1cImNsYXNzQ2xhc3NMYWJlbEJ1dHRvbkNvbGxhcHNlRXhwYW5kKClcIlxuICAgICAgICAob3V0Q2xpY2spPVwidmlld01vcmUoJGV2ZW50KVwiIC8+XG4gICAgfSBAZWxzZSB7XG4gICAgICBAaWYgKCFpZ25vcmVTaG93QnV0dG9uQ29sbGFwc2UoKSkge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvbi1saW5rLXByaW1hcnlcIlxuICAgICAgICAgIFtsYWJlbF09XCJsYWJlbEJ1dHRvbkNvbGxhcHNlKCkgfHwgJ2kxOG5fY29sbGFwc2UnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzQ2xhc3NJbmNsdWRlQnV0dG9uQ29sbGFwc2VFeHBhbmQoKVwiXG4gICAgICAgICAgW2NsYXNzTGFiZWxdPVwiY2xhc3NDbGFzc0xhYmVsQnV0dG9uQ29sbGFwc2VFeHBhbmQoKVwiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhpZGRlbk1vcmUoJGV2ZW50KVwiIC8+XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jbGFtcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGluZS1jbGFtcC9zcmMvbGluZS1jbGFtcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGluZS1jbGFtcC9zcmMvbGluZS1jbGFtcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlJLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBOEMsTUFBTSw2QkFBNkIsQ0FBQztBQUUzSCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFVNUUsTUFBTSxPQUFPLGtDQUFrQztJQUM3QyxlQUFlO0lBQ0wsZ0JBQWdCLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzFDLFVBQVUsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDcEMsWUFBWSxHQUFHLE1BQU0sQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUNsQyxjQUFjLEdB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TUFBTTt3REEyRi9CLE1BQU07c0JBRHJCLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95LCBPbkluaXQsIGVmZmVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0RJUkVDVElPTiwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IFRZUEVfT0JKRUNUIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLXNlY3VyaXR5LXRydXN0JztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJTGluZUNsYW1wRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0xpbmVDbGFtcERpcmVjdGl2ZSB9IGZyb20gJy4vbGluZS1jbGFtcC5kaXJlY3RpdmUnO1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWxpbmVfY2xhbXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGluZS1jbGFtcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xpbmUtY2xhbXAuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nQ2xhc3MsIFRyYW5zbGF0ZU1vZHVsZSwgQXN5bmNQaXBlLCBMaWJzVWlDb21wb25lbnRzTGluZUNsYW1wRGlyZWN0aXZlLCBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlLCBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0xpbmVDbGFtcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIFBST1BFUlRZICovXG4gIHByb3RlY3RlZCBkaXNwbGF5TGluZUNsYW1wID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGlzQ29sbGFwc2UgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgY29udGVudENsYW1wID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgY29udGVudERpc3BsYXkgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgLyoqIElOUFVUICovXG4gIHJlYWRvbmx5IGNvbnRlbnQgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxlbmd0aExpbWl0RGlzcGxheSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigyMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgfHwgMjAwIH0pO1xuICByZWFkb25seSBtYXhIZWlnaHQgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXI+KCk7IC8vIG1heEhlaWdodCA9IChsaW5lLWhlaWdodCBj4bunYSB0ZXh0KSooc+G7kSBkw7JuZyBtb25nIG114buRbilcbiAgcmVhZG9ubHkgaWdub3JlU2hvd0J1dHRvbkNvbGxhcHNlRXhwYW5kID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlU2hvd0J1dHRvbkNvbGxhcHNlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgc2hvd1Rvb2x0aXAgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB0aW1lSGlkZVBvcG92ZXJPbk1vdXNlb3V0ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDUwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDUwIH0pO1xuICByZWFkb25seSBtYXhXaWR0aFRvb2x0aXAgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMjUwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDI1MCB9KTtcbiAgcmVhZG9ubHkgbWF4SGVpZ2h0VG9vbHRpcCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxNTAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTUwIH0pO1xuICByZWFkb25seSB6SW5kZXhQb3BvdmVyID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMDEsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAwMSB9KTtcbiAgcmVhZG9ubHkgaXNJbm5lclRleHQgPSBpbnB1dDxib29sZWFuPigpOyAvLyBraMO0bmcgY+G6p24gZXNjYXBlSFRNTCBjb250ZW50IGtoaSBiaeG6v24gYuG6sW5nIHRydWVcbiAgcmVhZG9ubHkgY2xhc3NDbGFzc0xhYmVsQnV0dG9uQ29sbGFwc2VFeHBhbmQgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2xpYnMtdWktZm9udC1oNXInLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICdsaWJzLXVpLWZvbnQtaDVyJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NDbGFzc0luY2x1ZGVCdXR0b25Db2xsYXBzZUV4cGFuZCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignIXAtMCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJyFwLTAnIH0pO1xuICByZWFkb25seSBpZ25vcmVTdG9wUHJvcGFnYXRpb25Ub29sdGlwRXZlbnQgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgbmdDbGFzc09iamVjdCA9IGlucHV0PFRZUEVfT0JKRUNULCBUWVBFX09CSkVDVCB8IHVuZGVmaW5lZD4oeyAnbGlicy11aS1saW5lLWNsYW1wLWNvbnRlbnQgbGlicy11aS1mb250LWg1cic6IHRydWUgfSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCB8fCB7ICdsaWJzLXVpLWxpbmUtY2xhbXAtY29udGVudCBsaWItdWktZm9udC1oNXInOiB0cnVlIH0gfSk7IC8vIG9iamVjdCBuZ0NsYXNzXG4gIHJlYWRvbmx5IGhhc0JhY2tncm91bmRHcmFkaWVudCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBsYWJlbEJ1dHRvblZpZXdNb3JlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsYWJlbEJ1dHRvbkNvbGxhcHNlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBkaXJlY3Rpb25Ub29sdGlwID0gaW5wdXQ8VFlQRV9QT1BPVkVSX0RJUkVDVElPTiwgVFlQRV9QT1BPVkVSX0RJUkVDVElPTiB8IHVuZGVmaW5lZD4oJ3RvcCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ3RvcCcgfSk7XG4gIHJlYWRvbmx5IHVzZVhzc0ZpbHRlciA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KHRydWUsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgZGVmYXVsdElzQ29sbGFwc2UgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IHRydWUgfSk7XG5cbiAgLyoqIE9VVFBVVCAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3V0RGlzcGxheUxpbmVDbGFtcCA9IG91dHB1dDxib29sZWFuPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3V0QWN0aW9uID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG91dENsaWNrID0gb3V0cHV0PEV2ZW50IHwgVFlQRV9QT1BPVkVSX0VWRU5UPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3V0RnVuY3Rpb25Db250cm9sID0gb3V0cHV0PElMaW5lQ2xhbXBGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCFpc05pbCh0aGlzLmNvbnRlbnQoKSkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnREaXNwbGF5LnNldCgnJyk7XG4gICAgICAgICAgdGhpcy5kaXNwbGF5TGluZUNsYW1wLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5pc0NvbGxhcHNlLnNldChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbkNvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuICB9XG5cbiAgLyoqIEZVTkNUSU9OUyAqL1xuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUxpbmVDbGFtcEZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmcmVzaDogdGhpcy5yZWZyZXNoLmJpbmQodGhpcyksXG4gICAgICBjaGVja0lzRGlzcGxheUxpbmVDbGFtcDogYXN5bmMgKCkgPT4gdGhpcy5kaXNwbGF5TGluZUNsYW1wKCksXG4gICAgICB2aWV3TW9yZTogdGhpcy52aWV3TW9yZS5iaW5kKHRoaXMpLFxuICAgICAgaGlkZGVuTW9yZTogdGhpcy5oaWRkZW5Nb3JlLmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ29udGVudFN1Yihjb250ZW50OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KCkgIT09IGNvbnRlbnQpIHtcbiAgICAgIHRoaXMuZGlzcGxheUxpbmVDbGFtcC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmlzQ29sbGFwc2Uuc2V0KHRoaXMuZGVmYXVsdElzQ29sbGFwc2UoKSk7XG4gICAgICB0aGlzLmNvbnRlbnRDbGFtcC5zZXQoY29udGVudCk7XG4gICAgICB0aGlzLmNvbnRlbnREaXNwbGF5LnNldCh0aGlzLmlzQ29sbGFwc2UoKSA/IGNvbnRlbnQgOiB0aGlzLmNvbnRlbnQoKSk7XG4gICAgICB0aGlzLm91dERpc3BsYXlMaW5lQ2xhbXAuZW1pdCh0aGlzLmlzQ29sbGFwc2UoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHZpZXdNb3JlKGU/OiBFdmVudCkge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNDb2xsYXBzZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuY29udGVudERpc3BsYXkuc2V0KHRoaXMuY29udGVudCgpKTtcbiAgICBlPy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3V0QWN0aW9uLmVtaXQoJ3ZpZXctbW9yZScpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhpZGRlbk1vcmUoZT86IEV2ZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0NvbGxhcHNlLnNldCh0cnVlKTtcbiAgICB0aGlzLmNvbnRlbnREaXNwbGF5LnNldCh0aGlzLmNvbnRlbnRDbGFtcCgpKTtcbiAgICBlPy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3V0QWN0aW9uLmVtaXQoJ2hpZGRlbi1tb3JlJyk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgcHJvdGVjdGVkIGFzeW5jIHJlc2l6ZSgpIHtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZWZyZXNoKCkge1xuICAgIHRoaXMuY29udGVudERpc3BsYXkuc2V0KHRoaXMuY29udGVudCgpKTtcbiAgICB0aGlzLmRpc3BsYXlMaW5lQ2xhbXAuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmlzQ29sbGFwc2Uuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ2xpY2soZXZlbnQ6IEV2ZW50IHwgVFlQRV9QT1BPVkVSX0VWRU5UKSB7XG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycgJiYgZXZlbnQgIT09ICdjbGljaycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGlzcGxheUxpbmVDbGFtcC5zZXQoZmFsc2UpO1xuICB9XG59XG4iLCJAaWYgKCFkaXNwbGF5TGluZUNsYW1wKCkpIHtcbiAgQGlmICghaXNJbm5lclRleHQoKSkge1xuICAgIDxkaXZcbiAgICAgIExpYnNVaUNvbXBvbmVudHNMaW5lQ2xhbXBEaXJlY3RpdmVcbiAgICAgIFtsZW5ndGhMaW1pdERpc3BsYXldPVwibGVuZ3RoTGltaXREaXNwbGF5KClcIlxuICAgICAgW2lnbm9yZVRocmVlRG90c109XCJoYXNCYWNrZ3JvdW5kR3JhZGllbnQoKVwiXG4gICAgICBtZXRob2REaXNwbGF5PVwiaW5uZXJIVE1MXCJcbiAgICAgIGNsYXNzPVwib3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgIFtjb250ZW50XT1cImNvbnRlbnQoKVwiXG4gICAgICBbbmdDbGFzc109XCJuZ0NsYXNzT2JqZWN0KClcIlxuICAgICAgW3N0eWxlLm1heEhlaWdodC5weF09XCJtYXhIZWlnaHQoKVwiXG4gICAgICBbaW5uZXJIdG1sXT1cImNvbnRlbnQoKSB8IHRyYW5zbGF0ZSB8IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGU6ICdodG1sJyA6IHVzZVhzc0ZpbHRlcigpIHwgYXN5bmNcIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQpXCJcbiAgICAgIChrZXlkb3duLmVudGVyKT1cImhhbmRsZXJDbGljaygkZXZlbnQpXCJcbiAgICAgIChvdXRDb250ZW50U3ViKT1cImhhbmRsZXJDb250ZW50U3ViKCRldmVudClcIj48L2Rpdj5cbiAgfSBAZWxzZSB7XG4gICAgPGRpdlxuICAgICAgTGlic1VpQ29tcG9uZW50c0xpbmVDbGFtcERpcmVjdGl2ZVxuICAgICAgW2xlbmd0aExpbWl0RGlzcGxheV09XCJsZW5ndGhMaW1pdERpc3BsYXkoKVwiXG4gICAgICBbaWdub3JlVGhyZWVEb3RzXT1cImhhc0JhY2tncm91bmRHcmFkaWVudCgpXCJcbiAgICAgIG1ldGhvZERpc3BsYXk9XCJpbm5lclRleHRcIlxuICAgICAgY2xhc3M9XCJvdmVyZmxvdy1oaWRkZW5cIlxuICAgICAgW2NvbnRlbnRdPVwiY29udGVudCgpXCJcbiAgICAgIFtuZ0NsYXNzXT1cIm5nQ2xhc3NPYmplY3QoKVwiXG4gICAgICBbc3R5bGUubWF4SGVpZ2h0LnB4XT1cIm1heEhlaWdodCgpXCJcbiAgICAgIFtpbm5lclRleHRdPVwiY29udGVudCgpIHwgdHJhbnNsYXRlXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVyQ2xpY2soJGV2ZW50KVwiXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVyQ2xpY2soJGV2ZW50KVwiXG4gICAgICAob3V0Q29udGVudFN1Yik9XCJoYW5kbGVyQ29udGVudFN1YigkZXZlbnQpXCI+PC9kaXY+XG4gIH1cbn0gQGVsc2Uge1xuICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICBjbGFzcz1cInJlbGF0aXZlXCJcbiAgICB0eXBlPVwib3RoZXJcIlxuICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCIhc2hvd1Rvb2x0aXAoKVwiXG4gICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cImlnbm9yZVN0b3BQcm9wYWdhdGlvblRvb2x0aXBFdmVudCgpXCJcbiAgICBbY29uZmlnXT1cIntcbiAgICAgIHRpbWVyRGVzdHJveTogdGltZUhpZGVQb3BvdmVyT25Nb3VzZW91dCgpLFxuICAgICAgbWF4V2lkdGg6IG1heFdpZHRoVG9vbHRpcCgpLFxuICAgICAgbWF4SGVpZ2h0OiBtYXhIZWlnaHRUb29sdGlwKCksXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvblRvb2x0aXAoKSxcbiAgICAgIGNvbnRlbnQ6IGlzSW5uZXJUZXh0KCkgPyAodGhpcy5jb250ZW50KCkgfCBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlKSA6IHRoaXMuY29udGVudCgpLFxuICAgICAgekluZGV4OiB6SW5kZXhQb3BvdmVyKCksXG4gICAgfVwiXG4gICAgKG91dEV2ZW50KT1cImhhbmRsZXJDbGljaygkZXZlbnQpXCI+XG4gICAgQGlmIChpc0NvbGxhcHNlKCkgJiYgaGFzQmFja2dyb3VuZEdyYWRpZW50KCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJoLVs0MHB4XSBsaWJzLXVpLWxpbmUtY2xhbXAtYmctZ3JhZGllbnRcIj48L2Rpdj5cbiAgICB9XG4gICAgQGlmICghaXNJbm5lclRleHQoKSkge1xuICAgICAgPGRpdlxuICAgICAgICBbbmdDbGFzc109XCJuZ0NsYXNzT2JqZWN0KClcIlxuICAgICAgICBbaW5uZXJIdG1sXT1cImNvbnRlbnREaXNwbGF5KCkgfCB0cmFuc2xhdGUgfCBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlOiAnaHRtbCcgOiB1c2VYc3NGaWx0ZXIoKSB8IGFzeW5jXCI+PC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZGl2XG4gICAgICAgIFtuZ0NsYXNzXT1cIm5nQ2xhc3NPYmplY3QoKVwiXG4gICAgICAgIFtpbm5lclRleHRdPVwiY29udGVudERpc3BsYXkoKSB8IHRyYW5zbGF0ZVwiPjwvZGl2PlxuICAgIH1cbiAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cblxuICBAaWYgKCFpZ25vcmVTaG93QnV0dG9uQ29sbGFwc2VFeHBhbmQoKSkge1xuICAgIEBpZiAoaXNDb2xsYXBzZSgpKSB7XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b24tbGluay1wcmltYXJ5XCJcbiAgICAgICAgW2xhYmVsXT1cImxhYmVsQnV0dG9uVmlld01vcmUoKSB8fCAnaTE4bl92aWV3X21vcmUnXCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0NsYXNzSW5jbHVkZUJ1dHRvbkNvbGxhcHNlRXhwYW5kKClcIlxuICAgICAgICBbY2xhc3NMYWJlbF09XCJjbGFzc0NsYXNzTGFiZWxCdXR0b25Db2xsYXBzZUV4cGFuZCgpXCJcbiAgICAgICAgKG91dENsaWNrKT1cInZpZXdNb3JlKCRldmVudClcIiAvPlxuICAgIH0gQGVsc2Uge1xuICAgICAgQGlmICghaWdub3JlU2hvd0J1dHRvbkNvbGxhcHNlKCkpIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b24tbGluay1wcmltYXJ5XCJcbiAgICAgICAgICBbbGFiZWxdPVwibGFiZWxCdXR0b25Db2xsYXBzZSgpIHx8ICdpMThuX2NvbGxhcHNlJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0NsYXNzSW5jbHVkZUJ1dHRvbkNvbGxhcHNlRXhwYW5kKClcIlxuICAgICAgICAgIFtjbGFzc0xhYmVsXT1cImNsYXNzQ2xhc3NMYWJlbEJ1dHRvbkNvbGxhcHNlRXhwYW5kKClcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoaWRkZW5Nb3JlKCRldmVudClcIiAvPlxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NgClass, AsyncPipe } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { signal, input, output, inject, ElementRef, effect, untracked, Directive,
|
|
3
|
+
import { signal, input, output, inject, ElementRef, effect, untracked, Directive, Component, ChangeDetectionStrategy, HostListener } from '@angular/core';
|
|
4
4
|
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
5
5
|
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
6
6
|
import { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';
|
|
@@ -174,11 +174,11 @@ class LibsUiComponentsLineClampComponent {
|
|
|
174
174
|
this.displayLineClamp.set(false);
|
|
175
175
|
}
|
|
176
176
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsLineClampComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
177
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsLineClampComponent, isStandalone: true, selector: "libs_ui-components-line_clamp", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, lengthLimitDisplay: { classPropertyName: "lengthLimitDisplay", publicName: "lengthLimitDisplay", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: true, transformFunction: null }, ignoreShowButtonCollapseExpand: { classPropertyName: "ignoreShowButtonCollapseExpand", publicName: "ignoreShowButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowButtonCollapse: { classPropertyName: "ignoreShowButtonCollapse", publicName: "ignoreShowButtonCollapse", isSignal: true, isRequired: false, transformFunction: null }, showTooltip: { classPropertyName: "showTooltip", publicName: "showTooltip", isSignal: true, isRequired: false, transformFunction: null }, timeHidePopoverOnMouseout: { classPropertyName: "timeHidePopoverOnMouseout", publicName: "timeHidePopoverOnMouseout", isSignal: true, isRequired: false, transformFunction: null }, maxWidthTooltip: { classPropertyName: "maxWidthTooltip", publicName: "maxWidthTooltip", isSignal: true, isRequired: false, transformFunction: null }, maxHeightTooltip: { classPropertyName: "maxHeightTooltip", publicName: "maxHeightTooltip", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopover: { classPropertyName: "zIndexPopover", publicName: "zIndexPopover", isSignal: true, isRequired: false, transformFunction: null }, isInnerText: { classPropertyName: "isInnerText", publicName: "isInnerText", isSignal: true, isRequired: false, transformFunction: null }, classClassLabelButtonCollapseExpand: { classPropertyName: "classClassLabelButtonCollapseExpand", publicName: "classClassLabelButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, classClassIncludeButtonCollapseExpand: { classPropertyName: "classClassIncludeButtonCollapseExpand", publicName: "classClassIncludeButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationTooltipEvent: { classPropertyName: "ignoreStopPropagationTooltipEvent", publicName: "ignoreStopPropagationTooltipEvent", isSignal: true, isRequired: false, transformFunction: null }, ngClassObject: { classPropertyName: "ngClassObject", publicName: "ngClassObject", isSignal: true, isRequired: false, transformFunction: null }, hasBackgroundGradient: { classPropertyName: "hasBackgroundGradient", publicName: "hasBackgroundGradient", isSignal: true, isRequired: false, transformFunction: null }, labelButtonViewMore: { classPropertyName: "labelButtonViewMore", publicName: "labelButtonViewMore", isSignal: true, isRequired: false, transformFunction: null }, labelButtonCollapse: { classPropertyName: "labelButtonCollapse", publicName: "labelButtonCollapse", isSignal: true, isRequired: false, transformFunction: null }, directionTooltip: { classPropertyName: "directionTooltip", publicName: "directionTooltip", isSignal: true, isRequired: false, transformFunction: null }, useXssFilter: { classPropertyName: "useXssFilter", publicName: "useXssFilter", isSignal: true, isRequired: false, transformFunction: null }, defaultIsCollapse: { classPropertyName: "defaultIsCollapse", publicName: "defaultIsCollapse", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outDisplayLineClamp: "outDisplayLineClamp", outAction: "outAction", outClick: "outClick", outFunctionControl: "outFunctionControl" }, host: { listeners: { "window:resize": "resize($event)" } }, ngImport: i0, template: "@if (!displayLineClamp()) {\n @if (!isInnerText()) {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerHTML\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerHtml]=\"content() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n (click)=\"handlerClick($event)\"\n (
|
|
177
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsLineClampComponent, isStandalone: true, selector: "libs_ui-components-line_clamp", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, lengthLimitDisplay: { classPropertyName: "lengthLimitDisplay", publicName: "lengthLimitDisplay", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: true, transformFunction: null }, ignoreShowButtonCollapseExpand: { classPropertyName: "ignoreShowButtonCollapseExpand", publicName: "ignoreShowButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowButtonCollapse: { classPropertyName: "ignoreShowButtonCollapse", publicName: "ignoreShowButtonCollapse", isSignal: true, isRequired: false, transformFunction: null }, showTooltip: { classPropertyName: "showTooltip", publicName: "showTooltip", isSignal: true, isRequired: false, transformFunction: null }, timeHidePopoverOnMouseout: { classPropertyName: "timeHidePopoverOnMouseout", publicName: "timeHidePopoverOnMouseout", isSignal: true, isRequired: false, transformFunction: null }, maxWidthTooltip: { classPropertyName: "maxWidthTooltip", publicName: "maxWidthTooltip", isSignal: true, isRequired: false, transformFunction: null }, maxHeightTooltip: { classPropertyName: "maxHeightTooltip", publicName: "maxHeightTooltip", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopover: { classPropertyName: "zIndexPopover", publicName: "zIndexPopover", isSignal: true, isRequired: false, transformFunction: null }, isInnerText: { classPropertyName: "isInnerText", publicName: "isInnerText", isSignal: true, isRequired: false, transformFunction: null }, classClassLabelButtonCollapseExpand: { classPropertyName: "classClassLabelButtonCollapseExpand", publicName: "classClassLabelButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, classClassIncludeButtonCollapseExpand: { classPropertyName: "classClassIncludeButtonCollapseExpand", publicName: "classClassIncludeButtonCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationTooltipEvent: { classPropertyName: "ignoreStopPropagationTooltipEvent", publicName: "ignoreStopPropagationTooltipEvent", isSignal: true, isRequired: false, transformFunction: null }, ngClassObject: { classPropertyName: "ngClassObject", publicName: "ngClassObject", isSignal: true, isRequired: false, transformFunction: null }, hasBackgroundGradient: { classPropertyName: "hasBackgroundGradient", publicName: "hasBackgroundGradient", isSignal: true, isRequired: false, transformFunction: null }, labelButtonViewMore: { classPropertyName: "labelButtonViewMore", publicName: "labelButtonViewMore", isSignal: true, isRequired: false, transformFunction: null }, labelButtonCollapse: { classPropertyName: "labelButtonCollapse", publicName: "labelButtonCollapse", isSignal: true, isRequired: false, transformFunction: null }, directionTooltip: { classPropertyName: "directionTooltip", publicName: "directionTooltip", isSignal: true, isRequired: false, transformFunction: null }, useXssFilter: { classPropertyName: "useXssFilter", publicName: "useXssFilter", isSignal: true, isRequired: false, transformFunction: null }, defaultIsCollapse: { classPropertyName: "defaultIsCollapse", publicName: "defaultIsCollapse", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outDisplayLineClamp: "outDisplayLineClamp", outAction: "outAction", outClick: "outClick", outFunctionControl: "outFunctionControl" }, host: { listeners: { "window:resize": "resize($event)" } }, ngImport: i0, template: "@if (!displayLineClamp()) {\n @if (!isInnerText()) {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerHTML\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerHtml]=\"content() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n (click)=\"handlerClick($event)\"\n (keydown.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n } @else {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerText\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerText]=\"content() | translate\"\n (click)=\"handlerClick($event)\"\n (keydown.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n }\n} @else {\n <libs_ui-components-popover\n class=\"relative\"\n type=\"other\"\n [ignoreShowPopover]=\"!showTooltip()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationTooltipEvent()\"\n [config]=\"{\n timerDestroy: timeHidePopoverOnMouseout(),\n maxWidth: maxWidthTooltip(),\n maxHeight: maxHeightTooltip(),\n direction: directionTooltip(),\n content: isInnerText() ? (this.content() | LibsUiPipesEscapeHtmlPipe) : this.content(),\n zIndex: zIndexPopover(),\n }\"\n (outEvent)=\"handlerClick($event)\">\n @if (isCollapse() && hasBackgroundGradient()) {\n <div class=\"h-[40px] libs-ui-line-clamp-bg-gradient\"></div>\n }\n @if (!isInnerText()) {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerHtml]=\"contentDisplay() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"></div>\n } @else {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerText]=\"contentDisplay() | translate\"></div>\n }\n </libs_ui-components-popover>\n\n @if (!ignoreShowButtonCollapseExpand()) {\n @if (isCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonViewMore() || 'i18n_view_more'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"viewMore($event)\" />\n } @else {\n @if (!ignoreShowButtonCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonCollapse() || 'i18n_collapse'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"hiddenMore($event)\" />\n }\n }\n }\n}\n", styles: [".libs-ui-line-clamp-content{font-weight:400;text-align:start}.libs-ui-line-clamp-bg-gradient{opacity:.5;background:linear-gradient(180deg,#fff0,#fffffff2 51.56%,#fff);position:absolute;width:100%;bottom:0}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: LibsUiComponentsLineClampDirective, selector: "[LibsUiComponentsLineClampDirective]", inputs: ["lengthLimitDisplay", "methodDisplay", "content", "ignoreThreeDots"], outputs: ["outContentSub"] }, { kind: "pipe", type: LibsUiPipesSecurityTrustPipe, name: "LibsUiPipesSecurityTrustPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
178
178
|
}
|
|
179
179
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsLineClampComponent, decorators: [{
|
|
180
180
|
type: Component,
|
|
181
|
-
args: [{ selector: 'libs_ui-components-line_clamp', standalone: true, imports: [NgClass, TranslateModule, AsyncPipe, LibsUiComponentsLineClampDirective, LibsUiPipesSecurityTrustPipe, LibsUiPipesEscapeHtmlPipe, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!displayLineClamp()) {\n @if (!isInnerText()) {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerHTML\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerHtml]=\"content() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n (click)=\"handlerClick($event)\"\n (
|
|
181
|
+
args: [{ selector: 'libs_ui-components-line_clamp', standalone: true, imports: [NgClass, TranslateModule, AsyncPipe, LibsUiComponentsLineClampDirective, LibsUiPipesSecurityTrustPipe, LibsUiPipesEscapeHtmlPipe, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!displayLineClamp()) {\n @if (!isInnerText()) {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerHTML\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerHtml]=\"content() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n (click)=\"handlerClick($event)\"\n (keydown.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n } @else {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerText\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerText]=\"content() | translate\"\n (click)=\"handlerClick($event)\"\n (keydown.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n }\n} @else {\n <libs_ui-components-popover\n class=\"relative\"\n type=\"other\"\n [ignoreShowPopover]=\"!showTooltip()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationTooltipEvent()\"\n [config]=\"{\n timerDestroy: timeHidePopoverOnMouseout(),\n maxWidth: maxWidthTooltip(),\n maxHeight: maxHeightTooltip(),\n direction: directionTooltip(),\n content: isInnerText() ? (this.content() | LibsUiPipesEscapeHtmlPipe) : this.content(),\n zIndex: zIndexPopover(),\n }\"\n (outEvent)=\"handlerClick($event)\">\n @if (isCollapse() && hasBackgroundGradient()) {\n <div class=\"h-[40px] libs-ui-line-clamp-bg-gradient\"></div>\n }\n @if (!isInnerText()) {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerHtml]=\"contentDisplay() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"></div>\n } @else {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerText]=\"contentDisplay() | translate\"></div>\n }\n </libs_ui-components-popover>\n\n @if (!ignoreShowButtonCollapseExpand()) {\n @if (isCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonViewMore() || 'i18n_view_more'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"viewMore($event)\" />\n } @else {\n @if (!ignoreShowButtonCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonCollapse() || 'i18n_collapse'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"hiddenMore($event)\" />\n }\n }\n }\n}\n", styles: [".libs-ui-line-clamp-content{font-weight:400;text-align:start}.libs-ui-line-clamp-bg-gradient{opacity:.5;background:linear-gradient(180deg,#fff0,#fffffff2 51.56%,#fff);position:absolute;width:100%;bottom:0}\n"] }]
|
|
182
182
|
}], ctorParameters: () => [], propDecorators: { resize: [{
|
|
183
183
|
type: HostListener,
|
|
184
184
|
args: ['window:resize', ['$event']]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-line-clamp.mjs","sources":["../../../../../libs-ui/components/line-clamp/src/line-clamp.directive.ts","../../../../../libs-ui/components/line-clamp/src/line-clamp.component.ts","../../../../../libs-ui/components/line-clamp/src/line-clamp.component.html","../../../../../libs-ui/components/line-clamp/src/libs-ui-components-line-clamp.ts"],"sourcesContent":["import { Directive, effect, ElementRef, inject, input, OnDestroy, output, signal, untracked } from '@angular/core';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[LibsUiComponentsLineClampDirective]',\n standalone: true,\n})\nexport class LibsUiComponentsLineClampDirective implements OnDestroy {\n /** PROPERTY */\n private readonly timeInterval = signal<number | undefined>(undefined);\n private readonly textView = signal<string>('');\n\n /** INPUT */\n readonly lengthLimitDisplay = input.required<number>();\n readonly methodDisplay = input.required<string>();\n readonly content = input.required<string>();\n readonly ignoreThreeDots = input<boolean>();\n\n /** OUTPUT */\n readonly outContentSub = output<string>();\n\n /** INJECT */\n private readonly elementRef = inject(ElementRef);\n\n constructor() {\n effect(() => {\n if (!this.content() || !this.methodDisplay() || !this.lengthLimitDisplay()) {\n return;\n }\n untracked(() => {\n this.textView.set(this.content());\n if (this.textView().length > this.lengthLimitDisplay()) {\n this.textView.update((val) => val.substring(0, this.lengthLimitDisplay()));\n }\n\n if (!this.textView()) {\n return;\n }\n this.process();\n this.timeInterval.set(\n setInterval(() => {\n this.process();\n }, 250)\n );\n });\n });\n }\n\n /** FUNCTIONS */\n\n private process() {\n if (this.elementRef?.nativeElement[this.methodDisplay()]) {\n clearInterval(this.timeInterval());\n this.truncate();\n }\n }\n\n private truncate() {\n let content = this.textView();\n while (this.elementRef.nativeElement.scrollHeight - 2 > this.elementRef.nativeElement.offsetHeight) {\n if (!content) {\n return;\n }\n content = content.substring(0, content.length - 3);\n this.elementRef.nativeElement[this.methodDisplay()] = this.ignoreThreeDots() ? content : `${content}...`;\n }\n if (content !== this.textView()) {\n this.outContentSub.emit(this.ignoreThreeDots() ? content : `${content}...`);\n }\n }\n ngOnDestroy() {\n clearInterval(this.timeInterval());\n }\n}\n","import { AsyncPipe, NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, HostListener, OnDestroy, OnInit, effect, input, output, signal, untracked } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsPopoverComponent, TYPE_POPOVER_DIRECTION, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { TYPE_OBJECT } from '@libs-ui/interfaces-types';\nimport { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';\nimport { LibsUiPipesSecurityTrustPipe } from '@libs-ui/pipes-security-trust';\nimport { isNil } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ILineClampFunctionControlEvent } from './interfaces';\nimport { LibsUiComponentsLineClampDirective } from './line-clamp.directive';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-line_clamp',\n templateUrl: './line-clamp.component.html',\n styleUrls: ['./line-clamp.component.scss'],\n standalone: true,\n imports: [NgClass, TranslateModule, AsyncPipe, LibsUiComponentsLineClampDirective, LibsUiPipesSecurityTrustPipe, LibsUiPipesEscapeHtmlPipe, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsLineClampComponent implements OnInit, OnDestroy {\n /** PROPERTY */\n protected displayLineClamp = signal<boolean>(false);\n protected isCollapse = signal<boolean>(false);\n protected contentClamp = signal<string>('');\n protected contentDisplay = signal<string>('');\n\n /** INPUT */\n readonly content = input.required<string>();\n readonly lengthLimitDisplay = input<number, number | undefined>(200, { transform: (val) => val || 200 });\n readonly maxHeight = input.required<number>(); // maxHeight = (line-height của text)*(số dòng mong muốn)\n readonly ignoreShowButtonCollapseExpand = input<boolean>();\n readonly ignoreShowButtonCollapse = input<boolean>();\n readonly showTooltip = input<boolean>();\n readonly timeHidePopoverOnMouseout = input<number, number | undefined>(50, { transform: (val) => val ?? 50 });\n readonly maxWidthTooltip = input<number, number | undefined>(250, { transform: (val) => val ?? 250 });\n readonly maxHeightTooltip = input<number, number | undefined>(150, { transform: (val) => val ?? 150 });\n readonly zIndexPopover = input<number, number | undefined>(1001, { transform: (val) => val ?? 1001 });\n readonly isInnerText = input<boolean>(); // không cần escapeHTML content khi biến bằng true\n readonly classClassLabelButtonCollapseExpand = input<string, string | undefined>('libs-ui-font-h5r', { transform: (val) => val ?? 'libs-ui-font-h5r' });\n readonly classClassIncludeButtonCollapseExpand = input<string, string | undefined>('!p-0', { transform: (val) => val ?? '!p-0' });\n readonly ignoreStopPropagationTooltipEvent = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly ngClassObject = input<TYPE_OBJECT, TYPE_OBJECT | undefined>({ 'libs-ui-line-clamp-content libs-ui-font-h5r': true }, { transform: (val) => val || { 'libs-ui-line-clamp-content lib-ui-font-h5r': true } }); // object ngClass\n readonly hasBackgroundGradient = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly labelButtonViewMore = input<string>();\n readonly labelButtonCollapse = input<string>();\n readonly directionTooltip = input<TYPE_POPOVER_DIRECTION, TYPE_POPOVER_DIRECTION | undefined>('top', { transform: (val) => val ?? 'top' });\n readonly useXssFilter = input<boolean, boolean | undefined>(true, { transform: (val) => val ?? true });\n readonly defaultIsCollapse = input<boolean, boolean | undefined>(true, { transform: (val) => val ?? true });\n\n /** OUTPUT */\n protected readonly outDisplayLineClamp = output<boolean>();\n protected readonly outAction = output<string>();\n protected readonly outClick = output<Event | TYPE_POPOVER_EVENT>();\n protected readonly outFunctionControl = output<ILineClampFunctionControlEvent>();\n\n constructor() {\n effect(() => {\n if (!isNil(this.content())) {\n untracked(() => {\n this.contentDisplay.set('');\n this.displayLineClamp.set(false);\n this.isCollapse.set(false);\n });\n }\n });\n }\n\n async ngOnInit() {\n this.outFunctionControl.emit(this.FunctionsControl);\n }\n\n /** FUNCTIONS */\n public get FunctionsControl(): ILineClampFunctionControlEvent {\n return {\n refresh: this.refresh.bind(this),\n checkIsDisplayLineClamp: async () => this.displayLineClamp(),\n viewMore: this.viewMore.bind(this),\n hiddenMore: this.hiddenMore.bind(this),\n };\n }\n\n protected async handlerContentSub(content: string) {\n if (this.content() !== content) {\n this.displayLineClamp.set(true);\n this.isCollapse.set(this.defaultIsCollapse());\n this.contentClamp.set(content);\n this.contentDisplay.set(this.isCollapse() ? content : this.content());\n this.outDisplayLineClamp.emit(this.isCollapse());\n }\n }\n\n protected async viewMore(e?: Event) {\n e?.stopPropagation();\n this.isCollapse.set(false);\n this.contentDisplay.set(this.content());\n e?.preventDefault();\n this.outAction.emit('view-more');\n }\n\n protected async hiddenMore(e?: Event) {\n e?.stopPropagation();\n this.isCollapse.set(true);\n this.contentDisplay.set(this.contentClamp());\n e?.preventDefault();\n this.outAction.emit('hidden-more');\n }\n\n @HostListener('window:resize', ['$event'])\n protected async resize() {\n this.refresh();\n }\n\n protected async refresh() {\n this.contentDisplay.set(this.content());\n this.displayLineClamp.set(false);\n this.isCollapse.set(false);\n }\n\n protected async handlerClick(event: Event | TYPE_POPOVER_EVENT) {\n if (typeof event === 'string' && event !== 'click') {\n return;\n }\n this.outClick.emit(event);\n }\n\n ngOnDestroy() {\n this.displayLineClamp.set(false);\n }\n}\n","@if (!displayLineClamp()) {\n @if (!isInnerText()) {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerHTML\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerHtml]=\"content() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n (click)=\"handlerClick($event)\"\n (keyup.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n } @else {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerText\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerText]=\"content() | translate\"\n (click)=\"handlerClick($event)\"\n (keyup.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n }\n} @else {\n <libs_ui-components-popover\n class=\"relative\"\n type=\"other\"\n [ignoreShowPopover]=\"!showTooltip()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationTooltipEvent()\"\n [config]=\"{\n timerDestroy: timeHidePopoverOnMouseout(),\n maxWidth: maxWidthTooltip(),\n maxHeight: maxHeightTooltip(),\n direction: directionTooltip(),\n content: isInnerText() ? (this.content() | LibsUiPipesEscapeHtmlPipe) : this.content(),\n zIndex: zIndexPopover(),\n }\"\n (outEvent)=\"handlerClick($event)\">\n @if (isCollapse() && hasBackgroundGradient()) {\n <div class=\"h-[40px] libs-ui-line-clamp-bg-gradient\"></div>\n }\n @if (!isInnerText()) {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerHtml]=\"contentDisplay() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"></div>\n } @else {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerText]=\"contentDisplay() | translate\"></div>\n }\n </libs_ui-components-popover>\n\n @if (!ignoreShowButtonCollapseExpand()) {\n @if (isCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonViewMore() || 'i18n_view_more'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"viewMore($event)\" />\n } @else {\n @if (!ignoreShowButtonCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonCollapse() || 'i18n_collapse'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"hiddenMore($event)\" />\n }\n }\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-line-clamp.mjs","sources":["../../../../../libs-ui/components/line-clamp/src/line-clamp.directive.ts","../../../../../libs-ui/components/line-clamp/src/line-clamp.component.ts","../../../../../libs-ui/components/line-clamp/src/line-clamp.component.html","../../../../../libs-ui/components/line-clamp/src/libs-ui-components-line-clamp.ts"],"sourcesContent":["import { Directive, effect, ElementRef, inject, input, OnDestroy, output, signal, untracked } from '@angular/core';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[LibsUiComponentsLineClampDirective]',\n standalone: true,\n})\nexport class LibsUiComponentsLineClampDirective implements OnDestroy {\n /** PROPERTY */\n private readonly timeInterval = signal<number | undefined>(undefined);\n private readonly textView = signal<string>('');\n\n /** INPUT */\n readonly lengthLimitDisplay = input.required<number>();\n readonly methodDisplay = input.required<string>();\n readonly content = input.required<string>();\n readonly ignoreThreeDots = input<boolean>();\n\n /** OUTPUT */\n readonly outContentSub = output<string>();\n\n /** INJECT */\n private readonly elementRef = inject(ElementRef);\n\n constructor() {\n effect(() => {\n if (!this.content() || !this.methodDisplay() || !this.lengthLimitDisplay()) {\n return;\n }\n untracked(() => {\n this.textView.set(this.content());\n if (this.textView().length > this.lengthLimitDisplay()) {\n this.textView.update((val) => val.substring(0, this.lengthLimitDisplay()));\n }\n\n if (!this.textView()) {\n return;\n }\n this.process();\n this.timeInterval.set(\n setInterval(() => {\n this.process();\n }, 250)\n );\n });\n });\n }\n\n /** FUNCTIONS */\n\n private process() {\n if (this.elementRef?.nativeElement[this.methodDisplay()]) {\n clearInterval(this.timeInterval());\n this.truncate();\n }\n }\n\n private truncate() {\n let content = this.textView();\n while (this.elementRef.nativeElement.scrollHeight - 2 > this.elementRef.nativeElement.offsetHeight) {\n if (!content) {\n return;\n }\n content = content.substring(0, content.length - 3);\n this.elementRef.nativeElement[this.methodDisplay()] = this.ignoreThreeDots() ? content : `${content}...`;\n }\n if (content !== this.textView()) {\n this.outContentSub.emit(this.ignoreThreeDots() ? content : `${content}...`);\n }\n }\n ngOnDestroy() {\n clearInterval(this.timeInterval());\n }\n}\n","import { AsyncPipe, NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, HostListener, OnDestroy, OnInit, effect, input, output, signal, untracked } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsPopoverComponent, TYPE_POPOVER_DIRECTION, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { TYPE_OBJECT } from '@libs-ui/interfaces-types';\nimport { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';\nimport { LibsUiPipesSecurityTrustPipe } from '@libs-ui/pipes-security-trust';\nimport { isNil } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ILineClampFunctionControlEvent } from './interfaces';\nimport { LibsUiComponentsLineClampDirective } from './line-clamp.directive';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-line_clamp',\n templateUrl: './line-clamp.component.html',\n styleUrls: ['./line-clamp.component.scss'],\n standalone: true,\n imports: [NgClass, TranslateModule, AsyncPipe, LibsUiComponentsLineClampDirective, LibsUiPipesSecurityTrustPipe, LibsUiPipesEscapeHtmlPipe, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsLineClampComponent implements OnInit, OnDestroy {\n /** PROPERTY */\n protected displayLineClamp = signal<boolean>(false);\n protected isCollapse = signal<boolean>(false);\n protected contentClamp = signal<string>('');\n protected contentDisplay = signal<string>('');\n\n /** INPUT */\n readonly content = input.required<string>();\n readonly lengthLimitDisplay = input<number, number | undefined>(200, { transform: (val) => val || 200 });\n readonly maxHeight = input.required<number>(); // maxHeight = (line-height của text)*(số dòng mong muốn)\n readonly ignoreShowButtonCollapseExpand = input<boolean>();\n readonly ignoreShowButtonCollapse = input<boolean>();\n readonly showTooltip = input<boolean>();\n readonly timeHidePopoverOnMouseout = input<number, number | undefined>(50, { transform: (val) => val ?? 50 });\n readonly maxWidthTooltip = input<number, number | undefined>(250, { transform: (val) => val ?? 250 });\n readonly maxHeightTooltip = input<number, number | undefined>(150, { transform: (val) => val ?? 150 });\n readonly zIndexPopover = input<number, number | undefined>(1001, { transform: (val) => val ?? 1001 });\n readonly isInnerText = input<boolean>(); // không cần escapeHTML content khi biến bằng true\n readonly classClassLabelButtonCollapseExpand = input<string, string | undefined>('libs-ui-font-h5r', { transform: (val) => val ?? 'libs-ui-font-h5r' });\n readonly classClassIncludeButtonCollapseExpand = input<string, string | undefined>('!p-0', { transform: (val) => val ?? '!p-0' });\n readonly ignoreStopPropagationTooltipEvent = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly ngClassObject = input<TYPE_OBJECT, TYPE_OBJECT | undefined>({ 'libs-ui-line-clamp-content libs-ui-font-h5r': true }, { transform: (val) => val || { 'libs-ui-line-clamp-content lib-ui-font-h5r': true } }); // object ngClass\n readonly hasBackgroundGradient = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly labelButtonViewMore = input<string>();\n readonly labelButtonCollapse = input<string>();\n readonly directionTooltip = input<TYPE_POPOVER_DIRECTION, TYPE_POPOVER_DIRECTION | undefined>('top', { transform: (val) => val ?? 'top' });\n readonly useXssFilter = input<boolean, boolean | undefined>(true, { transform: (val) => val ?? true });\n readonly defaultIsCollapse = input<boolean, boolean | undefined>(true, { transform: (val) => val ?? true });\n\n /** OUTPUT */\n protected readonly outDisplayLineClamp = output<boolean>();\n protected readonly outAction = output<string>();\n protected readonly outClick = output<Event | TYPE_POPOVER_EVENT>();\n protected readonly outFunctionControl = output<ILineClampFunctionControlEvent>();\n\n constructor() {\n effect(() => {\n if (!isNil(this.content())) {\n untracked(() => {\n this.contentDisplay.set('');\n this.displayLineClamp.set(false);\n this.isCollapse.set(false);\n });\n }\n });\n }\n\n async ngOnInit() {\n this.outFunctionControl.emit(this.FunctionsControl);\n }\n\n /** FUNCTIONS */\n public get FunctionsControl(): ILineClampFunctionControlEvent {\n return {\n refresh: this.refresh.bind(this),\n checkIsDisplayLineClamp: async () => this.displayLineClamp(),\n viewMore: this.viewMore.bind(this),\n hiddenMore: this.hiddenMore.bind(this),\n };\n }\n\n protected async handlerContentSub(content: string) {\n if (this.content() !== content) {\n this.displayLineClamp.set(true);\n this.isCollapse.set(this.defaultIsCollapse());\n this.contentClamp.set(content);\n this.contentDisplay.set(this.isCollapse() ? content : this.content());\n this.outDisplayLineClamp.emit(this.isCollapse());\n }\n }\n\n protected async viewMore(e?: Event) {\n e?.stopPropagation();\n this.isCollapse.set(false);\n this.contentDisplay.set(this.content());\n e?.preventDefault();\n this.outAction.emit('view-more');\n }\n\n protected async hiddenMore(e?: Event) {\n e?.stopPropagation();\n this.isCollapse.set(true);\n this.contentDisplay.set(this.contentClamp());\n e?.preventDefault();\n this.outAction.emit('hidden-more');\n }\n\n @HostListener('window:resize', ['$event'])\n protected async resize() {\n this.refresh();\n }\n\n protected async refresh() {\n this.contentDisplay.set(this.content());\n this.displayLineClamp.set(false);\n this.isCollapse.set(false);\n }\n\n protected async handlerClick(event: Event | TYPE_POPOVER_EVENT) {\n if (typeof event === 'string' && event !== 'click') {\n return;\n }\n this.outClick.emit(event);\n }\n\n ngOnDestroy() {\n this.displayLineClamp.set(false);\n }\n}\n","@if (!displayLineClamp()) {\n @if (!isInnerText()) {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerHTML\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerHtml]=\"content() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n (click)=\"handlerClick($event)\"\n (keydown.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n } @else {\n <div\n LibsUiComponentsLineClampDirective\n [lengthLimitDisplay]=\"lengthLimitDisplay()\"\n [ignoreThreeDots]=\"hasBackgroundGradient()\"\n methodDisplay=\"innerText\"\n class=\"overflow-hidden\"\n [content]=\"content()\"\n [ngClass]=\"ngClassObject()\"\n [style.maxHeight.px]=\"maxHeight()\"\n [innerText]=\"content() | translate\"\n (click)=\"handlerClick($event)\"\n (keydown.enter)=\"handlerClick($event)\"\n (outContentSub)=\"handlerContentSub($event)\"></div>\n }\n} @else {\n <libs_ui-components-popover\n class=\"relative\"\n type=\"other\"\n [ignoreShowPopover]=\"!showTooltip()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationTooltipEvent()\"\n [config]=\"{\n timerDestroy: timeHidePopoverOnMouseout(),\n maxWidth: maxWidthTooltip(),\n maxHeight: maxHeightTooltip(),\n direction: directionTooltip(),\n content: isInnerText() ? (this.content() | LibsUiPipesEscapeHtmlPipe) : this.content(),\n zIndex: zIndexPopover(),\n }\"\n (outEvent)=\"handlerClick($event)\">\n @if (isCollapse() && hasBackgroundGradient()) {\n <div class=\"h-[40px] libs-ui-line-clamp-bg-gradient\"></div>\n }\n @if (!isInnerText()) {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerHtml]=\"contentDisplay() | translate | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"></div>\n } @else {\n <div\n [ngClass]=\"ngClassObject()\"\n [innerText]=\"contentDisplay() | translate\"></div>\n }\n </libs_ui-components-popover>\n\n @if (!ignoreShowButtonCollapseExpand()) {\n @if (isCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonViewMore() || 'i18n_view_more'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"viewMore($event)\" />\n } @else {\n @if (!ignoreShowButtonCollapse()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [label]=\"labelButtonCollapse() || 'i18n_collapse'\"\n [classInclude]=\"classClassIncludeButtonCollapseExpand()\"\n [classLabel]=\"classClassLabelButtonCollapseExpand()\"\n (outClick)=\"hiddenMore($event)\" />\n }\n }\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,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-line-clamp",
|
|
3
|
-
"version": "0.2.356-
|
|
3
|
+
"version": "0.2.356-43",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": ">=18.0.0",
|
|
6
6
|
"@angular/core": ">=18.0.0",
|
|
7
|
-
"@libs-ui/interfaces-types": "0.2.356-
|
|
8
|
-
"@libs-ui/components-buttons-button": "0.2.356-
|
|
9
|
-
"@libs-ui/components-popover": "0.2.356-
|
|
10
|
-
"@libs-ui/pipes-escape-html": "0.2.356-
|
|
11
|
-
"@libs-ui/pipes-security-trust": "0.2.356-
|
|
7
|
+
"@libs-ui/interfaces-types": "0.2.356-43",
|
|
8
|
+
"@libs-ui/components-buttons-button": "0.2.356-43",
|
|
9
|
+
"@libs-ui/components-popover": "0.2.356-43",
|
|
10
|
+
"@libs-ui/pipes-escape-html": "0.2.356-43",
|
|
11
|
+
"@libs-ui/pipes-security-trust": "0.2.356-43",
|
|
12
12
|
"@ngx-translate/core": "^15.0.0",
|
|
13
|
-
"@libs-ui/utils": "0.2.356-
|
|
13
|
+
"@libs-ui/utils": "0.2.356-43"
|
|
14
14
|
},
|
|
15
15
|
"sideEffects": false,
|
|
16
16
|
"module": "fesm2022/libs-ui-components-line-clamp.mjs",
|