@c8y/ngx-components 1023.6.3 → 1023.7.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/fesm2022/c8y-ngx-components-ai-agent-chat.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs +1 -1
- package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-app-logs.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-properties.mjs +2 -2
- package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-property-grid.component-B1q7kXRu.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-computed-asset-properties-alarm-count-config.component-Bl18pHcM.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-C5QMFdX1.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-computed-asset-properties-event-count-config.component-C-Lc5Ble.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-computed-asset-properties-last-measurement-config.component-BXfM7hTQ.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DN-f35bA.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-m7YeEj9R.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-protocols.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +1 -1
- package/fesm2022/c8y-ngx-components-events-events-timeline.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-file-preview.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-global-context.mjs +12 -12
- package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-messaging-management.mjs +1 -1
- package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-stepper-container.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operation-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operation-summary.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-status-filter.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-frames.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-platform-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-reports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-search.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +1 -1
- package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-static-assets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-time-context.mjs +1 -1
- package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-user-roles.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +4 -4
- package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-three-d-rotation.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +2 -2
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-widgets-implementations-device-control-message.mjs","sources":["../../widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.ts","../../widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.html","../../widgets/implementations/device-control-message/c8y-ngx-components-widgets-implementations-device-control-message.ts"],"sourcesContent":["import { Component, Input, OnChanges, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n CoreModule,\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator\n} from '@c8y/ngx-components';\nimport { IManagedObject, OperationService } from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { map, shareReplay } from 'rxjs/operators';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nexport type DeviceControlMessageWidgetConfig = { device?: IManagedObject };\n\n@Component({\n selector: 'c8y-device-control-message-widget-view',\n templateUrl: './device-control-message-widget-view.component.html',\n standalone: true,\n imports: [CoreModule, ReactiveFormsModule]\n})\nexport class DeviceControlMessageWidgetViewComponent\n implements OnChanges, DynamicComponent, OnDestroy, OnInit\n{\n @Input() config: DeviceControlMessageWidgetConfig;\n operationSupportedByDevice$: Observable<boolean>;\n messageToBeSent = '';\n alerts: DynamicComponentAlertAggregator;\n private readonly operationAttribute = 'c8y_Message';\n private currentDevice = new BehaviorSubject<IManagedObject | null>(null);\n private operationSupportedByDeviceSubscription: Subscription;\n\n constructor(\n private alert: AlertService,\n private operation: OperationService,\n private translate: TranslateService,\n @Optional() private dashboard: ContextDashboardComponent\n ) {\n this.operationSupportedByDevice$ = this.currentDevice.pipe(\n map(device => {\n if (!device) {\n return false;\n }\n const supportedOperations = device.c8y_SupportedOperations;\n if (supportedOperations && Array.isArray(supportedOperations)) {\n return supportedOperations.includes(this.operationAttribute);\n }\n return false;\n }),\n shareReplay({ refCount: true, bufferSize: 1 })\n );\n }\n\n ngOnInit(): void {\n if (this.dashboard?.isDeviceTypeDashboard && this.dashboard?.context?.id) {\n this.currentDevice.next(this.dashboard.context);\n }\n this.operationSupportedByDeviceSubscription = this.operationSupportedByDevice$.subscribe(\n supported => {\n if (!supported) {\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n type: 'warning',\n text: gettext('Operation not supported by this device')\n })\n );\n } else {\n this.alerts.clear();\n }\n }\n );\n }\n\n ngOnDestroy(): void {\n this.operationSupportedByDeviceSubscription?.unsubscribe();\n }\n\n ngOnChanges(): void {\n if (!this.dashboard?.isDeviceTypeDashboard && this.config.device) {\n this.currentDevice.next(this.config.device);\n }\n }\n\n async sendMessage() {\n const msg = this.messageToBeSent;\n const operationDescription = this.translate.instant(gettext('Send message \"{{msg}}\"'), { msg });\n try {\n await this.operation.create({\n deviceId: this.currentDevice.value?.id,\n description: operationDescription,\n [this.operationAttribute]: { text: msg }\n });\n this.alert.success(gettext('Message will be sent.'));\n this.messageToBeSent = '';\n } catch (e) {\n this.alert.addServerFailure(e);\n }\n }\n}\n","<div *ngIf=\"operationSupportedByDevice$ | async\" class=\"input-group p-16\">\n <input\n type=\"text\"\n class=\"form-control\"\n data-cy=\"c8y-device-control-message-widget-view--message-textbox\"\n [(ngModel)]=\"messageToBeSent\"\n placeholder=\"{{ 'Message' | translate }}\"\n />\n <span class=\"input-group-btn\">\n <button\n title=\"{{ 'Send' | translate }}\"\n class=\"btn btn-primary\"\n data-cy=\"c8y-device-control-message-widget-view--send-button\"\n (click)=\"sendMessage()\"\n [disabled]=\"!messageToBeSent\"\n translate\n >\n Send\n </button>\n </span>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-implementations-device-control-message.mjs","sources":["../../widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.ts","../../widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.html","../../widgets/implementations/device-control-message/c8y-ngx-components-widgets-implementations-device-control-message.ts"],"sourcesContent":["import { Component, Input, OnChanges, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n CoreModule,\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator\n} from '@c8y/ngx-components';\nimport { IManagedObject, OperationService } from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { map, shareReplay } from 'rxjs/operators';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nexport type DeviceControlMessageWidgetConfig = { device?: IManagedObject };\n\n@Component({\n selector: 'c8y-device-control-message-widget-view',\n templateUrl: './device-control-message-widget-view.component.html',\n standalone: true,\n imports: [CoreModule, ReactiveFormsModule]\n})\nexport class DeviceControlMessageWidgetViewComponent\n implements OnChanges, DynamicComponent, OnDestroy, OnInit\n{\n @Input() config: DeviceControlMessageWidgetConfig;\n operationSupportedByDevice$: Observable<boolean>;\n messageToBeSent = '';\n alerts: DynamicComponentAlertAggregator;\n private readonly operationAttribute = 'c8y_Message';\n private currentDevice = new BehaviorSubject<IManagedObject | null>(null);\n private operationSupportedByDeviceSubscription: Subscription;\n\n constructor(\n private alert: AlertService,\n private operation: OperationService,\n private translate: TranslateService,\n @Optional() private dashboard: ContextDashboardComponent\n ) {\n this.operationSupportedByDevice$ = this.currentDevice.pipe(\n map(device => {\n if (!device) {\n return false;\n }\n const supportedOperations = device.c8y_SupportedOperations;\n if (supportedOperations && Array.isArray(supportedOperations)) {\n return supportedOperations.includes(this.operationAttribute);\n }\n return false;\n }),\n shareReplay({ refCount: true, bufferSize: 1 })\n );\n }\n\n ngOnInit(): void {\n if (this.dashboard?.isDeviceTypeDashboard && this.dashboard?.context?.id) {\n this.currentDevice.next(this.dashboard.context);\n }\n this.operationSupportedByDeviceSubscription = this.operationSupportedByDevice$.subscribe(\n supported => {\n if (!supported) {\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n type: 'warning',\n text: gettext('Operation not supported by this device')\n })\n );\n } else {\n this.alerts.clear();\n }\n }\n );\n }\n\n ngOnDestroy(): void {\n this.operationSupportedByDeviceSubscription?.unsubscribe();\n }\n\n ngOnChanges(): void {\n if (!this.dashboard?.isDeviceTypeDashboard && this.config.device) {\n this.currentDevice.next(this.config.device);\n }\n }\n\n async sendMessage() {\n const msg = this.messageToBeSent;\n const operationDescription = this.translate.instant(gettext('Send message \"{{msg}}\"'), { msg });\n try {\n await this.operation.create({\n deviceId: this.currentDevice.value?.id,\n description: operationDescription,\n [this.operationAttribute]: { text: msg }\n });\n this.alert.success(gettext('Message will be sent.'));\n this.messageToBeSent = '';\n } catch (e) {\n this.alert.addServerFailure(e);\n }\n }\n}\n","<div *ngIf=\"operationSupportedByDevice$ | async\" class=\"input-group p-16\">\n <input\n type=\"text\"\n class=\"form-control\"\n data-cy=\"c8y-device-control-message-widget-view--message-textbox\"\n [(ngModel)]=\"messageToBeSent\"\n placeholder=\"{{ 'Message' | translate }}\"\n />\n <span class=\"input-group-btn\">\n <button\n title=\"{{ 'Send' | translate }}\"\n class=\"btn btn-primary\"\n data-cy=\"c8y-device-control-message-widget-view--send-button\"\n (click)=\"sendMessage()\"\n [disabled]=\"!messageToBeSent\"\n translate\n >\n Send\n </button>\n </span>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -596,7 +596,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
596
596
|
type: Input
|
|
597
597
|
}], useSalt: [{
|
|
598
598
|
type: Input
|
|
599
|
-
}] } });
|
|
599
|
+
}], hostElement: [{ type: i0.ViewChild, args: ['hostElement', { isSignal: true }] }] } });
|
|
600
600
|
|
|
601
601
|
class WidgetCodeEditorComponent {
|
|
602
602
|
constructor() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-widgets-implementations-html-widget.mjs","sources":["../../widgets/implementations/html-widget/html-widget.model.ts","../../widgets/implementations/html-widget/webcomponent-template.ts","../../widgets/implementations/html-widget/legacy-template.ts","../../widgets/implementations/html-widget/html-widget-config.service.ts","../../widgets/implementations/html-widget/advanced-settings/advanced-settings.component.ts","../../widgets/implementations/html-widget/advanced-settings/advanced-settings.component.html","../../widgets/implementations/html-widget/html-ai-chat-feedback.component.ts","../../widgets/implementations/html-widget/html-ai-chat-feedback.component.html","../../widgets/implementations/html-widget/html-frame/html-frame.component.ts","../../widgets/implementations/html-widget/html-frame/html-frame.component.html","../../widgets/implementations/html-widget/widget-code-editor-section/widget-code-editor.component.ts","../../widgets/implementations/html-widget/widget-code-editor-section/widget-code-editor.component.html","../../widgets/implementations/html-widget/html-widget-config.component.ts","../../widgets/implementations/html-widget/html-widget-config.component.html","../../widgets/implementations/html-widget/html-widget-properties-selector/html-widget-properties-selector.component.ts","../../widgets/implementations/html-widget/html-widget-properties-selector/html-widget-properties-selector.component.html","../../widgets/implementations/html-widget/html-widget.component.ts","../../widgets/implementations/html-widget/html-widget.component.html","../../widgets/implementations/html-widget/c8y-ngx-components-widgets-implementations-html-widget.ts"],"sourcesContent":["import { IManagedObject } from '@c8y/client';\nimport { WidgetSettings } from '@c8y/ngx-components';\n\nexport interface HtmlWidgetConfig {\n device: IManagedObject;\n settings: WidgetSettings;\n config: HtmlWidget;\n\n /**\n * On HTML WIdget 1.0 this property was used to store the HTML code.\n * It is not used anymore, but we need to keep it for backward compatibility.\n * The HTML code is now stored in the config property.\n * @deprecated Use config.code instead.\n */\n html?: any;\n}\n\nexport type C8yProperties = Array<PathProperty | ComputedProperty>;\n\nexport interface HtmlWidget {\n css: string;\n code: string;\n props?: C8yProperties;\n options: HtmlWidgetOptions;\n legacy: boolean;\n devMode: boolean;\n latestCodeHash?: string;\n}\n\nexport interface HtmlWidgetOptions {\n cssEncapsulation: boolean;\n advancedSecurity: boolean;\n}\n\nexport interface WebcomponentContext extends HTMLElement {\n c8yContext: IManagedObject;\n}\n\nexport interface PathProperty {\n name: string;\n path: string;\n query?: never;\n reducer?: never;\n}\n\nexport interface ComputedProperty {\n name: string;\n path?: never;\n query: string;\n reducer?: string;\n}\n\nexport const INITIAL_HTML_FORMATTED = `<div>\n <h2>Hello from <span class=\"branded\">HTML widget</span></h2>\n <p class=\"m-b-8 m-t-16\">\n You can use HTML and Javascript template literals here: <br>\n \\$\\{this.c8yContext ? this.c8yContext.name : 'No device selected'\\}\n </p>\n\n <a class=\"btn btn-primary m-b-16\" href=\"#/group\">Go to groups</a>\n\n <p>\n Use the CSS editor to customize the CSS. You can use <span class=\"text-bold\">any design-token CSS variable</span> in there.\n </p>\n</div>`;\nexport const INITIAL_CSS_FORMATTED = `\n:host > div {\n padding: var(--c8y-root-component-padding-default);\n}\nspan.branded { \n color: var(--brand-primary, var(--c8y-brand-primary)); \n}`;\n\nexport const defaultWebComponentName = 'DefaultWebComponent';\n\nexport const defaultWebComponentAttributeNameContext = 'c8yContext';\n","import { defaultWebComponentName } from './html-widget.model';\n\nexport const webComponentTemplate = (\n html: string,\n css?: string,\n viewEncapsulation?: boolean,\n name = defaultWebComponentName\n) => `\nimport { LitElement, html, css} from 'lit';\n${!viewEncapsulation ? `import { styleImports } from 'styles';` : ''}\n\nexport default class ${name} extends LitElement {\n static styles = css\\`\n ${css}\n \\`;\n\n static properties = {\n // The managed object this widget is assigned to. Can be null.\n c8yContext: { type: Object },\n };\n\n constructor() {\n super();\n }\n\n render() {\n return html\\`${\n viewEncapsulation\n ? html\n : `\n <style>\n \\${styleImports}\n </style>\n ${html}\n `\n }\\`;\n }\n}\n`;\n","export const legacyTemplate = (html: string, deviceId?: string | number, deviceName?: string) => {\n const escapedHtml = html\n // Finds: \\ Replaces with: \\\\\n .replace(/\\\\/g, '\\\\\\\\')\n // Finds: ` Replaces with: \\`\n .replace(/`/g, '\\\\`')\n // Finds: $ Replaces with: \\$\n .replace(/\\$/g, '\\\\$');\n\n return `\nimport { angular } from 'angular';\n\n// NOTE: This is a legacy template for the HTML widget.\n// It is used to compile the HTML content in the context of the AngularJS application.\n// The template is injected into the AngularJS application and compiled using the AngularJS compiler.\n// The template should only be used for backward compatibility purposes.\n// It is recommended to use a web component instead.\n\nif(!angular) {\n throw new Error('AngularJS is not available. Please make sure to include AngularJS in your project.');\n}\n\nconst $injector = angular.element(document.querySelector('c8y-ui-root')).injector();\nif (!$injector) {\n throw new Error('AngularJS injector is not available. Maybe not an hybrid application?');\n}\n\n// defining a new scope\nconst $rootScope = $injector.get('$rootScope');\nconst $scope = $rootScope.$new(true); \n\n// faking the old angularjs config \n$scope.child = { \n config: {\n ${deviceId ? `device: { id: \"${deviceId}\", name: \"${deviceName}\" },` : ''}\n html: \\`<div ng-controller=\"HtmlWidgetCtrl\">${escapedHtml}</div>\\`\n }\n};\n\n// load the needed services\nconst $compile = $injector.get('$compile');\nconst $controller = $injector.get('$controller');\n\n// create the element\nconst htmlElement = angular.element($scope.child.config.html);\n\n// The default controller providing the context\n$controller('HtmlWidgetCtrl', { $scope });\n\n// Compile the element\n$compile(htmlElement)($scope);\n\n// Apply the scope changes\n$rootScope.$apply();\n\nexport default htmlElement[0];`;\n};\n","import { inject, Injectable } from '@angular/core';\nimport { AppStateService } from '@c8y/ngx-components';\nimport { CockpitConfig } from '@c8y/ngx-components/cockpit-config';\nimport { ContextWidgetConfig, WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { isEmpty } from 'lodash';\nimport {\n combineLatest,\n debounceTime,\n distinctUntilChanged,\n filter,\n first,\n map,\n Observable,\n of,\n shareReplay,\n startWith,\n Subject,\n switchMap,\n takeUntil,\n withLatestFrom\n} from 'rxjs';\nimport { HtmlWidget, INITIAL_CSS_FORMATTED, INITIAL_HTML_FORMATTED } from './html-widget.model';\nimport { webComponentTemplate } from './webcomponent-template';\nimport { legacyTemplate } from './legacy-template';\n\n@Injectable()\nexport class HtmlWidgetConfigService {\n readonly DEFAULT_AUTO_SAVE_DEBOUNCE = 1000;\n codeChange$ = new Subject<{ value: string; type: 'css' | 'code' }>();\n widgetConfigService = inject(WidgetConfigService);\n appState = inject(AppStateService);\n destroy$ = new Subject<void>();\n\n init$ = this.widgetConfigService.currentConfig$.pipe(\n first(),\n map(current => {\n if (current.html) {\n current.config = this.mapLegacyConfig(current);\n }\n\n return (current.config || {}) as HtmlWidget;\n }),\n filter(config => !!config),\n withLatestFrom(this.appState.currentApplicationConfig),\n switchMap(([widgetConfig, appConfig]) => this.initConfig(appConfig, widgetConfig)),\n shareReplay(),\n takeUntil(this.destroy$)\n );\n\n config$ = this.init$.pipe(switchMap(initValue => this.configChanged$.pipe(startWith(initValue))));\n\n codeEditorChangeConfig$ = combineLatest([\n this.codeChange$.pipe(startWith(undefined)),\n this.config$\n ]).pipe(\n distinctUntilChanged(),\n takeUntil(this.destroy$),\n debounceTime(this.DEFAULT_AUTO_SAVE_DEBOUNCE),\n map(([change, config]) => {\n if (!change) {\n return config;\n }\n if (change.type === 'css') {\n config.css = change.value;\n } else {\n config.code = change.value;\n }\n return { ...config };\n })\n );\n\n configChanged$ = new Subject<HtmlWidget>();\n\n initConfig(appConfig: CockpitConfig, widgetConfig: HtmlWidget): Observable<HtmlWidget> {\n const defaultToAdvancedMode = appConfig?.htmlWidgetDefaultToAdvancedMode ?? false;\n const isEmptyConfig = isEmpty(widgetConfig);\n if (isEmptyConfig && !defaultToAdvancedMode) {\n widgetConfig = this.initDefaultMode(!appConfig?.htmlWidgetDisableSanitization);\n this.save(widgetConfig);\n return of(widgetConfig);\n }\n if (isEmptyConfig) {\n widgetConfig = this.enableAdvancedMode(widgetConfig);\n }\n\n // new config is needed to trigger ngOnChanges\n const newConfig = { ...widgetConfig };\n this.save(newConfig);\n return of(newConfig);\n }\n\n destroy(): void {\n this.destroy$.next();\n this.codeChange$.complete();\n this.configChanged$.complete();\n }\n\n save(config: HtmlWidget) {\n this.widgetConfigService.updateConfig({\n config\n });\n }\n\n changeCode(value: string) {\n this.codeChange$.next({ value, type: 'code' });\n }\n\n changeCss(value: string) {\n this.codeChange$.next({ value, type: 'css' });\n }\n\n enableAdvancedMode(currentConfig: HtmlWidget) {\n const currentHTML = currentConfig?.code || INITIAL_HTML_FORMATTED;\n const currentCSS = currentConfig?.css || INITIAL_CSS_FORMATTED;\n const code = currentConfig?.legacy\n ? legacyTemplate(\n currentHTML,\n this.widgetConfigService.currentConfig?.device?.id,\n this.widgetConfigService.currentConfig?.device?.name\n )\n : webComponentTemplate(currentHTML, currentCSS, false);\n currentConfig = {\n css: '',\n code,\n legacy: false,\n devMode: true,\n options: {\n cssEncapsulation: false,\n advancedSecurity: false\n }\n };\n return currentConfig;\n }\n\n initDefaultMode(advancedSecurity = true): HtmlWidget {\n return {\n css: INITIAL_CSS_FORMATTED,\n code: INITIAL_HTML_FORMATTED,\n legacy: false,\n devMode: false,\n options: {\n cssEncapsulation: false,\n advancedSecurity\n }\n };\n }\n\n private mapLegacyConfig(current: ContextWidgetConfig): HtmlWidget {\n const isAlreadyInAdvancedMode = current?.config?.devMode === true;\n if (isAlreadyInAdvancedMode) {\n return current.config as HtmlWidget;\n }\n\n const isAlreadyMapped = current?.config?.legacy === true;\n if (isAlreadyMapped) {\n return current.config as HtmlWidget;\n }\n\n return {\n code: current.html,\n css: '',\n legacy: true,\n devMode: false,\n options: {\n cssEncapsulation: false,\n advancedSecurity: current.sanitization === 'strict'\n }\n };\n }\n}\n","import { NgIf } from '@angular/common';\nimport { Component, inject, Input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { C8yTranslatePipe, IconDirective, Permissions } from '@c8y/ngx-components';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { HtmlWidgetConfigService } from '../html-widget-config.service';\nimport { HtmlWidgetConfig, HtmlWidgetOptions } from '../html-widget.model';\n\n@Component({\n standalone: true,\n imports: [IconDirective, NgIf, TooltipModule, PopoverModule, C8yTranslatePipe, FormsModule],\n selector: 'c8y-html-widget-advanced-settings',\n templateUrl: './advanced-settings.component.html'\n})\nexport class AdvancedSettingsComponent {\n widgetConfigService = inject(WidgetConfigService);\n htmlWidgetConfigService = inject(HtmlWidgetConfigService);\n router = inject(Router);\n permissionService = inject(Permissions);\n\n canChangeSettings = false;\n @Input()\n devMode: boolean;\n @Input()\n cssEncapsulation: boolean;\n\n CSS_ENCAPSULATION_HELP_CONTEXT = gettext(\n 'If enabled, the CSS will be encapsulated and no platform styling will be applied.'\n );\n\n ngOnInit(): void {\n this.canChangeSettings = this.permissionService.hasAnyRole([\n Permissions.ROLE_APPLICATION_MANAGEMENT_ADMIN,\n Permissions.ROLE_TENANT_ADMIN\n ]);\n }\n\n disableAdvancedMode() {\n const config = this.htmlWidgetConfigService.initDefaultMode();\n this.htmlWidgetConfigService.save(config);\n this.htmlWidgetConfigService.configChanged$.next(config);\n }\n\n enableAdvancedMode() {\n let { config } = this.widgetConfigService.currentConfig as HtmlWidgetConfig;\n config = this.htmlWidgetConfigService.enableAdvancedMode(config);\n this.htmlWidgetConfigService.save(config);\n this.htmlWidgetConfigService.configChanged$.next(config);\n }\n\n toggleAdvancedMode() {\n this.devMode ? this.disableAdvancedMode() : this.enableAdvancedMode();\n this.devMode = !this.devMode;\n }\n\n async changeOption(option: keyof HtmlWidgetOptions) {\n const { config } = this.widgetConfigService.currentConfig as HtmlWidgetConfig;\n config.options[option] = !config.options[option];\n this.htmlWidgetConfigService.save(config);\n this.htmlWidgetConfigService.configChanged$.next(config);\n }\n}\n","<fieldset class=\"c8y-fieldset m-t-0\">\n <legend>{{ 'Developer mode' | translate }}</legend>\n\n <div class=\"d-flex a-i-center p-b-16\">\n <label class=\"c8y-switch\">\n <input\n type=\"checkbox\"\n [ngModel]=\"devMode\"\n (change)=\"toggleAdvancedMode()\"\n [disabled]=\"!canChangeSettings\"\n />\n <span></span>\n <span>{{ 'Advanced developer mode' | translate }}</span>\n </label>\n\n <button class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"devMode ? disableAdvanced : enableAdvanced\"\n container=\"body\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n\n <ng-template #enableAdvanced>\n <p class=\"text-16 text-bold p-b-8\">\n <i [c8yIcon]=\"'imac-settings'\"></i>\n {{ 'Advanced developer mode' | translate }}\n </p>\n <p class=\"p-b-8\" translate>\n Create custom widgets by modifying a basic WebComponent with HTML and JavaScript. This\n <strong>unsupported</strong>\n feature is ideal for rapid prototyping and simple customizations.\n </p>\n <p class=\"p-b-8\" translate>\n For production environments, we recommend our fully-supported Angular-based\n <a href=\"https://styleguide.cumulocity.com\" target=\"_blank\">Web SDK</a>.\n <br />\n Enable advanced developer mode to start coding!\n </p>\n </ng-template>\n\n <ng-template #disableAdvanced>\n <p class=\"text-16 text-bold p-b-8\">\n {{ 'Advanced developer mode' | translate }}\n </p>\n <p class=\"p-b-8\" translate>\n The advanced developer mode is enabled for this widget allowing to build extensive Web\n Components.\n </p>\n <p class=\"p-b-8\" translate>\n You can disable this mode again, but it will reset the current code.\n </p>\n </ng-template>\n\n <ng-container *ngIf=\"!devMode\">\n <label\n class=\"c8y-switch m-l-auto\"\n >\n <input\n type=\"checkbox\"\n (change)=\"changeOption('cssEncapsulation')\"\n [disabled]=\"!canChangeSettings\"\n [ngModel]=\"cssEncapsulation\"\n />\n <span></span>\n <span>{{ 'CSS encapsulation' | translate }}</span>\n </label>\n <button\n class=\"btn-help m-0\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ CSS_ENCAPSULATION_HELP_CONTEXT | translate }}\"\n triggers=\"focus\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n ></button>\n </ng-container>\n\n </div>\n</fieldset>\n","import { AsyncPipe, JsonPipe, NgClass } from '@angular/common';\nimport { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport {\n C8yTranslatePipe,\n ListGroupComponent,\n ListItemBodyComponent,\n ListItemCollapseComponent,\n ListItemComponent,\n ListItemIconComponent,\n MarkdownToHtmlPipe\n} from '@c8y/ngx-components';\nimport { AgentStep } from '@c8y/ngx-components/ai';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { HtmlWidgetConfigService } from './html-widget-config.service';\n\n@Component({\n selector: 'c8y-html-ai-chat-feedback',\n templateUrl: './html-ai-chat-feedback.component.html',\n imports: [\n ListGroupComponent,\n ListItemComponent,\n ListItemCollapseComponent,\n ListItemBodyComponent,\n ListItemIconComponent,\n NgClass,\n JsonPipe,\n MarkdownToHtmlPipe,\n TooltipDirective,\n AsyncPipe,\n C8yTranslatePipe\n ],\n standalone: true,\n host: { class: 'agent-step-feedback' }\n})\nexport class HtmlAiChatFeedbackComponent implements OnInit, OnChanges {\n @Input({ required: true }) step: AgentStep;\n /**\n * The label to display for the feedback section.\n */\n label: string;\n /**\n * Indicates whether the feedback section is in a loading state.\n */\n loading = false;\n /**\n * Indicates whether the detailed feedback section is collapsed.\n */\n collapsed = true;\n /**\n * Indicates whether the feedback section can be collapsed.\n */\n canCollapse = false;\n /**\n * The code extracted from the agent step (if any).\n */\n code = '';\n /**\n * The text before the code block (if any).\n */\n textBeforeCode = '';\n /**\n * The text after the code block (if any).\n */\n textAfterCode = '';\n\n private readonly codeTag = 'c8y-code-extract';\n private readonly htmlWidgetConfigService = inject(HtmlWidgetConfigService);\n\n /**\n * @ignore\n */\n ngOnInit(): void {\n if (this.step) {\n this.parseAgentStep(this.step);\n }\n }\n\n /**\n * @ignore\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.step) {\n this.parseAgentStep(changes.step.currentValue);\n }\n }\n\n /**\n * Parse the agent step. Extracts the code block if present and updates the state accordingly.\n * @param step The agent step to parse.\n */\n parseAgentStep(step: AgentStep): void {\n if (step.reasoning) {\n this.label = gettext('Reasoning');\n this.loading = false;\n this.canCollapse = true;\n this.collapsed = false;\n }\n\n if (step.toolCalls?.length > 0 && !step.toolResults?.length) {\n this.label = gettext('Analyzing query…');\n this.loading = true;\n this.canCollapse = false;\n this.collapsed = true;\n } else if (step.toolResults?.length > 0) {\n this.label = gettext('Query analyzed.');\n this.loading = false;\n this.canCollapse = true;\n this.collapsed = true;\n }\n\n this.parseCodeBlock(step);\n }\n\n /**\n * Revert to the last applied code.\n */\n revert() {\n this.applyCurrentCode();\n }\n\n private parseCodeBlock(step: AgentStep) {\n const text = step.text;\n const codeBlockStart = text.lastIndexOf(`<${this.codeTag}>`);\n const codeBlockEnd = text.lastIndexOf(`</${this.codeTag}>`);\n const codeBlockStartLength = this.codeTag.length + 2;\n const codeBlockEndLength = this.codeTag.length + 3;\n if (codeBlockStart !== -1) {\n this.code = text.substring(codeBlockStart + codeBlockStartLength);\n this.textBeforeCode = text.substring(0, codeBlockStart + codeBlockStartLength);\n this.label = gettext('Creating widget…');\n this.loading = true;\n this.canCollapse = true;\n this.collapsed = true;\n }\n if (codeBlockEnd !== -1) {\n this.label = gettext('Widget created');\n this.code = text.substring(codeBlockStart + codeBlockStartLength, codeBlockEnd);\n this.loading = false;\n this.textAfterCode = text.substring(codeBlockEnd + codeBlockEndLength);\n this.canCollapse = true;\n this.collapsed = true;\n this.applyCurrentCode();\n }\n }\n\n private applyCurrentCode() {\n const newConfig = {\n code: this.code,\n css: '',\n devMode: true,\n legacy: false,\n options: { advancedSecurity: false, cssEncapsulation: false }\n };\n this.htmlWidgetConfigService.configChanged$.next(newConfig);\n this.htmlWidgetConfigService.widgetConfigService.updateConfig({ config: newConfig }, true);\n }\n}\n","@if (!step.reasoning && !code) {\n <div [innerHTML]=\"step.text | markdownToHtml | async\"></div>\n}\n@if (code) {\n <div [innerHTML]=\"textBeforeCode | markdownToHtml | async\"></div>\n}\n@if (label) {\n <c8y-list-group class=\"m-t-16 m-b-16\">\n <c8y-li\n [active]=\"!loading\"\n [collapsed]=\"collapsed\"\n >\n <c8y-li-icon>\n <span\n class=\"btn-ai btn-ai-hint btn-sm\"\n [ngClass]=\"{ working: loading }\"\n >\n <span></span>\n </span>\n </c8y-li-icon>\n <c8y-li-body>\n {{ label }}\n </c8y-li-body>\n\n @if (canCollapse) {\n <c8y-li-collapse>\n @if (step.reasoning) {\n <div [innerHTML]=\"step.reasoning | markdownToHtml | async\"></div>\n } @else if (code) {\n <pre\n class=\"fit-w\"\n style=\"max-height: 320px\"\n >{{ code }}</pre\n >\n @if (!loading) {\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Revert to this version' | translate\"\n [tooltip]=\"'Revert to this version' | translate\"\n container=\"body\"\n (click)=\"revert()\"\n >\n <i c8yIcon=\"undo\"></i>\n </button>\n }\n } @else if (step) {\n <pre\n class=\"fit-w\"\n style=\"max-height: 320px\"\n >{{ step | json }}</pre\n >\n }\n </c8y-li-collapse>\n }\n </c8y-li>\n </c8y-list-group>\n}\n\n@if (code) {\n <div [innerHTML]=\"textAfterCode | markdownToHtml | async\"></div>\n}\n","import { NgClass, NgFor } from '@angular/common';\nimport {\n Component,\n ElementRef,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n SecurityContext,\n SimpleChanges,\n viewChild\n} from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { IIdentified, IManagedObject, InventoryService } from '@c8y/client';\nimport { Alert } from '@c8y/ngx-components';\nimport { kebabCase } from 'lodash-es';\nimport {\n catchError,\n EMPTY,\n filter,\n from,\n fromEvent,\n isEmpty,\n map,\n merge,\n Observable,\n Subject,\n switchMap,\n takeUntil\n} from 'rxjs';\nimport { defaultWebComponentName, HtmlWidget, WebcomponentContext } from '../html-widget.model';\nimport { webComponentTemplate } from '../webcomponent-template';\nimport { legacyTemplate } from '../legacy-template';\n\n@Component({\n standalone: true,\n imports: [NgFor, NgClass],\n selector: 'c8y-html-frame',\n templateUrl: './html-frame.component.html',\n host: { class: 'd-contents' }\n})\nexport class HtmlFrameComponent implements OnChanges, OnDestroy {\n @Input()\n config: HtmlWidget;\n\n @Input()\n device: IManagedObject | IIdentified;\n\n /**\n * If set to true, it will be ensured that a unique hash is generated\n * for every webcomponent. This is useful if configured as otherwise it might\n * happen that the same code is already used in another webcomponent and the\n * error messages can not be assigned correctly.\n */\n @Input()\n useSalt = false;\n\n alerts: Alert[] = [];\n\n private sanitizer = inject(DomSanitizer);\n private destroy$ = new Subject<void>();\n private hostElement = viewChild<ElementRef<HTMLDivElement>>('hostElement');\n private reload$ = new Subject<void>();\n private latestUrl?: string;\n private htmlContentInitialization$ = this.reload$.pipe(\n filter(() => !!this.hostElement()),\n map(() => this.hostElement().nativeElement),\n switchMap((div: HTMLDivElement) =>\n merge(\n this.listenToErrors(),\n from(this.initDiv(div)).pipe(\n isEmpty(),\n filter(isEmpty => !!isEmpty),\n catchError(error => from([{ text: error, type: 'danger' }]))\n )\n )\n ),\n filter(alert => !!alert),\n takeUntil(this.destroy$)\n );\n private inventoryService = inject(InventoryService);\n\n constructor() {\n this.htmlContentInitialization$.pipe(takeUntil(this.destroy$)).subscribe((alert: Alert) => {\n this.alerts.push(alert);\n console.error(alert.text);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n changes.config?.currentValue ||\n (this.config && changes.device?.previousValue !== changes.device?.currentValue)\n ) {\n this.reloadComponent();\n }\n }\n\n reloadComponent() {\n this.alerts = [];\n const div = this.hostElement();\n div.nativeElement.innerHTML = '';\n this.reload$.next();\n }\n\n async initDiv(divHostElement: HTMLDivElement) {\n const code = this.getCode();\n const hash = await this.generateHash(code, this.useSalt);\n const webComponentName = kebabCase(defaultWebComponentName) + hash;\n const context: IManagedObject = await this.getContext(this.device);\n\n if (customElements.get(webComponentName)) {\n return this.createWebComponent(webComponentName, divHostElement, context);\n }\n\n const url = this.generateUrl(code);\n const defaultModule = await this.loadScript(url);\n\n // if the default module is a string, we will not use a webcomponent\n // instead we will simply parse the string and add it to the div\n // this is the case for legacy HTML widgets\n if (typeof defaultModule.default === 'string') {\n divHostElement.innerHTML = defaultModule.default;\n return EMPTY;\n }\n\n // same goes for an HTML Element\n if (defaultModule.default instanceof HTMLElement) {\n divHostElement.appendChild(defaultModule.default);\n\n // Find and execute scripts\n const scripts = divHostElement.querySelectorAll('script');\n scripts.forEach(script => {\n const newScript = document.createElement('script');\n Array.from(script.attributes).forEach(attr => {\n newScript.setAttribute(attr.name, attr.value);\n });\n newScript.textContent = script.textContent;\n script.parentNode.replaceChild(newScript, script);\n });\n return EMPTY;\n }\n\n // as a race condition can happen on loading, we need\n // to check again if the web component is already defined\n if (!customElements.get(webComponentName)) {\n customElements.define(webComponentName, defaultModule.default);\n }\n this.createWebComponent(webComponentName, divHostElement, context);\n return EMPTY;\n }\n\n private async getContext(\n device: IManagedObject | IIdentified | undefined\n ): Promise<IManagedObject> {\n if (!device) {\n return;\n }\n\n if (!device.self) {\n const { data } = await this.inventoryService.detail(device.id);\n return data;\n }\n return device as IManagedObject;\n }\n\n private async loadScript(url: string): Promise<{ default: any }> {\n const module = await import(/* webpackIgnore: true */ url);\n if (!module.default) {\n throw 'No default export found. Add an \"export default\" statement to your code.';\n }\n\n return module;\n }\n\n private generateUrl(script: string): string {\n const blob = new Blob([script], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n if (this.latestUrl) {\n URL.revokeObjectURL(this.latestUrl);\n }\n this.latestUrl = url;\n return url;\n }\n\n private listenToErrors(): Observable<Alert> {\n const errorEvents$ = fromEvent<ErrorEvent>(window, 'error').pipe(\n filter(event => event.filename?.includes(this.latestUrl)),\n map(event => this.mapErrorEventToAlert(event))\n );\n\n const rejectionEvents$ = fromEvent<PromiseRejectionEvent>(window, 'unhandledrejection').pipe(\n filter(event => event.reason?.stack?.includes(this.latestUrl)),\n map(event => this.mapErrorEventToAlert(event)),\n takeUntil(this.destroy$)\n );\n\n return merge(errorEvents$, rejectionEvents$);\n }\n\n private createWebComponent(\n webComponentName: string,\n divHostElement: HTMLDivElement,\n context: IManagedObject\n ) {\n const webComponent: WebcomponentContext = document.createElement<any>(webComponentName);\n webComponent.c8yContext = context;\n divHostElement.appendChild(webComponent);\n return webComponent;\n }\n\n private mapErrorEventToAlert(event: PromiseRejectionEvent | ErrorEvent): Alert {\n const hasReason = 'reason' in event;\n if (hasReason && event.reason?.name === ReferenceError.name) {\n const undefinedVar = event.reason.message.split(' ')[0];\n return { text: undefinedVar + ' is not defined', type: 'info' };\n }\n return { text: hasReason ? event.reason.message : event.message, type: 'danger' };\n }\n\n private getCode() {\n const isDevMode = this.config.devMode;\n if (isDevMode) {\n return this.config.code;\n }\n return this.createDefaultWebcomponentCode();\n }\n\n private async generateHash(value: string, useSalt: boolean): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(value + (useSalt ? Math.random() : ''));\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map(byte => byte.toString(16).padStart(2, '0')).join('');\n return hashHex;\n }\n\n private createDefaultWebcomponentCode(): string {\n if (this.config.legacy) {\n const legacyWebComponent = legacyTemplate(\n this.config.options.advancedSecurity\n ? this.sanitizer.sanitize(SecurityContext.HTML, this.config.code)\n : this.config.code,\n this.device?.id,\n this.device?.name\n );\n return legacyWebComponent;\n }\n\n const webComponentScript = webComponentTemplate(\n this.config.options.advancedSecurity\n ? this.sanitizer.sanitize(SecurityContext.HTML, this.config.code)\n : this.config.code,\n this.config.options.advancedSecurity\n ? this.sanitizer.sanitize(SecurityContext.STYLE, this.config.css)\n : this.config.css,\n this.config.options.cssEncapsulation\n );\n return webComponentScript;\n }\n}\n","<ng-container *ngFor=\"let alert of alerts\">\n <div\n class=\"alert m-8\"\n role=\"alert\"\n [ngClass]=\"{\n 'alert-danger': alert.type === 'danger',\n 'alert-warning': alert.type === 'warning',\n 'alert-info': alert.type === 'info',\n 'alert-success': alert.type === 'success'\n }\"\n >\n <p><strong translate>There was an issue in the HTML widget:</strong></p>\n <pre>{{ alert.text }}</pre>\n </div>\n</ng-container>\n<div\n class=\"fit-w fit-h\"\n #hostElement\n></div>\n","import { Component, inject, Input, OnDestroy, SimpleChanges, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { C8yTranslatePipe, IconDirective, LoadingComponent, TabsModule } from '@c8y/ngx-components';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { WidgetConfigFeedbackComponent } from '@c8y/ngx-components/context-dashboard';\nimport { EditorComponent } from '@c8y/ngx-components/editor';\nimport type * as Monaco from 'monaco-editor';\nimport { Subject } from 'rxjs';\nimport { HtmlWidgetConfigService } from '../html-widget-config.service';\nimport { HtmlWidget } from '../html-widget.model';\nimport { AdvancedSettingsComponent } from '../advanced-settings/advanced-settings.component';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\n@Component({\n standalone: true,\n imports: [\n EditorComponent,\n FormsModule,\n IconDirective,\n C8yTranslatePipe,\n WidgetConfigFeedbackComponent,\n TabsModule,\n TooltipModule,\n PopoverModule,\n LoadingComponent,\n AdvancedSettingsComponent\n ],\n selector: 'c8y-widget-code-editor',\n templateUrl: './widget-code-editor.component.html'\n})\nexport class WidgetCodeEditorComponent implements OnDestroy {\n @Input()\n mode: 'code' | 'css' = 'code';\n\n @Input()\n config: HtmlWidget;\n\n @ViewChild(EditorComponent) editorComponent!: EditorComponent;\n\n configService = inject(HtmlWidgetConfigService);\n\n editor: Monaco.editor.IStandaloneCodeEditor;\n isAutoSaveEnabled = true;\n language: 'html' | 'css' | 'javascript' = 'html';\n value: string;\n isLoading = false;\n\n readonly TAB_WEBCOMPONENT_LABEL = gettext('Web Component`Tab label of HTML Widget`');\n readonly TAB_HTML_LABEL = gettext('HTML`Tab label of HTML Widget`');\n readonly TAB_CSS_LABEL = gettext('CSS`Tab label of HTML Widget`');\n readonly BUTTON_DISABLE_AUTOSAVE_LABEL = gettext(\n 'Disable auto save`An action you can do on the html widget editor`'\n );\n readonly BUTTON_ENABLE_AUTOSAVE_LABEL = gettext(\n 'Enable auto save`An action you can do on the html widget editor`'\n );\n readonly TAB_OUTLET_NAME = 'html-widget-tab-outlet';\n\n private destroy$ = new Subject<void>();\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.config) {\n this.changeCode(this.config.code);\n }\n\n if (changes.config?.currentValue) {\n this.loadCode();\n }\n }\n\n loadCode() {\n this.isLoading = true;\n const isInDevMode = this.config?.devMode;\n this.language = 'html';\n\n if (isInDevMode) {\n this.language = 'javascript';\n }\n\n if (this.mode === 'css') {\n this.language = 'css';\n }\n\n this.value = this.mode === 'code' ? this.config.code : this.config.css;\n\n this.isLoading = false;\n\n if (this.editor) {\n queueMicrotask(() => this.formatCode());\n }\n }\n\n switchMode(mode: 'code' | 'css') {\n this.mode = mode;\n this.loadCode();\n }\n\n editorLoaded(editor: Monaco.editor.IStandaloneCodeEditor) {\n this.editor = editor;\n const monaco = this.editorComponent.monaco;\n this.editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => {\n this.saveCode();\n });\n }\n\n formatCode() {\n this.editor.getAction('editor.action.formatDocument').run();\n }\n\n redo() {\n this.editor.trigger('keyboard', 'redo', null);\n }\n\n undo() {\n this.editor.trigger('keyboard', 'undo', null);\n }\n\n changeCode($event: string) {\n if (this.isAutoSaveEnabled) {\n this.saveCode($event);\n }\n }\n\n saveCode(codeStr?: string) {\n const code = codeStr || this.editor.getValue();\n if (this.mode === 'code') {\n this.configService.changeCode(code);\n return;\n }\n this.configService.changeCss(code);\n }\n}\n","<c8y-widget-config-feedback>\n <div class=\"d-flex\">\n @if (config?.devMode && !config?.legacy) {\n <span\n class=\"tag tag--warning text-12\"\n translate\n >\n Advanced developer mode\n </span>\n }\n </div>\n <div class=\"d-flex\">\n @if (config?.legacy) {\n <span\n class=\"tag tag--warning text-12\"\n [title]=\"\n 'This widget is in legacy mode. Consider to upgrade this to a new HTML widget. Read our documentation on details to transform your widget'\n | translate\n \"\n translate\n >\n Legacy mode\n </span>\n }\n </div>\n</c8y-widget-config-feedback>\n\n<div class=\"d-flex d-col fit-h fit-w\">\n <c8y-html-widget-advanced-settings\n [devMode]=\"config?.devMode\"\n [cssEncapsulation]=\"config?.options?.cssEncapsulation\"\n ></c8y-html-widget-advanced-settings>\n\n <fieldset class=\"c8y-fieldset p-0 overflow-hidden\">\n <legend class=\"m-l-16 p-l-0\">{{ 'Code' | translate }}</legend>\n\n <div class=\"btn-group btn-group-sm m-l-0 p-t-8 p-b-8 p-l-16 p-r-16 fit-w d-flex\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Undo' | translate\"\n [tooltip]=\"'Undo' | translate\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"undo()\"\n >\n <i [c8yIcon]=\"'undo'\"></i>\n </button>\n\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Redo' | translate\"\n [tooltip]=\"'Redo' | translate\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"redo()\"\n >\n <i [c8yIcon]=\"'redo'\"></i>\n </button>\n\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Format code' | translate\"\n [tooltip]=\"'Format code' | translate\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"formatCode()\"\n >\n <i [c8yIcon]=\"'format-align-left'\"></i>\n </button>\n\n <label class=\"c8y-switch m-l-auto\">\n <input\n type=\"checkbox\"\n [checked]=\"isAutoSaveEnabled\"\n (change)=\"isAutoSaveEnabled = !isAutoSaveEnabled\"\n />\n <span></span>\n <span translate>Auto save</span>\n </label>\n </div>\n\n <div\n class=\"btn-toolbar m-0 p-relative\"\n role=\"toolbar\"\n >\n <c8y-tabs-outlet\n class=\"elevation-none\"\n [outletName]=\"TAB_OUTLET_NAME\"\n [orientation]=\"'horizontal'\"\n [openFirstTab]=\"false\"\n ></c8y-tabs-outlet>\n <c8y-tab\n [icon]=\"'code'\"\n [label]=\"(config?.devMode ? TAB_WEBCOMPONENT_LABEL : TAB_HTML_LABEL) | translate\"\n [priority]=\"100\"\n [showAlways]=\"true\"\n [tabsOutlet]=\"TAB_OUTLET_NAME\"\n [isActive]=\"mode === 'code'\"\n (onSelect)=\"switchMode('code')\"\n ></c8y-tab>\n @if (!config?.devMode && !config?.legacy) {\n <c8y-tab\n [icon]=\"'c8y-css'\"\n [label]=\"TAB_CSS_LABEL | translate\"\n [priority]=\"0\"\n [tabsOutlet]=\"TAB_OUTLET_NAME\"\n [isActive]=\"mode === 'css'\"\n (onSelect)=\"switchMode('css')\"\n ></c8y-tab>\n }\n </div>\n\n @if (!isLoading) {\n @if (!(mode === 'css' && config?.devMode)) {\n <c8y-editor\n class=\"flex-grow d-block\"\n style=\"height: 450px\"\n [ngModel]=\"value\"\n (ngModelChange)=\"changeCode($event)\"\n [editorOptions]=\"{\n language,\n tabSize: 2,\n insertSpaces: true,\n minimap: { enabled: false }\n }\"\n (editorInit)=\"editorLoaded($event)\"\n ></c8y-editor>\n }\n } @else {\n <c8y-loading></c8y-loading>\n }\n </fieldset>\n</div>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, inject, OnDestroy, TemplateRef, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { OptionsService } from '@c8y/ngx-components';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { HtmlFrameComponent } from './html-frame/html-frame.component';\nimport { HtmlWidgetConfigService } from './html-widget-config.service';\nimport { WidgetCodeEditorComponent } from './widget-code-editor-section/widget-code-editor.component';\n\n@Component({\n selector: 'c8y-html-widget-config',\n templateUrl: './html-widget-config.component.html',\n standalone: true,\n imports: [RouterModule, FormsModule, AsyncPipe, HtmlFrameComponent, WidgetCodeEditorComponent]\n})\nexport class HtmlWidgetConfigComponent implements OnDestroy {\n @ViewChild('htmlPreview')\n set htmlPreviewTemplate(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n } else {\n this.widgetConfigService.setPreview(null);\n }\n }\n options = inject(OptionsService);\n htmlWidgetConfigService = inject(HtmlWidgetConfigService);\n widgetConfigService = inject(WidgetConfigService);\n\n ngOnDestroy(): void {\n // sadly the service is component scoped\n // but still not recycled correctly. That is why we do\n // it here.\n this.htmlWidgetConfigService.destroy();\n }\n}\n","<c8y-widget-code-editor\n [config]=\"htmlWidgetConfigService.config$ | async\"\n [mode]=\"'code'\"\n></c8y-widget-code-editor>\n\n<ng-template #htmlPreview>\n <c8y-html-frame\n [config]=\"htmlWidgetConfigService.codeEditorChangeConfig$ | async\"\n [device]=\"(widgetConfigService.currentConfig$ | async).device\"\n [useSalt]=\"true\"\n ></c8y-html-frame>\n</ng-template>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, inject } from '@angular/core';\nimport { C8yTranslatePipe, ClipboardService } from '@c8y/ngx-components';\nimport {\n AssetPropertyActionDirective,\n AssetPropertyListComponent,\n AssetPropertyType\n} from '@c8y/ngx-components/asset-properties';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\n\n@Component({\n selector: 'c8y-html-widget-properties-selector',\n templateUrl: './html-widget-properties-selector.component.html',\n host: {\n class: 'bg-level-1'\n },\n standalone: true,\n imports: [\n AssetPropertyListComponent,\n AssetPropertyActionDirective,\n AsyncPipe,\n C8yTranslatePipe,\n PopoverModule,\n TooltipModule\n ]\n})\nexport class HtmlWidgetPropertiesSelectorComponent {\n widgetConfigService = inject(WidgetConfigService);\n clipboardService = inject(ClipboardService);\n\n /**\n * Copies the property path to the clipboard in a format suitable for use in HTML widget.\n * For nested properties, it uses the keyPath to create a path to nested property.\n * @param context The context containing the property information.\n */\n async copyProperty(context: AssetPropertyType) {\n const nonAlphanumericRegex = /[^a-zA-Z0-9]/;\n let path: string;\n if (context.keyPath) {\n path = context.keyPath\n .map(key => (nonAlphanumericRegex.test(key) ? `['${key}']` : `.${key}`))\n .join('');\n } else {\n path = nonAlphanumericRegex.test(context.name) ? `['${context.name}']` : `.${context.name}`;\n }\n const content = '${this.c8yContext' + path + '}';\n await this.clipboardService.writeText(content);\n }\n}\n","<div\n class=\"d-flex m-b-8\"\n style=\"margin-top: -16px\"\n>\n <em\n class=\"m-l-24 text-muted\"\n translate\n >\n How to use properties in the widget\n </em>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"helpContent\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n</div>\n<c8y-asset-property-list\n class=\"inner-scroll bg-inherit d-block\"\n style=\"max-height: 450px\"\n [asset]=\"(widgetConfigService.currentConfig$ | async).device\"\n [config]=\"{\n selectMode: 'none',\n expansionMode: 'expandedByDefault',\n filterable: false,\n allowDragAndDrop: true\n }\"\n>\n <button\n class=\"btn-dot btn fit-h\"\n [attr.aria-label]=\"'Copy' | translate\"\n tooltip=\"{{ 'Copy' | translate }}\"\n type=\"button\"\n *c8yAssetPropertyAction=\"let context\"\n [delay]=\"500\"\n (click)=\"copyProperty(context)\"\n >\n <i class=\"dlt-c8y-icon-copy\"></i>\n </button>\n</c8y-asset-property-list>\n\n<ng-template #helpContent>\n <p\n class=\"p-b-8\"\n translate\n >\n Click the copy icon next to a property, then paste it into the HTML editor below as a template\n literal.\n </p>\n</ng-template>\n","import { Component, Input } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { ContextWidgetConfig } from '@c8y/ngx-components/context-dashboard';\nimport { HtmlFrameComponent } from './html-frame/html-frame.component';\nimport { HtmlWidget, HtmlWidgetConfig } from './html-widget.model';\n\n@Component({\n selector: 'c8y-html-widget',\n templateUrl: './html-widget.component.html',\n standalone: true,\n imports: [RouterModule, HtmlFrameComponent]\n})\nexport class HtmlWidgetComponent {\n @Input() config: HtmlWidgetConfig;\n\n ngOnInit(): void {\n if (this.config.html && !this.config.config) {\n this.config.config = this.mapLegacyConfig(this.config);\n }\n }\n\n private mapLegacyConfig(current: ContextWidgetConfig): HtmlWidget {\n const isAlreadyInAdvancedMode = current?.config?.devMode === true;\n if (isAlreadyInAdvancedMode) {\n return current.config as HtmlWidget;\n }\n return {\n code: current.html,\n css: '',\n legacy: true,\n devMode: false,\n options: {\n cssEncapsulation: false,\n advancedSecurity: current.sanitization === 'strict'\n }\n };\n }\n}\n","<c8y-html-frame\n [config]=\"config.config\"\n [device]=\"config.device\"\n></c8y-html-frame>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["isEmpty","i1","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-implementations-html-widget.mjs","sources":["../../widgets/implementations/html-widget/html-widget.model.ts","../../widgets/implementations/html-widget/webcomponent-template.ts","../../widgets/implementations/html-widget/legacy-template.ts","../../widgets/implementations/html-widget/html-widget-config.service.ts","../../widgets/implementations/html-widget/advanced-settings/advanced-settings.component.ts","../../widgets/implementations/html-widget/advanced-settings/advanced-settings.component.html","../../widgets/implementations/html-widget/html-ai-chat-feedback.component.ts","../../widgets/implementations/html-widget/html-ai-chat-feedback.component.html","../../widgets/implementations/html-widget/html-frame/html-frame.component.ts","../../widgets/implementations/html-widget/html-frame/html-frame.component.html","../../widgets/implementations/html-widget/widget-code-editor-section/widget-code-editor.component.ts","../../widgets/implementations/html-widget/widget-code-editor-section/widget-code-editor.component.html","../../widgets/implementations/html-widget/html-widget-config.component.ts","../../widgets/implementations/html-widget/html-widget-config.component.html","../../widgets/implementations/html-widget/html-widget-properties-selector/html-widget-properties-selector.component.ts","../../widgets/implementations/html-widget/html-widget-properties-selector/html-widget-properties-selector.component.html","../../widgets/implementations/html-widget/html-widget.component.ts","../../widgets/implementations/html-widget/html-widget.component.html","../../widgets/implementations/html-widget/c8y-ngx-components-widgets-implementations-html-widget.ts"],"sourcesContent":["import { IManagedObject } from '@c8y/client';\nimport { WidgetSettings } from '@c8y/ngx-components';\n\nexport interface HtmlWidgetConfig {\n device: IManagedObject;\n settings: WidgetSettings;\n config: HtmlWidget;\n\n /**\n * On HTML WIdget 1.0 this property was used to store the HTML code.\n * It is not used anymore, but we need to keep it for backward compatibility.\n * The HTML code is now stored in the config property.\n * @deprecated Use config.code instead.\n */\n html?: any;\n}\n\nexport type C8yProperties = Array<PathProperty | ComputedProperty>;\n\nexport interface HtmlWidget {\n css: string;\n code: string;\n props?: C8yProperties;\n options: HtmlWidgetOptions;\n legacy: boolean;\n devMode: boolean;\n latestCodeHash?: string;\n}\n\nexport interface HtmlWidgetOptions {\n cssEncapsulation: boolean;\n advancedSecurity: boolean;\n}\n\nexport interface WebcomponentContext extends HTMLElement {\n c8yContext: IManagedObject;\n}\n\nexport interface PathProperty {\n name: string;\n path: string;\n query?: never;\n reducer?: never;\n}\n\nexport interface ComputedProperty {\n name: string;\n path?: never;\n query: string;\n reducer?: string;\n}\n\nexport const INITIAL_HTML_FORMATTED = `<div>\n <h2>Hello from <span class=\"branded\">HTML widget</span></h2>\n <p class=\"m-b-8 m-t-16\">\n You can use HTML and Javascript template literals here: <br>\n \\$\\{this.c8yContext ? this.c8yContext.name : 'No device selected'\\}\n </p>\n\n <a class=\"btn btn-primary m-b-16\" href=\"#/group\">Go to groups</a>\n\n <p>\n Use the CSS editor to customize the CSS. You can use <span class=\"text-bold\">any design-token CSS variable</span> in there.\n </p>\n</div>`;\nexport const INITIAL_CSS_FORMATTED = `\n:host > div {\n padding: var(--c8y-root-component-padding-default);\n}\nspan.branded { \n color: var(--brand-primary, var(--c8y-brand-primary)); \n}`;\n\nexport const defaultWebComponentName = 'DefaultWebComponent';\n\nexport const defaultWebComponentAttributeNameContext = 'c8yContext';\n","import { defaultWebComponentName } from './html-widget.model';\n\nexport const webComponentTemplate = (\n html: string,\n css?: string,\n viewEncapsulation?: boolean,\n name = defaultWebComponentName\n) => `\nimport { LitElement, html, css} from 'lit';\n${!viewEncapsulation ? `import { styleImports } from 'styles';` : ''}\n\nexport default class ${name} extends LitElement {\n static styles = css\\`\n ${css}\n \\`;\n\n static properties = {\n // The managed object this widget is assigned to. Can be null.\n c8yContext: { type: Object },\n };\n\n constructor() {\n super();\n }\n\n render() {\n return html\\`${\n viewEncapsulation\n ? html\n : `\n <style>\n \\${styleImports}\n </style>\n ${html}\n `\n }\\`;\n }\n}\n`;\n","export const legacyTemplate = (html: string, deviceId?: string | number, deviceName?: string) => {\n const escapedHtml = html\n // Finds: \\ Replaces with: \\\\\n .replace(/\\\\/g, '\\\\\\\\')\n // Finds: ` Replaces with: \\`\n .replace(/`/g, '\\\\`')\n // Finds: $ Replaces with: \\$\n .replace(/\\$/g, '\\\\$');\n\n return `\nimport { angular } from 'angular';\n\n// NOTE: This is a legacy template for the HTML widget.\n// It is used to compile the HTML content in the context of the AngularJS application.\n// The template is injected into the AngularJS application and compiled using the AngularJS compiler.\n// The template should only be used for backward compatibility purposes.\n// It is recommended to use a web component instead.\n\nif(!angular) {\n throw new Error('AngularJS is not available. Please make sure to include AngularJS in your project.');\n}\n\nconst $injector = angular.element(document.querySelector('c8y-ui-root')).injector();\nif (!$injector) {\n throw new Error('AngularJS injector is not available. Maybe not an hybrid application?');\n}\n\n// defining a new scope\nconst $rootScope = $injector.get('$rootScope');\nconst $scope = $rootScope.$new(true); \n\n// faking the old angularjs config \n$scope.child = { \n config: {\n ${deviceId ? `device: { id: \"${deviceId}\", name: \"${deviceName}\" },` : ''}\n html: \\`<div ng-controller=\"HtmlWidgetCtrl\">${escapedHtml}</div>\\`\n }\n};\n\n// load the needed services\nconst $compile = $injector.get('$compile');\nconst $controller = $injector.get('$controller');\n\n// create the element\nconst htmlElement = angular.element($scope.child.config.html);\n\n// The default controller providing the context\n$controller('HtmlWidgetCtrl', { $scope });\n\n// Compile the element\n$compile(htmlElement)($scope);\n\n// Apply the scope changes\n$rootScope.$apply();\n\nexport default htmlElement[0];`;\n};\n","import { inject, Injectable } from '@angular/core';\nimport { AppStateService } from '@c8y/ngx-components';\nimport { CockpitConfig } from '@c8y/ngx-components/cockpit-config';\nimport { ContextWidgetConfig, WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { isEmpty } from 'lodash';\nimport {\n combineLatest,\n debounceTime,\n distinctUntilChanged,\n filter,\n first,\n map,\n Observable,\n of,\n shareReplay,\n startWith,\n Subject,\n switchMap,\n takeUntil,\n withLatestFrom\n} from 'rxjs';\nimport { HtmlWidget, INITIAL_CSS_FORMATTED, INITIAL_HTML_FORMATTED } from './html-widget.model';\nimport { webComponentTemplate } from './webcomponent-template';\nimport { legacyTemplate } from './legacy-template';\n\n@Injectable()\nexport class HtmlWidgetConfigService {\n readonly DEFAULT_AUTO_SAVE_DEBOUNCE = 1000;\n codeChange$ = new Subject<{ value: string; type: 'css' | 'code' }>();\n widgetConfigService = inject(WidgetConfigService);\n appState = inject(AppStateService);\n destroy$ = new Subject<void>();\n\n init$ = this.widgetConfigService.currentConfig$.pipe(\n first(),\n map(current => {\n if (current.html) {\n current.config = this.mapLegacyConfig(current);\n }\n\n return (current.config || {}) as HtmlWidget;\n }),\n filter(config => !!config),\n withLatestFrom(this.appState.currentApplicationConfig),\n switchMap(([widgetConfig, appConfig]) => this.initConfig(appConfig, widgetConfig)),\n shareReplay(),\n takeUntil(this.destroy$)\n );\n\n config$ = this.init$.pipe(switchMap(initValue => this.configChanged$.pipe(startWith(initValue))));\n\n codeEditorChangeConfig$ = combineLatest([\n this.codeChange$.pipe(startWith(undefined)),\n this.config$\n ]).pipe(\n distinctUntilChanged(),\n takeUntil(this.destroy$),\n debounceTime(this.DEFAULT_AUTO_SAVE_DEBOUNCE),\n map(([change, config]) => {\n if (!change) {\n return config;\n }\n if (change.type === 'css') {\n config.css = change.value;\n } else {\n config.code = change.value;\n }\n return { ...config };\n })\n );\n\n configChanged$ = new Subject<HtmlWidget>();\n\n initConfig(appConfig: CockpitConfig, widgetConfig: HtmlWidget): Observable<HtmlWidget> {\n const defaultToAdvancedMode = appConfig?.htmlWidgetDefaultToAdvancedMode ?? false;\n const isEmptyConfig = isEmpty(widgetConfig);\n if (isEmptyConfig && !defaultToAdvancedMode) {\n widgetConfig = this.initDefaultMode(!appConfig?.htmlWidgetDisableSanitization);\n this.save(widgetConfig);\n return of(widgetConfig);\n }\n if (isEmptyConfig) {\n widgetConfig = this.enableAdvancedMode(widgetConfig);\n }\n\n // new config is needed to trigger ngOnChanges\n const newConfig = { ...widgetConfig };\n this.save(newConfig);\n return of(newConfig);\n }\n\n destroy(): void {\n this.destroy$.next();\n this.codeChange$.complete();\n this.configChanged$.complete();\n }\n\n save(config: HtmlWidget) {\n this.widgetConfigService.updateConfig({\n config\n });\n }\n\n changeCode(value: string) {\n this.codeChange$.next({ value, type: 'code' });\n }\n\n changeCss(value: string) {\n this.codeChange$.next({ value, type: 'css' });\n }\n\n enableAdvancedMode(currentConfig: HtmlWidget) {\n const currentHTML = currentConfig?.code || INITIAL_HTML_FORMATTED;\n const currentCSS = currentConfig?.css || INITIAL_CSS_FORMATTED;\n const code = currentConfig?.legacy\n ? legacyTemplate(\n currentHTML,\n this.widgetConfigService.currentConfig?.device?.id,\n this.widgetConfigService.currentConfig?.device?.name\n )\n : webComponentTemplate(currentHTML, currentCSS, false);\n currentConfig = {\n css: '',\n code,\n legacy: false,\n devMode: true,\n options: {\n cssEncapsulation: false,\n advancedSecurity: false\n }\n };\n return currentConfig;\n }\n\n initDefaultMode(advancedSecurity = true): HtmlWidget {\n return {\n css: INITIAL_CSS_FORMATTED,\n code: INITIAL_HTML_FORMATTED,\n legacy: false,\n devMode: false,\n options: {\n cssEncapsulation: false,\n advancedSecurity\n }\n };\n }\n\n private mapLegacyConfig(current: ContextWidgetConfig): HtmlWidget {\n const isAlreadyInAdvancedMode = current?.config?.devMode === true;\n if (isAlreadyInAdvancedMode) {\n return current.config as HtmlWidget;\n }\n\n const isAlreadyMapped = current?.config?.legacy === true;\n if (isAlreadyMapped) {\n return current.config as HtmlWidget;\n }\n\n return {\n code: current.html,\n css: '',\n legacy: true,\n devMode: false,\n options: {\n cssEncapsulation: false,\n advancedSecurity: current.sanitization === 'strict'\n }\n };\n }\n}\n","import { NgIf } from '@angular/common';\nimport { Component, inject, Input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { C8yTranslatePipe, IconDirective, Permissions } from '@c8y/ngx-components';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { HtmlWidgetConfigService } from '../html-widget-config.service';\nimport { HtmlWidgetConfig, HtmlWidgetOptions } from '../html-widget.model';\n\n@Component({\n standalone: true,\n imports: [IconDirective, NgIf, TooltipModule, PopoverModule, C8yTranslatePipe, FormsModule],\n selector: 'c8y-html-widget-advanced-settings',\n templateUrl: './advanced-settings.component.html'\n})\nexport class AdvancedSettingsComponent {\n widgetConfigService = inject(WidgetConfigService);\n htmlWidgetConfigService = inject(HtmlWidgetConfigService);\n router = inject(Router);\n permissionService = inject(Permissions);\n\n canChangeSettings = false;\n @Input()\n devMode: boolean;\n @Input()\n cssEncapsulation: boolean;\n\n CSS_ENCAPSULATION_HELP_CONTEXT = gettext(\n 'If enabled, the CSS will be encapsulated and no platform styling will be applied.'\n );\n\n ngOnInit(): void {\n this.canChangeSettings = this.permissionService.hasAnyRole([\n Permissions.ROLE_APPLICATION_MANAGEMENT_ADMIN,\n Permissions.ROLE_TENANT_ADMIN\n ]);\n }\n\n disableAdvancedMode() {\n const config = this.htmlWidgetConfigService.initDefaultMode();\n this.htmlWidgetConfigService.save(config);\n this.htmlWidgetConfigService.configChanged$.next(config);\n }\n\n enableAdvancedMode() {\n let { config } = this.widgetConfigService.currentConfig as HtmlWidgetConfig;\n config = this.htmlWidgetConfigService.enableAdvancedMode(config);\n this.htmlWidgetConfigService.save(config);\n this.htmlWidgetConfigService.configChanged$.next(config);\n }\n\n toggleAdvancedMode() {\n this.devMode ? this.disableAdvancedMode() : this.enableAdvancedMode();\n this.devMode = !this.devMode;\n }\n\n async changeOption(option: keyof HtmlWidgetOptions) {\n const { config } = this.widgetConfigService.currentConfig as HtmlWidgetConfig;\n config.options[option] = !config.options[option];\n this.htmlWidgetConfigService.save(config);\n this.htmlWidgetConfigService.configChanged$.next(config);\n }\n}\n","<fieldset class=\"c8y-fieldset m-t-0\">\n <legend>{{ 'Developer mode' | translate }}</legend>\n\n <div class=\"d-flex a-i-center p-b-16\">\n <label class=\"c8y-switch\">\n <input\n type=\"checkbox\"\n [ngModel]=\"devMode\"\n (change)=\"toggleAdvancedMode()\"\n [disabled]=\"!canChangeSettings\"\n />\n <span></span>\n <span>{{ 'Advanced developer mode' | translate }}</span>\n </label>\n\n <button class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"devMode ? disableAdvanced : enableAdvanced\"\n container=\"body\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n\n <ng-template #enableAdvanced>\n <p class=\"text-16 text-bold p-b-8\">\n <i [c8yIcon]=\"'imac-settings'\"></i>\n {{ 'Advanced developer mode' | translate }}\n </p>\n <p class=\"p-b-8\" translate>\n Create custom widgets by modifying a basic WebComponent with HTML and JavaScript. This\n <strong>unsupported</strong>\n feature is ideal for rapid prototyping and simple customizations.\n </p>\n <p class=\"p-b-8\" translate>\n For production environments, we recommend our fully-supported Angular-based\n <a href=\"https://styleguide.cumulocity.com\" target=\"_blank\">Web SDK</a>.\n <br />\n Enable advanced developer mode to start coding!\n </p>\n </ng-template>\n\n <ng-template #disableAdvanced>\n <p class=\"text-16 text-bold p-b-8\">\n {{ 'Advanced developer mode' | translate }}\n </p>\n <p class=\"p-b-8\" translate>\n The advanced developer mode is enabled for this widget allowing to build extensive Web\n Components.\n </p>\n <p class=\"p-b-8\" translate>\n You can disable this mode again, but it will reset the current code.\n </p>\n </ng-template>\n\n <ng-container *ngIf=\"!devMode\">\n <label\n class=\"c8y-switch m-l-auto\"\n >\n <input\n type=\"checkbox\"\n (change)=\"changeOption('cssEncapsulation')\"\n [disabled]=\"!canChangeSettings\"\n [ngModel]=\"cssEncapsulation\"\n />\n <span></span>\n <span>{{ 'CSS encapsulation' | translate }}</span>\n </label>\n <button\n class=\"btn-help m-0\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ CSS_ENCAPSULATION_HELP_CONTEXT | translate }}\"\n triggers=\"focus\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n ></button>\n </ng-container>\n\n </div>\n</fieldset>\n","import { AsyncPipe, JsonPipe, NgClass } from '@angular/common';\nimport { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport {\n C8yTranslatePipe,\n ListGroupComponent,\n ListItemBodyComponent,\n ListItemCollapseComponent,\n ListItemComponent,\n ListItemIconComponent,\n MarkdownToHtmlPipe\n} from '@c8y/ngx-components';\nimport { AgentStep } from '@c8y/ngx-components/ai';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { HtmlWidgetConfigService } from './html-widget-config.service';\n\n@Component({\n selector: 'c8y-html-ai-chat-feedback',\n templateUrl: './html-ai-chat-feedback.component.html',\n imports: [\n ListGroupComponent,\n ListItemComponent,\n ListItemCollapseComponent,\n ListItemBodyComponent,\n ListItemIconComponent,\n NgClass,\n JsonPipe,\n MarkdownToHtmlPipe,\n TooltipDirective,\n AsyncPipe,\n C8yTranslatePipe\n ],\n standalone: true,\n host: { class: 'agent-step-feedback' }\n})\nexport class HtmlAiChatFeedbackComponent implements OnInit, OnChanges {\n @Input({ required: true }) step: AgentStep;\n /**\n * The label to display for the feedback section.\n */\n label: string;\n /**\n * Indicates whether the feedback section is in a loading state.\n */\n loading = false;\n /**\n * Indicates whether the detailed feedback section is collapsed.\n */\n collapsed = true;\n /**\n * Indicates whether the feedback section can be collapsed.\n */\n canCollapse = false;\n /**\n * The code extracted from the agent step (if any).\n */\n code = '';\n /**\n * The text before the code block (if any).\n */\n textBeforeCode = '';\n /**\n * The text after the code block (if any).\n */\n textAfterCode = '';\n\n private readonly codeTag = 'c8y-code-extract';\n private readonly htmlWidgetConfigService = inject(HtmlWidgetConfigService);\n\n /**\n * @ignore\n */\n ngOnInit(): void {\n if (this.step) {\n this.parseAgentStep(this.step);\n }\n }\n\n /**\n * @ignore\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.step) {\n this.parseAgentStep(changes.step.currentValue);\n }\n }\n\n /**\n * Parse the agent step. Extracts the code block if present and updates the state accordingly.\n * @param step The agent step to parse.\n */\n parseAgentStep(step: AgentStep): void {\n if (step.reasoning) {\n this.label = gettext('Reasoning');\n this.loading = false;\n this.canCollapse = true;\n this.collapsed = false;\n }\n\n if (step.toolCalls?.length > 0 && !step.toolResults?.length) {\n this.label = gettext('Analyzing query…');\n this.loading = true;\n this.canCollapse = false;\n this.collapsed = true;\n } else if (step.toolResults?.length > 0) {\n this.label = gettext('Query analyzed.');\n this.loading = false;\n this.canCollapse = true;\n this.collapsed = true;\n }\n\n this.parseCodeBlock(step);\n }\n\n /**\n * Revert to the last applied code.\n */\n revert() {\n this.applyCurrentCode();\n }\n\n private parseCodeBlock(step: AgentStep) {\n const text = step.text;\n const codeBlockStart = text.lastIndexOf(`<${this.codeTag}>`);\n const codeBlockEnd = text.lastIndexOf(`</${this.codeTag}>`);\n const codeBlockStartLength = this.codeTag.length + 2;\n const codeBlockEndLength = this.codeTag.length + 3;\n if (codeBlockStart !== -1) {\n this.code = text.substring(codeBlockStart + codeBlockStartLength);\n this.textBeforeCode = text.substring(0, codeBlockStart + codeBlockStartLength);\n this.label = gettext('Creating widget…');\n this.loading = true;\n this.canCollapse = true;\n this.collapsed = true;\n }\n if (codeBlockEnd !== -1) {\n this.label = gettext('Widget created');\n this.code = text.substring(codeBlockStart + codeBlockStartLength, codeBlockEnd);\n this.loading = false;\n this.textAfterCode = text.substring(codeBlockEnd + codeBlockEndLength);\n this.canCollapse = true;\n this.collapsed = true;\n this.applyCurrentCode();\n }\n }\n\n private applyCurrentCode() {\n const newConfig = {\n code: this.code,\n css: '',\n devMode: true,\n legacy: false,\n options: { advancedSecurity: false, cssEncapsulation: false }\n };\n this.htmlWidgetConfigService.configChanged$.next(newConfig);\n this.htmlWidgetConfigService.widgetConfigService.updateConfig({ config: newConfig }, true);\n }\n}\n","@if (!step.reasoning && !code) {\n <div [innerHTML]=\"step.text | markdownToHtml | async\"></div>\n}\n@if (code) {\n <div [innerHTML]=\"textBeforeCode | markdownToHtml | async\"></div>\n}\n@if (label) {\n <c8y-list-group class=\"m-t-16 m-b-16\">\n <c8y-li\n [active]=\"!loading\"\n [collapsed]=\"collapsed\"\n >\n <c8y-li-icon>\n <span\n class=\"btn-ai btn-ai-hint btn-sm\"\n [ngClass]=\"{ working: loading }\"\n >\n <span></span>\n </span>\n </c8y-li-icon>\n <c8y-li-body>\n {{ label }}\n </c8y-li-body>\n\n @if (canCollapse) {\n <c8y-li-collapse>\n @if (step.reasoning) {\n <div [innerHTML]=\"step.reasoning | markdownToHtml | async\"></div>\n } @else if (code) {\n <pre\n class=\"fit-w\"\n style=\"max-height: 320px\"\n >{{ code }}</pre\n >\n @if (!loading) {\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Revert to this version' | translate\"\n [tooltip]=\"'Revert to this version' | translate\"\n container=\"body\"\n (click)=\"revert()\"\n >\n <i c8yIcon=\"undo\"></i>\n </button>\n }\n } @else if (step) {\n <pre\n class=\"fit-w\"\n style=\"max-height: 320px\"\n >{{ step | json }}</pre\n >\n }\n </c8y-li-collapse>\n }\n </c8y-li>\n </c8y-list-group>\n}\n\n@if (code) {\n <div [innerHTML]=\"textAfterCode | markdownToHtml | async\"></div>\n}\n","import { NgClass, NgFor } from '@angular/common';\nimport {\n Component,\n ElementRef,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n SecurityContext,\n SimpleChanges,\n viewChild\n} from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { IIdentified, IManagedObject, InventoryService } from '@c8y/client';\nimport { Alert } from '@c8y/ngx-components';\nimport { kebabCase } from 'lodash-es';\nimport {\n catchError,\n EMPTY,\n filter,\n from,\n fromEvent,\n isEmpty,\n map,\n merge,\n Observable,\n Subject,\n switchMap,\n takeUntil\n} from 'rxjs';\nimport { defaultWebComponentName, HtmlWidget, WebcomponentContext } from '../html-widget.model';\nimport { webComponentTemplate } from '../webcomponent-template';\nimport { legacyTemplate } from '../legacy-template';\n\n@Component({\n standalone: true,\n imports: [NgFor, NgClass],\n selector: 'c8y-html-frame',\n templateUrl: './html-frame.component.html',\n host: { class: 'd-contents' }\n})\nexport class HtmlFrameComponent implements OnChanges, OnDestroy {\n @Input()\n config: HtmlWidget;\n\n @Input()\n device: IManagedObject | IIdentified;\n\n /**\n * If set to true, it will be ensured that a unique hash is generated\n * for every webcomponent. This is useful if configured as otherwise it might\n * happen that the same code is already used in another webcomponent and the\n * error messages can not be assigned correctly.\n */\n @Input()\n useSalt = false;\n\n alerts: Alert[] = [];\n\n private sanitizer = inject(DomSanitizer);\n private destroy$ = new Subject<void>();\n private hostElement = viewChild<ElementRef<HTMLDivElement>>('hostElement');\n private reload$ = new Subject<void>();\n private latestUrl?: string;\n private htmlContentInitialization$ = this.reload$.pipe(\n filter(() => !!this.hostElement()),\n map(() => this.hostElement().nativeElement),\n switchMap((div: HTMLDivElement) =>\n merge(\n this.listenToErrors(),\n from(this.initDiv(div)).pipe(\n isEmpty(),\n filter(isEmpty => !!isEmpty),\n catchError(error => from([{ text: error, type: 'danger' }]))\n )\n )\n ),\n filter(alert => !!alert),\n takeUntil(this.destroy$)\n );\n private inventoryService = inject(InventoryService);\n\n constructor() {\n this.htmlContentInitialization$.pipe(takeUntil(this.destroy$)).subscribe((alert: Alert) => {\n this.alerts.push(alert);\n console.error(alert.text);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n changes.config?.currentValue ||\n (this.config && changes.device?.previousValue !== changes.device?.currentValue)\n ) {\n this.reloadComponent();\n }\n }\n\n reloadComponent() {\n this.alerts = [];\n const div = this.hostElement();\n div.nativeElement.innerHTML = '';\n this.reload$.next();\n }\n\n async initDiv(divHostElement: HTMLDivElement) {\n const code = this.getCode();\n const hash = await this.generateHash(code, this.useSalt);\n const webComponentName = kebabCase(defaultWebComponentName) + hash;\n const context: IManagedObject = await this.getContext(this.device);\n\n if (customElements.get(webComponentName)) {\n return this.createWebComponent(webComponentName, divHostElement, context);\n }\n\n const url = this.generateUrl(code);\n const defaultModule = await this.loadScript(url);\n\n // if the default module is a string, we will not use a webcomponent\n // instead we will simply parse the string and add it to the div\n // this is the case for legacy HTML widgets\n if (typeof defaultModule.default === 'string') {\n divHostElement.innerHTML = defaultModule.default;\n return EMPTY;\n }\n\n // same goes for an HTML Element\n if (defaultModule.default instanceof HTMLElement) {\n divHostElement.appendChild(defaultModule.default);\n\n // Find and execute scripts\n const scripts = divHostElement.querySelectorAll('script');\n scripts.forEach(script => {\n const newScript = document.createElement('script');\n Array.from(script.attributes).forEach(attr => {\n newScript.setAttribute(attr.name, attr.value);\n });\n newScript.textContent = script.textContent;\n script.parentNode.replaceChild(newScript, script);\n });\n return EMPTY;\n }\n\n // as a race condition can happen on loading, we need\n // to check again if the web component is already defined\n if (!customElements.get(webComponentName)) {\n customElements.define(webComponentName, defaultModule.default);\n }\n this.createWebComponent(webComponentName, divHostElement, context);\n return EMPTY;\n }\n\n private async getContext(\n device: IManagedObject | IIdentified | undefined\n ): Promise<IManagedObject> {\n if (!device) {\n return;\n }\n\n if (!device.self) {\n const { data } = await this.inventoryService.detail(device.id);\n return data;\n }\n return device as IManagedObject;\n }\n\n private async loadScript(url: string): Promise<{ default: any }> {\n const module = await import(/* webpackIgnore: true */ url);\n if (!module.default) {\n throw 'No default export found. Add an \"export default\" statement to your code.';\n }\n\n return module;\n }\n\n private generateUrl(script: string): string {\n const blob = new Blob([script], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n if (this.latestUrl) {\n URL.revokeObjectURL(this.latestUrl);\n }\n this.latestUrl = url;\n return url;\n }\n\n private listenToErrors(): Observable<Alert> {\n const errorEvents$ = fromEvent<ErrorEvent>(window, 'error').pipe(\n filter(event => event.filename?.includes(this.latestUrl)),\n map(event => this.mapErrorEventToAlert(event))\n );\n\n const rejectionEvents$ = fromEvent<PromiseRejectionEvent>(window, 'unhandledrejection').pipe(\n filter(event => event.reason?.stack?.includes(this.latestUrl)),\n map(event => this.mapErrorEventToAlert(event)),\n takeUntil(this.destroy$)\n );\n\n return merge(errorEvents$, rejectionEvents$);\n }\n\n private createWebComponent(\n webComponentName: string,\n divHostElement: HTMLDivElement,\n context: IManagedObject\n ) {\n const webComponent: WebcomponentContext = document.createElement<any>(webComponentName);\n webComponent.c8yContext = context;\n divHostElement.appendChild(webComponent);\n return webComponent;\n }\n\n private mapErrorEventToAlert(event: PromiseRejectionEvent | ErrorEvent): Alert {\n const hasReason = 'reason' in event;\n if (hasReason && event.reason?.name === ReferenceError.name) {\n const undefinedVar = event.reason.message.split(' ')[0];\n return { text: undefinedVar + ' is not defined', type: 'info' };\n }\n return { text: hasReason ? event.reason.message : event.message, type: 'danger' };\n }\n\n private getCode() {\n const isDevMode = this.config.devMode;\n if (isDevMode) {\n return this.config.code;\n }\n return this.createDefaultWebcomponentCode();\n }\n\n private async generateHash(value: string, useSalt: boolean): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(value + (useSalt ? Math.random() : ''));\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map(byte => byte.toString(16).padStart(2, '0')).join('');\n return hashHex;\n }\n\n private createDefaultWebcomponentCode(): string {\n if (this.config.legacy) {\n const legacyWebComponent = legacyTemplate(\n this.config.options.advancedSecurity\n ? this.sanitizer.sanitize(SecurityContext.HTML, this.config.code)\n : this.config.code,\n this.device?.id,\n this.device?.name\n );\n return legacyWebComponent;\n }\n\n const webComponentScript = webComponentTemplate(\n this.config.options.advancedSecurity\n ? this.sanitizer.sanitize(SecurityContext.HTML, this.config.code)\n : this.config.code,\n this.config.options.advancedSecurity\n ? this.sanitizer.sanitize(SecurityContext.STYLE, this.config.css)\n : this.config.css,\n this.config.options.cssEncapsulation\n );\n return webComponentScript;\n }\n}\n","<ng-container *ngFor=\"let alert of alerts\">\n <div\n class=\"alert m-8\"\n role=\"alert\"\n [ngClass]=\"{\n 'alert-danger': alert.type === 'danger',\n 'alert-warning': alert.type === 'warning',\n 'alert-info': alert.type === 'info',\n 'alert-success': alert.type === 'success'\n }\"\n >\n <p><strong translate>There was an issue in the HTML widget:</strong></p>\n <pre>{{ alert.text }}</pre>\n </div>\n</ng-container>\n<div\n class=\"fit-w fit-h\"\n #hostElement\n></div>\n","import { Component, inject, Input, OnDestroy, SimpleChanges, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { C8yTranslatePipe, IconDirective, LoadingComponent, TabsModule } from '@c8y/ngx-components';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { WidgetConfigFeedbackComponent } from '@c8y/ngx-components/context-dashboard';\nimport { EditorComponent } from '@c8y/ngx-components/editor';\nimport type * as Monaco from 'monaco-editor';\nimport { Subject } from 'rxjs';\nimport { HtmlWidgetConfigService } from '../html-widget-config.service';\nimport { HtmlWidget } from '../html-widget.model';\nimport { AdvancedSettingsComponent } from '../advanced-settings/advanced-settings.component';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\n@Component({\n standalone: true,\n imports: [\n EditorComponent,\n FormsModule,\n IconDirective,\n C8yTranslatePipe,\n WidgetConfigFeedbackComponent,\n TabsModule,\n TooltipModule,\n PopoverModule,\n LoadingComponent,\n AdvancedSettingsComponent\n ],\n selector: 'c8y-widget-code-editor',\n templateUrl: './widget-code-editor.component.html'\n})\nexport class WidgetCodeEditorComponent implements OnDestroy {\n @Input()\n mode: 'code' | 'css' = 'code';\n\n @Input()\n config: HtmlWidget;\n\n @ViewChild(EditorComponent) editorComponent!: EditorComponent;\n\n configService = inject(HtmlWidgetConfigService);\n\n editor: Monaco.editor.IStandaloneCodeEditor;\n isAutoSaveEnabled = true;\n language: 'html' | 'css' | 'javascript' = 'html';\n value: string;\n isLoading = false;\n\n readonly TAB_WEBCOMPONENT_LABEL = gettext('Web Component`Tab label of HTML Widget`');\n readonly TAB_HTML_LABEL = gettext('HTML`Tab label of HTML Widget`');\n readonly TAB_CSS_LABEL = gettext('CSS`Tab label of HTML Widget`');\n readonly BUTTON_DISABLE_AUTOSAVE_LABEL = gettext(\n 'Disable auto save`An action you can do on the html widget editor`'\n );\n readonly BUTTON_ENABLE_AUTOSAVE_LABEL = gettext(\n 'Enable auto save`An action you can do on the html widget editor`'\n );\n readonly TAB_OUTLET_NAME = 'html-widget-tab-outlet';\n\n private destroy$ = new Subject<void>();\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.config) {\n this.changeCode(this.config.code);\n }\n\n if (changes.config?.currentValue) {\n this.loadCode();\n }\n }\n\n loadCode() {\n this.isLoading = true;\n const isInDevMode = this.config?.devMode;\n this.language = 'html';\n\n if (isInDevMode) {\n this.language = 'javascript';\n }\n\n if (this.mode === 'css') {\n this.language = 'css';\n }\n\n this.value = this.mode === 'code' ? this.config.code : this.config.css;\n\n this.isLoading = false;\n\n if (this.editor) {\n queueMicrotask(() => this.formatCode());\n }\n }\n\n switchMode(mode: 'code' | 'css') {\n this.mode = mode;\n this.loadCode();\n }\n\n editorLoaded(editor: Monaco.editor.IStandaloneCodeEditor) {\n this.editor = editor;\n const monaco = this.editorComponent.monaco;\n this.editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => {\n this.saveCode();\n });\n }\n\n formatCode() {\n this.editor.getAction('editor.action.formatDocument').run();\n }\n\n redo() {\n this.editor.trigger('keyboard', 'redo', null);\n }\n\n undo() {\n this.editor.trigger('keyboard', 'undo', null);\n }\n\n changeCode($event: string) {\n if (this.isAutoSaveEnabled) {\n this.saveCode($event);\n }\n }\n\n saveCode(codeStr?: string) {\n const code = codeStr || this.editor.getValue();\n if (this.mode === 'code') {\n this.configService.changeCode(code);\n return;\n }\n this.configService.changeCss(code);\n }\n}\n","<c8y-widget-config-feedback>\n <div class=\"d-flex\">\n @if (config?.devMode && !config?.legacy) {\n <span\n class=\"tag tag--warning text-12\"\n translate\n >\n Advanced developer mode\n </span>\n }\n </div>\n <div class=\"d-flex\">\n @if (config?.legacy) {\n <span\n class=\"tag tag--warning text-12\"\n [title]=\"\n 'This widget is in legacy mode. Consider to upgrade this to a new HTML widget. Read our documentation on details to transform your widget'\n | translate\n \"\n translate\n >\n Legacy mode\n </span>\n }\n </div>\n</c8y-widget-config-feedback>\n\n<div class=\"d-flex d-col fit-h fit-w\">\n <c8y-html-widget-advanced-settings\n [devMode]=\"config?.devMode\"\n [cssEncapsulation]=\"config?.options?.cssEncapsulation\"\n ></c8y-html-widget-advanced-settings>\n\n <fieldset class=\"c8y-fieldset p-0 overflow-hidden\">\n <legend class=\"m-l-16 p-l-0\">{{ 'Code' | translate }}</legend>\n\n <div class=\"btn-group btn-group-sm m-l-0 p-t-8 p-b-8 p-l-16 p-r-16 fit-w d-flex\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Undo' | translate\"\n [tooltip]=\"'Undo' | translate\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"undo()\"\n >\n <i [c8yIcon]=\"'undo'\"></i>\n </button>\n\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Redo' | translate\"\n [tooltip]=\"'Redo' | translate\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"redo()\"\n >\n <i [c8yIcon]=\"'redo'\"></i>\n </button>\n\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Format code' | translate\"\n [tooltip]=\"'Format code' | translate\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"formatCode()\"\n >\n <i [c8yIcon]=\"'format-align-left'\"></i>\n </button>\n\n <label class=\"c8y-switch m-l-auto\">\n <input\n type=\"checkbox\"\n [checked]=\"isAutoSaveEnabled\"\n (change)=\"isAutoSaveEnabled = !isAutoSaveEnabled\"\n />\n <span></span>\n <span translate>Auto save</span>\n </label>\n </div>\n\n <div\n class=\"btn-toolbar m-0 p-relative\"\n role=\"toolbar\"\n >\n <c8y-tabs-outlet\n class=\"elevation-none\"\n [outletName]=\"TAB_OUTLET_NAME\"\n [orientation]=\"'horizontal'\"\n [openFirstTab]=\"false\"\n ></c8y-tabs-outlet>\n <c8y-tab\n [icon]=\"'code'\"\n [label]=\"(config?.devMode ? TAB_WEBCOMPONENT_LABEL : TAB_HTML_LABEL) | translate\"\n [priority]=\"100\"\n [showAlways]=\"true\"\n [tabsOutlet]=\"TAB_OUTLET_NAME\"\n [isActive]=\"mode === 'code'\"\n (onSelect)=\"switchMode('code')\"\n ></c8y-tab>\n @if (!config?.devMode && !config?.legacy) {\n <c8y-tab\n [icon]=\"'c8y-css'\"\n [label]=\"TAB_CSS_LABEL | translate\"\n [priority]=\"0\"\n [tabsOutlet]=\"TAB_OUTLET_NAME\"\n [isActive]=\"mode === 'css'\"\n (onSelect)=\"switchMode('css')\"\n ></c8y-tab>\n }\n </div>\n\n @if (!isLoading) {\n @if (!(mode === 'css' && config?.devMode)) {\n <c8y-editor\n class=\"flex-grow d-block\"\n style=\"height: 450px\"\n [ngModel]=\"value\"\n (ngModelChange)=\"changeCode($event)\"\n [editorOptions]=\"{\n language,\n tabSize: 2,\n insertSpaces: true,\n minimap: { enabled: false }\n }\"\n (editorInit)=\"editorLoaded($event)\"\n ></c8y-editor>\n }\n } @else {\n <c8y-loading></c8y-loading>\n }\n </fieldset>\n</div>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, inject, OnDestroy, TemplateRef, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { OptionsService } from '@c8y/ngx-components';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { HtmlFrameComponent } from './html-frame/html-frame.component';\nimport { HtmlWidgetConfigService } from './html-widget-config.service';\nimport { WidgetCodeEditorComponent } from './widget-code-editor-section/widget-code-editor.component';\n\n@Component({\n selector: 'c8y-html-widget-config',\n templateUrl: './html-widget-config.component.html',\n standalone: true,\n imports: [RouterModule, FormsModule, AsyncPipe, HtmlFrameComponent, WidgetCodeEditorComponent]\n})\nexport class HtmlWidgetConfigComponent implements OnDestroy {\n @ViewChild('htmlPreview')\n set htmlPreviewTemplate(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n } else {\n this.widgetConfigService.setPreview(null);\n }\n }\n options = inject(OptionsService);\n htmlWidgetConfigService = inject(HtmlWidgetConfigService);\n widgetConfigService = inject(WidgetConfigService);\n\n ngOnDestroy(): void {\n // sadly the service is component scoped\n // but still not recycled correctly. That is why we do\n // it here.\n this.htmlWidgetConfigService.destroy();\n }\n}\n","<c8y-widget-code-editor\n [config]=\"htmlWidgetConfigService.config$ | async\"\n [mode]=\"'code'\"\n></c8y-widget-code-editor>\n\n<ng-template #htmlPreview>\n <c8y-html-frame\n [config]=\"htmlWidgetConfigService.codeEditorChangeConfig$ | async\"\n [device]=\"(widgetConfigService.currentConfig$ | async).device\"\n [useSalt]=\"true\"\n ></c8y-html-frame>\n</ng-template>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, inject } from '@angular/core';\nimport { C8yTranslatePipe, ClipboardService } from '@c8y/ngx-components';\nimport {\n AssetPropertyActionDirective,\n AssetPropertyListComponent,\n AssetPropertyType\n} from '@c8y/ngx-components/asset-properties';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\n\n@Component({\n selector: 'c8y-html-widget-properties-selector',\n templateUrl: './html-widget-properties-selector.component.html',\n host: {\n class: 'bg-level-1'\n },\n standalone: true,\n imports: [\n AssetPropertyListComponent,\n AssetPropertyActionDirective,\n AsyncPipe,\n C8yTranslatePipe,\n PopoverModule,\n TooltipModule\n ]\n})\nexport class HtmlWidgetPropertiesSelectorComponent {\n widgetConfigService = inject(WidgetConfigService);\n clipboardService = inject(ClipboardService);\n\n /**\n * Copies the property path to the clipboard in a format suitable for use in HTML widget.\n * For nested properties, it uses the keyPath to create a path to nested property.\n * @param context The context containing the property information.\n */\n async copyProperty(context: AssetPropertyType) {\n const nonAlphanumericRegex = /[^a-zA-Z0-9]/;\n let path: string;\n if (context.keyPath) {\n path = context.keyPath\n .map(key => (nonAlphanumericRegex.test(key) ? `['${key}']` : `.${key}`))\n .join('');\n } else {\n path = nonAlphanumericRegex.test(context.name) ? `['${context.name}']` : `.${context.name}`;\n }\n const content = '${this.c8yContext' + path + '}';\n await this.clipboardService.writeText(content);\n }\n}\n","<div\n class=\"d-flex m-b-8\"\n style=\"margin-top: -16px\"\n>\n <em\n class=\"m-l-24 text-muted\"\n translate\n >\n How to use properties in the widget\n </em>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"helpContent\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n</div>\n<c8y-asset-property-list\n class=\"inner-scroll bg-inherit d-block\"\n style=\"max-height: 450px\"\n [asset]=\"(widgetConfigService.currentConfig$ | async).device\"\n [config]=\"{\n selectMode: 'none',\n expansionMode: 'expandedByDefault',\n filterable: false,\n allowDragAndDrop: true\n }\"\n>\n <button\n class=\"btn-dot btn fit-h\"\n [attr.aria-label]=\"'Copy' | translate\"\n tooltip=\"{{ 'Copy' | translate }}\"\n type=\"button\"\n *c8yAssetPropertyAction=\"let context\"\n [delay]=\"500\"\n (click)=\"copyProperty(context)\"\n >\n <i class=\"dlt-c8y-icon-copy\"></i>\n </button>\n</c8y-asset-property-list>\n\n<ng-template #helpContent>\n <p\n class=\"p-b-8\"\n translate\n >\n Click the copy icon next to a property, then paste it into the HTML editor below as a template\n literal.\n </p>\n</ng-template>\n","import { Component, Input } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { ContextWidgetConfig } from '@c8y/ngx-components/context-dashboard';\nimport { HtmlFrameComponent } from './html-frame/html-frame.component';\nimport { HtmlWidget, HtmlWidgetConfig } from './html-widget.model';\n\n@Component({\n selector: 'c8y-html-widget',\n templateUrl: './html-widget.component.html',\n standalone: true,\n imports: [RouterModule, HtmlFrameComponent]\n})\nexport class HtmlWidgetComponent {\n @Input() config: HtmlWidgetConfig;\n\n ngOnInit(): void {\n if (this.config.html && !this.config.config) {\n this.config.config = this.mapLegacyConfig(this.config);\n }\n }\n\n private mapLegacyConfig(current: ContextWidgetConfig): HtmlWidget {\n const isAlreadyInAdvancedMode = current?.config?.devMode === true;\n if (isAlreadyInAdvancedMode) {\n return current.config as HtmlWidget;\n }\n return {\n code: current.html,\n css: '',\n legacy: true,\n devMode: false,\n options: {\n cssEncapsulation: false,\n advancedSecurity: current.sanitization === 'strict'\n }\n };\n }\n}\n","<c8y-html-frame\n [config]=\"config.config\"\n [device]=\"config.device\"\n></c8y-html-frame>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["isEmpty","i1","i2"],"mappings":"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"}
|