@c8y/ngx-components 1023.90.1 → 1023.96.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/ai/agents/scada/index.d.ts +10 -0
  2. package/ai/agents/scada/index.d.ts.map +1 -0
  3. package/ai/ai-chat/index.d.ts +1 -1
  4. package/ai/ai-chat/index.d.ts.map +1 -1
  5. package/auth-configuration/index.d.ts +19 -1
  6. package/auth-configuration/index.d.ts.map +1 -1
  7. package/computed-asset-properties/index.d.ts +89 -1
  8. package/computed-asset-properties/index.d.ts.map +1 -1
  9. package/context-dashboard/index.d.ts +18 -8
  10. package/context-dashboard/index.d.ts.map +1 -1
  11. package/echart/index.d.ts +1 -1
  12. package/echart/models/index.d.ts +1 -1
  13. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs +2 -2
  14. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs.map +1 -1
  15. package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs +893 -0
  16. package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs.map +1 -0
  17. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs +1 -0
  18. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs.map +1 -1
  19. package/fesm2022/c8y-ngx-components-asset-properties.mjs +2 -2
  20. package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +73 -7
  22. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  23. package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-Cy9R6Ixb.mjs → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CHZX7ALq.mjs} +10 -9
  24. package/fesm2022/c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CHZX7ALq.mjs.map +1 -0
  25. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-LrmlAh6V.mjs → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DgWGXzEx.mjs} +2 -2
  26. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-LrmlAh6V.mjs.map → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DgWGXzEx.mjs.map} +1 -1
  27. package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-f1u1TcCl.mjs → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-yfc45-l_.mjs} +2 -2
  28. package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-f1u1TcCl.mjs.map → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-yfc45-l_.mjs.map} +1 -1
  29. package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs +1 -1
  30. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +44 -36
  31. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  32. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
  33. package/fesm2022/c8y-ngx-components-echart.mjs +1 -1
  34. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  35. package/fesm2022/c8y-ngx-components-global-context.mjs +112 -22
  36. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  37. package/fesm2022/c8y-ngx-components-repository-configuration.mjs +292 -115
  38. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  39. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +2 -2
  40. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  41. package/fesm2022/c8y-ngx-components-repository-software.mjs +1 -1
  42. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  43. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +2 -1
  44. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
  45. package/fesm2022/c8y-ngx-components-widgets-definitions-scada.mjs +169 -0
  46. package/fesm2022/c8y-ngx-components-widgets-definitions-scada.mjs.map +1 -0
  47. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +2 -1
  48. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  49. package/fesm2022/c8y-ngx-components-widgets-exports.mjs +8 -1
  50. package/fesm2022/c8y-ngx-components-widgets-exports.mjs.map +1 -1
  51. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +2 -2
  52. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  53. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +3 -3
  54. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  55. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs +2 -2
  56. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs.map +1 -1
  57. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +2 -2
  58. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  59. package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs +2 -2
  60. package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs.map +1 -1
  61. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +90 -32
  62. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
  63. package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs +2 -2
  64. package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
  65. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs +1698 -0
  66. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs.map +1 -0
  67. package/fesm2022/c8y-ngx-components.mjs +193 -40
  68. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  69. package/global-context/index.d.ts +58 -3
  70. package/global-context/index.d.ts.map +1 -1
  71. package/index.d.ts +77 -22
  72. package/index.d.ts.map +1 -1
  73. package/locales/de.po +170 -10
  74. package/locales/es.po +170 -10
  75. package/locales/fr.po +170 -10
  76. package/locales/ja_JP.po +162 -9
  77. package/locales/ko.po +170 -10
  78. package/locales/locales.pot +212 -7
  79. package/locales/nl.po +170 -10
  80. package/locales/pl.po +170 -10
  81. package/locales/pt_BR.po +170 -10
  82. package/locales/zh_CN.po +170 -10
  83. package/locales/zh_TW.po +170 -10
  84. package/package.json +1 -1
  85. package/repository/configuration/index.d.ts +64 -39
  86. package/repository/configuration/index.d.ts.map +1 -1
  87. package/widgets/cockpit-exports/index.d.ts +6 -0
  88. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  89. package/widgets/definitions/index.d.ts +1 -0
  90. package/widgets/definitions/index.d.ts.map +1 -1
  91. package/widgets/definitions/scada/index.d.ts +6 -0
  92. package/widgets/definitions/scada/index.d.ts.map +1 -0
  93. package/widgets/device-management-exports/index.d.ts +6 -0
  94. package/widgets/device-management-exports/index.d.ts.map +1 -1
  95. package/widgets/exports/index.d.ts +8 -1
  96. package/widgets/exports/index.d.ts.map +1 -1
  97. package/widgets/implementations/html-widget/index.d.ts +30 -12
  98. package/widgets/implementations/html-widget/index.d.ts.map +1 -1
  99. package/widgets/implementations/scada/index.d.ts +415 -0
  100. package/widgets/implementations/scada/index.d.ts.map +1 -0
  101. package/fesm2022/c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-Cy9R6Ixb.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c8y-ngx-components-widgets-implementations-scada.mjs","sources":["../../widgets/implementations/scada/scada-widget-config/scada.model.ts","../../widgets/implementations/scada/scada-widget.service.ts","../../widgets/implementations/scada/scada-widget-config/lit-helpers.ts","../../widgets/implementations/scada/scada-widget-config/scada-widget-config.service.ts","../../widgets/implementations/scada/scada-widget-config/scada-ai-chat-tool-details.component.ts","../../widgets/implementations/scada/scada-widget-config/scada-ai-chat-tool-details.component.html","../../widgets/implementations/scada/scada-widget-config/scada-widget-svg-selector.component.ts","../../widgets/implementations/scada/scada-widget-config/scada-widget-svg-selector.component.html","../../widgets/implementations/scada/scada-widget-config/scada-widget-placeholder-modal.component.ts","../../widgets/implementations/scada/scada-widget-view/scada-widget-view.component.ts","../../widgets/implementations/scada/scada-widget-view/scada-widget-view.component.html","../../widgets/implementations/scada/scada-widget-config/scada-widget-advanced-editor.component.ts","../../widgets/implementations/scada/scada-widget-config/scada-widget-advanced-editor.component.html","../../widgets/implementations/scada/c8y-ngx-components-widgets-implementations-scada.ts"],"sourcesContent":["import { IIdentified } from '@c8y/client';\nimport type { HtmlWidgetConfig } from '@c8y/ngx-components/widgets/implementations/html-widget';\nimport { AssetPropertyMappings, ContextWidgetConfig } from '@c8y/ngx-components/context-dashboard';\nimport { C8yPropertyType } from '@c8y/ngx-components';\n\nexport const SCADA_WIDGET_FEATURE_FLAG_NAME = 'ui.scada-widget.v2';\n\nexport interface ScadaWidgetConfig extends ContextWidgetConfig {\n config: {\n htmlWidgetConfig: HtmlWidgetConfig;\n mappings: AssetPropertyMappings;\n svgDisplaySettings?: SvgDisplaySettings;\n };\n}\n\nexport type DisplayOption = 'contain' | 'full-width';\nexport type HorizontalAlignment = 'left' | 'center' | 'right';\nexport type VerticalAlignment = 'top' | 'center' | 'bottom';\n\nexport interface SvgDisplaySettings {\n displayOption: DisplayOption;\n horizontalAlignment: HorizontalAlignment;\n verticalAlignment: VerticalAlignment;\n}\n\nexport interface SvgComputedStyling {\n svgWidth: string;\n svgHeight: string;\n svgMaxWidth: string;\n svgMaxHeight: string;\n /** null means the preserveAspectRatio attribute should be removed */\n preserveAspectRatio: string | null;\n containerDisplay: string;\n containerJustifyContent: string;\n containerAlignItems: string;\n containerOverflow: string;\n containerHeight: string;\n containerBoxSizing: string;\n}\n\nexport const defaultDisplayOption: DisplayOption = 'full-width';\nexport const defaultAlignment = 'center';\n\n// For backward compatibility with old SCADA widget configurations:\n\nexport interface ScadaWidgetConfigLegacy {\n binaryId: string;\n sanitization: 'strict' | 'lax' | 'none';\n device: Pick<IIdentified, 'id' | 'name'>;\n deviceIds: { [placeholderName: string]: string };\n mapping: { [placeholderName: string]: LegacyMapping };\n}\n\nexport type LegacyMapping = LegacyMappingBase | LegacyMappingComputed | LegacyMappingFieldbus;\n\nexport interface LegacyMappingBase {\n id: string;\n keyPath: string[];\n label: string;\n type: C8yPropertyType;\n}\n\nexport interface LegacyMappingComputed extends LegacyMappingBase {\n computed: true;\n configSchema: object;\n config: {\n _id: string;\n [key: string]: any;\n };\n}\n\nexport interface LegacyMappingFieldbus {\n fieldbus: true;\n id: string;\n keyPath: [string, string];\n label: string;\n}\n\nexport interface ActiveAlarmsStatus {\n critical: number;\n major: number;\n minor: number;\n warning: number;\n}\n\nexport const INITIAL_SVG_CODE = `<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<svg width=\"600px\" height=\"1350px\" viewBox=\"0 0 600 1350\" xmlns=\"http://www.w3.org/2000/svg\">\n <style>\n /* Typography */\n .header {\n font-family: var(--c8y-font-family-base);\n font-size: 28px;\n font-weight: bold;\n fill: var(--text-color, var(--c8y-component-color-default, var(--c8y-root-component-color-default)));\n }\n .branded {\n fill: var(--brand-primary,var(--c8y-brand-primary));\n }\n .step-number {\n font-family: var(--c8y-font-family-base);\n font-size: 18px;\n font-weight: bold;\n fill: var(--c8y-component-background-default, var(--c8y-root-component-background-default));\n }\n .step-title {\n font-family: var(--c8y-font-family-base);\n font-size: 16px;\n font-weight: bold;\n fill: var(--text-color, var(--c8y-component-color-default, var(--c8y-root-component-color-default)));\n }\n .description {\n font-family: var(--c8y-font-family-base);\n font-size: 14px;\n }\n .placeholder {\n font-family: var(--c8y-font-family-base);\n font-size: 14px;\n fill: var(--brand-primary,var(--c8y-brand-primary));\n font-weight: bold;\n }\n .code {\n font-family: var(--c8y-font-family-mono-spaced);\n font-size: 12px;\n fill: var(--c8y-code-color);\n }\n .label {\n font-family: var(--c8y-font-family-base);\n font-size: 13px;\n fill: var(--text-color, var(--c8y-component-color-default, var(--c8y-root-component-color-default)));\n }\n \n /* Components */\n .section-bg {\n fill: var(--c8y-pre-background);\n stroke: var(--c8y-pre-border-color);\n stroke-width: 1px;\n rx: 4px;\n }\n .step-circle {\n fill: var(--brand-primary,var(--c8y-brand-primary));\n }\n .code-bg {\n fill: #0000000d;\n stroke: transparent;\n stroke-width: 1px;\n rx: 13px;\n }\n .button{\n cursor: pointer;\n }\n .button-bg {\n fill: var(--brand-primary,var(--c8y-brand-primary));\n rx: var(--c8y-btn-border-radius-base);\n stroke: var(--brand-primary,var(--c8y-brand-primary));\n stroke-width: 1px;\n }\n .button-text {\n font-family: inherit;\n font-size: 14px;\n fill: var(--c8y-component-background-default, var(--c8y-root-component-background-default));\n text-anchor: middle;\n }\n .button:hover .button-bg {\n fill: var(--c8y-component-background-default, var(--c8y-root-component-background-default));\n }\n .button:hover .button-text {\n fill: var(--brand-primary,var(--c8y-brand-primary));\n }\n .divider {\n stroke: var(--c8y-component-border-color, var(--c8y-root-component-border-color));\n stroke-width: 2px;\n }\n \n /* Alarm status indicators */\n .alarm-none {\n fill: var(--c8y-palette-status-success);\n }\n .alarm-warning {\n fill: var(--c8y-palette-status-info);\n }\n .alarm-minor {\n fill: var(--c8y-palette-status-warning-high);\n }\n .alarm-major {\n fill: var(--c8y-palette-status-warning);\n }\n .alarm-critical {\n fill: var(--c8y-palette-status-danger);\n }\n \n /* Conditional text colors */\n .temp-ok {\n fill: var(--c8y-palette-status-success);\n }\n .temp-warning {\n fill:var(--c8y-palette-status-danger);\n }\n </style>\n \n <!-- Background -->\n <rect width=\"600\" height=\"1400\" fill=\"var(--c8y-component-background-default, var(--c8y-root-component-background-default))\" />\n \n <!-- Header -->\n <text x=\"40\" y=\"50\" class=\"header\">SCADA widget example</text>\n \n <text x=\"40\" y=\"90\" class=\"description\">Follow these steps to customize your visualization</text>\n \n <!-- Divider -->\n <line x1=\"40\" y1=\"110\" x2=\"560\" y2=\"110\" class=\"divider\" />\n \n <!-- STEP 1: SVG configuration -->\n <circle cx=\"55\" cy=\"150\" r=\"15\" class=\"step-circle\" />\n <text x=\"55\" y=\"157\" class=\"step-number\" text-anchor=\"middle\">1</text>\n <text x=\"85\" y=\"155\" class=\"step-title\">SVG configuration</text>\n \n <text x=\"85\" y=\"180\" class=\"description\">Use \"SVG configuration\" section to upload a file, paste code, or generate with AI.</text>\n \n <!-- STEP 2: Add Placeholders -->\n <circle cx=\"55\" cy=\"230\" r=\"15\" class=\"step-circle\" />\n <text x=\"55\" y=\"237\" class=\"step-number\" text-anchor=\"middle\">2</text>\n <text x=\"85\" y=\"235\" class=\"step-title\">Add placeholders</text>\n \n <text x=\"85\" y=\"260\" class=\"description\">Click on a text or tspan element in the preview to convert it into a placeholder.</text>\n \n <rect x=\"85\" y=\"280\" width=\"475\" height=\"80\" class=\"section-bg\" />\n <text x=\"100\" y=\"305\" class=\"label\">Example - click text below to make it dynamic:</text>\n <text x=\"100\" y=\"330\" class=\"placeholder\"><tspan>Device name</tspan> (<tspan>Device ID</tspan>)</text>\n \n <!-- STEP 3: Configure Data Binding -->\n <circle cx=\"55\" cy=\"395\" r=\"15\" class=\"step-circle\" />\n <text x=\"55\" y=\"402\" class=\"step-number\" text-anchor=\"middle\">3</text>\n <text x=\"85\" y=\"400\" class=\"step-title\">Configure data binding</text>\n \n <text x=\"85\" y=\"425\" class=\"description\">Assign asset properties to placeholders in the \"Placeholder mappings\" section</text>\n <text x=\"85\" y=\"445\" class=\"description\">to see their values in the preview.</text>\n \n <!-- Example with actual placeholders -->\n <rect x=\"40\" y=\"470\" width=\"520\" height=\"120\" class=\"section-bg\" />\n <text x=\"60\" y=\"495\" class=\"label\">Examples:</text>\n \n <text x=\"60\" y=\"525\" class=\"label\">Device name:</text>\n <text x=\"180\" y=\"525\" class=\"placeholder\">\\${this.c8yScadaValues?.deviceName || '-'}</text>\n\n <text x=\"60\" y=\"550\" class=\"label\">Temperature:</text>\n <text x=\"180\" y=\"550\" class=\"placeholder\">\\${this.c8yScadaValues?.temperature || '-'} °C</text>\n\n <text x=\"60\" y=\"575\" class=\"label\">Status:</text>\n <text x=\"180\" y=\"575\" class=\"placeholder\">\\${this.c8yScadaValues?.status || '-'}</text>\n\n <!-- STEP 4: Advanced Customization -->\n <circle cx=\"55\" cy=\"630\" r=\"15\" class=\"step-circle\" />\n <text x=\"55\" y=\"637\" class=\"step-number\" text-anchor=\"middle\">4</text>\n <text x=\"85\" y=\"635\" class=\"step-title\">Advanced: Edit component code</text>\n\n <text x=\"85\" y=\"660\" class=\"description\">Open \"Advanced editor\" section to customize the web component directly.</text>\n \n <!-- Advanced Examples -->\n <rect x=\"40\" y=\"690\" width=\"520\" height=\"630\" class=\"section-bg\" />\n <text x=\"60\" y=\"715\" class=\"label\">Advanced examples (see implementation in the editor):</text>\n \n <!-- Example 1a: Interactive Button - Device Details -->\n <text x=\"60\" y=\"745\" class=\"description\">• Button navigating to device details:</text>\n <g class=\"button\" @click=\\${() => this.c8yScadaFunctions?.goToDeviceDetails(this.c8yScadaValues?.deviceId)}>\n <rect x=\"70\" y=\"755\" width=\"200\" height=\"35\" class=\"button-bg\" />\n <text x=\"170\" y=\"777\" class=\"button-text\">Go to device details</text>\n </g>\n\n <!-- Example 1b: Interactive Button - Group Details -->\n <text x=\"60\" y=\"820\" class=\"description\">• Button navigating to group details:</text>\n <g class=\"button\" @click=\\${() => this.c8yScadaFunctions?.goToGroupDetails(this.c8yScadaValues?.groupId)}>\n <rect x=\"70\" y=\"830\" width=\"200\" height=\"35\" class=\"button-bg\" />\n <text x=\"170\" y=\"852\" class=\"button-text\">Go to group details</text>\n </g>\n\n <!-- Example 2: Conditional Styling -->\n <text x=\"60\" y=\"895\" class=\"description\">• Conditional styling based on temperature range:</text>\n <text x=\"70\" y=\"920\" \n class=\"\\${(this.c8yScadaValues?.temperature >= 20 && this.c8yScadaValues?.temperature <= 30) ? 'temp-ok' : 'temp-warning'}\"\n font-size=\"14px\"\n font-weight=\"bold\">\n Green if temperature is between 20 and 30 °C, otherwise red.\n </text>\n \n <!-- Example 3: Dynamic Width Progress Bar -->\n <text x=\"60\" y=\"975\" class=\"description\">• Dynamic calculations (progress bar):</text>\n <rect x=\"70\" y=\"985\" width=\"400\" height=\"25\" class=\"code-bg\" />\n <rect x=\"70\" y=\"985\" \n width=\"\\${Math.min((this.c8yScadaValues?.progress || 0) * 4, 400)}\" \n height=\"25\" \n fill=\"var(--brand-primary,var(--c8y-brand-primary))\" \n rx=\"13\" />\n <text x=\"480\" y=\"1000\" class=\"label\">\\${this.c8yScadaValues?.progress || 0}%</text>\n \n <!-- Example 4: Alarm Status Circle -->\n <text x=\"60\" y=\"1040\" class=\"description\">• Alarm status indicator using getActiveAlarmsStatusClass():</text>\n <circle cx=\"80\" cy=\"1065\" r=\"12\" \n class=\"\\${this.c8yScadaFunctions?.getActiveAlarmsStatusClass ? 'alarm-' + this.c8yScadaFunctions.getActiveAlarmsStatusClass(this.c8yScadaValues?.alarmsStatus) : 'alarm-none'}\" />\n <text x=\"100\" y=\"1070\" class=\"label\">\n Alarm status:\n \\${this.c8yScadaValues?.alarmsStatus?.critical > 0 ? 'CRITICAL' : this.c8yScadaValues?.alarmsStatus?.major > 0 ? 'MAJOR' : this.c8yScadaValues?.alarmsStatus?.minor > 0 ? 'MINOR' : this.c8yScadaValues?.alarmsStatus?.warning > 0 ? 'WARNING' : 'OK'}\n </text>\n \n <!-- Legend for alarm colors -->\n <text x=\"70\" y=\"1110\" class=\"label\">Alarm color legend:</text>\n <circle cx=\"80\" cy=\"1130\" r=\"8\" class=\"alarm-none\" />\n <text x=\"95\" y=\"1135\" class=\"description\">OK</text>\n \n <circle cx=\"150\" cy=\"1130\" r=\"8\" class=\"alarm-warning\" />\n <text x=\"165\" y=\"1135\" class=\"description\">Warning</text>\n \n <circle cx=\"240\" cy=\"1130\" r=\"8\" class=\"alarm-minor\" />\n <text x=\"255\" y=\"1135\" class=\"description\">Minor</text>\n \n <circle cx=\"320\" cy=\"1130\" r=\"8\" class=\"alarm-major\" />\n <text x=\"335\" y=\"1135\" class=\"description\">Major</text>\n \n <circle cx=\"400\" cy=\"1130\" r=\"8\" class=\"alarm-critical\" />\n <text x=\"415\" y=\"1135\" class=\"description\">Critical</text>\n \n <!-- Additional examples info -->\n <rect x=\"70\" y=\"1170\" width=\"460\" height=\"130\" fill=\"var(--c8y-palette-status-info-light)\" stroke=\"var(--c8y-palette-status-info)\" stroke-width=\"1\" rx=\"4\" />\n <text x=\"85\" y=\"1195\" class=\"label\" font-weight=\"bold\">💡 Tips for advanced usage:</text>\n <text x=\"85\" y=\"1220\" class=\"description\">• Use this.c8yScadaValues to access placeholder values</text>\n <text x=\"85\" y=\"1240\" class=\"description\">• Use this.c8yScadaFunctions for navigation and utilities</text>\n <text x=\"85\" y=\"1260\" class=\"description\">• Combine template literals \\\\\\${ } with conditional logic</text>\n <text x=\"85\" y=\"1280\" class=\"description\">• Apply CSS classes dynamically for styling</text>\n</svg>\n`;\n","import { Injectable } from '@angular/core';\nimport { IIdentified } from '@c8y/client';\nimport {\n ActiveAlarmsStatus,\n DisplayOption,\n HorizontalAlignment,\n SvgComputedStyling,\n SvgDisplaySettings,\n VerticalAlignment\n} from './scada-widget-config/scada.model';\n\n@Injectable()\nexport class ScadaWidgetService {\n getScadaFunctions() {\n return {\n goToGroupDetails: (groupId: IIdentified['id']) => {\n window.location.hash = `/group/${groupId}`;\n },\n goToDeviceDetails: (deviceId: IIdentified['id']) => {\n window.location.hash = `/device/${deviceId}`;\n },\n getActiveAlarmsStatusClass: (\n activeAlarmsStatus: ActiveAlarmsStatus\n ): keyof ActiveAlarmsStatus | 'none' => {\n const severities: Array<keyof ActiveAlarmsStatus> = [\n 'critical',\n 'major',\n 'minor',\n 'warning'\n ];\n for (const severity of severities) {\n if (activeAlarmsStatus?.[severity] > 0) {\n return severity;\n }\n }\n return 'none';\n }\n };\n }\n\n getSvgComputedStyling(settings: SvgDisplaySettings | null | undefined): SvgComputedStyling {\n const displayOption: DisplayOption = settings?.displayOption ?? 'full-width';\n const hAlign: HorizontalAlignment = settings?.horizontalAlignment ?? 'center';\n const vAlign: VerticalAlignment = settings?.verticalAlignment ?? 'center';\n\n if (!settings || displayOption === 'full-width') {\n return {\n svgWidth: '100%',\n svgHeight: '',\n svgMaxWidth: '',\n svgMaxHeight: '',\n preserveAspectRatio: null,\n containerDisplay: '',\n containerJustifyContent: '',\n containerAlignItems: '',\n containerOverflow: '',\n containerHeight: '100%',\n containerBoxSizing: 'border-box'\n };\n }\n\n const hFlex: Record<HorizontalAlignment, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end'\n };\n const vFlex: Record<VerticalAlignment, string> = {\n top: 'flex-start',\n center: 'center',\n bottom: 'flex-end'\n };\n const hPar: Record<HorizontalAlignment, string> = { left: 'Min', center: 'Mid', right: 'Max' };\n const vPar: Record<VerticalAlignment, string> = { top: 'Min', center: 'Mid', bottom: 'Max' };\n const parBase = `x${hPar[hAlign]}Y${vPar[vAlign]}`;\n\n // contain\n return {\n svgWidth: '',\n svgHeight: '',\n svgMaxWidth: '100%',\n svgMaxHeight: '100%',\n preserveAspectRatio: `${parBase} meet`,\n containerDisplay: 'flex',\n containerJustifyContent: hFlex[hAlign],\n containerAlignItems: vFlex[vAlign],\n containerOverflow: '',\n containerHeight: '100%',\n containerBoxSizing: 'border-box'\n };\n }\n}\n","/**\n * Escapes Lit syntax to safe data attributes for XML parsing.\n *\n * Converts:\n * - @click=${...} => data-lit-event-click=\"${...}\"\n * - ?attr=${...} => data-lit-attribute-attr=\"${...}\"\n * - .prop=${...} => data-lit-property-prop=\"${...}\"\n * - `\"` inside expressions => `&quot;` (to produce valid XML/HTML attribute values)\n *\n * @param svg The SVG string containing Lit syntax\n * @returns The SVG string with escaped Lit syntax\n */\nexport function escapeLitSyntax(svg: string): string {\n return (\n svg\n // @click=${...} => data-lit-event-click=\"${...}\"\n .replace(/@([a-zA-Z0-9_-]+)=\\$\\{([^}]*)\\}/g, (_, name, expr) => {\n const escaped = expr.replace(/\"/g, '&quot;');\n return `data-lit-event-${name}=\"\\${${escaped}}\"`;\n })\n // ?attr=${...} => data-lit-attribute-attr=\"${...}\"\n .replace(/\\?([a-zA-Z0-9_-]+)=\\$\\{([^}]*)\\}/g, (_, name, expr) => {\n const escaped = expr.replace(/\"/g, '&quot;');\n return `data-lit-attribute-${name}=\"\\${${escaped}}\"`;\n })\n // .prop=${...} => data-lit-property-prop=\"${...}\"\n .replace(/\\.([a-zA-Z0-9_-]+)=\\$\\{([^}]*)\\}/g, (_, name, expr) => {\n const escaped = expr.replace(/\"/g, '&quot;');\n return `data-lit-property-${name}=\"\\${${escaped}}\"`;\n })\n );\n}\n\n/**\n * Unescapes data attributes back to Lit syntax.\n *\n * Converts:\n * - data-lit-event-click=\"${...}\" => @click=${...}\n * - data-lit-attribute-attr=\"${...}\" => ?attr=${...}\n * - data-lit-property-prop=\"${...}\" => .prop=${...}\n * - `&quot;` inside expression values => `\"` (decoded automatically via `DOMParser`)\n *\n * @param svg The SVG string with escaped data attributes\n * @returns The SVG string with restored Lit syntax\n */\nexport function unescapeLitSyntax(svg: string): string {\n return (\n svg\n // data-lit-event-click=\"${...}\" => @click=${...}\n .replace(/data-lit-event-([a-zA-Z0-9_-]+)=\"([^\"]*)\"/g, (_, name, value) => {\n const valueDocument = new DOMParser().parseFromString(value, 'text/html');\n const { textContent } = valueDocument.documentElement;\n return `@${name}=${textContent}`;\n })\n // data-lit-attribute-attr=\"${...}\" => ?attr=${...}\n .replace(/data-lit-attribute-([a-zA-Z0-9_-]+)=\"([^\"]*)\"/g, (_, name, value) => {\n const valueDocument = new DOMParser().parseFromString(value, 'text/html');\n const { textContent } = valueDocument.documentElement;\n return `?${name}=${textContent}`;\n })\n // data-lit-property-prop=\"${...}\" => .prop=${...}\n .replace(/data-lit-property-([a-zA-Z0-9_-]+)=\"([^\"]*)\"/g, (_, name, value) => {\n const valueDocument = new DOMParser().parseFromString(value, 'text/html');\n const { textContent } = valueDocument.documentElement;\n return `.${name}=${textContent}`;\n })\n );\n}\n\n/**\n * Removes Lit expressions from SVG and replaces them with placeholders.\n *\n * Converts ${...} to __LIT_EXPR_n__ to allow safe XML parsing.\n * The extracted expressions are stored in the provided array for later restoration.\n *\n * @param svg The SVG string containing Lit expressions\n * @param litExpressions Array to store extracted expressions\n * @returns The SVG string with expressions replaced by placeholders\n */\nexport function removeLitExpressions(svg: string, litExpressions: string[]): string {\n // ${...} => __LIT_EXPR_n__\n let exprIndex = 0;\n return svg.replace(/\\$\\{([^}]*)\\}/g, (_, expr) => {\n litExpressions.push(expr);\n return `__LIT_EXPR_${exprIndex++}__`;\n });\n}\n\n/**\n * Restores Lit expressions in SVG from placeholders.\n *\n * Converts __LIT_EXPR_n__ back to ${...} using expressions from the provided array.\n *\n * @param svg The SVG string with expression placeholders\n * @param litExpressions Array containing the extracted expressions\n * @returns The SVG string with restored Lit expressions\n */\nexport function restoreLitExpressions(svg: string, litExpressions: string[]): string {\n // __LIT_EXPR_n__ => ${...}\n return svg.replace(/__LIT_EXPR_(\\d+)__/g, (_, index) => {\n const expr = litExpressions[Number(index)];\n return `\\${${expr}}`;\n });\n}\n\n/**\n * Generates Lit web component code for rendering SCADA SVG elements.\n *\n * Creates a custom element class that extends LitElement with support for:\n * - Dynamic context binding (c8yContext)\n * - SCADA value placeholders (c8yScadaValues)\n * - SCADA helper functions (c8yScadaFunctions)\n * - Interactive placeholder highlighting and selection\n *\n * The generated component includes event listeners for hover and click interactions\n * on elements with the 'potential-placeholder' class, enabling users to identify\n * and select placeholders within the SCADA visualization in the widget's configuration.\n *\n * @param svgCode The SVG markup to embed in the component's render method\n * @returns A string containing the complete Lit web component code\n */\nexport function getWebComponentCode(svgCode: string): string {\n return `\nimport { LitElement, html, css } from 'lit';\n\nexport default class ScadaElement extends LitElement {\n static styles = css\\`\n :host > div {\n padding: var(--c8y-root-component-padding-default);\n }\n\n .enable-potential-placeholders .potential-placeholder {\n cursor: pointer;\n transition: fill 0.2s, stroke 0.2s;\n pointer-events: auto;\n }\n .enable-potential-placeholders .potential-placeholder.hovered {\n fill: var(--brand-primary, var(--c8y-brand-primary));\n stroke: var(--brand-primary, var(--c8y-brand-primary));\n }\n \\`;\n\n static properties = {\n // Context managed object assigned to this widget, might be null.\n c8yContext: { type: Object },\n // Object with values assigned to placeholders in the widget, might be null.\n c8yScadaValues: { type: Object },\n // Object with helper functions, might be null.\n c8yScadaFunctions: { type: Object },\n // The instant translation function.\n c8yTranslate: { type: Function },\n // Pre-computed SVG display and alignment styling.\n c8ySvgComputedStyling: { type: Object },\n // Whether to highlight potential placeholders and emit click events.\n enablePotentialPlaceholders: { type: Boolean },\n };\n\n constructor() {\n super();\n }\n\n get _wrapperStyle() {\n const s = this.c8ySvgComputedStyling;\n if (!s || !s.containerDisplay) {\n return '';\n }\n let style = 'display: ' + s.containerDisplay + '; height: ' + s.containerHeight + '; justify-content: ' + s.containerJustifyContent + '; align-items: ' + s.containerAlignItems;\n if (s.containerOverflow) {\n style += '; overflow: ' + s.containerOverflow;\n }\n if (s.containerBoxSizing) {\n style += '; box-sizing: ' + s.containerBoxSizing;\n }\n return style;\n }\n\n _applySvgStyling() {\n const svg = this.renderRoot.querySelector('svg');\n if (!svg) return;\n const s = this.c8ySvgComputedStyling;\n if (!s) {\n svg.style.width = '100%';\n svg.style.height = '';\n svg.style.maxWidth = '';\n svg.style.maxHeight = '';\n svg.removeAttribute('preserveAspectRatio');\n return;\n }\n svg.style.width = s.svgWidth;\n svg.style.height = s.svgHeight;\n svg.style.maxWidth = s.svgMaxWidth;\n svg.style.maxHeight = s.svgMaxHeight;\n if (s.preserveAspectRatio === null) {\n svg.removeAttribute('preserveAspectRatio');\n } else {\n svg.setAttribute('preserveAspectRatio', s.preserveAspectRatio);\n }\n }\n\n firstUpdated() {\n // Add hover and click listeners to potential placeholders\n const svg = this.renderRoot.querySelector('svg');\n if (svg) {\n svg.querySelectorAll('.potential-placeholder').forEach(node => {\n const dispatchPlaceholderClickEvent = () => {\n const event = new CustomEvent('potential-placeholder-click', {\n detail: { node },\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(event);\n };\n\n node.setAttribute('tabindex', '0');\n node.setAttribute('role', 'button');\n node.addEventListener('mouseenter', () => {\n node.classList.add('hovered');\n });\n node.addEventListener('mouseleave', () => {\n node.classList.remove('hovered');\n });\n node.addEventListener('click', () => {\n dispatchPlaceholderClickEvent();\n });\n node.addEventListener('keydown', event => {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n event.preventDefault();\n dispatchPlaceholderClickEvent();\n }\n });\n });\n }\n this._applySvgStyling();\n }\n\n updated(changedProperties) {\n if (changedProperties.has('c8ySvgComputedStyling')) {\n this._applySvgStyling();\n }\n }\n\n render() {\n return html\\`\n <div class=\"\\${this.enablePotentialPlaceholders ? 'enable-potential-placeholders' : ''}\"\n style=\"\\${this._wrapperStyle}\">\n ${svgCode}\n </div>\n \\`;\n }\n}`;\n}\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AssetPropertyMappings,\n ContextWidgetConfig,\n WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport { debounceTime, firstValueFrom, shareReplay, startWith, Subject, switchMap } from 'rxjs';\nimport {\n defaultAlignment,\n INITIAL_SVG_CODE,\n LegacyMapping,\n LegacyMappingBase,\n LegacyMappingComputed,\n LegacyMappingFieldbus,\n ScadaWidgetConfig\n} from './scada.model';\nimport { IIdentified, InventoryBinaryService, InventoryService } from '@c8y/client';\nimport { AssetPropertyType, ComputedPropertiesService } from '@c8y/ngx-components/asset-properties';\nimport {\n escapeLitSyntax,\n getWebComponentCode,\n removeLitExpressions,\n restoreLitExpressions,\n unescapeLitSyntax\n} from './lit-helpers';\nimport { FieldbusService } from '@c8y/ngx-components/computed-asset-properties';\nimport { C8yPropertyType } from '@c8y/ngx-components';\nimport {\n GlobalContextState,\n GLOBAL_CONTEXT_DISPLAY_MODE,\n WidgetConfigMigrationService\n} from '@c8y/ngx-components/global-context';\nimport { merge } from 'lodash-es';\nimport {\n SVG_EXTRACT_TAG_NAME,\n MAPPING_EXTRACT_TAG_NAME\n} from '@c8y/ngx-components/ai/agents/scada';\n\n@Injectable()\nexport class ScadaWidgetConfigService {\n private readonly widgetConfigService = inject(WidgetConfigService);\n private readonly widgetConfigMigration = inject(WidgetConfigMigrationService);\n private readonly inventory = inject(InventoryService);\n private readonly inventoryBinary = inject(InventoryBinaryService);\n private readonly computedPropertiesService = inject(ComputedPropertiesService);\n private readonly fieldbusService = inject(FieldbusService);\n private readonly destroyRef = inject(DestroyRef);\n\n configChanged$ = new Subject<ScadaWidgetConfig>();\n config$ = this.widgetConfigService.currentConfig$.pipe(\n debounceTime(100),\n switchMap(config => this.initializeConfig(config)),\n switchMap(initConfig => this.configChanged$.pipe(startWith(initConfig))),\n shareReplay({ bufferSize: 1, refCount: true }),\n takeUntilDestroyed(this.destroyRef)\n );\n\n constructor() {\n this.destroyRef.onDestroy(() => this.configChanged$.complete());\n }\n\n async initializeConfig(\n config: ContextWidgetConfig | null\n ): Promise<ScadaWidgetConfig & GlobalContextState> {\n let migratedConfig = await this.migrateConfigIfNeeded(config);\n if (!migratedConfig.config?.htmlWidgetConfig) {\n migratedConfig = await this.updateConfigWithSvgCode(migratedConfig, INITIAL_SVG_CODE);\n }\n return migratedConfig;\n }\n\n save(config: ScadaWidgetConfig) {\n // - only persist SCADA-specific state (avoid writing stale global time context values)\n // - force=true applies the update synchronously so that subsequent dialog saves see the latest state\n this.widgetConfigService.updateConfig({ config: config.config }, true);\n this.configChanged$.next(config);\n }\n\n async updateConfigWithSvgFile(\n config: ScadaWidgetConfig,\n svgFile: File\n ): Promise<ScadaWidgetConfig> {\n if (!svgFile || !svgFile.text) {\n throw new Error('Invalid SVG file provided');\n }\n const originalSvgCode = await svgFile.text();\n return this.updateConfigWithSvgCode(config, originalSvgCode);\n }\n\n async updateConfigWithSvgCode(\n config: ScadaWidgetConfig,\n originalSvgCode: string\n ): Promise<ScadaWidgetConfig> {\n // Remove hardcoded dimensions to make the SVG responsive\n const svgCodeWithoutDimensions = await this.removeHardcodedSvgDimensions(originalSvgCode);\n const svgCodeWithUuids =\n await this.findAndAddMarkupForPotentialTextPlaceholders(svgCodeWithoutDimensions);\n const svgCode = this.replacePlaceholdersWithTemplateSyntax(svgCodeWithUuids);\n\n config.config = config.config || ({} as ScadaWidgetConfig['config']);\n config.config.htmlWidgetConfig = {\n config: {\n devMode: true,\n code: getWebComponentCode(svgCode),\n css: '',\n legacy: false,\n options: {\n cssEncapsulation: false,\n advancedSecurity: false\n }\n },\n device: null,\n settings: {}\n };\n this.updateMappings(config);\n\n return config;\n }\n\n extractTagContent(text: string, tagName: string): string | undefined {\n const openTag = `<${tagName}>`;\n const closeTag = `</${tagName}>`;\n const openIdx = text.indexOf(openTag);\n const closeIdx = text.indexOf(closeTag);\n if (openIdx !== -1 && closeIdx !== -1 && closeIdx > openIdx) {\n return text.substring(openIdx + openTag.length, closeIdx);\n }\n return undefined;\n }\n\n async applySvgCode(code: string): Promise<void> {\n const config = await firstValueFrom(this.config$);\n const updatedConfig = await this.updateConfigWithSvgCode(config, code);\n this.save(updatedConfig);\n }\n\n async applyMappings(mappings: string): Promise<void> {\n try {\n const parsedMappings = JSON.parse(mappings);\n const config = await firstValueFrom(this.config$);\n config.config.mappings = parsedMappings;\n this.save(config);\n } catch (ex) {\n // eslint-disable-next-line no-console\n console.error('Failed to apply placeholder mapping:', ex);\n }\n }\n\n async applyScadaOutput(content: string): Promise<void> {\n const svgContent = this.extractTagContent(content, SVG_EXTRACT_TAG_NAME);\n const mappingContent = this.extractTagContent(content, MAPPING_EXTRACT_TAG_NAME);\n\n if (svgContent) {\n await this.applySvgCode(svgContent.trim());\n }\n\n if (mappingContent) {\n await this.applyMappings(mappingContent.trim());\n }\n }\n\n /**\n * Safely parses an SVG string containing Lit expressions, allows DOM editing, and returns the edited SVG string.\n * Handles escaping/unescaping Lit syntax and expressions.\n *\n * @param svg The SVG string to process.\n * @param editFn A function that receives the parsed SVG document for editing.\n * @returns The edited SVG string, or throws an exception if parsing or editing failed.\n */\n async editSafelySvgWithLitExpressions(\n svg: string,\n editFn: (doc: Document) => Promise<void>\n ): Promise<string> {\n const litExpressions: string[] = [];\n const parseToDoc = (svg: string): Document => {\n const parser = new DOMParser();\n const doc = parser.parseFromString(\n removeLitExpressions(escapeLitSyntax(svg), litExpressions),\n 'image/svg+xml'\n );\n\n if (doc.querySelector('parsererror')) {\n throw new Error('Could not parse SVG: it may contain unsupported Lit syntax.');\n }\n\n return doc;\n };\n const serializeToString = (doc: Document): string => {\n const serializer = new XMLSerializer();\n const serializedSvg = serializer.serializeToString(doc.documentElement);\n return restoreLitExpressions(unescapeLitSyntax(serializedSvg), litExpressions);\n };\n\n const doc = parseToDoc(svg);\n await editFn(doc);\n return serializeToString(doc);\n }\n\n updateMappings(config: ScadaWidgetConfig) {\n let keys;\n if (config.config.htmlWidgetConfig.config.legacy) {\n keys = this.extractLegacyScadaKeys(config.config.htmlWidgetConfig.config.code);\n } else {\n keys = this.extractScadaKeys(config.config.htmlWidgetConfig.config.code);\n }\n const currentMappings = config.config.mappings || {};\n const newMappings: ScadaWidgetConfig['config']['mappings'] = {};\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(currentMappings, key)) {\n newMappings[key] = currentMappings[key];\n } else {\n newMappings[key] = { assetProperty: null };\n }\n }\n config.config.mappings = newMappings;\n }\n\n /**\n * Removes hardcoded width and height attributes from the root SVG element.\n *\n * @param svg The SVG string to process.\n * @returns The modified SVG string with width and height attributes removed from the root SVG element.\n */\n private async removeHardcodedSvgDimensions(svg: string): Promise<string> {\n return this.editSafelySvgWithLitExpressions(svg, async doc => {\n const svgElement = doc.documentElement;\n if (svgElement.tagName.toLowerCase() === 'svg') {\n svgElement.removeAttribute('width');\n svgElement.removeAttribute('height');\n }\n });\n }\n\n /**\n * Processes an SVG string to identify and mark potential text placeholders within `<text>` and `<tspan>` elements.\n *\n * This method performs the following steps:\n * 1. Escapes Lit syntax event bindings (e.g., `@click=${...}`) to avoid XML parsing issues.\n * 2. Parses the SVG string into a DOM structure.\n * 3. For each `<text>` and `<tspan>` element:\n * - Adds a unique `id` attribute if not already present.\n * - Adds the CSS class `potential-placeholder` if the element's text content does not already contain a placeholder expression (`this.c8yScadaValues?.`).\n * 4. Serializes the DOM back to an SVG string and restores the original Lit syntax.\n *\n * If parsing fails (e.g., due to unhandled Lit syntax), the original SVG string is returned unchanged.\n *\n * @param svg The SVG string to process.\n * @returns The modified SVG string with potential placeholders marked, or the original SVG if parsing fails.\n */\n private async findAndAddMarkupForPotentialTextPlaceholders(svg: string): Promise<string> {\n return this.editSafelySvgWithLitExpressions(svg, async doc => {\n // Handle both <text> and <tspan> elements\n const nodes = doc.querySelectorAll('text, tspan');\n nodes.forEach(node => {\n // exclude nodes which has child nodes\n if (node.children.length > 0) {\n return;\n }\n\n // exclude nodes which already contain expressions\n const nodeTextContent = node.textContent || '';\n if (nodeTextContent.includes('__LIT_EXPR_')) {\n return;\n }\n\n // add id attribute with random UUID if not present\n if (!node.hasAttribute('id')) {\n node.setAttribute('id', crypto.randomUUID());\n }\n\n // add class 'potential-placeholder'\n node.classList.add('potential-placeholder');\n });\n });\n }\n\n /**\n * Replaces `{{ key }}` placeholders with new template syntax `${this.c8yScadaValues?.key}`.\n *\n * @param svgCode The SVG code string with placeholders.\n * @returns The SVG code string with new template syntax.\n */\n private replacePlaceholdersWithTemplateSyntax(svgCode: string): string {\n return svgCode.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (_, key) => `\\${this.c8yScadaValues?.${key}}`);\n }\n\n /**\n * Extracts placeholder keys used in the template syntax (`${this.c8yScadaValues?.key}`)\n * from the provided SVG code string.\n *\n * @param svgCode The SVG code string containing template syntax placeholders.\n * @returns Array of unique placeholder keys.\n */\n private extractScadaKeys(svgCode: string): string[] {\n const curlyBracesRegex = /\\$\\{([^}]*)\\}/g;\n const scadaValueRegex = /this\\.c8yScadaValues\\??\\.([a-zA-Z0-9_]+)/g;\n const keys = new Set<string>();\n let curlyBracesMatch: RegExpExecArray | null;\n while ((curlyBracesMatch = curlyBracesRegex.exec(svgCode)) !== null) {\n const curlyBracesExpression = curlyBracesMatch[1];\n let scadaValueMatch: RegExpExecArray | null;\n while ((scadaValueMatch = scadaValueRegex.exec(curlyBracesExpression)) !== null) {\n keys.add(scadaValueMatch[1]);\n }\n }\n return Array.from(keys);\n }\n\n /**\n * Extracts placeholder keys used in the legacy template syntax (`{{ key }}`)\n * from the provided SVG code string.\n *\n * @param svgCode The SVG code string containing legacy template syntax placeholders.\n * @returns Array of unique placeholder keys.\n */\n private extractLegacyScadaKeys(svgCode: string): string[] {\n const legacyPlaceholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/g;\n const keys = new Set<string>();\n let match: RegExpExecArray | null;\n while ((match = legacyPlaceholderRegex.exec(svgCode)) !== null) {\n keys.add(match[1]);\n }\n return Array.from(keys);\n }\n\n private async migrateConfigIfNeeded(\n config: ContextWidgetConfig | null\n ): Promise<ScadaWidgetConfig & GlobalContextState> {\n const hasNewConfig = !!config?.config?.mappings && !!config?.config?.htmlWidgetConfig;\n const hasLegacyConfig = !!config?.binaryId && !!config?.mapping && !!config?.deviceIds;\n const migrationNeeded = hasLegacyConfig && !hasNewConfig;\n\n config = this.migrateGlobalContextConfig(config);\n\n if (!migrationNeeded) {\n return config as ScadaWidgetConfig & GlobalContextState;\n }\n\n return await this.migrateFromLegacyBinary(config);\n }\n\n private migrateGlobalContextConfig(\n config: ContextWidgetConfig | null\n ): ContextWidgetConfig | null {\n // Always migrate global context config and set displayMode to 'dashboard' if no other value was explicitly used:\n const hadExplicitDisplayMode =\n typeof config?.displayMode === 'string' &&\n Object.values(GLOBAL_CONTEXT_DISPLAY_MODE).includes(\n config.displayMode as GLOBAL_CONTEXT_DISPLAY_MODE\n );\n const migratedGlobalContextConfig = this.widgetConfigMigration.migrateWidgetConfig(config);\n config = merge(config, migratedGlobalContextConfig);\n if (!hadExplicitDisplayMode) {\n config.displayMode = GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n }\n return config;\n }\n\n private async migrateFromLegacyBinary(\n config: ContextWidgetConfig\n ): Promise<ScadaWidgetConfig & GlobalContextState> {\n const binaryId = config.binaryId;\n const binary = await this.inventoryBinary.download(binaryId);\n const svgCode = await binary.text();\n\n const mappings: AssetPropertyMappings = {};\n for (const key of Object.keys(config.mapping)) {\n mappings[key] = {\n assetProperty: await this.migrateProperty(config.mapping[key], config.deviceIds[key])\n };\n }\n\n return {\n ...config,\n config: {\n htmlWidgetConfig: {\n config: {\n code: svgCode,\n css: '',\n legacy: true,\n devMode: false,\n options: {\n cssEncapsulation: false,\n // must be `false`, otherwise the legacy widgets won't work correctly\n advancedSecurity: false\n }\n },\n device: null,\n settings: {}\n },\n mappings,\n svgDisplaySettings: {\n displayOption: 'contain',\n horizontalAlignment: defaultAlignment,\n verticalAlignment: defaultAlignment\n }\n }\n };\n }\n\n private async migrateProperty(\n legacyProperty: LegacyMapping,\n assetId: IIdentified['id']\n ): Promise<AssetPropertyType> {\n const isFieldbus = (prop: LegacyMapping): prop is LegacyMappingFieldbus =>\n prop['fieldbus'] === true;\n const isComputed = (prop: LegacyMapping): prop is LegacyMappingComputed =>\n prop['computed'] === true;\n const isRegular = (prop: LegacyMapping): prop is LegacyMappingBase =>\n !isFieldbus(prop) && !isComputed(prop);\n const asset = (await this.inventory.detail(assetId)).data;\n\n if (isFieldbus(legacyProperty)) {\n return this.fieldbusService.migrateFieldbusProperty(legacyProperty, asset);\n }\n\n if (isComputed(legacyProperty)) {\n const computedPropertyName = legacyProperty.id.replace(/^c8ySchema!!/, '');\n const computedProperty = await this.computedPropertiesService.getByName(computedPropertyName);\n\n return {\n ...computedProperty.prop,\n instanceId: legacyProperty.config._id,\n active: true,\n temporary: true,\n contextAssetId: assetId,\n config: legacyProperty.config,\n asset: {\n id: asset.id,\n name: asset.name\n }\n };\n }\n\n if (isRegular(legacyProperty)) {\n const buildJsonSchema = (keyPath: string[], label: string, type: C8yPropertyType) => {\n if (keyPath.length === 1) {\n return {\n [keyPath[0]]: {\n label,\n type,\n key: keyPath[0],\n properties: {}\n }\n };\n }\n // Recursively nest properties\n const [first, ...rest] = keyPath;\n return {\n [first]: {\n properties: buildJsonSchema(rest, label, type)\n }\n };\n };\n\n const assetProperty: AssetPropertyType = {\n isEditable: true,\n c8y_JsonSchema: {\n properties: buildJsonSchema(\n legacyProperty.keyPath,\n legacyProperty.label,\n legacyProperty.type\n )\n },\n name: legacyProperty.keyPath.join('.'),\n active: true,\n label: legacyProperty.label,\n type: legacyProperty.type,\n asset: {\n id: asset.id,\n name: asset.name\n }\n };\n return assetProperty;\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';\nimport { ToolCallPart } from '@c8y/ngx-components/ai';\nimport {\n MAPPING_EXTRACT_TAG_NAME,\n SVG_EXTRACT_TAG_NAME\n} from '@c8y/ngx-components/ai/agents/scada';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { ScadaWidgetConfigService } from './scada-widget-config.service';\n\n@Component({\n selector: 'c8y-scada-ai-chat-tool-details',\n templateUrl: './scada-ai-chat-tool-details.component.html',\n host: { style: 'display: block' },\n imports: [TooltipDirective, C8yTranslatePipe, IconDirective],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ScadaAiChatToolDetailsComponent {\n readonly tool = input.required<ToolCallPart<{ content: string }>>();\n readonly content = computed(() => this.tool().input?.content || '');\n readonly isExecuting = computed(() => this.tool().type !== 'tool-result');\n readonly svgContent = computed(() =>\n this.scadaWidgetConfigService.extractTagContent(this.content(), SVG_EXTRACT_TAG_NAME)\n );\n readonly mappingContent = computed(() =>\n this.scadaWidgetConfigService.extractTagContent(this.content(), MAPPING_EXTRACT_TAG_NAME)\n );\n readonly mappingRows = computed(() => {\n const mapping = this.mappingContent();\n if (!mapping) return null;\n try {\n const parsed: Record<\n string,\n {\n assetProperty?: {\n label?: string;\n computed?: boolean;\n asset?: { name?: string };\n config?: { dp?: Array<{ label?: string }> };\n };\n }\n > = JSON.parse(mapping);\n return Object.entries(parsed).map(([placeholder, value]) => {\n const assetProperty = value?.assetProperty;\n const asset = assetProperty?.asset?.name ?? '';\n let property = assetProperty?.label ?? '';\n if (assetProperty?.computed && assetProperty.config?.dp?.[0]?.label) {\n property = assetProperty.config.dp[0].label;\n }\n return { placeholder, asset, property };\n });\n } catch {\n return null;\n }\n });\n readonly previewSvg = computed(() =>\n this.sanitizer.bypassSecurityTrustHtml(this.simplifyPreviewSvg(this.svgContent() || ''))\n );\n\n private readonly sanitizer = inject(DomSanitizer);\n private readonly scadaWidgetConfigService = inject(ScadaWidgetConfigService);\n\n apply(): void {\n const svg = this.svgContent();\n const mapping = this.mappingContent();\n if (svg) {\n void this.scadaWidgetConfigService.applySvgCode(svg.trim());\n }\n if (mapping) {\n void this.scadaWidgetConfigService.applyMappings(mapping.trim());\n }\n }\n\n private simplifyPreviewSvg(svg: string): string {\n return svg\n .replace(/\\$\\{this\\.c8yScadaValues\\?\\.(\\w+)\\?\\.value[^}]*\\}/g, '{$1}')\n .replace(/\\$\\{this\\.c8yScadaValues\\?\\.(\\w+)\\?\\.(\\w+)[^}]*\\}/g, '{$1.$2}')\n .replace(/\\$\\{this\\.c8yScadaValues\\?\\.(\\w+)[^}]*\\}/g, '{$1}')\n .replace(/\\$\\{[^}]+\\}/g, '');\n }\n}\n","@if (svgContent()) {\n <div\n class=\"m-b-8\"\n style=\"max-height: 320px; overflow: auto\"\n [innerHTML]=\"previewSvg()\"\n ></div>\n}\n@if (mappingRows(); as rows) {\n <div\n class=\"m-b-8\"\n style=\"max-height: 160px; overflow: auto\"\n >\n <table class=\"table table-condensed m-b-0\">\n <thead>\n <tr>\n <th>{{ 'Placeholder' | translate }}</th>\n <th>{{ 'Asset' | translate }}</th>\n <th>{{ 'Property' | translate }}</th>\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row.placeholder) {\n <tr>\n <td>\n <code>{{ row.placeholder }}</code>\n </td>\n <td>{{ row.asset }}</td>\n <td>{{ row.property }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n} @else if (mappingContent()) {\n <pre\n class=\"m-b-8\"\n style=\"max-height: 160px\"\n >{{ mappingContent() }}</pre\n >\n}\n@if (!isExecuting()) {\n <div class=\"d-flex j-c-end\">\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Apply' | translate\"\n [tooltip]=\"'Apply' | translate\"\n container=\"body\"\n (click)=\"apply()\"\n >\n <i c8yIcon=\"check\"></i>\n </button>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n OnInit,\n signal,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n DroppedFile,\n DropAreaComponent,\n C8yTranslatePipe,\n AlertService,\n FormGroupComponent,\n ListGroupModule\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n WidgetConfigSectionComponent,\n WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport { ScadaWidgetConfigService } from './scada-widget-config.service';\nimport { firstValueFrom } from 'rxjs';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport {\n AIAssistantMessage,\n AIStreamResponse,\n AssistantMessageDisplayConfig,\n AIService,\n AgentChatConfig,\n ToolCallPart\n} from '@c8y/ngx-components/ai';\nimport {\n SCADA_OUTPUT_TAG_NAME,\n SCADA_SVG_AGENT_DEFINITION\n} from '@c8y/ngx-components/ai/agents/scada';\nimport { AgentChatComponent } from '@c8y/ngx-components/ai/agent-chat';\nimport { ScadaAiChatToolDetailsComponent } from './scada-ai-chat-tool-details.component';\nimport { InventoryService } from '@c8y/client';\nimport {\n defaultAlignment,\n defaultDisplayOption,\n ScadaWidgetConfig,\n SvgDisplaySettings\n} from './scada.model';\n\n@Component({\n selector: 'c8y-scada-widget-svg-selector',\n imports: [\n DropAreaComponent,\n C8yTranslatePipe,\n FormsModule,\n ReactiveFormsModule,\n FormGroupComponent,\n BsDropdownModule,\n A11yModule,\n AgentChatComponent,\n ListGroupModule\n ],\n templateUrl: './scada-widget-svg-selector.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ScadaWidgetSvgSelectorComponent implements OnInit {\n widgetConfigService = inject(WidgetConfigService);\n scadaConfigService = inject(ScadaWidgetConfigService);\n sectionComponent = inject(WidgetConfigSectionComponent);\n inventoryService = inject(InventoryService);\n alertService = inject(AlertService);\n aiService = inject(AIService);\n formBuilder = inject(FormBuilder);\n destroyRef = inject(DestroyRef);\n formGroup = this.formBuilder.group({\n source: this.formBuilder.nonNullable.control<'file' | 'text' | 'ai'>('file'),\n svgCode: this.formBuilder.nonNullable.control('', []),\n svgDisplaySettings: this.formBuilder.group({\n displayOption: this.formBuilder.nonNullable.control(defaultDisplayOption),\n horizontalAlignment: this.formBuilder.nonNullable.control(defaultAlignment),\n verticalAlignment: this.formBuilder.nonNullable.control(defaultAlignment)\n })\n });\n dropArea = viewChild<DropAreaComponent>('dropArea');\n placeholderText = `<svg viewBox=\"0 0 200 200\">…</svg>`;\n displayOptions = [\n {\n label: gettext('Full width`image fitting option`'),\n value: 'full-width',\n description: gettext(\n `The image is resized to fit the widget's width while preserving the aspect ratio. Overflowing area is scrollable.`\n )\n },\n {\n label: gettext('Contain`verb, image fitting option`'),\n value: 'contain',\n description: gettext(\n 'The image is entirely displayed within the widget while preserving the aspect ratio.'\n )\n }\n ];\n horizontalAlignmentOptions = [\n { label: gettext('left`horizontal alignment`'), value: 'left' },\n { label: gettext('center`horizontal alignment`'), value: 'center' },\n { label: gettext('right`horizontal alignment`'), value: 'right' }\n ];\n verticalAlignmentOptions = [\n { label: gettext('top`vertical alignment`'), value: 'top' },\n { label: gettext('center`vertical alignment`'), value: 'center' },\n { label: gettext('bottom`vertical alignment`'), value: 'bottom' }\n ];\n\n isAiAvailable = signal(false);\n aiInitialized = false;\n chatConfig: Partial<AgentChatConfig> = {\n welcomeText: gettext('What would you like to visualize in this SCADA widget?'),\n showCumulativeUsage: true,\n showUsagePerMessage: true,\n showDeleteAction: true\n };\n agent = SCADA_SVG_AGENT_DEFINITION;\n variables = {\n c8yContext: null,\n c8yContextMeasurements: null\n };\n suggestions = [\n {\n label: gettext('Analyze and suggest'),\n prompt:\n 'Analyze the current context object, its properties, measurements, alarms, events, and any other relevant data, and suggest up to 3 distinct SCADA widget visualization options to explore further.'\n },\n {\n label: gettext('Best guess'),\n prompt:\n 'Analyze the current context object, its properties, measurements, alarms, events, and any other relevant data, and figure out the most useful SCADA widget visualization.'\n }\n ];\n assistantMessageDisplayConfig: AssistantMessageDisplayConfig = {\n toolCallConfig: {\n 'cumulocity-api-request': {\n executingLabel: gettext('Analyzing query…'),\n completedLabel: gettext('Query analyzed.')\n },\n [SCADA_OUTPUT_TAG_NAME]: {\n executingLabel: gettext('Updating SVG and mappings…'),\n completedLabel: gettext('SVG and mappings updated.'),\n isShownWithMainAnswer: true\n }\n },\n toolDetailsComponent: toolCallPart =>\n toolCallPart.toolName === SCADA_OUTPUT_TAG_NAME ? ScadaAiChatToolDetailsComponent : undefined\n };\n\n readonly preprocessAgentMessage = (\n message: AIAssistantMessage,\n changedPart: AIStreamResponse['changedPart']\n ): AIAssistantMessage => {\n if (!changedPart || changedPart.type !== 'text') {\n return message;\n }\n\n const openTag = `<${SCADA_OUTPUT_TAG_NAME}>`;\n const closeTag = `</${SCADA_OUTPUT_TAG_NAME}>`;\n\n const inProgressTool = message.content.reduce<ToolCallPart<{ content: string }> | undefined>(\n (last, part) =>\n 'toolName' in part && part.toolName === SCADA_OUTPUT_TAG_NAME && part.type !== 'tool-result'\n ? (part as ToolCallPart<{ content: string }>)\n : last,\n undefined\n );\n\n if (inProgressTool) {\n const accumulated = `${inProgressTool.input?.content || ''}${changedPart.text}`;\n inProgressTool.input = { content: accumulated };\n changedPart.text = '';\n\n const closeIdx = accumulated.indexOf(closeTag);\n if (closeIdx !== -1) {\n const content = accumulated.substring(0, closeIdx);\n const afterClose = accumulated.substring(closeIdx + closeTag.length);\n inProgressTool.input = { content };\n inProgressTool.type = 'tool-result';\n message.content.push({ type: 'step-start' });\n if (afterClose.length > 0) {\n message.content.push({ type: 'text', text: afterClose });\n }\n void this.applyScadaOutput(content);\n } else {\n const idx = message.content.findIndex(part => part === inProgressTool);\n message.content[idx] = { ...inProgressTool };\n }\n } else {\n const openIdx = changedPart.text.indexOf(openTag);\n if (openIdx !== -1) {\n const afterOpen = changedPart.text.substring(openIdx + openTag.length);\n changedPart.text = changedPart.text.substring(0, openIdx);\n message.content.push({ type: 'step-start' });\n message.content.push({\n type: 'tool-input-streaming',\n toolName: SCADA_OUTPUT_TAG_NAME,\n toolCallId: `${SCADA_OUTPUT_TAG_NAME}-${message.content.length}`,\n input: { content: afterOpen }\n });\n }\n }\n\n if (changedPart.text === '') {\n message.content.splice(\n message.content.findIndex(part => part === changedPart),\n 1\n );\n }\n\n return message;\n };\n\n async ngOnInit(): Promise<void> {\n const [instanceId, config, agentHealth] = await Promise.all([\n firstValueFrom(this.widgetConfigService.instanceId$),\n firstValueFrom(this.scadaConfigService.config$),\n this.aiService.getAgentHealth()\n ]);\n this.isAiAvailable.set(agentHealth.isProviderConfigured);\n const savedInstanceIds = Object.keys(config?.settings?.dashboardMo?.children ?? {});\n const isNewInstance = !savedInstanceIds.includes(instanceId);\n if (isNewInstance) {\n this.sectionComponent.section.expanded = true;\n }\n\n this.formGroup\n .get('source')\n ?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(async value => {\n if (value === 'ai') {\n await this.initializeAI(config);\n }\n });\n\n if (config?.config?.svgDisplaySettings) {\n this.formGroup\n .get('svgDisplaySettings')\n ?.patchValue(config.config.svgDisplaySettings, { emitEvent: false });\n }\n\n this.formGroup\n .get('svgDisplaySettings')\n ?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(async svgDisplaySettings => {\n const currentConfig = await firstValueFrom(this.scadaConfigService.config$);\n currentConfig.config.svgDisplaySettings = svgDisplaySettings as SvgDisplaySettings;\n this.scadaConfigService.save(currentConfig);\n });\n }\n\n async onSvgFileDropped(event: DroppedFile[]) {\n this.dropArea().loading = true;\n try {\n const svgFile = event[0].file;\n const config = await firstValueFrom(this.scadaConfigService.config$);\n const updatedConfig = await this.scadaConfigService.updateConfigWithSvgFile(config, svgFile);\n this.scadaConfigService.save(updatedConfig);\n this.sectionComponent.section.expanded = false;\n this.dropArea().files = null;\n this.alertService.success(gettext('SVG file uploaded.'));\n } catch (e) {\n this.alertService.danger(gettext('Could not upload the selected SVG file.'), e?.message || e);\n } finally {\n this.dropArea().loading = false;\n }\n }\n\n async applySvgCode() {\n if (!this.formGroup.get('svgCode')?.value?.trim()) {\n this.alertService.danger(gettext('Please paste SVG code before applying.'));\n return;\n }\n try {\n const config = await firstValueFrom(this.scadaConfigService.config$);\n const updatedConfig = await this.scadaConfigService.updateConfigWithSvgCode(\n config,\n this.formGroup.get('svgCode')?.value.trim()\n );\n this.scadaConfigService.save(updatedConfig);\n this.sectionComponent.section.expanded = false;\n this.formGroup.get('svgCode')?.setValue('');\n this.alertService.success(gettext('SVG code applied.'));\n } catch (e) {\n this.alertService.danger(gettext('Could not apply the pasted SVG code.'), e?.message || e);\n }\n }\n\n private async initializeAI(config: ScadaWidgetConfig) {\n if (!this.aiInitialized) {\n this.aiInitialized = true;\n\n this.variables = {\n c8yContext: config?.device,\n c8yContextMeasurements: await this.inventoryService.getSupportedMeasurements(\n config?.device?.id\n )\n };\n }\n }\n\n private async applyScadaOutput(content: string): Promise<void> {\n await this.scadaConfigService.applyScadaOutput(content);\n }\n}\n","<form [formGroup]=\"formGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Source' | translate }}</legend>\n <div class=\"form-group\">\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Upload file' | translate }}\"\n >\n <input\n name=\"source\"\n type=\"radio\"\n value=\"file\"\n formControlName=\"source\"\n />\n <span></span>\n <span>{{ 'Upload file' | translate }}</span>\n </label>\n <label\n class=\"c8y-radio radio-inline m-l-8\"\n title=\"{{ 'Paste text' | translate }}\"\n >\n <input\n name=\"source\"\n type=\"radio\"\n value=\"text\"\n formControlName=\"source\"\n />\n <span></span>\n <span>\n {{ 'Paste text' | translate }}\n </span>\n </label>\n @if (isAiAvailable()) {\n <label\n class=\"c8y-radio radio-inline m-l-8\"\n title=\"{{ 'Generate with AI' | translate }}\"\n >\n <input\n name=\"source\"\n type=\"radio\"\n value=\"ai\"\n formControlName=\"source\"\n />\n <span></span>\n <span>\n {{ 'Generate with AI' | translate }}\n </span>\n </label>\n }\n </div>\n\n @switch (formGroup.get('source')?.value) {\n @case ('file') {\n <c8y-form-group class=\"m-b-24\">\n <c8y-drop-area\n class=\"drop-area-sm\"\n [icon]=\"'upload'\"\n #dropArea\n [accept]=\"'.svg'\"\n [maxAllowedFiles]=\"1\"\n (dropped)=\"onSvgFileDropped($event)\"\n [message]=\"'Browse or drop file here…' | translate\"\n ></c8y-drop-area>\n </c8y-form-group>\n }\n @case ('text') {\n <c8y-form-group class=\"m-b-24\">\n <textarea\n class=\"form-control\"\n aria-label=\"{{ 'Paste SVG code here' | translate }}\"\n id=\"svgCode\"\n placeholder=\"{{ placeholderText }}\"\n rows=\"6\"\n formControlName=\"svgCode\"\n ></textarea>\n </c8y-form-group>\n <button\n class=\"btn btn-default\"\n (click)=\"applySvgCode()\"\n translate\n [disabled]=\"!formGroup.get('svgCode')?.value?.trim()\"\n >\n Apply\n </button>\n }\n @case ('ai') {\n @if (isAiAvailable()) {\n <c8y-agent-chat\n #agentChat\n [chatConfig]=\"chatConfig\"\n [suggestions]=\"agentChat.isWelcoming() ? suggestions : []\"\n [agent]=\"agent\"\n [variables]=\"variables\"\n [preprocessAgentMessage]=\"preprocessAgentMessage\"\n [assistantMessageDisplayConfig]=\"assistantMessageDisplayConfig\"\n ></c8y-agent-chat>\n }\n }\n }\n </fieldset>\n\n <div formGroupName=\"svgDisplaySettings\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Image display' | translate }}\n </legend>\n <c8y-form-group class=\"form-group-sm m-b-0\">\n <c8y-list-group\n class=\"no-border-last p-b-16\"\n role=\"list\"\n >\n @for (displayOption of displayOptions; track displayOption.value) {\n <c8y-li role=\"listitem\">\n <label class=\"c8y-radio\">\n <input\n type=\"radio\"\n formControlName=\"displayOption\"\n [value]=\"displayOption.value\"\n />\n <span></span>\n <span class=\"l-h-1\">\n {{ displayOption.label | translate }}\n <br />\n <small class=\"text-muted\">\n {{ displayOption.description | translate }}\n </small>\n </span>\n </label>\n </c8y-li>\n }\n </c8y-list-group>\n </c8y-form-group>\n </fieldset>\n @if (formGroup.get('svgDisplaySettings')?.get('displayOption')?.value === 'contain') {\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Image alignment' | translate }}\n </legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label>{{ 'Horizontal`alignment`' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"horizontalAlignment\"\n >\n @for (option of horizontalAlignmentOptions; track option.value) {\n <option [ngValue]=\"option.value\">\n {{ option.label | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label>{{ 'Vertical`alignment`' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"verticalAlignment\"\n >\n @for (option of verticalAlignmentOptions; track option.value) {\n <option [ngValue]=\"option.value\">\n {{ option.label | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n </div>\n</form>\n","import {\n Component,\n viewChild,\n ElementRef,\n OnInit,\n AfterViewInit,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';\nimport { ModalModule, FormsModule, ModalComponent, C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-scada-widget-placeholder-modal',\n template: `\n <c8y-modal\n [title]=\"'Add placeholder' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n #modal\n >\n <form class=\"p-24\" [formGroup]=\"form\" c8y-modal-body>\n <c8y-form-group>\n <label for=\"placeholderName\" translate>Placeholder name</label>\n <input\n class=\"form-control\"\n id=\"placeholderName\"\n placeholder=\"{{ 'e.g. myPlaceholder' | translate }}\"\n type=\"text\"\n autocomplete=\"off\"\n required\n #placeholderNameInput\n formControlName=\"placeholderName\"\n />\n <c8y-messages>\n <c8y-message\n name=\"required\"\n text=\"{{ 'Placeholder name is required.' | translate }}\"\n ></c8y-message>\n <c8y-message\n name=\"pattern\"\n text=\"{{\n 'Name must be a valid identifier (only letters, digits, underscores, or dollar signs allowed, cannot start with a digit).'\n | translate\n }}\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </form>\n <div class=\"modal-footer\" c8y-modal-footer-custom>\n <button class=\"btn btn-default\" (click)=\"onCancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn btn-primary\" (click)=\"onContinue()\" [disabled]=\"form.invalid\">\n {{ 'Continue' | translate }}\n </button>\n </div>\n </c8y-modal>\n `,\n imports: [ModalModule, FormsModule, ReactiveFormsModule, C8yTranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ScadaWidgetPlaceholderModalComponent implements OnInit, AfterViewInit {\n defaultName = '';\n private readonly modal = viewChild<ModalComponent>('modal');\n private readonly placeholderNameInput =\n viewChild<ElementRef<HTMLInputElement>>('placeholderNameInput');\n\n form: FormGroup;\n result: Promise<string> = new Promise((resolve, reject) => {\n this._close = resolve;\n this._cancel = reject;\n });\n private _close: (value: string) => void;\n private _cancel: (reason?: string) => void;\n\n constructor(private fb: FormBuilder) {\n this.form = this.fb.group({\n placeholderName: ['', [Validators.required, Validators.pattern('^[a-zA-Z_$][a-zA-Z0-9_$]*$')]]\n });\n }\n\n ngOnInit() {\n this.form.setValue({ placeholderName: this.defaultName || '' });\n }\n\n ngAfterViewInit() {\n setTimeout(() => this.placeholderNameInput()?.nativeElement.focus());\n }\n\n onCancel(): void {\n this._cancel('cancelled');\n this.modal()?._close();\n }\n\n onContinue(): void {\n this._close(this.form.get('placeholderName')?.value);\n this.modal()?._close();\n }\n}\n","import {\n ElementRef,\n Component,\n DestroyRef,\n inject,\n input,\n output,\n effect,\n signal,\n computed,\n ChangeDetectionStrategy\n} from '@angular/core';\n// eslint-disable-next-line @typescript-eslint/no-restricted-imports\nimport { HtmlFrameComponent } from '@c8y/ngx-components/widgets/implementations/html-widget';\nimport { ScadaWidgetService } from '../scada-widget.service';\nimport { ScadaWidgetConfigService } from '../scada-widget-config/scada-widget-config.service';\nimport {\n debounceTime,\n filter,\n Observable,\n retry,\n shareReplay,\n Subject,\n Subscription,\n switchMap,\n take,\n tap\n} from 'rxjs';\nimport { AssetPropertyMappingsService } from '@c8y/ngx-components/context-dashboard';\nimport { ScadaWidgetConfig } from '../scada-widget-config/scada.model';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GlobalContextConnectorComponent,\n GlobalContextState,\n LocalControlsComponent,\n PRESET_NAME\n} from '@c8y/ngx-components/global-context';\nimport {\n AlertService,\n DashboardChildComponent,\n DismissAlertStrategy,\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n ManagedObjectRealtimeService\n} from '@c8y/ngx-components';\n\n// AngularJS hybrid bridge: `window.angular` is provided at runtime by the\n// legacy app shell and is not part of the DOM `Window` typings.\nconst angularGlobal = (\n window as unknown as {\n angular: { element: (node: Element) => { controller: () => { $scope: object } } };\n }\n).angular;\n\n@Component({\n selector: 'c8y-scada-widget-view',\n templateUrl: './scada-widget-view.component.html',\n host: { class: 'd-contents' },\n imports: [HtmlFrameComponent, GlobalContextConnectorComponent, LocalControlsComponent],\n providers: [ScadaWidgetService, ScadaWidgetConfigService, ManagedObjectRealtimeService],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ScadaWidgetViewComponent implements DynamicComponent {\n elementRef = inject(ElementRef);\n scadaWidgetService = inject(ScadaWidgetService);\n scadaWidgetConfigService = inject(ScadaWidgetConfigService);\n\n config = input<ScadaWidgetConfig>();\n private readonly contextOverride = signal<Partial<GlobalContextState>>({});\n private readonly initializedConfig = toSignal(\n toObservable(this.config).pipe(\n debounceTime(100),\n switchMap(config => this.scadaWidgetConfigService.initializeConfig(config)),\n // After getting a fresh base config for the widget (e.g. an edit in the widget config sidebar)\n // reset the ephemeral runtime overrides of the context so they won't interfere.\n // Otherwise, the in-view controls' initial sync emit seeds contextOverride with the whole\n // config and permanently masks later config changes (e.g. toggling auto-refresh\n // in the \"Time context\" section).\n tap(() => this.contextOverride.set({}))\n )\n );\n readonly effectiveConfig = computed(() => {\n const base = this.initializedConfig();\n return base ? { ...base, ...this.contextOverride() } : null;\n });\n svgDisplaySettings = computed(() => this.effectiveConfig()?.config.svgDisplaySettings ?? null);\n readonly htmlFrameConfig = computed(() => {\n const base = this.effectiveConfig();\n return base ? { ...base.config.htmlWidgetConfig.config } : null;\n });\n readonly device = computed(() => this.effectiveConfig()?.device ?? null);\n enablePotentialPlaceholders = input<boolean>(false);\n potentialPlaceholderClick = output<{ node: Element }>();\n private clickListenerController: AbortController;\n\n webComponentRef: Element;\n legacyScopeRef: object;\n private legacyElementRef?: Element;\n preview = input<boolean>(false);\n\n private destroyRef = inject(DestroyRef);\n private alertService = inject(AlertService);\n protected readonly dashboardChild = inject(DashboardChildComponent, { optional: true });\n alerts = new DynamicComponentAlertAggregator();\n private readonly SERVER_ERROR_TEXT = gettext('Server error occurred.');\n private assetPropertyMappings = inject(AssetPropertyMappingsService);\n readonly realtimeControl$ = toObservable(\n computed(() => this.effectiveConfig()?.isAutoRefreshEnabled === true)\n );\n private realtimeSubscription: Subscription | null = null;\n private readonly refresh$ = new Subject<void>();\n\n // Shared stream used by <c8y-html-frame [propertyValues$]> and by\n // setupRealtimeSubscription for DOM-level c8yScadaValues injection — one\n // underlying getValues$ call for both consumers.\n propertyValues$ = toObservable(this.initializedConfig).pipe(\n filter(Boolean),\n switchMap(config =>\n this.assetPropertyMappings\n .getValues$(config.config.mappings, this.realtimeControl$, this.refresh$)\n .pipe(\n tap({\n next: () => this.isLoading.set(false),\n error: () => this.isLoading.set(false)\n }),\n retry({ delay: err => this.handleFetchError(err) })\n )\n ),\n shareReplay({ bufferSize: 1, refCount: true })\n );\n\n isLoading = signal<boolean>(false);\n /**\n * Controls link state to global context:\n * - true/undefined: Widget follows global time context\n * - false: Widget uses local state, ignores global changes\n * Set to false when user is interacting (scrolling, zooming) to prevent interruption\n */\n isLinkedToGlobal = signal<boolean | undefined>(undefined);\n\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n readonly PRESET_NAME = PRESET_NAME;\n\n constructor() {\n this.alerts?.setAlertGroupDismissStrategy(\n 'warning',\n DismissAlertStrategy.TEMPORARY_OR_PERMANENT\n );\n\n effect(() => {\n const host: HTMLElement = this.elementRef.nativeElement;\n if (this.enablePotentialPlaceholders()) {\n this.clickListenerController = new AbortController();\n const listener = (event: CustomEvent<{ node: Element }>) => {\n this.potentialPlaceholderClick.emit(event.detail);\n };\n host.addEventListener('potential-placeholder-click', listener, {\n signal: this.clickListenerController.signal\n });\n } else {\n this.clickListenerController?.abort();\n }\n });\n\n this.initializeHtmlWidget();\n }\n\n onContextChange(event: { context: GlobalContextState; diff: GlobalContextState }): void {\n this.contextOverride.update(prev => ({ ...prev, ...event.context }));\n this.onRefresh();\n }\n\n onRefresh(): void {\n this.isLoading.set(true);\n this.refresh$.next();\n }\n\n private initializeHtmlWidget(): void {\n const host: HTMLElement = this.elementRef.nativeElement;\n const mutationObserver = new MutationObserver(() => {\n const webComponent = Array.from(host.querySelectorAll('*')).find(el =>\n el.tagName.toLowerCase().startsWith('default-web-component')\n );\n if (webComponent && webComponent !== this.webComponentRef) {\n this.webComponentRef = webComponent;\n this.legacyScopeRef = undefined;\n this.legacyElementRef = undefined;\n this.setupRealtimeSubscription();\n return;\n }\n\n const legacyComponent = Array.from(host.querySelectorAll('*')).find(\n el => el.getAttribute('ng-controller') === 'HtmlWidgetCtrl'\n );\n if (legacyComponent && legacyComponent !== this.legacyElementRef) {\n this.webComponentRef = undefined;\n this.legacyElementRef = legacyComponent;\n this.legacyScopeRef = angularGlobal.element(legacyComponent).controller().$scope;\n this.applyLegacySvgStyling();\n this.setupRealtimeSubscription();\n }\n });\n mutationObserver.observe(host, { childList: true, subtree: true });\n this.destroyRef.onDestroy(() => mutationObserver.disconnect());\n }\n\n private applyLegacySvgStyling(): void {\n const host: HTMLElement = this.elementRef.nativeElement;\n const svgEl = host.querySelector<SVGSVGElement>('svg');\n if (!svgEl) {\n return;\n }\n const svgStyling = this.scadaWidgetService.getSvgComputedStyling(this.svgDisplaySettings());\n const container = svgEl.parentElement;\n svgEl.style.width = svgStyling.svgWidth;\n svgEl.style.height = svgStyling.svgHeight;\n svgEl.style.maxWidth = svgStyling.svgMaxWidth;\n svgEl.style.maxHeight = svgStyling.svgMaxHeight;\n if (svgStyling.preserveAspectRatio === null) {\n svgEl.removeAttribute('preserveAspectRatio');\n } else {\n svgEl.setAttribute('preserveAspectRatio', svgStyling.preserveAspectRatio);\n }\n if (container) {\n container.style.display = svgStyling.containerDisplay;\n container.style.justifyContent = svgStyling.containerJustifyContent;\n container.style.alignItems = svgStyling.containerAlignItems;\n container.style.overflow = svgStyling.containerOverflow;\n container.style.height = svgStyling.containerHeight;\n container.style.boxSizing = svgStyling.containerBoxSizing;\n }\n }\n\n private setupRealtimeSubscription(): void {\n if (!this.webComponentRef && !this.legacyScopeRef) {\n return;\n }\n\n this.realtimeSubscription?.unsubscribe();\n\n const scadaFunctions = this.scadaWidgetService.getScadaFunctions();\n\n this.realtimeSubscription = this.propertyValues$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: scadaValues => {\n this.isLoading.set(false);\n\n if (this.webComponentRef) {\n this.webComponentRef['c8yScadaValues'] = scadaValues;\n this.webComponentRef['c8yScadaFunctions'] = scadaFunctions;\n this.webComponentRef['enablePotentialPlaceholders'] =\n this.enablePotentialPlaceholders();\n this.webComponentRef['c8ySvgComputedStyling'] =\n this.scadaWidgetService.getSvgComputedStyling(this.svgDisplaySettings());\n }\n\n if (this.legacyScopeRef) {\n Object.assign(this.legacyScopeRef, scadaValues);\n Object.assign(this.legacyScopeRef, scadaFunctions);\n }\n },\n error: err => {\n this.isLoading.set(false);\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n type: 'danger',\n text: gettext('Could not subscribe to mapped data.'),\n detailedData: err\n })\n );\n this.alertService.addServerFailure(err);\n }\n });\n }\n\n private handleFetchError(err: { message?: string }): Observable<unknown> {\n this.alerts?.addAlerts(\n new DynamicComponentAlert({\n type: 'warning',\n text: err?.message ?? this.SERVER_ERROR_TEXT\n })\n );\n return this.refresh$.pipe(take(1));\n }\n}\n","@let cfg = effectiveConfig();\n@if (cfg) {\n @if (cfg.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n @if (dashboardChild) {\n <c8y-global-context-connector\n [controls]=\"PRESET_NAME.AUTO_REFRESH_ONLY_CONFIG\"\n [config]=\"cfg\"\n [isLoading]=\"isLoading()\"\n [dashboardChild]=\"dashboardChild\"\n [linked]=\"isLinkedToGlobal()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n >\n </c8y-global-context-connector>\n }\n } @else {\n <c8y-local-controls\n [controls]=\"PRESET_NAME.AUTO_REFRESH_ONLY_CONFIG\"\n [displayMode]=\"cfg.displayMode\"\n [config]=\"cfg\"\n [isLoading]=\"isLoading()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n >\n </c8y-local-controls>\n }\n <c8y-html-frame\n [config]=\"htmlFrameConfig()\"\n [device]=\"device()\"\n [propertyValues$]=\"propertyValues$\"\n [realtimeControl$]=\"realtimeControl$\"\n ></c8y-html-frame>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n inject,\n TemplateRef,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ScadaWidgetPlaceholderModalComponent } from './scada-widget-placeholder-modal.component';\nimport {\n AssetPropertyMappingKeyRenamedNotification,\n escapeForRegExp,\n quoteAndEscape,\n renamePropertyKeyInCode,\n WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport { ScadaWidgetViewComponent } from '../scada-widget-view/scada-widget-view.component';\nimport { ScadaWidgetConfigService } from './scada-widget-config.service';\nimport { AsyncPipe } from '@angular/common';\n// eslint-disable-next-line @typescript-eslint/no-restricted-imports\nimport {\n HtmlWidgetConfigService,\n WidgetCodeEditorComponent\n} from '@c8y/ngx-components/widgets/implementations/html-widget';\nimport { AlertService } from '@c8y/ngx-components';\nimport { filter, firstValueFrom, map } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { camelCase } from 'lodash-es';\n\n@Component({\n selector: 'c8y-scada-widget-advanced-editor',\n templateUrl: './scada-widget-advanced-editor.component.html',\n imports: [ScadaWidgetViewComponent, AsyncPipe, WidgetCodeEditorComponent],\n providers: [HtmlWidgetConfigService],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ScadaWidgetAdvancedEditorComponent {\n private modalService = inject(BsModalService);\n private destroyRef = inject(DestroyRef);\n private alert = inject(AlertService);\n widgetConfigService = inject(WidgetConfigService);\n scadaWidgetConfigService = inject(ScadaWidgetConfigService);\n config$ = this.scadaWidgetConfigService.config$;\n propertyKeys$ = this.config$.pipe(\n map(config => Object.keys(config?.config?.mappings || {}).sort((a, b) => a.localeCompare(b)))\n );\n readonly PROPERTY_PREFIX = 'this.c8yScadaValues';\n\n private readonly isLegacy = toSignal(\n this.config$.pipe(map(config => !!config?.config?.htmlWidgetConfig?.config?.legacy)),\n { initialValue: false }\n );\n\n private readonly scadaWidgetPreview = viewChild<TemplateRef<unknown>>('scadaWidgetPreview');\n\n constructor() {\n effect(() => {\n const template = this.scadaWidgetPreview();\n this.widgetConfigService.setPreview(template ?? null);\n });\n this.widgetConfigService.notify$\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(\n (n): n is AssetPropertyMappingKeyRenamedNotification =>\n n.type === 'asset-property-mapping-key-renamed'\n )\n )\n .subscribe(notification => this.handleRename(notification));\n }\n\n readonly getFormattedPropertyExpressionFn = (key: string): string => {\n if (this.isLegacy()) {\n return `{{ ${key} }}`;\n }\n const nonAlphanumericRegex = /[^a-zA-Z0-9]/;\n const formattedKey = nonAlphanumericRegex.test(key) ? `[${quoteAndEscape(key)}]` : key;\n return '${' + this.PROPERTY_PREFIX + '?.' + formattedKey + '}';\n };\n\n async changeCode(newCode: string) {\n const config = await firstValueFrom(this.config$);\n config.config.htmlWidgetConfig.config.code = newCode;\n this.scadaWidgetConfigService.updateMappings(config);\n this.scadaWidgetConfigService.save({ ...config });\n }\n\n /**\n * Adds a placeholder variable to a clicked SVG text or tspan element.\n *\n * This method handles the conversion of static text content in SVG elements into dynamic\n * placeholders that can be mapped to SCADA values. It locates the SVG node in the configuration,\n * prompts the user for a placeholder name, and updates both the SVG code and mappings.\n *\n * @param event - The event object containing the SVG Element that was clicked\n * @param event.node - The SVG Element (text or tspan) that was clicked\n *\n * @returns A promise that resolves when the placeholder has been added and configuration saved\n *\n * @remarks\n * - Only processes `<text>` and `<tspan>` SVG elements\n * - Skips elements that already contain placeholder syntax\n * - Removes the 'potential-placeholder' CSS class from the processed node\n * - Generates a camelCase placeholder name from the existing text content\n * - Updates the widget configuration with new placeholder and mapping\n * - If user cancels the placeholder name prompt, no changes are made\n */\n async addPlaceholder(event: { node: Element }) {\n const { node } = event;\n const nodeId = node.getAttribute('id');\n const config = await firstValueFrom(this.config$);\n const code = config?.config?.htmlWidgetConfig?.config?.code;\n const newCode = await this.replaceAsync(code, /<svg[\\s\\S]*?>[\\s\\S]*?<\\/svg>/i, async svg => {\n return this.scadaWidgetConfigService.editSafelySvgWithLitExpressions(svg, async doc => {\n const node = doc.getElementById(nodeId);\n const textContent = node.textContent;\n const proposedName = textContent && textContent.trim() ? camelCase(textContent) : '';\n try {\n const placeholderName = await this.confirmPlaceholderName(proposedName);\n node.textContent = `\\${${this.PROPERTY_PREFIX}?.${placeholderName} || '[${placeholderName}]'}`;\n node.classList.remove('potential-placeholder');\n } catch (e) {\n if (e !== 'cancelled') {\n throw e;\n }\n }\n });\n });\n\n if (newCode === code) {\n return;\n }\n\n config.config.htmlWidgetConfig.config.code = newCode;\n config.config.htmlWidgetConfig.config = { ...config.config.htmlWidgetConfig.config };\n this.scadaWidgetConfigService.updateMappings(config);\n this.scadaWidgetConfigService.save({ ...config });\n }\n\n async confirmPlaceholderName(proposedName: string): Promise<string | null> {\n const modalRef = this.modalService.show(ScadaWidgetPlaceholderModalComponent, {\n class: 'modal-sm',\n initialState: { defaultName: proposedName }\n });\n return modalRef.content.result;\n }\n\n private async handleRename(\n notification: AssetPropertyMappingKeyRenamedNotification\n ): Promise<void> {\n const { oldKey, newKey } = notification;\n const config = await firstValueFrom(this.config$);\n if (!config?.config?.htmlWidgetConfig?.config) {\n return;\n }\n const code = config.config.htmlWidgetConfig.config.code;\n let newCode = renamePropertyKeyInCode(code, oldKey, newKey, ['this.c8yScadaValues']);\n newCode = newCode.replace(\n new RegExp(`\\\\|\\\\| '\\\\[${escapeForRegExp(oldKey)}\\\\]'`, 'g'),\n `|| '[${newKey}]'`\n );\n if (newCode === code) {\n return;\n }\n config.config.htmlWidgetConfig.config = {\n ...config.config.htmlWidgetConfig.config,\n code: newCode\n };\n this.scadaWidgetConfigService.save({ ...config });\n this.alert.success(gettext('Renamed placeholder and updated references in code.'));\n }\n\n private async replaceAsync(\n str: string,\n regex: RegExp,\n asyncFn: (...args: any[]) => Promise<string>\n ): Promise<string> {\n const matches: { match: string; index: number; args: any[] }[] = [];\n str.replace(regex, function (...args) {\n const match = args[0];\n const index = args[args.length - 2];\n matches.push({ match, index, args });\n return match;\n });\n const replacements = await Promise.all(matches.map(({ args }) => asyncFn(...args)));\n let result = '';\n let lastIndex = 0;\n matches.forEach(({ index, match }, i) => {\n result += str.slice(lastIndex, index) + replacements[i];\n lastIndex = index + match.length;\n });\n result += str.slice(lastIndex);\n return result;\n }\n}\n","@let config = config$ | async;\n@if (config) {\n @let htmlWidgetConfig = config.config?.htmlWidgetConfig;\n @if (htmlWidgetConfig) {\n <c8y-widget-code-editor\n [config]=\"htmlWidgetConfig.config\"\n [mode]=\"'code'\"\n [showAdvancedSettings]=\"false\"\n [propertyKeys$]=\"propertyKeys$\"\n [getFormattedPropertyExpression]=\"getFormattedPropertyExpressionFn\"\n (codeChange)=\"changeCode($event)\"\n ></c8y-widget-code-editor>\n }\n\n <ng-template #scadaWidgetPreview>\n <c8y-scada-widget-view\n [config]=\"config\"\n [enablePotentialPlaceholders]=\"true\"\n (potentialPlaceholderClick)=\"addPlaceholder($event)\"\n [preview]=\"true\"\n ></c8y-scada-widget-view>\n </ng-template>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["FormsModule"],"mappings":"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"}