@ruc-lib/widget 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +120 -0
- package/esm2020/index.mjs +4 -0
- package/esm2020/interface/widget.mjs +2 -0
- package/esm2020/lib/ruclib-widget/ruclib-widget.component.mjs +108 -0
- package/esm2020/lib/ruclib-widget-item/ruclib-widget-item.component.mjs +103 -0
- package/esm2020/lib/ruclib-widget.module.mjs +34 -0
- package/esm2020/model/default-values.mjs +32 -0
- package/esm2020/pipes/safe-html.pipe.mjs +36 -0
- package/esm2020/ruc-lib-widget.mjs +5 -0
- package/fesm2015/ruc-lib-widget.mjs +307 -0
- package/fesm2015/ruc-lib-widget.mjs.map +1 -0
- package/fesm2020/ruc-lib-widget.mjs +305 -0
- package/fesm2020/ruc-lib-widget.mjs.map +1 -0
- package/index.d.ts +3 -0
- package/interface/widget.d.ts +92 -0
- package/lib/ruclib-widget/ruclib-widget.component.d.ts +77 -0
- package/lib/ruclib-widget-item/ruclib-widget-item.component.d.ts +60 -0
- package/lib/ruclib-widget.module.d.ts +13 -0
- package/model/default-values.d.ts +2 -0
- package/package.json +37 -0
- package/pipes/safe-html.pipe.d.ts +24 -0
package/README.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# ruclib-widget
|
|
2
|
+
|
|
3
|
+
This library provides a flexible and customizable widget component for your Angular applications. Users can integrate the widget component using Angular selectors with ease. Below are the features, usage instructions, and integration details:
|
|
4
|
+
|
|
5
|
+
## RUC Library Installation Guide
|
|
6
|
+
|
|
7
|
+
Users can easily install the RUC (Ruxptest Library) from npm. Additionally, they can also choose to install individual components based on their requirements.
|
|
8
|
+
|
|
9
|
+
## Install complete library
|
|
10
|
+
|
|
11
|
+
`npm install @uxpractice/ruc-lib`
|
|
12
|
+
|
|
13
|
+
## Install individual component
|
|
14
|
+
|
|
15
|
+
If users only need the widget component, they can install it separately
|
|
16
|
+
|
|
17
|
+
`npm install @ruc-lib/widget`
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
To use the widget component in your project, follow the integration guidelines provided in the documentation. Customize the widget as per your requirements by adjusting the configuration options.
|
|
22
|
+
|
|
23
|
+
## Using Selector
|
|
24
|
+
|
|
25
|
+
1. Import `WidgetModule` into `app.module.ts` file.
|
|
26
|
+
`( import { RuclibWidgetModule } from '@ruc-lib/widget'; OR import { RuclibWidgetModule } from '@ uxpractice /ruc-lib/widget'; )`
|
|
27
|
+
2. Use the widget selector in your HTML file.
|
|
28
|
+
3. Handle input and output bindings accordingly.
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
<uxp-ruclib-widget
|
|
32
|
+
[rucInputData]="widgetInput"
|
|
33
|
+
[customTheme]="customTheme"
|
|
34
|
+
(widgetClose)="passEvent($event)"
|
|
35
|
+
(layoutChanged)="passEvent($event)"
|
|
36
|
+
></uxp-ruclib-widget>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
# Input and Output
|
|
40
|
+
|
|
41
|
+
## Input and Output
|
|
42
|
+
|
|
43
|
+
Inputs:
|
|
44
|
+
• rucInputData: Data to be passed to the widget.
|
|
45
|
+
• customTheme: Custom styling/theme for the widget.
|
|
46
|
+
|
|
47
|
+
Outputs:
|
|
48
|
+
• widgetClose: Event emitted from the widget on clicking close button of a widget.
|
|
49
|
+
• layoutChanged: Event emitted from the widget on resizing/dragging a widget.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
## rucInputData configurations options-
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
WidgetDefaultConfig {
|
|
56
|
+
color: string = 'primary',
|
|
57
|
+
widgetData: WidgetConfigData[] = [
|
|
58
|
+
{
|
|
59
|
+
id: string = 'default-widget-1',
|
|
60
|
+
title: string = 'Default Widget 1',
|
|
61
|
+
description: string = 'Widget Description'
|
|
62
|
+
contentType: string = 'text',
|
|
63
|
+
contentData: any = 'This is the default content for the first widget. It is draggable and has a close icon.',
|
|
64
|
+
top: string = '20px',
|
|
65
|
+
left: string = '20px',
|
|
66
|
+
width: string = '300px',
|
|
67
|
+
height: string = '200px',
|
|
68
|
+
draggable: boolean = true,
|
|
69
|
+
showCloseIcon: boolean = true,
|
|
70
|
+
disabled: boolean = false,
|
|
71
|
+
headerIcon: string = 'widgets'
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
};
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
# Default value be like –
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
export const mockDrawerInput = {
|
|
81
|
+
color: 'primary',
|
|
82
|
+
widgetData: [
|
|
83
|
+
{
|
|
84
|
+
id: 'default-widget-1',
|
|
85
|
+
title: 'Default Widget 1',
|
|
86
|
+
contentType: 'text',
|
|
87
|
+
contentData: 'This is the default content for the first widget. It is draggable and has a close icon.',
|
|
88
|
+
top: '20px',
|
|
89
|
+
left: '20px',
|
|
90
|
+
width: '300px',
|
|
91
|
+
height: '200px',
|
|
92
|
+
draggable: true,
|
|
93
|
+
showCloseIcon: true,
|
|
94
|
+
headerIcon: 'widgets'
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: 'default-widget-2',
|
|
98
|
+
title: 'Default Widget 2 (HTML)',
|
|
99
|
+
contentType: 'html',
|
|
100
|
+
contentData: '<h3>HTML Content</h3><p>This widget contains <strong>HTML</strong> and has a different background color.</p>',
|
|
101
|
+
top: '240px',
|
|
102
|
+
left: '20px',
|
|
103
|
+
width: '300px',
|
|
104
|
+
height: '200px',
|
|
105
|
+
draggable: true,
|
|
106
|
+
showCloseIcon: true,
|
|
107
|
+
backgroundColor: '#f0f0f0'
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
};
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
# Contribution
|
|
115
|
+
|
|
116
|
+
Contributions are welcome! Feel free to open issues or pull requests for any enhancements or fixes.
|
|
117
|
+
|
|
118
|
+
# Acknowledgements
|
|
119
|
+
|
|
120
|
+
Thank you for choosing the Widget Component Library. If you have any feedback or suggestions, please let us know!
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './lib/ruclib-widget.module';
|
|
2
|
+
export * from './lib/ruclib-widget/ruclib-widget.component';
|
|
3
|
+
export * from './model/default-values';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsd0JBQXdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9ydWNsaWItd2lkZ2V0Lm1vZHVsZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3J1Y2xpYi13aWRnZXQvcnVjbGliLXdpZGdldC5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL21vZGVsL2RlZmF1bHQtdmFsdWVzJzsiXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZS93aWRnZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFR5cGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLyoqXHJcbiAqIERlZmluZXMgdGhlIGlucHV0IHByb3BlcnRpZXMgZm9yIHRoZSBtYWluIGBydWNsaWItd2lkZ2V0YCBjb21wb25lbnQuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFdpZGdldENvbmZpZyB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHRoZW1lIGNvbG9yIHRvIGJlIGFwcGxpZWQgdG8gaW50ZXJhY3RpdmUgZWxlbWVudHMgbGlrZSBpY29ucy5cclxuICAgKiBAZXhhbXBsZSAncHJpbWFyeScsICdhY2NlbnQnLCAnd2FybidcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKi9cclxuICBjb2xvcj86IHN0cmluZztcclxuICAvKipcclxuICAgKiBBbiBhcnJheSBvZiBjb25maWd1cmF0aW9uIG9iamVjdHMsIGVhY2ggZGVmaW5pbmcgYSBzaW5nbGUgd2lkZ2V0LlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqL1xyXG4gIHdpZGdldERhdGE/OiBXaWRnZXRDb25maWdEYXRhW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIGZvciBhIHNpbmdsZSB3aWRnZXQgd2l0aGluIHRoZSBjb250YWluZXIuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFdpZGdldENvbmZpZ0RhdGEge1xyXG4gIC8qKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgd2lkZ2V0LiAqL1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogVGhlIHRpdGxlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgd2lkZ2V0J3MgaGVhZGVyLlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqL1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvciBtYWluIHRleHQgY29udGVudCwgdXNlZCB3aGVuIGBjb250ZW50VHlwZWAgaXMgJ3RleHQnLlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqL1xyXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIElmIHRydWUsIGEgY2xvc2UgaWNvbiBpcyBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlciB0byBhbGxvdyB0aGUgdXNlciB0byByZW1vdmUgdGhlIHdpZGdldC5cclxuICAgKiBAb3B0aW9uYWxcclxuICAgKi9cclxuICBzaG93Q2xvc2VJY29uPzogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiBJZiB0cnVlLCB0aGUgd2lkZ2V0IGlzIHZpc3VhbGx5IGZhZGVkIGFuZCBjYW5ub3QgYmUgaW50ZXJhY3RlZCB3aXRoIChkcmFnZ2VkLCByZXNpemVkLCBldGMuKS5cclxuICAgKiBAb3B0aW9uYWxcclxuICAgKi9cclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogVGhlIENTUyB3aWR0aCBvZiB0aGUgd2lkZ2V0LlxyXG4gICAqIEBleGFtcGxlICczMDBweCcsICc1MCUnLCAnMzN2dydcclxuICAgKiBAb3B0aW9uYWxcclxuICAgKi9cclxuICB3aWR0aD86IHN0cmluZztcclxuICAvKipcclxuICAgKiBUaGUgQ1NTIGhlaWdodCBvZiB0aGUgd2lkZ2V0LlxyXG4gICAqIEBleGFtcGxlICcyMDBweCcsICdhdXRvJywgJzUwdmgnXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICovXHJcbiAgaGVpZ2h0Pzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIElmIHRydWUsIHRoZSB3aWRnZXQgY2FuIGJlIGRyYWdnZWQgYXJvdW5kIHRoZSBjb250YWluZXIuXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICovXHJcbiAgZHJhZ2dhYmxlPzogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiBJZiB0cnVlLCB0aGUgd2lkZ2V0IGNhbiBiZSByZXNpemVkIGJ5IHRoZSB1c2VyIChyZXF1aXJlcyBhIHJlc2l6aW5nIGxpYnJhcnkgaW1wbGVtZW50YXRpb24pLlxyXG4gICAqIEBvcHRpb25hbFxyXG4gICAqL1xyXG4gIHJlc2l6YWJsZT86IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogVGhlIHR5cGUgb2YgY29udGVudCB0aGUgd2lkZ2V0IHdpbGwgZGlzcGxheS5cclxuICAgKiBAb3B0aW9uYWxcclxuICAgKi9cclxuICBjb250ZW50VHlwZT86ICd0ZXh0JyB8ICdodG1sJyB8ICdjb21wb25lbnQnIHwgJ2NoYXJ0JyB8ICd2aWRlbycgfCAnYXVkaW8nO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBkYXRhIGZvciB0aGUgY29udGVudC4gVGhlIHN0cnVjdHVyZSBkZXBlbmRzIG9uIHRoZSBgY29udGVudFR5cGVgLlxyXG4gICAqIEZvciAnY29tcG9uZW50JywgaXQgc2hvdWxkIGJlIGFuIG9iamVjdDogYHsgY29tcG9uZW50OiBZb3VyQ29tcG9uZW50LCBpbnB1dHM6IHsgLi4uIH0gfWAuXHJcbiAgICogQG9wdGlvbmFsXHJcbiAgICovXHJcbiAgY29udGVudERhdGE/OiBhbnkgfCB7IGNvbXBvbmVudDogVHlwZTxhbnk+LCBpbnB1dHM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH07XHJcbiAgLyoqIFRoZSBDU1MgYHRvcGAgcG9zaXRpb24gZm9yIGFic29sdXRlIHBvc2l0aW9uaW5nLiBAZXhhbXBsZSAnMjBweCcsICc1JScgQG9wdGlvbmFsICovXHJcbiAgdG9wPzogc3RyaW5nO1xyXG4gIC8qKiBUaGUgQ1NTIGBsZWZ0YCBwb3NpdGlvbiBmb3IgYWJzb2x1dGUgcG9zaXRpb25pbmcuIEBleGFtcGxlICcyMHB4JywgJzUlJyBAb3B0aW9uYWwgKi9cclxuICBsZWZ0Pzogc3RyaW5nO1xyXG4gIC8qKiBUaGUgbmFtZSBvZiBhIE1hdGVyaWFsIGljb24gdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyLiBAb3B0aW9uYWwgKi9cclxuICBoZWFkZXJJY29uPzogc3RyaW5nO1xyXG4gIC8qKiBJbnRlcm5hbCBzdGF0ZSBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSB3aWRnZXQgaXMgYmVpbmcgYWN0aXZlbHkgZHJhZ2dlZCBvciByZXNpemVkLiBAb3B0aW9uYWwgKi9cclxuICBpc0FjdGl2ZT86IGJvb2xlYW47XHJcbiAgLyoqIFRoZSBDU1MgYGJhY2tncm91bmQtY29sb3JgIGZvciB0aGUgd2lkZ2V0LiBAZXhhbXBsZSAnI2ZmZmZmZicsICdyZ2JhKDAsMCwwLDAuMSknIEBvcHRpb25hbCAqL1xyXG4gIGJhY2tncm91bmRDb2xvcj86IHN0cmluZzsgLy8gZS5nLiwgJyNmZmZmZmYnLCAncmdiYSgyNTUsIDAsIDAsIDAuNSknLCAnbGlnaHRibHVlJ1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
import * as i2 from "@angular/material/icon";
|
|
5
|
+
import * as i3 from "@angular/material/button";
|
|
6
|
+
import * as i4 from "@angular/cdk/drag-drop";
|
|
7
|
+
import * as i5 from "../ruclib-widget-item/ruclib-widget-item.component";
|
|
8
|
+
/**
|
|
9
|
+
* A component that renders a collection of draggable and configurable widgets within a host container.
|
|
10
|
+
* It manages the layout, interaction, and dynamic content of each widget.
|
|
11
|
+
*/
|
|
12
|
+
export class RuclibWidgetComponent {
|
|
13
|
+
/**
|
|
14
|
+
* @param cdr The ChangeDetectorRef to manually trigger change detection when needed.
|
|
15
|
+
*/
|
|
16
|
+
constructor(cdr) {
|
|
17
|
+
this.cdr = cdr;
|
|
18
|
+
/**
|
|
19
|
+
* An event emitter that fires when a widget's close icon is clicked.
|
|
20
|
+
* It emits the unique ID of the widget to be closed.
|
|
21
|
+
*/
|
|
22
|
+
this.widgetClose = new EventEmitter();
|
|
23
|
+
/**
|
|
24
|
+
* An event emitter that fires when a widget is dragged and dropped.
|
|
25
|
+
* It emits the entire updated array of widget configurations, allowing the parent to save the new layout.
|
|
26
|
+
*/
|
|
27
|
+
this.layoutChanged = new EventEmitter();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* After the view initializes, this hook captures the host container's native element
|
|
31
|
+
* and sets it as the boundary for dragging widgets.
|
|
32
|
+
*/
|
|
33
|
+
ngAfterViewInit() {
|
|
34
|
+
if (this.widgetsHostContainerRef) {
|
|
35
|
+
this.dragBoundaryElement = this.widgetsHostContainerRef.nativeElement;
|
|
36
|
+
this.cdr.detectChanges();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Handles the click event on a widget's close button.
|
|
41
|
+
* @param widgetId The ID of the widget to be closed.
|
|
42
|
+
*/
|
|
43
|
+
onCloseClick(widgetId) {
|
|
44
|
+
this.widgetClose.emit(widgetId);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Handles the start of a drag operation for a widget.
|
|
48
|
+
* Sets the widget's isActive state to true for visual feedback.
|
|
49
|
+
* @param widget The WidgetConfigData object being dragged.
|
|
50
|
+
* @param event The CdkDragStart event.
|
|
51
|
+
*/
|
|
52
|
+
onDragStarted(widget, event) {
|
|
53
|
+
widget.isActive = true;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Handles the end of a drag operation.
|
|
57
|
+
* It calculates the new top/left position, updates the widget's configuration,
|
|
58
|
+
* and emits the `layoutChanged` event with the new layout data.
|
|
59
|
+
* @param widget The WidgetConfigData object that was dragged.
|
|
60
|
+
* @param event The CdkDragEnd event.
|
|
61
|
+
*/
|
|
62
|
+
onDragEnded(widget, event) {
|
|
63
|
+
widget.isActive = false;
|
|
64
|
+
const newPosition = event.source.getFreeDragPosition();
|
|
65
|
+
const initialTopPx = parseFloat(widget.top || '0');
|
|
66
|
+
const initialLeftPx = parseFloat(widget.left || '0');
|
|
67
|
+
const newTopPx = initialTopPx + newPosition.y;
|
|
68
|
+
const newLeftPx = initialLeftPx + newPosition.x;
|
|
69
|
+
widget.top = `${newTopPx}px`;
|
|
70
|
+
widget.left = `${newLeftPx}px`;
|
|
71
|
+
event.source.reset();
|
|
72
|
+
if (this.rucInputData.widgetData) {
|
|
73
|
+
this.layoutChanged.emit(this.rucInputData.widgetData);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Retrieves the color for UI elements like icons from the input data.
|
|
78
|
+
* @returns The color string (e.g., 'primary', 'accent') or 'primary' as a default.
|
|
79
|
+
*/
|
|
80
|
+
getColor() {
|
|
81
|
+
return this.rucInputData?.color || 'primary';
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A safe getter for the widget data array from the main input configuration.
|
|
85
|
+
* @returns The array of widget configurations, or an empty array if not defined.
|
|
86
|
+
*/
|
|
87
|
+
getWidgetData() {
|
|
88
|
+
return typeof this.rucInputData.widgetData !== 'undefined' ? this.rucInputData.widgetData : [];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
RuclibWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibWidgetComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
92
|
+
RuclibWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RuclibWidgetComponent, selector: "uxp-ruclib-widget", inputs: { rucInputData: "rucInputData", customTheme: "customTheme" }, outputs: { widgetClose: "widgetClose", layoutChanged: "layoutChanged" }, viewQueries: [{ propertyName: "widgetsHostContainerRef", first: true, predicate: ["widgetsHostContainer"], descendants: true }], ngImport: i0, template: "<!--\r\n The main container for all widgets.\r\n - Applies a custom theme class if provided.\r\n - Acts as the boundary for dragging operations via the #widgetsHostContainer template reference.\r\n-->\r\n<div\r\n class=\"widgets-host-container {{ customTheme || '' }}\"\r\n #widgetsHostContainer\r\n>\r\n <!--\r\n Iterates through the widget data to render each individual widget.\r\n Each widget is a draggable container powered by Angular CDK.\r\n -->\r\n <div\r\n *ngFor=\"let widgetConfig of getWidgetData()\"\r\n [style.width]=\"widgetConfig.width ? widgetConfig.width : '200px'\"\r\n [style.height]=\"widgetConfig.height ? widgetConfig.height : '150px'\"\r\n [style.minWidth]=\"widgetConfig.width ? widgetConfig.width : '200px'\"\r\n [style.minHeight]=\"widgetConfig.height ? widgetConfig.height : '150px'\"\r\n [style.top]=\"widgetConfig.top\"\r\n [style.left]=\"widgetConfig.left\"\r\n [style.background-color]=\"widgetConfig.backgroundColor\"\r\n [class.disabled]=\"widgetConfig.disabled\"\r\n [class.draggable]=\"widgetConfig.draggable && !widgetConfig.disabled\"\r\n [class.resizable]=\"widgetConfig.resizable && !widgetConfig.disabled\"\r\n class=\"widget-container\"\r\n cdkDrag\r\n [cdkDragDisabled]=\"!widgetConfig.draggable || widgetConfig.disabled\"\r\n [cdkDragBoundary]=\"dragBoundaryElement\"\r\n (cdkDragStarted)=\"onDragStarted(widgetConfig, $event)\"\r\n (cdkDragEnded)=\"onDragEnded(widgetConfig, $event)\"\r\n [ngClass]=\"{ 'is-active': widgetConfig.isActive }\"\r\n >\r\n <!--\r\n Widget Header: Contains title and controls. Acts as the handle for dragging.\r\n -->\r\n <div class=\"widget-header\" cdkDragHandle>\r\n <div class=\"widget-header-left\">\r\n <!-- Draggable indicator icon, shown only if the widget is draggable and not disabled -->\r\n <mat-icon\r\n *ngIf=\"widgetConfig.draggable && !widgetConfig.disabled\"\r\n class=\"widget-drag-handle\"\r\n aria-hidden=\"true\"\r\n >drag_indicator</mat-icon\r\n >\r\n <!-- Optional header icon -->\r\n <mat-icon *ngIf=\"widgetConfig.headerIcon\" class=\"widget-header-icon\">{{\r\n widgetConfig.headerIcon\r\n }}</mat-icon>\r\n <!-- Widget Title -->\r\n <h3 *ngIf=\"widgetConfig?.title\">{{ widgetConfig?.title }}</h3>\r\n </div>\r\n <!-- Optional close button with accessibility label -->\r\n <button\r\n color=\"{{ getColor() }}\"\r\n mat-icon-button\r\n *ngIf=\"widgetConfig?.showCloseIcon\"\r\n class=\"widget-close-button\"\r\n [disabled]=\"widgetConfig.disabled\"\r\n (click)=\"onCloseClick(widgetConfig.id)\"\r\n [attr.aria-label]=\"'Close widget ' + widgetConfig?.title\"\r\n >\r\n <mat-icon color=\"{{ getColor() }}\">close</mat-icon>\r\n </button>\r\n </div>\r\n <!--\r\n Widget Content: Renders the main content of the widget using the child uxp-ruclib-widget-item component.\r\n -->\r\n <div class=\"widget-content\">\r\n <uxp-ruclib-widget-item\r\n [widgetConfig]=\"widgetConfig\"\r\n ></uxp-ruclib-widget-item>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block}.widget-container{border:1px solid #ccc;border-radius:8px;box-shadow:0 2px 4px #0000001a;display:flex;flex-direction:column;position:absolute;overflow:hidden;padding:15px;transition:box-shadow .2s ease-in-out,border-color .2s ease-in-out}.widget-container:hover{box-shadow:0 4px 8px #0003;border-color:#007bff;transform:translateY(-2px)}.widget-container.is-active{box-shadow:0 10px 20px #00000040,0 6px 6px #0000003b;border-color:#28a745;transform:scale(1.02);z-index:1000;cursor:grabbing!important}.widget-container .cdk-drag-placeholder{opacity:.4;background-color:#f0f0f0;border:1px dashed #999;transition:none}.widget-container .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.widget-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.widget-container.draggable .widget-header{cursor:move}.widget-header-left{display:flex;align-items:center;gap:8px;overflow:hidden}.widget-header-icon{flex-shrink:0}.widget-header-left h3{margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.widget-header h3{margin:0;font-size:1.2em}.widget-drag-handle{color:#aaa;flex-shrink:0}.widget-close-button{background:none;border:none;cursor:pointer;padding:0;line-height:1;transition:color .2s ease-in-out}.widget-close-button mat-icon{font-size:20px;vertical-align:middle}.widget-content{flex-grow:1;overflow:auto;font-size:.9em}.widget-content p{margin-top:0;line-height:1.6}.widgets-host-container{position:relative;width:100%;min-height:600px;border:1px dashed #eee}.widget-container.disabled{opacity:.6;pointer-events:none;cursor:not-allowed}.widget-container.resizable{resize:both}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i4.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i4.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i5.RuclibWidgetItemComponent, selector: "uxp-ruclib-widget-item", inputs: ["widgetConfig"] }] });
|
|
93
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibWidgetComponent, decorators: [{
|
|
94
|
+
type: Component,
|
|
95
|
+
args: [{ selector: 'uxp-ruclib-widget', template: "<!--\r\n The main container for all widgets.\r\n - Applies a custom theme class if provided.\r\n - Acts as the boundary for dragging operations via the #widgetsHostContainer template reference.\r\n-->\r\n<div\r\n class=\"widgets-host-container {{ customTheme || '' }}\"\r\n #widgetsHostContainer\r\n>\r\n <!--\r\n Iterates through the widget data to render each individual widget.\r\n Each widget is a draggable container powered by Angular CDK.\r\n -->\r\n <div\r\n *ngFor=\"let widgetConfig of getWidgetData()\"\r\n [style.width]=\"widgetConfig.width ? widgetConfig.width : '200px'\"\r\n [style.height]=\"widgetConfig.height ? widgetConfig.height : '150px'\"\r\n [style.minWidth]=\"widgetConfig.width ? widgetConfig.width : '200px'\"\r\n [style.minHeight]=\"widgetConfig.height ? widgetConfig.height : '150px'\"\r\n [style.top]=\"widgetConfig.top\"\r\n [style.left]=\"widgetConfig.left\"\r\n [style.background-color]=\"widgetConfig.backgroundColor\"\r\n [class.disabled]=\"widgetConfig.disabled\"\r\n [class.draggable]=\"widgetConfig.draggable && !widgetConfig.disabled\"\r\n [class.resizable]=\"widgetConfig.resizable && !widgetConfig.disabled\"\r\n class=\"widget-container\"\r\n cdkDrag\r\n [cdkDragDisabled]=\"!widgetConfig.draggable || widgetConfig.disabled\"\r\n [cdkDragBoundary]=\"dragBoundaryElement\"\r\n (cdkDragStarted)=\"onDragStarted(widgetConfig, $event)\"\r\n (cdkDragEnded)=\"onDragEnded(widgetConfig, $event)\"\r\n [ngClass]=\"{ 'is-active': widgetConfig.isActive }\"\r\n >\r\n <!--\r\n Widget Header: Contains title and controls. Acts as the handle for dragging.\r\n -->\r\n <div class=\"widget-header\" cdkDragHandle>\r\n <div class=\"widget-header-left\">\r\n <!-- Draggable indicator icon, shown only if the widget is draggable and not disabled -->\r\n <mat-icon\r\n *ngIf=\"widgetConfig.draggable && !widgetConfig.disabled\"\r\n class=\"widget-drag-handle\"\r\n aria-hidden=\"true\"\r\n >drag_indicator</mat-icon\r\n >\r\n <!-- Optional header icon -->\r\n <mat-icon *ngIf=\"widgetConfig.headerIcon\" class=\"widget-header-icon\">{{\r\n widgetConfig.headerIcon\r\n }}</mat-icon>\r\n <!-- Widget Title -->\r\n <h3 *ngIf=\"widgetConfig?.title\">{{ widgetConfig?.title }}</h3>\r\n </div>\r\n <!-- Optional close button with accessibility label -->\r\n <button\r\n color=\"{{ getColor() }}\"\r\n mat-icon-button\r\n *ngIf=\"widgetConfig?.showCloseIcon\"\r\n class=\"widget-close-button\"\r\n [disabled]=\"widgetConfig.disabled\"\r\n (click)=\"onCloseClick(widgetConfig.id)\"\r\n [attr.aria-label]=\"'Close widget ' + widgetConfig?.title\"\r\n >\r\n <mat-icon color=\"{{ getColor() }}\">close</mat-icon>\r\n </button>\r\n </div>\r\n <!--\r\n Widget Content: Renders the main content of the widget using the child uxp-ruclib-widget-item component.\r\n -->\r\n <div class=\"widget-content\">\r\n <uxp-ruclib-widget-item\r\n [widgetConfig]=\"widgetConfig\"\r\n ></uxp-ruclib-widget-item>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block}.widget-container{border:1px solid #ccc;border-radius:8px;box-shadow:0 2px 4px #0000001a;display:flex;flex-direction:column;position:absolute;overflow:hidden;padding:15px;transition:box-shadow .2s ease-in-out,border-color .2s ease-in-out}.widget-container:hover{box-shadow:0 4px 8px #0003;border-color:#007bff;transform:translateY(-2px)}.widget-container.is-active{box-shadow:0 10px 20px #00000040,0 6px 6px #0000003b;border-color:#28a745;transform:scale(1.02);z-index:1000;cursor:grabbing!important}.widget-container .cdk-drag-placeholder{opacity:.4;background-color:#f0f0f0;border:1px dashed #999;transition:none}.widget-container .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.widget-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.widget-container.draggable .widget-header{cursor:move}.widget-header-left{display:flex;align-items:center;gap:8px;overflow:hidden}.widget-header-icon{flex-shrink:0}.widget-header-left h3{margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.widget-header h3{margin:0;font-size:1.2em}.widget-drag-handle{color:#aaa;flex-shrink:0}.widget-close-button{background:none;border:none;cursor:pointer;padding:0;line-height:1;transition:color .2s ease-in-out}.widget-close-button mat-icon{font-size:20px;vertical-align:middle}.widget-content{flex-grow:1;overflow:auto;font-size:.9em}.widget-content p{margin-top:0;line-height:1.6}.widgets-host-container{position:relative;width:100%;min-height:600px;border:1px dashed #eee}.widget-container.disabled{opacity:.6;pointer-events:none;cursor:not-allowed}.widget-container.resizable{resize:both}\n"] }]
|
|
96
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { rucInputData: [{
|
|
97
|
+
type: Input
|
|
98
|
+
}], customTheme: [{
|
|
99
|
+
type: Input
|
|
100
|
+
}], widgetClose: [{
|
|
101
|
+
type: Output
|
|
102
|
+
}], layoutChanged: [{
|
|
103
|
+
type: Output
|
|
104
|
+
}], widgetsHostContainerRef: [{
|
|
105
|
+
type: ViewChild,
|
|
106
|
+
args: ['widgetsHostContainer']
|
|
107
|
+
}] } });
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi13aWRnZXQvcnVjbGliLXdpZGdldC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi13aWRnZXQvcnVjbGliLXdpZGdldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWlCLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBSWhJOzs7R0FHRztBQU1ILE1BQU0sT0FBTyxxQkFBcUI7SUEwQmhDOztPQUVHO0lBQ0gsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFmMUM7OztXQUdHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRW5EOzs7V0FHRztRQUNPLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7SUFLbkIsQ0FBQztJQU8vQzs7O09BR0c7SUFDSCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDaEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUM7WUFDdEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLENBQUMsUUFBZ0I7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsYUFBYSxDQUFDLE1BQXdCLEVBQUUsS0FBbUI7UUFDekQsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFdBQVcsQ0FBQyxNQUF3QixFQUFFLEtBQWlCO1FBQ3JELE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXhCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUV2RCxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNuRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUVyRCxNQUFNLFFBQVEsR0FBRyxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLFNBQVMsR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUVoRCxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsUUFBUSxJQUFJLENBQUM7UUFDN0IsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLFNBQVMsSUFBSSxDQUFDO1FBRS9CLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFckIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRTtZQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxJQUFJLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDakcsQ0FBQzs7bUhBM0dVLHFCQUFxQjt1R0FBckIscUJBQXFCLHlVQ2JsQyxrckdBMkVBOzRGRDlEYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsbUJBQW1CO3dHQVVwQixZQUFZO3NCQUFwQixLQUFLO2dCQU1HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUksV0FBVztzQkFBcEIsTUFBTTtnQkFNRyxhQUFhO3NCQUF0QixNQUFNO2dCQVE0Qix1QkFBdUI7c0JBQXpELFNBQVM7dUJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgV2lkZ2V0Q29uZmlnLCBXaWRnZXRDb25maWdEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlL3dpZGdldCc7XHJcbmltcG9ydCB7IENka0RyYWdTdGFydCwgQ2RrRHJhZ0VuZCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5cclxuLyoqXHJcbiAqIEEgY29tcG9uZW50IHRoYXQgcmVuZGVycyBhIGNvbGxlY3Rpb24gb2YgZHJhZ2dhYmxlIGFuZCBjb25maWd1cmFibGUgd2lkZ2V0cyB3aXRoaW4gYSBob3N0IGNvbnRhaW5lci5cclxuICogSXQgbWFuYWdlcyB0aGUgbGF5b3V0LCBpbnRlcmFjdGlvbiwgYW5kIGR5bmFtaWMgY29udGVudCBvZiBlYWNoIHdpZGdldC5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndXhwLXJ1Y2xpYi13aWRnZXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ydWNsaWItd2lkZ2V0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ydWNsaWItd2lkZ2V0LmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSdWNsaWJXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcclxuICAvKipcclxuICAgKiBUaGUgbWFpbiBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIHdpZGdldCBjb250YWluZXIuXHJcbiAgICogSXQgaW5jbHVkZXMgdGhlIGFycmF5IG9mIHdpZGdldCBkYXRhIGFuZCBnbG9iYWwgc2V0dGluZ3MuXHJcbiAgICogQHNlZSBXaWRnZXRDb25maWcgaW50ZXJmYWNlIGZvciBkZXRhaWxlZCBwcm9wZXJ0aWVzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHJ1Y0lucHV0RGF0YSE6IFdpZGdldENvbmZpZztcclxuXHJcbiAgLyoqXHJcbiAgICogQW4gb3B0aW9uYWwgY3VzdG9tIHRoZW1lIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHdpZGdldCBob3N0IGNvbnRhaW5lci5cclxuICAgKiBAZXhhbXBsZSAnZGFyay10aGVtZScsICdjdXN0b20tdGhlbWUtb25lJ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGN1c3RvbVRoZW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEFuIGV2ZW50IGVtaXR0ZXIgdGhhdCBmaXJlcyB3aGVuIGEgd2lkZ2V0J3MgY2xvc2UgaWNvbiBpcyBjbGlja2VkLlxyXG4gICAqIEl0IGVtaXRzIHRoZSB1bmlxdWUgSUQgb2YgdGhlIHdpZGdldCB0byBiZSBjbG9zZWQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIHdpZGdldENsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEFuIGV2ZW50IGVtaXR0ZXIgdGhhdCBmaXJlcyB3aGVuIGEgd2lkZ2V0IGlzIGRyYWdnZWQgYW5kIGRyb3BwZWQuXHJcbiAgICogSXQgZW1pdHMgdGhlIGVudGlyZSB1cGRhdGVkIGFycmF5IG9mIHdpZGdldCBjb25maWd1cmF0aW9ucywgYWxsb3dpbmcgdGhlIHBhcmVudCB0byBzYXZlIHRoZSBuZXcgbGF5b3V0LlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBsYXlvdXRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxXaWRnZXRDb25maWdEYXRhW10+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBjZHIgVGhlIENoYW5nZURldGVjdG9yUmVmIHRvIG1hbnVhbGx5IHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB3aGVuIG5lZWRlZC5cclxuICAgKi9cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxyXG5cclxuICAvKiogQSByZWZlcmVuY2UgdG8gdGhlIGhvc3QgY29udGFpbmVyIGVsZW1lbnQsIHVzZWQgdG8gZGVmaW5lIHRoZSBkcmFnIGJvdW5kYXJ5LiAqL1xyXG4gIEBWaWV3Q2hpbGQoJ3dpZGdldHNIb3N0Q29udGFpbmVyJykgd2lkZ2V0c0hvc3RDb250YWluZXJSZWYhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuICAvKiogVGhlIEhUTUwgZWxlbWVudCB0aGF0IHNlcnZlcyBhcyB0aGUgYm91bmRhcnkgZm9yIGFsbCBkcmFnIG9wZXJhdGlvbnMuICovXHJcbiAgcHVibGljIGRyYWdCb3VuZGFyeUVsZW1lbnQhOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgLyoqXHJcbiAgICogQWZ0ZXIgdGhlIHZpZXcgaW5pdGlhbGl6ZXMsIHRoaXMgaG9vayBjYXB0dXJlcyB0aGUgaG9zdCBjb250YWluZXIncyBuYXRpdmUgZWxlbWVudFxyXG4gICAqIGFuZCBzZXRzIGl0IGFzIHRoZSBib3VuZGFyeSBmb3IgZHJhZ2dpbmcgd2lkZ2V0cy5cclxuICAgKi9cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRzSG9zdENvbnRhaW5lclJlZikge1xyXG4gICAgICB0aGlzLmRyYWdCb3VuZGFyeUVsZW1lbnQgPSB0aGlzLndpZGdldHNIb3N0Q29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgdGhlIGNsaWNrIGV2ZW50IG9uIGEgd2lkZ2V0J3MgY2xvc2UgYnV0dG9uLlxyXG4gICAqIEBwYXJhbSB3aWRnZXRJZCBUaGUgSUQgb2YgdGhlIHdpZGdldCB0byBiZSBjbG9zZWQuXHJcbiAgICovXHJcbiAgb25DbG9zZUNsaWNrKHdpZGdldElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMud2lkZ2V0Q2xvc2UuZW1pdCh3aWRnZXRJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhIGRyYWcgb3BlcmF0aW9uIGZvciBhIHdpZGdldC5cclxuICAgKiBTZXRzIHRoZSB3aWRnZXQncyBpc0FjdGl2ZSBzdGF0ZSB0byB0cnVlIGZvciB2aXN1YWwgZmVlZGJhY2suXHJcbiAgICogQHBhcmFtIHdpZGdldCBUaGUgV2lkZ2V0Q29uZmlnRGF0YSBvYmplY3QgYmVpbmcgZHJhZ2dlZC5cclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIENka0RyYWdTdGFydCBldmVudC5cclxuICAgKi9cclxuICBvbkRyYWdTdGFydGVkKHdpZGdldDogV2lkZ2V0Q29uZmlnRGF0YSwgZXZlbnQ6IENka0RyYWdTdGFydCk6IHZvaWQge1xyXG4gICAgd2lkZ2V0LmlzQWN0aXZlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgdGhlIGVuZCBvZiBhIGRyYWcgb3BlcmF0aW9uLlxyXG4gICAqIEl0IGNhbGN1bGF0ZXMgdGhlIG5ldyB0b3AvbGVmdCBwb3NpdGlvbiwgdXBkYXRlcyB0aGUgd2lkZ2V0J3MgY29uZmlndXJhdGlvbixcclxuICAgKiBhbmQgZW1pdHMgdGhlIGBsYXlvdXRDaGFuZ2VkYCBldmVudCB3aXRoIHRoZSBuZXcgbGF5b3V0IGRhdGEuXHJcbiAgICogQHBhcmFtIHdpZGdldCBUaGUgV2lkZ2V0Q29uZmlnRGF0YSBvYmplY3QgdGhhdCB3YXMgZHJhZ2dlZC5cclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIENka0RyYWdFbmQgZXZlbnQuXHJcbiAgICovXHJcbiAgb25EcmFnRW5kZWQod2lkZ2V0OiBXaWRnZXRDb25maWdEYXRhLCBldmVudDogQ2RrRHJhZ0VuZCk6IHZvaWQge1xyXG4gICAgd2lkZ2V0LmlzQWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBldmVudC5zb3VyY2UuZ2V0RnJlZURyYWdQb3NpdGlvbigpO1xyXG5cclxuICAgIGNvbnN0IGluaXRpYWxUb3BQeCA9IHBhcnNlRmxvYXQod2lkZ2V0LnRvcCB8fCAnMCcpO1xyXG4gICAgY29uc3QgaW5pdGlhbExlZnRQeCA9IHBhcnNlRmxvYXQod2lkZ2V0LmxlZnQgfHwgJzAnKTtcclxuXHJcbiAgICBjb25zdCBuZXdUb3BQeCA9IGluaXRpYWxUb3BQeCArIG5ld1Bvc2l0aW9uLnk7XHJcbiAgICBjb25zdCBuZXdMZWZ0UHggPSBpbml0aWFsTGVmdFB4ICsgbmV3UG9zaXRpb24ueDtcclxuXHJcbiAgICB3aWRnZXQudG9wID0gYCR7bmV3VG9wUHh9cHhgO1xyXG4gICAgd2lkZ2V0LmxlZnQgPSBgJHtuZXdMZWZ0UHh9cHhgO1xyXG5cclxuICAgIGV2ZW50LnNvdXJjZS5yZXNldCgpO1xyXG5cclxuICAgIGlmICh0aGlzLnJ1Y0lucHV0RGF0YS53aWRnZXREYXRhKSB7XHJcbiAgICAgIHRoaXMubGF5b3V0Q2hhbmdlZC5lbWl0KHRoaXMucnVjSW5wdXREYXRhLndpZGdldERhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBjb2xvciBmb3IgVUkgZWxlbWVudHMgbGlrZSBpY29ucyBmcm9tIHRoZSBpbnB1dCBkYXRhLlxyXG4gICAqIEByZXR1cm5zIFRoZSBjb2xvciBzdHJpbmcgKGUuZy4sICdwcmltYXJ5JywgJ2FjY2VudCcpIG9yICdwcmltYXJ5JyBhcyBhIGRlZmF1bHQuXHJcbiAgICovXHJcbiAgZ2V0Q29sb3IoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnJ1Y0lucHV0RGF0YT8uY29sb3IgfHwgJ3ByaW1hcnknO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBzYWZlIGdldHRlciBmb3IgdGhlIHdpZGdldCBkYXRhIGFycmF5IGZyb20gdGhlIG1haW4gaW5wdXQgY29uZmlndXJhdGlvbi5cclxuICAgKiBAcmV0dXJucyBUaGUgYXJyYXkgb2Ygd2lkZ2V0IGNvbmZpZ3VyYXRpb25zLCBvciBhbiBlbXB0eSBhcnJheSBpZiBub3QgZGVmaW5lZC5cclxuICAgKi9cclxuICBnZXRXaWRnZXREYXRhKCk6IFdpZGdldENvbmZpZ0RhdGFbXSB8IGFueSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucnVjSW5wdXREYXRhLndpZGdldERhdGEgIT09ICd1bmRlZmluZWQnID8gdGhpcy5ydWNJbnB1dERhdGEud2lkZ2V0RGF0YSA6IFtdO1xyXG4gIH1cclxufVxyXG4iLCI8IS0tXHJcbiAgVGhlIG1haW4gY29udGFpbmVyIGZvciBhbGwgd2lkZ2V0cy5cclxuICAtIEFwcGxpZXMgYSBjdXN0b20gdGhlbWUgY2xhc3MgaWYgcHJvdmlkZWQuXHJcbiAgLSBBY3RzIGFzIHRoZSBib3VuZGFyeSBmb3IgZHJhZ2dpbmcgb3BlcmF0aW9ucyB2aWEgdGhlICN3aWRnZXRzSG9zdENvbnRhaW5lciB0ZW1wbGF0ZSByZWZlcmVuY2UuXHJcbi0tPlxyXG48ZGl2XHJcbiAgY2xhc3M9XCJ3aWRnZXRzLWhvc3QtY29udGFpbmVyIHt7IGN1c3RvbVRoZW1lIHx8ICcnIH19XCJcclxuICAjd2lkZ2V0c0hvc3RDb250YWluZXJcclxuPlxyXG4gIDwhLS1cclxuICAgIEl0ZXJhdGVzIHRocm91Z2ggdGhlIHdpZGdldCBkYXRhIHRvIHJlbmRlciBlYWNoIGluZGl2aWR1YWwgd2lkZ2V0LlxyXG4gICAgRWFjaCB3aWRnZXQgaXMgYSBkcmFnZ2FibGUgY29udGFpbmVyIHBvd2VyZWQgYnkgQW5ndWxhciBDREsuXHJcbiAgLS0+XHJcbiAgPGRpdlxyXG4gICAgKm5nRm9yPVwibGV0IHdpZGdldENvbmZpZyBvZiBnZXRXaWRnZXREYXRhKClcIlxyXG4gICAgW3N0eWxlLndpZHRoXT1cIndpZGdldENvbmZpZy53aWR0aCA/IHdpZGdldENvbmZpZy53aWR0aCA6ICcyMDBweCdcIlxyXG4gICAgW3N0eWxlLmhlaWdodF09XCJ3aWRnZXRDb25maWcuaGVpZ2h0ID8gd2lkZ2V0Q29uZmlnLmhlaWdodCA6ICcxNTBweCdcIlxyXG4gICAgW3N0eWxlLm1pbldpZHRoXT1cIndpZGdldENvbmZpZy53aWR0aCA/IHdpZGdldENvbmZpZy53aWR0aCA6ICcyMDBweCdcIlxyXG4gICAgW3N0eWxlLm1pbkhlaWdodF09XCJ3aWRnZXRDb25maWcuaGVpZ2h0ID8gd2lkZ2V0Q29uZmlnLmhlaWdodCA6ICcxNTBweCdcIlxyXG4gICAgW3N0eWxlLnRvcF09XCJ3aWRnZXRDb25maWcudG9wXCJcclxuICAgIFtzdHlsZS5sZWZ0XT1cIndpZGdldENvbmZpZy5sZWZ0XCJcclxuICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIndpZGdldENvbmZpZy5iYWNrZ3JvdW5kQ29sb3JcIlxyXG4gICAgW2NsYXNzLmRpc2FibGVkXT1cIndpZGdldENvbmZpZy5kaXNhYmxlZFwiXHJcbiAgICBbY2xhc3MuZHJhZ2dhYmxlXT1cIndpZGdldENvbmZpZy5kcmFnZ2FibGUgJiYgIXdpZGdldENvbmZpZy5kaXNhYmxlZFwiXHJcbiAgICBbY2xhc3MucmVzaXphYmxlXT1cIndpZGdldENvbmZpZy5yZXNpemFibGUgJiYgIXdpZGdldENvbmZpZy5kaXNhYmxlZFwiXHJcbiAgICBjbGFzcz1cIndpZGdldC1jb250YWluZXJcIlxyXG4gICAgY2RrRHJhZ1xyXG4gICAgW2Nka0RyYWdEaXNhYmxlZF09XCIhd2lkZ2V0Q29uZmlnLmRyYWdnYWJsZSB8fCB3aWRnZXRDb25maWcuZGlzYWJsZWRcIlxyXG4gICAgW2Nka0RyYWdCb3VuZGFyeV09XCJkcmFnQm91bmRhcnlFbGVtZW50XCJcclxuICAgIChjZGtEcmFnU3RhcnRlZCk9XCJvbkRyYWdTdGFydGVkKHdpZGdldENvbmZpZywgJGV2ZW50KVwiXHJcbiAgICAoY2RrRHJhZ0VuZGVkKT1cIm9uRHJhZ0VuZGVkKHdpZGdldENvbmZpZywgJGV2ZW50KVwiXHJcbiAgICBbbmdDbGFzc109XCJ7ICdpcy1hY3RpdmUnOiB3aWRnZXRDb25maWcuaXNBY3RpdmUgfVwiXHJcbiAgPlxyXG4gICAgPCEtLVxyXG4gICAgICBXaWRnZXQgSGVhZGVyOiBDb250YWlucyB0aXRsZSBhbmQgY29udHJvbHMuIEFjdHMgYXMgdGhlIGhhbmRsZSBmb3IgZHJhZ2dpbmcuXHJcbiAgICAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXQtaGVhZGVyXCIgY2RrRHJhZ0hhbmRsZT5cclxuICAgICAgPGRpdiBjbGFzcz1cIndpZGdldC1oZWFkZXItbGVmdFwiPlxyXG4gICAgICAgIDwhLS0gRHJhZ2dhYmxlIGluZGljYXRvciBpY29uLCBzaG93biBvbmx5IGlmIHRoZSB3aWRnZXQgaXMgZHJhZ2dhYmxlIGFuZCBub3QgZGlzYWJsZWQgLS0+XHJcbiAgICAgICAgPG1hdC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldENvbmZpZy5kcmFnZ2FibGUgJiYgIXdpZGdldENvbmZpZy5kaXNhYmxlZFwiXHJcbiAgICAgICAgICBjbGFzcz1cIndpZGdldC1kcmFnLWhhbmRsZVwiXHJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvblxyXG4gICAgICAgID5cclxuICAgICAgICA8IS0tIE9wdGlvbmFsIGhlYWRlciBpY29uIC0tPlxyXG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIndpZGdldENvbmZpZy5oZWFkZXJJY29uXCIgY2xhc3M9XCJ3aWRnZXQtaGVhZGVyLWljb25cIj57e1xyXG4gICAgICAgICAgd2lkZ2V0Q29uZmlnLmhlYWRlckljb25cclxuICAgICAgICB9fTwvbWF0LWljb24+XHJcbiAgICAgICAgPCEtLSBXaWRnZXQgVGl0bGUgLS0+XHJcbiAgICAgICAgPGgzICpuZ0lmPVwid2lkZ2V0Q29uZmlnPy50aXRsZVwiPnt7IHdpZGdldENvbmZpZz8udGl0bGUgfX08L2gzPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSBPcHRpb25hbCBjbG9zZSBidXR0b24gd2l0aCBhY2Nlc3NpYmlsaXR5IGxhYmVsIC0tPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY29sb3I9XCJ7eyBnZXRDb2xvcigpIH19XCJcclxuICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAqbmdJZj1cIndpZGdldENvbmZpZz8uc2hvd0Nsb3NlSWNvblwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXQtY2xvc2UtYnV0dG9uXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0Q29uZmlnLmRpc2FibGVkXCJcclxuICAgICAgICAoY2xpY2spPVwib25DbG9zZUNsaWNrKHdpZGdldENvbmZpZy5pZClcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0Nsb3NlIHdpZGdldCAnICsgd2lkZ2V0Q29uZmlnPy50aXRsZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWljb24gY29sb3I9XCJ7eyBnZXRDb2xvcigpIH19XCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLVxyXG4gICAgICBXaWRnZXQgQ29udGVudDogUmVuZGVycyB0aGUgbWFpbiBjb250ZW50IG9mIHRoZSB3aWRnZXQgdXNpbmcgdGhlIGNoaWxkIHV4cC1ydWNsaWItd2lkZ2V0LWl0ZW0gY29tcG9uZW50LlxyXG4gICAgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0LWNvbnRlbnRcIj5cclxuICAgICAgPHV4cC1ydWNsaWItd2lkZ2V0LWl0ZW1cclxuICAgICAgICBbd2lkZ2V0Q29uZmlnXT1cIndpZGdldENvbmZpZ1wiXHJcbiAgICAgID48L3V4cC1ydWNsaWItd2lkZ2V0LWl0ZW0+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Component, Input, ViewChild, ViewContainerRef, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/platform-browser";
|
|
5
|
+
import * as i2 from "@angular/common";
|
|
6
|
+
import * as i3 from "../../pipes/safe-html.pipe";
|
|
7
|
+
/**
|
|
8
|
+
* Represents a single item within a widget.
|
|
9
|
+
* This component is responsible for rendering the content of a widget, which can be
|
|
10
|
+
* simple text, HTML, a video, or a dynamically loaded Angular component.
|
|
11
|
+
*/
|
|
12
|
+
export class RuclibWidgetItemComponent {
|
|
13
|
+
/**
|
|
14
|
+
* @param cdr The ChangeDetectorRef to manually trigger change detection.
|
|
15
|
+
* @param sanitizer The DomSanitizer service to prevent XSS attacks by sanitizing HTML.
|
|
16
|
+
*/
|
|
17
|
+
constructor(cdr, sanitizer) {
|
|
18
|
+
this.cdr = cdr;
|
|
19
|
+
this.sanitizer = sanitizer;
|
|
20
|
+
/**
|
|
21
|
+
* A reference to the dynamically created component instance.
|
|
22
|
+
* This is used to manage the lifecycle of the injected component.
|
|
23
|
+
*/
|
|
24
|
+
this.dynamicComponentRef = null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A lifecycle hook that responds when Angular sets or resets data-bound input properties.
|
|
28
|
+
* It checks for changes in `widgetConfig` and reloads the content accordingly.
|
|
29
|
+
* @param changes An object of the changed properties.
|
|
30
|
+
*/
|
|
31
|
+
ngOnChanges(changes) {
|
|
32
|
+
if (changes['widgetConfig']) {
|
|
33
|
+
if (this.widgetConfig.contentType === 'component' && this.widgetComponentHost) {
|
|
34
|
+
this.loadDynamicContent();
|
|
35
|
+
}
|
|
36
|
+
else if (this.widgetConfig.contentType !== 'component') {
|
|
37
|
+
this.clearDynamicContent();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A lifecycle hook that is called after Angular has fully initialized a component's view.
|
|
43
|
+
* It ensures that if the initial content type is 'component', it gets loaded.
|
|
44
|
+
*/
|
|
45
|
+
ngAfterViewInit() {
|
|
46
|
+
if (this.widgetConfig.contentType === 'component' && this.widgetComponentHost) {
|
|
47
|
+
this.loadDynamicContent();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Loads a dynamic component into the `widgetComponentHost` view container.
|
|
52
|
+
* It reads the component type and any input data from the `widgetConfig`.
|
|
53
|
+
*/
|
|
54
|
+
loadDynamicContent() {
|
|
55
|
+
this.clearDynamicContent();
|
|
56
|
+
if (this.widgetConfig.contentType === 'component' && this.widgetConfig.contentData && this.widgetConfig.contentData.component) {
|
|
57
|
+
if (this.widgetComponentHost) {
|
|
58
|
+
const componentType = this.widgetConfig.contentData.component;
|
|
59
|
+
this.dynamicComponentRef = this.widgetComponentHost.createComponent(componentType);
|
|
60
|
+
if (this.widgetConfig.contentData.inputs && this.dynamicComponentRef?.instance) {
|
|
61
|
+
Object.keys(this.widgetConfig.contentData.inputs).forEach(key => {
|
|
62
|
+
if (this.dynamicComponentRef && key in this.dynamicComponentRef.instance) {
|
|
63
|
+
this.dynamicComponentRef.instance[key] = this.widgetConfig.contentData.inputs[key];
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
this.dynamicComponentRef.changeDetectorRef.detectChanges();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
this.cdr.detectChanges();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Clears any dynamically loaded component from the view container and destroys its instance.
|
|
74
|
+
*/
|
|
75
|
+
clearDynamicContent() {
|
|
76
|
+
if (this.dynamicComponentRef) {
|
|
77
|
+
this.dynamicComponentRef.destroy();
|
|
78
|
+
this.dynamicComponentRef = null;
|
|
79
|
+
}
|
|
80
|
+
if (this.widgetComponentHost) {
|
|
81
|
+
this.widgetComponentHost.clear();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* A lifecycle hook that cleans up the component before it's destroyed.
|
|
86
|
+
* Ensures that any dynamically created components are properly destroyed to avoid memory leaks.
|
|
87
|
+
*/
|
|
88
|
+
ngOnDestroy() {
|
|
89
|
+
this.clearDynamicContent();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
RuclibWidgetItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibWidgetItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
93
|
+
RuclibWidgetItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RuclibWidgetItemComponent, selector: "uxp-ruclib-widget-item", inputs: { widgetConfig: "widgetConfig" }, viewQueries: [{ propertyName: "widgetComponentHost", first: true, predicate: ["widgetComponentHost"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<!--\r\n This container uses a switch to determine how to render the widget's content\r\n based on the `contentType` property in the widget's configuration.\r\n-->\r\n<ng-container [ngSwitch]=\"widgetConfig.contentType\">\r\n <!-- Case for simple text content. -->\r\n <p *ngSwitchCase=\"'text'\">{{ widgetConfig.contentData }}</p>\r\n\r\n <!-- Case for HTML content, sanitized through the `safeHtml` pipe. -->\r\n <div\r\n *ngSwitchCase=\"'html'\"\r\n [innerHTML]=\"widgetConfig.contentData | safeHtml\"\r\n ></div>\r\n\r\n <!-- Case for video content, with attributes bound to the widget's configuration. -->\r\n <video\r\n *ngSwitchCase=\"'video'\"\r\n [src]=\"widgetConfig.contentData.src\"\r\n [attr.type]=\"widgetConfig.contentData.type\"\r\n [controls]=\"widgetConfig.contentData.controls\"\r\n [autoplay]=\"widgetConfig.contentData.autoplay\"\r\n [loop]=\"widgetConfig.contentData.loop\"\r\n style=\"width: 100%; height: 100%; object-fit: contain\"\r\n ></video>\r\n\r\n <!--\r\n Case for rendering a dynamic Angular component.\r\n The `ng-template` with the #widgetComponentHost reference serves as the anchor point\r\n where the component will be programmatically injected.\r\n -->\r\n <ng-container *ngSwitchCase=\"'component'\">\r\n <ng-template #widgetComponentHost></ng-template>\r\n </ng-container>\r\n\r\n <!--\r\n Default case that displays a fallback message if the `contentType`\r\n is not recognized or if no content is provided.\r\n -->\r\n <p *ngSwitchDefault>No content provided or content type not supported.</p>\r\n</ng-container>\r\n", styles: [":host{display:block;height:100%;width:100%}video{max-width:100%;max-height:100%}p{margin:0}\n"], dependencies: [{ kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: i3.SafeHtmlPipe, name: "safeHtml" }] });
|
|
94
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibWidgetItemComponent, decorators: [{
|
|
95
|
+
type: Component,
|
|
96
|
+
args: [{ selector: 'uxp-ruclib-widget-item', template: "<!--\r\n This container uses a switch to determine how to render the widget's content\r\n based on the `contentType` property in the widget's configuration.\r\n-->\r\n<ng-container [ngSwitch]=\"widgetConfig.contentType\">\r\n <!-- Case for simple text content. -->\r\n <p *ngSwitchCase=\"'text'\">{{ widgetConfig.contentData }}</p>\r\n\r\n <!-- Case for HTML content, sanitized through the `safeHtml` pipe. -->\r\n <div\r\n *ngSwitchCase=\"'html'\"\r\n [innerHTML]=\"widgetConfig.contentData | safeHtml\"\r\n ></div>\r\n\r\n <!-- Case for video content, with attributes bound to the widget's configuration. -->\r\n <video\r\n *ngSwitchCase=\"'video'\"\r\n [src]=\"widgetConfig.contentData.src\"\r\n [attr.type]=\"widgetConfig.contentData.type\"\r\n [controls]=\"widgetConfig.contentData.controls\"\r\n [autoplay]=\"widgetConfig.contentData.autoplay\"\r\n [loop]=\"widgetConfig.contentData.loop\"\r\n style=\"width: 100%; height: 100%; object-fit: contain\"\r\n ></video>\r\n\r\n <!--\r\n Case for rendering a dynamic Angular component.\r\n The `ng-template` with the #widgetComponentHost reference serves as the anchor point\r\n where the component will be programmatically injected.\r\n -->\r\n <ng-container *ngSwitchCase=\"'component'\">\r\n <ng-template #widgetComponentHost></ng-template>\r\n </ng-container>\r\n\r\n <!--\r\n Default case that displays a fallback message if the `contentType`\r\n is not recognized or if no content is provided.\r\n -->\r\n <p *ngSwitchDefault>No content provided or content type not supported.</p>\r\n</ng-container>\r\n", styles: [":host{display:block;height:100%;width:100%}video{max-width:100%;max-height:100%}p{margin:0}\n"] }]
|
|
97
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DomSanitizer }]; }, propDecorators: { widgetConfig: [{
|
|
98
|
+
type: Input
|
|
99
|
+
}], widgetComponentHost: [{
|
|
100
|
+
type: ViewChild,
|
|
101
|
+
args: ['widgetComponentHost', { read: ViewContainerRef }]
|
|
102
|
+
}] } });
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLXdpZGdldC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVjbGliLXdpZGdldC1pdGVtL3J1Y2xpYi13aWRnZXQtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi13aWRnZXQtaXRlbS9ydWNsaWItd2lkZ2V0LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUNULGdCQUFnQixFQU1oQixpQkFBaUIsRUFFbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7OztBQUd6RDs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLHlCQUF5QjtJQWtCcEM7OztPQUdHO0lBQ0gsWUFBb0IsR0FBc0IsRUFBVSxTQUF1QjtRQUF2RCxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFWM0U7OztXQUdHO1FBQ0ssd0JBQW1CLEdBQTZCLElBQUksQ0FBQztJQU1rQixDQUFDO0lBRWhGOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUM3RSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUMzQjtpQkFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRTtnQkFDeEQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDNUI7U0FDRjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzdFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7WUFDN0gsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzVCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQXNCLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUVuRixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxFQUFFO29CQUM5RSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDOUQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUU7NEJBQ3hFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3lCQUNwRjtvQkFDSCxDQUFDLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQzVEO2FBQ0Y7U0FDRjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssbUJBQW1CO1FBQ3pCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzVCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1NBQ2pDO1FBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDOzt1SEE1RlUseUJBQXlCOzJHQUF6Qix5QkFBeUIsK01BV00sZ0JBQWdCLGtEQ3JDNUQsdWxEQXdDQTs0RkRkYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0Usd0JBQXdCO21JQVN6QixZQUFZO3NCQUFwQixLQUFLO2dCQU13RCxtQkFBbUI7c0JBQWhGLFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NvbnRhaW5lclJlZixcclxuICBDb21wb25lbnRSZWYsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIFR5cGUsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQWZ0ZXJWaWV3SW5pdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgV2lkZ2V0Q29uZmlnRGF0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZS93aWRnZXQnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBzaW5nbGUgaXRlbSB3aXRoaW4gYSB3aWRnZXQuXHJcbiAqIFRoaXMgY29tcG9uZW50IGlzIHJlc3BvbnNpYmxlIGZvciByZW5kZXJpbmcgdGhlIGNvbnRlbnQgb2YgYSB3aWRnZXQsIHdoaWNoIGNhbiBiZVxyXG4gKiBzaW1wbGUgdGV4dCwgSFRNTCwgYSB2aWRlbywgb3IgYSBkeW5hbWljYWxseSBsb2FkZWQgQW5ndWxhciBjb21wb25lbnQuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3V4cC1ydWNsaWItd2lkZ2V0LWl0ZW0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ydWNsaWItd2lkZ2V0LWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3J1Y2xpYi13aWRnZXQtaXRlbS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSdWNsaWJXaWRnZXRJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gIC8qKlxyXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhpcyBzcGVjaWZpYyB3aWRnZXQgaXRlbS5cclxuICAgKiBJdCBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIGNvbnRlbnQgdG8gcmVuZGVyIGFuZCBwcm92aWRlcyB0aGUgbmVjZXNzYXJ5IGRhdGEuXHJcbiAgICovXHJcbiAgQElucHV0KCkgd2lkZ2V0Q29uZmlnITogV2lkZ2V0Q29uZmlnRGF0YTtcclxuXHJcbiAgLyoqXHJcbiAgICogQSByZWZlcmVuY2UgdG8gdGhlIHZpZXcgY29udGFpbmVyIHdoZXJlIGEgZHluYW1pYyBjb21wb25lbnQgd2lsbCBiZSBpbmplY3RlZC5cclxuICAgKiBUaGlzIGlzIHVzZWQgd2hlbiBgd2lkZ2V0Q29uZmlnLmNvbnRlbnRUeXBlYCBpcyAnY29tcG9uZW50Jy5cclxuICAgKi9cclxuICBAVmlld0NoaWxkKCd3aWRnZXRDb21wb25lbnRIb3N0JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIHdpZGdldENvbXBvbmVudEhvc3QhOiBWaWV3Q29udGFpbmVyUmVmO1xyXG4gIC8qKlxyXG4gICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBkeW5hbWljYWxseSBjcmVhdGVkIGNvbXBvbmVudCBpbnN0YW5jZS5cclxuICAgKiBUaGlzIGlzIHVzZWQgdG8gbWFuYWdlIHRoZSBsaWZlY3ljbGUgb2YgdGhlIGluamVjdGVkIGNvbXBvbmVudC5cclxuICAgKi9cclxuICBwcml2YXRlIGR5bmFtaWNDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBjZHIgVGhlIENoYW5nZURldGVjdG9yUmVmIHRvIG1hbnVhbGx5IHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbi5cclxuICAgKiBAcGFyYW0gc2FuaXRpemVyIFRoZSBEb21TYW5pdGl6ZXIgc2VydmljZSB0byBwcmV2ZW50IFhTUyBhdHRhY2tzIGJ5IHNhbml0aXppbmcgSFRNTC5cclxuICAgKi9cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBBIGxpZmVjeWNsZSBob29rIHRoYXQgcmVzcG9uZHMgd2hlbiBBbmd1bGFyIHNldHMgb3IgcmVzZXRzIGRhdGEtYm91bmQgaW5wdXQgcHJvcGVydGllcy5cclxuICAgKiBJdCBjaGVja3MgZm9yIGNoYW5nZXMgaW4gYHdpZGdldENvbmZpZ2AgYW5kIHJlbG9hZHMgdGhlIGNvbnRlbnQgYWNjb3JkaW5nbHkuXHJcbiAgICogQHBhcmFtIGNoYW5nZXMgQW4gb2JqZWN0IG9mIHRoZSBjaGFuZ2VkIHByb3BlcnRpZXMuXHJcbiAgICovXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3dpZGdldENvbmZpZyddKSB7XHJcbiAgICAgIGlmICh0aGlzLndpZGdldENvbmZpZy5jb250ZW50VHlwZSA9PT0gJ2NvbXBvbmVudCcgJiYgdGhpcy53aWRnZXRDb21wb25lbnRIb3N0KSB7XHJcbiAgICAgICAgdGhpcy5sb2FkRHluYW1pY0NvbnRlbnQoKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLndpZGdldENvbmZpZy5jb250ZW50VHlwZSAhPT0gJ2NvbXBvbmVudCcpIHtcclxuICAgICAgICB0aGlzLmNsZWFyRHluYW1pY0NvbnRlbnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBsaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciBBbmd1bGFyIGhhcyBmdWxseSBpbml0aWFsaXplZCBhIGNvbXBvbmVudCdzIHZpZXcuXHJcbiAgICogSXQgZW5zdXJlcyB0aGF0IGlmIHRoZSBpbml0aWFsIGNvbnRlbnQgdHlwZSBpcyAnY29tcG9uZW50JywgaXQgZ2V0cyBsb2FkZWQuXHJcbiAgICovXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0Q29uZmlnLmNvbnRlbnRUeXBlID09PSAnY29tcG9uZW50JyAmJiB0aGlzLndpZGdldENvbXBvbmVudEhvc3QpIHtcclxuICAgICAgdGhpcy5sb2FkRHluYW1pY0NvbnRlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGEgZHluYW1pYyBjb21wb25lbnQgaW50byB0aGUgYHdpZGdldENvbXBvbmVudEhvc3RgIHZpZXcgY29udGFpbmVyLlxyXG4gICAqIEl0IHJlYWRzIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgYW55IGlucHV0IGRhdGEgZnJvbSB0aGUgYHdpZGdldENvbmZpZ2AuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkRHluYW1pY0NvbnRlbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyRHluYW1pY0NvbnRlbnQoKTtcclxuICAgIGlmICh0aGlzLndpZGdldENvbmZpZy5jb250ZW50VHlwZSA9PT0gJ2NvbXBvbmVudCcgJiYgdGhpcy53aWRnZXRDb25maWcuY29udGVudERhdGEgJiYgdGhpcy53aWRnZXRDb25maWcuY29udGVudERhdGEuY29tcG9uZW50KSB7XHJcbiAgICAgIGlmICh0aGlzLndpZGdldENvbXBvbmVudEhvc3QpIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRUeXBlID0gdGhpcy53aWRnZXRDb25maWcuY29udGVudERhdGEuY29tcG9uZW50IGFzIFR5cGU8YW55PjtcclxuICAgICAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRSZWYgPSB0aGlzLndpZGdldENvbXBvbmVudEhvc3QuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy53aWRnZXRDb25maWcuY29udGVudERhdGEuaW5wdXRzICYmIHRoaXMuZHluYW1pY0NvbXBvbmVudFJlZj8uaW5zdGFuY2UpIHtcclxuICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMud2lkZ2V0Q29uZmlnLmNvbnRlbnREYXRhLmlucHV0cykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5keW5hbWljQ29tcG9uZW50UmVmICYmIGtleSBpbiB0aGlzLmR5bmFtaWNDb21wb25lbnRSZWYuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRSZWYuaW5zdGFuY2Vba2V5XSA9IHRoaXMud2lkZ2V0Q29uZmlnLmNvbnRlbnREYXRhLmlucHV0c1trZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhcnMgYW55IGR5bmFtaWNhbGx5IGxvYWRlZCBjb21wb25lbnQgZnJvbSB0aGUgdmlldyBjb250YWluZXIgYW5kIGRlc3Ryb3lzIGl0cyBpbnN0YW5jZS5cclxuICAgKi9cclxuICBwcml2YXRlIGNsZWFyRHluYW1pY0NvbnRlbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5keW5hbWljQ29tcG9uZW50UmVmKSB7XHJcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFJlZi5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy53aWRnZXRDb21wb25lbnRIb3N0KSB7XHJcbiAgICAgIHRoaXMud2lkZ2V0Q29tcG9uZW50SG9zdC5jbGVhcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBsaWZlY3ljbGUgaG9vayB0aGF0IGNsZWFucyB1cCB0aGUgY29tcG9uZW50IGJlZm9yZSBpdCdzIGRlc3Ryb3llZC5cclxuICAgKiBFbnN1cmVzIHRoYXQgYW55IGR5bmFtaWNhbGx5IGNyZWF0ZWQgY29tcG9uZW50cyBhcmUgcHJvcGVybHkgZGVzdHJveWVkIHRvIGF2b2lkIG1lbW9yeSBsZWFrcy5cclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXJEeW5hbWljQ29udGVudCgpO1xyXG4gIH1cclxufSIsIjwhLS1cclxuICBUaGlzIGNvbnRhaW5lciB1c2VzIGEgc3dpdGNoIHRvIGRldGVybWluZSBob3cgdG8gcmVuZGVyIHRoZSB3aWRnZXQncyBjb250ZW50XHJcbiAgYmFzZWQgb24gdGhlIGBjb250ZW50VHlwZWAgcHJvcGVydHkgaW4gdGhlIHdpZGdldCdzIGNvbmZpZ3VyYXRpb24uXHJcbi0tPlxyXG48bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJ3aWRnZXRDb25maWcuY29udGVudFR5cGVcIj5cclxuICA8IS0tIENhc2UgZm9yIHNpbXBsZSB0ZXh0IGNvbnRlbnQuIC0tPlxyXG4gIDxwICpuZ1N3aXRjaENhc2U9XCIndGV4dCdcIj57eyB3aWRnZXRDb25maWcuY29udGVudERhdGEgfX08L3A+XHJcblxyXG4gIDwhLS0gQ2FzZSBmb3IgSFRNTCBjb250ZW50LCBzYW5pdGl6ZWQgdGhyb3VnaCB0aGUgYHNhZmVIdG1sYCBwaXBlLiAtLT5cclxuICA8ZGl2XHJcbiAgICAqbmdTd2l0Y2hDYXNlPVwiJ2h0bWwnXCJcclxuICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0Q29uZmlnLmNvbnRlbnREYXRhIHwgc2FmZUh0bWxcIlxyXG4gID48L2Rpdj5cclxuXHJcbiAgPCEtLSBDYXNlIGZvciB2aWRlbyBjb250ZW50LCB3aXRoIGF0dHJpYnV0ZXMgYm91bmQgdG8gdGhlIHdpZGdldCdzIGNvbmZpZ3VyYXRpb24uIC0tPlxyXG4gIDx2aWRlb1xyXG4gICAgKm5nU3dpdGNoQ2FzZT1cIid2aWRlbydcIlxyXG4gICAgW3NyY109XCJ3aWRnZXRDb25maWcuY29udGVudERhdGEuc3JjXCJcclxuICAgIFthdHRyLnR5cGVdPVwid2lkZ2V0Q29uZmlnLmNvbnRlbnREYXRhLnR5cGVcIlxyXG4gICAgW2NvbnRyb2xzXT1cIndpZGdldENvbmZpZy5jb250ZW50RGF0YS5jb250cm9sc1wiXHJcbiAgICBbYXV0b3BsYXldPVwid2lkZ2V0Q29uZmlnLmNvbnRlbnREYXRhLmF1dG9wbGF5XCJcclxuICAgIFtsb29wXT1cIndpZGdldENvbmZpZy5jb250ZW50RGF0YS5sb29wXCJcclxuICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgb2JqZWN0LWZpdDogY29udGFpblwiXHJcbiAgPjwvdmlkZW8+XHJcblxyXG4gIDwhLS1cclxuICAgIENhc2UgZm9yIHJlbmRlcmluZyBhIGR5bmFtaWMgQW5ndWxhciBjb21wb25lbnQuXHJcbiAgICBUaGUgYG5nLXRlbXBsYXRlYCB3aXRoIHRoZSAjd2lkZ2V0Q29tcG9uZW50SG9zdCByZWZlcmVuY2Ugc2VydmVzIGFzIHRoZSBhbmNob3IgcG9pbnRcclxuICAgIHdoZXJlIHRoZSBjb21wb25lbnQgd2lsbCBiZSBwcm9ncmFtbWF0aWNhbGx5IGluamVjdGVkLlxyXG4gIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjb21wb25lbnQnXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgI3dpZGdldENvbXBvbmVudEhvc3Q+PC9uZy10ZW1wbGF0ZT5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPCEtLVxyXG4gICAgRGVmYXVsdCBjYXNlIHRoYXQgZGlzcGxheXMgYSBmYWxsYmFjayBtZXNzYWdlIGlmIHRoZSBgY29udGVudFR5cGVgXHJcbiAgICBpcyBub3QgcmVjb2duaXplZCBvciBpZiBubyBjb250ZW50IGlzIHByb3ZpZGVkLlxyXG4gIC0tPlxyXG4gIDxwICpuZ1N3aXRjaERlZmF1bHQ+Tm8gY29udGVudCBwcm92aWRlZCBvciBjb250ZW50IHR5cGUgbm90IHN1cHBvcnRlZC48L3A+XHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { RuclibWidgetComponent } from './ruclib-widget/ruclib-widget.component';
|
|
4
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
5
|
+
import { DragDropModule } from '@angular/cdk/drag-drop';
|
|
6
|
+
import { SafeHtmlPipe } from '../pipes/safe-html.pipe';
|
|
7
|
+
import { RuclibWidgetItemComponent } from './ruclib-widget-item/ruclib-widget-item.component';
|
|
8
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
export class RuclibWidgetModule {
|
|
11
|
+
}
|
|
12
|
+
RuclibWidgetModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibWidgetModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
13
|
+
RuclibWidgetModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RuclibWidgetModule, declarations: [RuclibWidgetComponent, SafeHtmlPipe, RuclibWidgetItemComponent], imports: [CommonModule,
|
|
14
|
+
MatIconModule,
|
|
15
|
+
MatButtonModule,
|
|
16
|
+
DragDropModule], exports: [RuclibWidgetComponent] });
|
|
17
|
+
RuclibWidgetModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibWidgetModule, imports: [CommonModule,
|
|
18
|
+
MatIconModule,
|
|
19
|
+
MatButtonModule,
|
|
20
|
+
DragDropModule] });
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibWidgetModule, decorators: [{
|
|
22
|
+
type: NgModule,
|
|
23
|
+
args: [{
|
|
24
|
+
imports: [
|
|
25
|
+
CommonModule,
|
|
26
|
+
MatIconModule,
|
|
27
|
+
MatButtonModule,
|
|
28
|
+
DragDropModule
|
|
29
|
+
],
|
|
30
|
+
declarations: [RuclibWidgetComponent, SafeHtmlPipe, RuclibWidgetItemComponent],
|
|
31
|
+
exports: [RuclibWidgetComponent]
|
|
32
|
+
}]
|
|
33
|
+
}] });
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLXdpZGdldC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi13aWRnZXQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFZM0QsTUFBTSxPQUFPLGtCQUFrQjs7Z0hBQWxCLGtCQUFrQjtpSEFBbEIsa0JBQWtCLGlCQUhkLHFCQUFxQixFQUFFLFlBQVksRUFBRSx5QkFBeUIsYUFMM0UsWUFBWTtRQUNaLGFBQWE7UUFDYixlQUFlO1FBQ2YsY0FBYyxhQUdOLHFCQUFxQjtpSEFFcEIsa0JBQWtCLFlBUjNCLFlBQVk7UUFDWixhQUFhO1FBQ2IsZUFBZTtRQUNmLGNBQWM7NEZBS0wsa0JBQWtCO2tCQVY5QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixjQUFjO3FCQUNmO29CQUNELFlBQVksRUFBRSxDQUFDLHFCQUFxQixFQUFFLFlBQVksRUFBRSx5QkFBeUIsQ0FBQztvQkFDOUUsT0FBTyxFQUFFLENBQUMscUJBQXFCLENBQUM7aUJBQ2pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgUnVjbGliV2lkZ2V0Q29tcG9uZW50IH0gZnJvbSAnLi9ydWNsaWItd2lkZ2V0L3J1Y2xpYi13aWRnZXQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBEcmFnRHJvcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBTYWZlSHRtbFBpcGUgfSBmcm9tICcuLi9waXBlcy9zYWZlLWh0bWwucGlwZSc7XHJcbmltcG9ydCB7IFJ1Y2xpYldpZGdldEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL3J1Y2xpYi13aWRnZXQtaXRlbS9ydWNsaWItd2lkZ2V0LWl0ZW0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIERyYWdEcm9wTW9kdWxlXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtSdWNsaWJXaWRnZXRDb21wb25lbnQsIFNhZmVIdG1sUGlwZSwgUnVjbGliV2lkZ2V0SXRlbUNvbXBvbmVudF0sXHJcbiAgZXhwb3J0czogW1J1Y2xpYldpZGdldENvbXBvbmVudF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFJ1Y2xpYldpZGdldE1vZHVsZSB7IH1cclxuIl19
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export const defaultValues = {
|
|
2
|
+
color: 'primary',
|
|
3
|
+
widgetData: [
|
|
4
|
+
{
|
|
5
|
+
id: 'default-widget-1',
|
|
6
|
+
title: 'Default Widget 1',
|
|
7
|
+
contentType: 'text',
|
|
8
|
+
contentData: 'This is the default content for the first widget. It is draggable and has a close icon.',
|
|
9
|
+
top: '20px',
|
|
10
|
+
left: '20px',
|
|
11
|
+
width: '300px',
|
|
12
|
+
height: '200px',
|
|
13
|
+
draggable: true,
|
|
14
|
+
showCloseIcon: true,
|
|
15
|
+
headerIcon: 'widgets'
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: 'default-widget-2',
|
|
19
|
+
title: 'Default Widget 2 (HTML)',
|
|
20
|
+
contentType: 'html',
|
|
21
|
+
contentData: '<h3>HTML Content</h3><p>This widget contains <strong>HTML</strong> and has a different background color.</p>',
|
|
22
|
+
top: '240px',
|
|
23
|
+
left: '20px',
|
|
24
|
+
width: '300px',
|
|
25
|
+
height: '200px',
|
|
26
|
+
draggable: true,
|
|
27
|
+
showCloseIcon: true,
|
|
28
|
+
backgroundColor: '#f0f0f0'
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC12YWx1ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kZWwvZGVmYXVsdC12YWx1ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN2QyxLQUFLLEVBQUUsU0FBUztJQUNoQixVQUFVLEVBQUU7UUFDUjtZQUNJLEVBQUUsRUFBRSxrQkFBa0I7WUFDdEIsS0FBSyxFQUFFLGtCQUFrQjtZQUN6QixXQUFXLEVBQUUsTUFBTTtZQUNuQixXQUFXLEVBQUUseUZBQXlGO1lBQ3RHLEdBQUcsRUFBRSxNQUFNO1lBQ1gsSUFBSSxFQUFFLE1BQU07WUFDWixLQUFLLEVBQUUsT0FBTztZQUNkLE1BQU0sRUFBRSxPQUFPO1lBQ2YsU0FBUyxFQUFFLElBQUk7WUFDZixhQUFhLEVBQUUsSUFBSTtZQUNuQixVQUFVLEVBQUUsU0FBUztTQUN4QjtRQUNEO1lBQ0ksRUFBRSxFQUFFLGtCQUFrQjtZQUN0QixLQUFLLEVBQUUseUJBQXlCO1lBQ2hDLFdBQVcsRUFBRSxNQUFNO1lBQ25CLFdBQVcsRUFBRSw4R0FBOEc7WUFDM0gsR0FBRyxFQUFFLE9BQU87WUFDWixJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSxPQUFPO1lBQ2QsTUFBTSxFQUFFLE9BQU87WUFDZixTQUFTLEVBQUUsSUFBSTtZQUNmLGFBQWEsRUFBRSxJQUFJO1lBQ25CLGVBQWUsRUFBRSxTQUFTO1NBQzdCO0tBQ0o7Q0FDSixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2lkZ2V0Q29uZmlnIH0gZnJvbSBcIi4uL2ludGVyZmFjZS93aWRnZXRcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0VmFsdWVzOiBXaWRnZXRDb25maWcgPSB7XHJcbiAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgd2lkZ2V0RGF0YTogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWQ6ICdkZWZhdWx0LXdpZGdldC0xJyxcclxuICAgICAgICAgICAgdGl0bGU6ICdEZWZhdWx0IFdpZGdldCAxJyxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgICAgY29udGVudERhdGE6ICdUaGlzIGlzIHRoZSBkZWZhdWx0IGNvbnRlbnQgZm9yIHRoZSBmaXJzdCB3aWRnZXQuIEl0IGlzIGRyYWdnYWJsZSBhbmQgaGFzIGEgY2xvc2UgaWNvbi4nLFxyXG4gICAgICAgICAgICB0b3A6ICcyMHB4JyxcclxuICAgICAgICAgICAgbGVmdDogJzIwcHgnLFxyXG4gICAgICAgICAgICB3aWR0aDogJzMwMHB4JyxcclxuICAgICAgICAgICAgaGVpZ2h0OiAnMjAwcHgnLFxyXG4gICAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsXHJcbiAgICAgICAgICAgIHNob3dDbG9zZUljb246IHRydWUsXHJcbiAgICAgICAgICAgIGhlYWRlckljb246ICd3aWRnZXRzJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogJ2RlZmF1bHQtd2lkZ2V0LTInLFxyXG4gICAgICAgICAgICB0aXRsZTogJ0RlZmF1bHQgV2lkZ2V0IDIgKEhUTUwpJyxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6ICdodG1sJyxcclxuICAgICAgICAgICAgY29udGVudERhdGE6ICc8aDM+SFRNTCBDb250ZW50PC9oMz48cD5UaGlzIHdpZGdldCBjb250YWlucyA8c3Ryb25nPkhUTUw8L3N0cm9uZz4gYW5kIGhhcyBhIGRpZmZlcmVudCBiYWNrZ3JvdW5kIGNvbG9yLjwvcD4nLFxyXG4gICAgICAgICAgICB0b3A6ICcyNDBweCcsXHJcbiAgICAgICAgICAgIGxlZnQ6ICcyMHB4JyxcclxuICAgICAgICAgICAgd2lkdGg6ICczMDBweCcsXHJcbiAgICAgICAgICAgIGhlaWdodDogJzIwMHB4JyxcclxuICAgICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBzaG93Q2xvc2VJY29uOiB0cnVlLFxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZjBmMGYwJ1xyXG4gICAgICAgIH1cclxuICAgIF1cclxufSJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Pipe } from '@angular/core';
|
|
2
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/platform-browser";
|
|
5
|
+
/**
|
|
6
|
+
* @Pipe SafeHtmlPipe
|
|
7
|
+
* @name safeHtml
|
|
8
|
+
* @description A pipe that bypasses Angular's built-in security and sanitizes HTML content,
|
|
9
|
+
* allowing it to be safely rendered in the DOM. Use with caution and only with trusted HTML sources.
|
|
10
|
+
*/
|
|
11
|
+
export class SafeHtmlPipe {
|
|
12
|
+
/**
|
|
13
|
+
* @param sanitizer - An instance of DomSanitizer used to bypass security.
|
|
14
|
+
*/
|
|
15
|
+
constructor(sanitizer) {
|
|
16
|
+
this.sanitizer = sanitizer;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Transforms a string containing HTML into a SafeHtml object that can be bound to [innerHTML].
|
|
20
|
+
* @param value - The HTML string to sanitize.
|
|
21
|
+
* @returns A SafeHtml object, which Angular trusts as safe HTML.
|
|
22
|
+
*/
|
|
23
|
+
transform(value) {
|
|
24
|
+
if (value === null || value === undefined) {
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
return this.sanitizer.bypassSecurityTrustHtml(value);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
SafeHtmlPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SafeHtmlPipe, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
31
|
+
SafeHtmlPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: SafeHtmlPipe, name: "safeHtml" });
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SafeHtmlPipe, decorators: [{
|
|
33
|
+
type: Pipe,
|
|
34
|
+
args: [{ name: 'safeHtml' }]
|
|
35
|
+
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; } });
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS1odG1sLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGlwZXMvc2FmZS1odG1sLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7QUFFekQ7Ozs7O0dBS0c7QUFFSCxNQUFNLE9BQU8sWUFBWTtJQUN2Qjs7T0FFRztJQUNILFlBQW9CLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxTQUFTLENBQWM7SUFBSSxDQUFDO0lBQ2hEOzs7O09BSUc7SUFDSCxTQUFTLENBQUMsS0FBVTtRQUNsQixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN6QyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELENBQUM7OzBHQWZVLFlBQVk7d0dBQVosWUFBWTs0RkFBWixZQUFZO2tCQUR4QixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG4vKipcclxuICogQFBpcGUgU2FmZUh0bWxQaXBlXHJcbiAqIEBuYW1lIHNhZmVIdG1sXHJcbiAqIEBkZXNjcmlwdGlvbiBBIHBpcGUgdGhhdCBieXBhc3NlcyBBbmd1bGFyJ3MgYnVpbHQtaW4gc2VjdXJpdHkgYW5kIHNhbml0aXplcyBIVE1MIGNvbnRlbnQsXHJcbiAqIGFsbG93aW5nIGl0IHRvIGJlIHNhZmVseSByZW5kZXJlZCBpbiB0aGUgRE9NLiBVc2Ugd2l0aCBjYXV0aW9uIGFuZCBvbmx5IHdpdGggdHJ1c3RlZCBIVE1MIHNvdXJjZXMuXHJcbiAqL1xyXG5AUGlwZSh7IG5hbWU6ICdzYWZlSHRtbCcgfSlcclxuZXhwb3J0IGNsYXNzIFNhZmVIdG1sUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBzYW5pdGl6ZXIgLSBBbiBpbnN0YW5jZSBvZiBEb21TYW5pdGl6ZXIgdXNlZCB0byBieXBhc3Mgc2VjdXJpdHkuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikgeyB9XHJcbiAgLyoqXHJcbiAgICogVHJhbnNmb3JtcyBhIHN0cmluZyBjb250YWluaW5nIEhUTUwgaW50byBhIFNhZmVIdG1sIG9iamVjdCB0aGF0IGNhbiBiZSBib3VuZCB0byBbaW5uZXJIVE1MXS5cclxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgSFRNTCBzdHJpbmcgdG8gc2FuaXRpemUuXHJcbiAgICogQHJldHVybnMgQSBTYWZlSHRtbCBvYmplY3QsIHdoaWNoIEFuZ3VsYXIgdHJ1c3RzIGFzIHNhZmUgSFRNTC5cclxuICAgKi9cclxuICB0cmFuc2Zvcm0odmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHZhbHVlKTtcclxuICB9XHJcbn0iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjLWxpYi13aWRnZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVjLWxpYi13aWRnZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|