{"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          <div\n            class=\"btn btn-ai btn-icon-dot btn-sm btn-ai-hint m-l-4 m-r-4\"\n            aria-hidden=\"true\"\n          >\n            <span></span>\n          </div>\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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"}