@meshmakers/octo-meshboard 3.3.390
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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meshmakers-octo-meshboard.mjs","sources":["../../../../projects/meshmakers/octo-meshboard/src/lib/models/meshboard.models.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/utils/runtime-entity-data-sources.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/getSystemPersistentQueries.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/components/query-selector/query-selector.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/getEntitiesByCkType.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/components/runtime-entity-selector/runtime-entity-selector.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/components/widget-not-configured/widget-not-configured.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/getDashboards.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/createDashboard.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/updateDashboard.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/createDashboardWidget.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/updateDashboardWidget.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/deleteEntities.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/getDashboardWithWidgets.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/globalTypes.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/services/widget-registry.service.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/services/meshboard-persistence.service.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/services/meshboard-grid.service.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/services/meshboard-state.service.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/getDashboardEntity.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/getCkModelsWithState.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/executeRuntimeQuery.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/services/meshboard-variable.service.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/services/meshboard-data.service.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/services/widget-factory.service.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/services/edit-mode-state.service.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/entity-card-widget/entity-card-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/entity-card-widget/entity-card-widget.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/entity-card-widget/entity-card-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/kpi-widget/kpi-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/kpi-widget/kpi-widget.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/kpi-widget/kpi-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/entity-associations-widget/entity-detail-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/entity-associations-widget/entity-associations-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/entity-associations-widget/entity-associations-widget.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/graphQL/getCkTypeAssociationRoles.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/entity-associations-widget/associations-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/table-widget/table-widget-data-source.directive.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/table-widget/table-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/table-widget/table-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/gauge-widget/gauge-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/gauge-widget/gauge-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/pie-chart-widget/pie-chart-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/pie-chart-widget/pie-chart-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/bar-chart-widget/bar-chart-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/bar-chart-widget/bar-chart-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/stats-grid-widget/stats-grid-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/stats-grid-widget/stats-grid-widget.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/stats-grid-widget/stats-grid-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/status-indicator-widget/status-indicator-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/status-indicator-widget/status-indicator-widget.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/status-indicator-widget/status-indicator-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/service-health-widget/service-health-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/service-health-widget/service-health-widget.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/service-health-widget/service-health-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/widget-group/widget-group.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/widget-group/widget-group.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/widget-group/widget-group-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/markdown-widget/markdown-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/markdown-widget/markdown-widget.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/markdown-widget/markdown-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/process-widget/services/process-data.service.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/process-widget/process-widget.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/widgets/process-widget/process-config-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/registrations/process-widget-registration.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/registrations/default-widget-registrations.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/components/variables-editor/variables-editor.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/components/variables-editor/variables-editor.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/dialogs/meshboard-settings-dialog/meshboard-settings-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/dialogs/meshboard-settings-dialog/meshboard-settings-dialog.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/dialogs/add-widget-dialog/add-widget-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/dialogs/add-widget-dialog/add-widget-dialog.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/dialogs/meshboard-manager-dialog/meshboard-manager-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/dialogs/meshboard-manager-dialog/meshboard-manager-dialog.component.html","../../../../projects/meshmakers/octo-meshboard/src/lib/dialogs/edit-widget-dialog/edit-widget-dialog.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/containers/meshboard-view/meshboard-view.component.ts","../../../../projects/meshmakers/octo-meshboard/src/lib/containers/meshboard-view/meshboard-view.component.html","../../../../projects/meshmakers/octo-meshboard/src/public-api.ts","../../../../projects/meshmakers/octo-meshboard/src/meshmakers-octo-meshboard.ts"],"sourcesContent":["/**\n * MeshBoard Widget Models\n * Defines the interfaces for MeshBoard widgets and their data sources\n */\n\n// ============================================================================\n// Data Source Types\n// ============================================================================\n\n/**\n * All supported data source types\n */\nexport type DataSourceType =\n | 'runtimeEntity'\n | 'persistentQuery'\n | 'aggregation'\n | 'serviceCall'\n | 'constructionKitQuery'\n | 'static'\n | 'repeaterQuery';\n\n/**\n * Base interface for all data sources\n */\nexport interface WidgetDataSource {\n type: DataSourceType;\n}\n\n/**\n * Data source that fetches a single runtime entity by ID\n */\nexport interface RuntimeEntityDataSource extends WidgetDataSource {\n type: 'runtimeEntity';\n ckTypeId?: string;\n rtId?: string;\n attributePaths?: string[];\n includeAssociations?: boolean;\n}\n\n/**\n * Static data source for demo/testing\n */\nexport interface StaticDataSource extends WidgetDataSource {\n type: 'static';\n data: unknown;\n}\n\n/**\n * Data source that executes a persistent query by its rtId\n */\nexport interface PersistentQueryDataSource extends WidgetDataSource {\n type: 'persistentQuery';\n /** The rtId of the persistent query to execute */\n queryRtId: string;\n /** Display name of the query (for UI) */\n queryName?: string;\n}\n\n/**\n * Aggregation types supported\n */\nexport type AggregationType = 'count' | 'sum' | 'avg' | 'min' | 'max';\n\n/**\n * Single aggregation query configuration\n */\nexport interface AggregationQuery {\n /** Unique ID to reference this query result */\n id: string;\n /** The CK type to aggregate (e.g., 'ConstructionKit/CkType') */\n ckTypeId: string;\n /** Type of aggregation to perform */\n aggregation: AggregationType;\n /** Attribute to aggregate (required for sum/avg/min/max) */\n attribute?: string;\n /** Optional filter expression (deprecated, use filters instead) */\n filter?: string;\n /** Field filters for the aggregation query */\n filters?: WidgetFilterConfig[];\n}\n\n/**\n * Data source that performs aggregation queries (count, sum, avg, etc.)\n */\nexport interface AggregationDataSource extends WidgetDataSource {\n type: 'aggregation';\n queries: AggregationQuery[];\n}\n\n/**\n * Service call types for status/health checks\n */\nexport type ServiceCallType = 'modelAvailable' | 'healthCheck';\n\n/**\n * Data source that calls a service for status information\n */\nexport interface ServiceCallDataSource extends WidgetDataSource {\n type: 'serviceCall';\n /** Type of service call */\n callType: ServiceCallType;\n /** Model name for 'modelAvailable' check */\n modelName?: string;\n /** Service type for 'healthCheck' */\n serviceType?: 'identity' | 'asset-repository' | 'bot' | 'communication-controller' | 'mesh-adapter' | 'custom';\n /** Custom endpoint URL for custom health checks */\n customEndpoint?: string;\n}\n\n/**\n * Construction Kit query targets\n */\nexport type CkQueryTarget = 'models' | 'types' | 'attributes' | 'associationRoles' | 'enums' | 'records';\n\n/**\n * Data source that queries Construction Kit data\n * Supports grouping for chart widgets (e.g., models grouped by state)\n */\nexport interface ConstructionKitQueryDataSource extends WidgetDataSource {\n type: 'constructionKitQuery';\n /** What to query from Construction Kit */\n queryTarget: CkQueryTarget;\n /** Field to group results by (for charts) */\n groupBy?: string;\n /** Field to use as value (for aggregations) */\n valueField?: string;\n /** Field to use as category/label */\n categoryField?: string;\n}\n\n/**\n * Data source for repeating widgets (Widget Group).\n * Fetches multiple items and renders a child widget for each.\n * Supports two modes:\n * 1. Query Mode: Execute a persistent query and get rows\n * 2. Entity Mode: Load entities by CK type with optional filters\n */\nexport interface RepeaterQueryDataSource extends WidgetDataSource {\n type: 'repeaterQuery';\n /** Execute a persistent query by its rtId (Query Mode) */\n queryRtId?: string;\n /** Display name of the query (for UI) */\n queryName?: string;\n /** Load entities by CK type (Entity Mode) */\n ckTypeId?: string;\n /** Filters for Entity Mode */\n filters?: WidgetFilterConfig[];\n /** Maximum number of items to render (default: 50) */\n maxItems?: number;\n}\n\nexport type DataSource =\n | RuntimeEntityDataSource\n | StaticDataSource\n | PersistentQueryDataSource\n | AggregationDataSource\n | ServiceCallDataSource\n | ConstructionKitQueryDataSource\n | RepeaterQueryDataSource;\n\n// ============================================================================\n// Widget Types\n// ============================================================================\n\n/**\n * Supported widget types\n */\nexport type WidgetType =\n | 'entityCard'\n | 'entityWithAssociations'\n | 'kpi'\n | 'table'\n | 'gauge'\n | 'pieChart'\n | 'barChart'\n | 'statsGrid'\n | 'statusIndicator'\n | 'serviceHealth'\n | 'process'\n | 'widgetGroup'\n | 'markdown';\n\n/**\n * Base widget configuration\n */\nexport interface WidgetConfig {\n /** Local ID used for UI tracking (generated by WidgetFactoryService) */\n id: string;\n /** Backend-generated ID (rtId from GraphQL). Only set after persistence. */\n rtId?: string;\n type: WidgetType;\n title: string;\n dataSource: DataSource;\n // TileLayout positioning\n col: number;\n row: number;\n colSpan: number;\n rowSpan: number;\n /** Whether the widget supports data source configuration dialog */\n configurable?: boolean;\n}\n\n/**\n * Entity Card Widget - displays a single entity like a UML class diagram\n */\nexport interface EntityCardWidgetConfig extends WidgetConfig {\n type: 'entityCard';\n showHeader?: boolean;\n showAttributes?: boolean;\n attributeFilter?: string[];\n headerColor?: string;\n}\n\n/**\n * Entity with Associations Widget - displays entity with its relationships\n */\nexport interface EntityWithAssociationsWidgetConfig extends WidgetConfig {\n type: 'entityWithAssociations';\n showIncoming?: boolean;\n showOutgoing?: boolean;\n maxAssociations?: number;\n /** List of role IDs to filter (empty = show all) */\n roleFilter?: string[];\n /** Display mode: 'expandable' shows groups that can be expanded */\n displayMode?: 'count' | 'expandable';\n}\n\n/**\n * KPI query mode for persistent queries\n * - 'simpleCount': Use totalCount from simple query\n * - 'aggregation': Single value from aggregation query (1 row, 1 column)\n * - 'groupedAggregation': Value for a specific category from grouped aggregation\n */\nexport type KpiQueryMode = 'simpleCount' | 'aggregation' | 'groupedAggregation';\n\n/**\n * KPI/Statistics Widget - displays a single value with label\n * Supports both runtime entity data sources and persistent queries\n */\nexport interface KpiWidgetConfig extends WidgetConfig {\n type: 'kpi';\n /** Attribute path for runtime entity data source */\n valueAttribute: string;\n labelAttribute?: string;\n prefix?: string;\n suffix?: string;\n icon?: string;\n trend?: 'up' | 'down' | 'neutral';\n /** Query mode when using persistent query data source */\n queryMode?: KpiQueryMode;\n /** Value field for aggregation/grouped queries */\n queryValueField?: string;\n /** Category field for grouped aggregation queries */\n queryCategoryField?: string;\n /** Selected category value for grouped aggregation queries */\n queryCategoryValue?: string;\n /** Field filters for data source */\n filters?: WidgetFilterConfig[];\n}\n\n/**\n * Sorting configuration for table widget (JSON-compatible)\n */\nexport interface TableSortConfig {\n attributePath: string;\n sortOrder: string;\n}\n\n/**\n * Filter configuration for widgets (JSON-compatible)\n * Used by Table, KPI, Gauge, Pie Chart, Bar Chart widgets\n */\nexport interface WidgetFilterConfig {\n attributePath: string;\n operator: string;\n comparisonValue: string;\n}\n\n/**\n * @deprecated Use WidgetFilterConfig instead\n */\nexport type TableFilterConfig = WidgetFilterConfig;\n\n/**\n * Table Widget - displays multiple entities in a table\n * Note: sorting and filters use simplified JSON-compatible types\n */\nexport interface TableWidgetConfig extends WidgetConfig {\n type: 'table';\n columns: TableColumn[];\n sorting?: TableSortConfig[];\n filters?: TableFilterConfig[];\n pageSize?: number;\n sortable?: boolean;\n}\n\nexport interface TableColumn {\n field: string;\n title: string;\n width?: number;\n}\n\n/**\n * Gauge types available\n */\nexport type GaugeType = 'arc' | 'circular' | 'linear' | 'radial';\n\n/**\n * Color range for gauge thresholds\n */\nexport interface GaugeRange {\n from: number;\n to: number;\n color: string;\n}\n\n/**\n * Gauge Widget - displays a numeric value as a gauge visualization\n * Supports Arc, Circular, Linear, and Radial gauge types from Kendo UI\n * Supports both runtime entity data sources and persistent queries\n */\nexport interface GaugeWidgetConfig extends WidgetConfig {\n type: 'gauge';\n /** The gauge visualization type */\n gaugeType: GaugeType;\n /** Attribute path to read the numeric value from (for runtime entity) */\n valueAttribute: string;\n /** Minimum value for the gauge scale */\n min?: number;\n /** Maximum value for the gauge scale */\n max?: number;\n /** Color ranges for thresholds (e.g., green/yellow/red zones) */\n ranges?: GaugeRange[];\n /** Show the value label on the gauge */\n showLabel?: boolean;\n /** Optional attribute for dynamic label */\n labelAttribute?: string;\n /** Prefix for value display (e.g., '$') */\n prefix?: string;\n /** Suffix for value display (e.g., '%', 'units') */\n suffix?: string;\n /** Reverse the gauge direction */\n reverse?: boolean;\n /** Query mode when using persistent query data source */\n queryMode?: KpiQueryMode;\n /** Value field for aggregation/grouped queries */\n queryValueField?: string;\n /** Category field for grouped aggregation queries */\n queryCategoryField?: string;\n /** Selected category value for grouped aggregation queries */\n queryCategoryValue?: string;\n /** Field filters for data source */\n filters?: WidgetFilterConfig[];\n}\n\n/**\n * Pie Chart types available\n */\nexport type PieChartType = 'pie' | 'donut';\n\n/**\n * Pie Chart Widget - displays data as a pie or donut chart\n * Works especially well with grouped aggregation queries\n */\nexport interface PieChartWidgetConfig extends WidgetConfig {\n type: 'pieChart';\n /** The chart visualization type */\n chartType: PieChartType;\n /** Field used for category labels (e.g., 'legalEntityType') */\n categoryField: string;\n /** Field used for values (e.g., 'meterReading') */\n valueField: string;\n /** Show labels on chart segments */\n showLabels?: boolean;\n /** Show the chart legend */\n showLegend?: boolean;\n /** Position of the legend */\n legendPosition?: 'top' | 'bottom' | 'left' | 'right';\n /** Field filters for data source */\n filters?: WidgetFilterConfig[];\n}\n\n/**\n * Bar Chart types available\n * - column: Vertical bars (standard column chart)\n * - bar: Horizontal bars\n * - stackedColumn: Stacked vertical bars\n * - stackedBar: Stacked horizontal bars\n * - stackedColumn100: 100% stacked vertical bars\n * - stackedBar100: 100% stacked horizontal bars\n */\nexport type BarChartType = 'column' | 'bar' | 'stackedColumn' | 'stackedBar' | 'stackedColumn100' | 'stackedBar100';\n\n/**\n * Series configuration for bar chart\n * Each series represents a set of values displayed as bars\n */\nexport interface BarChartSeries {\n /** Value field from query results */\n field: string;\n /** Display name for legend (defaults to field name) */\n name?: string;\n /** Optional custom color for this series */\n color?: string;\n}\n\n/**\n * Bar Chart Widget - displays data as bar or column charts\n * Supports multiple series for grouped/stacked visualization\n * Works especially well with grouped aggregation queries\n *\n * Two modes are supported:\n * 1. Static Series Mode: Define series[] with explicit field mappings\n * 2. Dynamic Series Mode: Use seriesGroupField + valueField to auto-create series from data\n */\nexport interface BarChartWidgetConfig extends WidgetConfig {\n type: 'barChart';\n /** The chart visualization type */\n chartType: BarChartType;\n /** Field used for category labels (X-axis for column, Y-axis for bar) */\n categoryField: string;\n /** Series configuration - each series becomes a set of bars (Static Series Mode) */\n series: BarChartSeries[];\n /**\n * Field used to group data into series (Dynamic Series Mode).\n * When set, unique values of this field become separate series.\n * Example: 'billingType' with values 'Credit'/'Debit' creates two series.\n */\n seriesGroupField?: string;\n /**\n * Value field when using seriesGroupField (Dynamic Series Mode).\n * The numeric field to display for each category/series combination.\n */\n valueField?: string;\n /** Show the chart legend */\n showLegend?: boolean;\n /** Position of the legend */\n legendPosition?: 'top' | 'bottom' | 'left' | 'right';\n /** Show data labels on bars */\n showDataLabels?: boolean;\n /** Field filters for data source */\n filters?: WidgetFilterConfig[];\n}\n\n// ============================================================================\n// Stats Grid Widget\n// ============================================================================\n\n/**\n * Color options for stat items\n */\nexport type StatColor = 'mint' | 'cyan' | 'violet' | 'toffee' | 'lilac' | 'bubblegum' | 'default';\n\n/**\n * Single stat item configuration\n */\nexport interface StatItem {\n /** Display label */\n label: string;\n /** Reference to aggregation query ID */\n queryId: string;\n /** Color variant */\n color?: StatColor;\n /** Number format */\n format?: 'number' | 'percent' | 'currency';\n /** Prefix for display (e.g., '$') */\n prefix?: string;\n /** Suffix for display (e.g., '%') */\n suffix?: string;\n}\n\n/**\n * Stats Grid Widget - displays multiple KPIs in a grid layout\n * Uses AggregationDataSource for data\n */\nexport interface StatsGridWidgetConfig extends WidgetConfig {\n type: 'statsGrid';\n /** Stat items to display */\n stats: StatItem[];\n /** Number of columns in the grid (default: 3) */\n columns?: number;\n}\n\n// ============================================================================\n// Status Indicator Widget\n// ============================================================================\n\n/**\n * Status Indicator Widget - displays a boolean status (ENABLED/DISABLED, etc.)\n * Uses ServiceCallDataSource for data\n */\nexport interface StatusIndicatorWidgetConfig extends WidgetConfig {\n type: 'statusIndicator';\n /** Label to show when status is true */\n trueLabel?: string;\n /** Label to show when status is false */\n falseLabel?: string;\n /** Custom true color (CSS color) */\n trueColor?: string;\n /** Custom false color (CSS color) */\n falseColor?: string;\n}\n\n// ============================================================================\n// Service Health Widget\n// ============================================================================\n\n/**\n * Service Health Widget - displays health status with pulse animation\n * Uses ServiceCallDataSource with callType: 'healthCheck'\n */\nexport interface ServiceHealthWidgetConfig extends WidgetConfig {\n type: 'serviceHealth';\n /** Enable click to navigate to detail page */\n navigateOnClick?: boolean;\n /** Route to navigate to (relative to current route) */\n detailRoute?: string;\n /** Show pulse animation when healthy */\n showPulse?: boolean;\n}\n\n// ============================================================================\n// Widget Group Widget\n// ============================================================================\n\n/**\n * Supported child widget types for Widget Group\n */\nexport type GroupChildWidgetType = 'kpi' | 'gauge' | 'entityCard';\n\n/**\n * Layout options for Widget Group\n */\nexport type WidgetGroupLayout = 'grid' | 'horizontal' | 'vertical';\n\n/**\n * Attribute mapping configuration for child widgets.\n * Maps data item attributes to child widget properties.\n */\nexport interface WidgetGroupAttributeMappings {\n /** Attribute path for the value (KPI/Gauge) */\n valueAttribute?: string;\n /** Attribute path for dynamic label */\n labelAttribute?: string;\n /** Attribute path for status (StatusIndicator) */\n statusAttribute?: string;\n}\n\n/**\n * Template for child widgets in a Widget Group.\n * Defines how each data item is rendered as a widget.\n */\nexport interface WidgetGroupChildTemplate {\n /** The widget type to render for each item */\n widgetType: GroupChildWidgetType;\n /**\n * Title template with variable substitution.\n * Available variables: $rtWellKnownName, $rtId, $ckTypeId, and any attribute with $attributeName\n */\n titleTemplate?: string;\n /** Maps data item attributes to widget properties */\n attributeMappings: WidgetGroupAttributeMappings;\n /** Static configuration merged into each child widget */\n staticConfig?: Partial<KpiWidgetConfig | GaugeWidgetConfig | EntityCardWidgetConfig>;\n}\n\n/**\n * Widget Group Widget - renders a widget for each item from a query or entity list.\n * Acts as a container that executes a query and dynamically creates child widgets.\n *\n * Example use case: Query returns 5 machines → 5 KPI widgets show each machine's status.\n *\n * Uses RepeaterQueryDataSource for data:\n * - Query Mode: Execute persistent query, render widget per row\n * - Entity Mode: Load entities by CK type, render widget per entity\n */\nexport interface WidgetGroupConfig extends WidgetConfig {\n type: 'widgetGroup';\n /** The data source that provides items to repeat */\n dataSource: RepeaterQueryDataSource;\n /** Template defining how each item is rendered as a widget */\n childTemplate: WidgetGroupChildTemplate;\n /** Layout mode for child widgets */\n layout: WidgetGroupLayout;\n /** Number of columns for grid layout (default: 4) */\n gridColumns?: number;\n /** Minimum width for child widgets in pixels (default: 150) */\n minChildWidth?: number;\n /** Gap between child widgets in pixels (default: 8) */\n gap?: number;\n /** Message to show when no items are returned */\n emptyMessage?: string;\n}\n\n// ============================================================================\n// Markdown Widget\n// ============================================================================\n\n/**\n * Text alignment options for Markdown widget\n */\nexport type MarkdownTextAlign = 'left' | 'center' | 'right';\n\n/**\n * Markdown Widget - displays formatted markdown content\n * Uses static data source since content is stored directly in config\n */\nexport interface MarkdownWidgetConfig extends WidgetConfig {\n type: 'markdown';\n /** The markdown content to display */\n content: string;\n /** Whether to resolve MeshBoard variables ($name or ${name}) in content */\n resolveVariables?: boolean;\n /** Custom padding (CSS value, default: 16px) */\n padding?: string;\n /** Text alignment (default: left) */\n textAlign?: MarkdownTextAlign;\n}\n\n// Process Widget Config is defined in the process-widget module\n// Re-exported here for AnyWidgetConfig union\nimport type { ProcessWidgetConfig, DiagramPropertyMapping } from '../widgets/process-widget/process-widget-config.model';\nexport type { ProcessWidgetConfig, DiagramPropertyMapping };\n\nexport type AnyWidgetConfig =\n | EntityCardWidgetConfig\n | EntityWithAssociationsWidgetConfig\n | KpiWidgetConfig\n | TableWidgetConfig\n | GaugeWidgetConfig\n | PieChartWidgetConfig\n | BarChartWidgetConfig\n | StatsGridWidgetConfig\n | StatusIndicatorWidgetConfig\n | ServiceHealthWidgetConfig\n | ProcessWidgetConfig\n | WidgetGroupConfig\n | MarkdownWidgetConfig;\n\n// ============================================================================\n// MeshBoard Variables\n// ============================================================================\n\n/**\n * Supported variable types\n */\nexport type MeshBoardVariableType = 'string' | 'number' | 'boolean' | 'date' | 'datetime';\n\n/**\n * Source of the variable value (extensible for future dynamic variables)\n */\nexport type MeshBoardVariableSource = 'static' | 'timeFilter';\n// Future: 'url' | 'user' | 'expression'\n\n/**\n * MeshBoard variable definition\n */\nexport interface MeshBoardVariable {\n /** Unique variable name (without $ prefix) */\n name: string;\n /** Display label for UI */\n label?: string;\n /** Variable description */\n description?: string;\n /** Data type */\n type: MeshBoardVariableType;\n /** Value source (extensible) */\n source: MeshBoardVariableSource;\n /** Current value (as string for serialization) */\n value: string;\n /** Default value if no value is set */\n defaultValue?: string;\n}\n\n// ============================================================================\n// MeshBoard Time Filter\n// ============================================================================\n\n/**\n * Supported time range types for the time filter\n */\nexport type TimeRangeType = 'year' | 'quarter' | 'month' | 'relative' | 'custom';\n\n/**\n * Time units for relative time ranges\n */\nexport type RelativeTimeUnit = 'hours' | 'days' | 'weeks' | 'months';\n\n/**\n * Quarter number (1-4)\n */\nexport type Quarter = 1 | 2 | 3 | 4;\n\n/**\n * Configuration for the time range picker component\n */\nexport interface TimeRangePickerConfig {\n /** Available range types to show. Defaults to all. */\n availableTypes?: TimeRangeType[];\n /** Minimum selectable year. */\n minYear?: number;\n /** Maximum selectable year. */\n maxYear?: number;\n /** Default relative time value. */\n defaultRelativeValue?: number;\n /** Default relative time unit. */\n defaultRelativeUnit?: RelativeTimeUnit;\n /** Show time in custom date pickers. */\n showTime?: boolean;\n}\n\n/**\n * The current selection state of the time range picker (for persistence)\n */\nexport interface TimeRangeSelection {\n type: TimeRangeType;\n year?: number;\n quarter?: Quarter;\n month?: number;\n relativeValue?: number;\n relativeUnit?: RelativeTimeUnit;\n customFrom?: string; // ISO string for persistence\n customTo?: string; // ISO string for persistence\n}\n\n/**\n * Time filter configuration for MeshBoard\n */\nexport interface MeshBoardTimeFilterConfig {\n /** Whether the time filter is enabled */\n enabled: boolean;\n /** Configuration for the time range picker */\n pickerConfig?: TimeRangePickerConfig;\n /** Current selection (for persistence) */\n selection?: TimeRangeSelection;\n}\n\n// ============================================================================\n// MeshBoard Configuration\n// ============================================================================\n\n/**\n * Complete MeshBoard configuration\n */\nexport interface MeshBoardConfig {\n id: string;\n name: string;\n description?: string;\n /** Well-known name for routing (e.g., 'cockpit', 'sales-dashboard') */\n rtWellKnownName?: string | null;\n columns: number;\n rowHeight: number;\n gap: number;\n /** MeshBoard-level variables that can be used in widget filters */\n variables?: MeshBoardVariable[];\n /** Optional time filter configuration */\n timeFilter?: MeshBoardTimeFilterConfig;\n widgets: AnyWidgetConfig[];\n}\n\n/** @deprecated Use MeshBoardConfig instead */\nexport type DashboardConfig = MeshBoardConfig;\n\n// ============================================================================\n// Runtime Entity Data (from GraphQL)\n// ============================================================================\n\nexport interface EntityAttribute {\n attributeName: string;\n value: unknown;\n}\n\nexport interface EntityAssociation {\n targetRtId: string;\n targetCkTypeId: string;\n originRtId: string;\n originCkTypeId: string;\n ckAssociationRoleId: string;\n}\n\nexport interface RuntimeEntityData {\n rtId: string;\n ckTypeId: string;\n rtWellKnownName?: string;\n rtCreationDateTime?: string;\n rtChangedDateTime?: string;\n attributes: EntityAttribute[];\n associations: EntityAssociation[];\n}\n","import { Observable, from, map } from 'rxjs';\nimport { firstValueFrom } from 'rxjs';\nimport { EntitySelectDataSource, EntitySelectResult } from '@meshmakers/shared-services';\nimport {\n EntitySelectDialogDataSource,\n DialogFetchOptions,\n DialogFetchResult,\n ColumnDefinition\n} from '@meshmakers/shared-ui';\nimport { FieldFilterOperatorsDto } from '@meshmakers/octo-services';\nimport { GetEntitiesByCkTypeDtoGQL } from '../graphQL/getEntitiesByCkType';\n\n/**\n * Represents a runtime entity for selection in config dialogs\n */\nexport interface RuntimeEntityItem {\n rtId: string;\n ckTypeId: string;\n rtWellKnownName?: string;\n displayName: string;\n}\n\n/**\n * Persistent query item for selection in config dialogs\n */\nexport interface PersistentQueryItem {\n rtId: string;\n name: string;\n description?: string | null;\n queryCkTypeId?: string | null;\n}\n\n/**\n * Column info derived from query execution\n */\nexport interface QueryColumnItem {\n attributePath: string;\n attributeValueType: string;\n}\n\n/**\n * Category value item for grouped aggregation\n */\nexport interface CategoryValueItem {\n value: string;\n displayValue: string;\n}\n\n/**\n * Data source for entity autocomplete input - filters entities by CK Type\n */\nexport class RuntimeEntitySelectDataSource implements EntitySelectDataSource<RuntimeEntityItem> {\n constructor(\n private getEntitiesByCkTypeGQL: GetEntitiesByCkTypeDtoGQL,\n private ckTypeId: string\n ) {}\n\n async onFilter(filter: string, take?: number): Promise<EntitySelectResult<RuntimeEntityItem>> {\n const result = await firstValueFrom(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId: this.ckTypeId,\n first: take ?? 10,\n fieldFilters: [\n { attributePath: 'rtId', operator: FieldFilterOperatorsDto.LikeDto, comparisonValue: filter }\n ]\n }\n })\n );\n\n const items = (result.data?.runtime?.runtimeEntities?.items ?? [])\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .map(item => ({\n rtId: item.rtId,\n ckTypeId: item.ckTypeId,\n rtWellKnownName: item.rtWellKnownName ?? undefined,\n displayName: item.rtWellKnownName || item.rtId\n }));\n\n return {\n totalCount: result.data?.runtime?.runtimeEntities?.totalCount ?? 0,\n items\n };\n }\n\n onDisplayEntity(entity: RuntimeEntityItem): string {\n return entity.displayName;\n }\n\n getIdEntity(entity: RuntimeEntityItem): string {\n return entity.rtId;\n }\n}\n\n/**\n * Dialog data source for entity selection grid with pagination and search\n */\nexport class RuntimeEntityDialogDataSource implements EntitySelectDialogDataSource<RuntimeEntityItem> {\n constructor(\n private getEntitiesByCkTypeGQL: GetEntitiesByCkTypeDtoGQL,\n private ckTypeId: string\n ) {}\n\n getColumns(): ColumnDefinition[] {\n return [\n { field: 'rtId', displayName: 'RT-ID' },\n { field: 'rtWellKnownName', displayName: 'Name' },\n { field: 'ckTypeId', displayName: 'CK Type' }\n ];\n }\n\n fetchData(options: DialogFetchOptions): Observable<DialogFetchResult<RuntimeEntityItem>> {\n // Build field filters for text search\n const fieldFilters: { attributePath: string; operator: FieldFilterOperatorsDto; comparisonValue: string }[] = [];\n if (options.textSearch && options.textSearch.trim()) {\n fieldFilters.push({\n attributePath: 'rtId',\n operator: FieldFilterOperatorsDto.LikeDto,\n comparisonValue: options.textSearch.trim()\n });\n }\n\n return from(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId: this.ckTypeId,\n first: options.take,\n after: options.skip > 0 ? btoa(`arrayconnection:${options.skip - 1}`) : undefined,\n fieldFilters: fieldFilters.length > 0 ? fieldFilters : undefined\n }\n })\n ).pipe(\n map(result => {\n const items = (result.data?.runtime?.runtimeEntities?.items ?? [])\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .map(item => ({\n rtId: item.rtId,\n ckTypeId: item.ckTypeId,\n rtWellKnownName: item.rtWellKnownName ?? undefined,\n displayName: item.rtWellKnownName || item.rtId\n }));\n\n return {\n data: items,\n totalCount: result.data?.runtime?.runtimeEntities?.totalCount ?? 0\n };\n })\n );\n }\n\n onDisplayEntity(entity: RuntimeEntityItem): string {\n return entity.displayName;\n }\n\n getIdEntity(entity: RuntimeEntityItem): string {\n return entity.rtId;\n }\n}\n","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type GetSystemPersistentQueriesQueryVariablesDto = Types.Exact<{\n after?: Types.InputMaybe<Types.Scalars['String']['input']>;\n first?: Types.InputMaybe<Types.Scalars['Int']['input']>;\n searchFilter?: Types.InputMaybe<Types.SearchFilterDto>;\n fieldFilters?: Types.InputMaybe<Array<Types.InputMaybe<Types.FieldFilterDto>> | Types.InputMaybe<Types.FieldFilterDto>>;\n sort?: Types.InputMaybe<Array<Types.InputMaybe<Types.SortDto>> | Types.InputMaybe<Types.SortDto>>;\n}>;\n\n\nexport type GetSystemPersistentQueriesQueryDto = { __typename?: 'OctoQuery', runtime?: { __typename?: 'RuntimeModelQuery', systemPersistentQuery?: { __typename?: 'SystemPersistentQueryConnection', totalCount?: number | null, items?: Array<{ __typename?: 'SystemPersistentQuery', rtId: any, ckTypeId: any, name: string, description?: string | null, queryCkTypeId: string } | null> | null } | null } | null };\n\nexport const GetSystemPersistentQueriesDocumentDto = gql`\n query getSystemPersistentQueries($after: String, $first: Int, $searchFilter: SearchFilter, $fieldFilters: [FieldFilter], $sort: [Sort]) {\n runtime {\n systemPersistentQuery(\n after: $after\n first: $first\n searchFilter: $searchFilter\n fieldFilter: $fieldFilters\n sortOrder: $sort\n ) {\n totalCount\n items {\n rtId\n ckTypeId\n name\n description\n queryCkTypeId\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class GetSystemPersistentQueriesDtoGQL extends Apollo.Query<GetSystemPersistentQueriesQueryDto, GetSystemPersistentQueriesQueryVariablesDto> {\n document = GetSystemPersistentQueriesDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import { Component, Input, Output, EventEmitter, OnInit, inject, forwardRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { firstValueFrom } from 'rxjs';\nimport { GetSystemPersistentQueriesDtoGQL } from '../../graphQL/getSystemPersistentQueries';\nimport { PersistentQueryItem } from '../../utils/runtime-entity-data-sources';\n\n/**\n * Reusable component for selecting a persistent query.\n * Provides a combobox with filtering and displays query name + description.\n *\n * Usage:\n * ```html\n * <mm-query-selector\n * [(ngModel)]=\"selectedQuery\"\n * (querySelected)=\"onQuerySelected($event)\"\n * placeholder=\"Select a Query...\"\n * hint=\"Select a query to provide data for this widget.\">\n * </mm-query-selector>\n * ```\n */\n@Component({\n selector: 'mm-query-selector',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DropDownsModule\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => QuerySelectorComponent),\n multi: true\n }\n ],\n template: `\n <div class=\"query-selector\">\n <kendo-combobox\n [data]=\"queries\"\n [textField]=\"'name'\"\n [valueField]=\"'rtId'\"\n [valuePrimitive]=\"false\"\n [(ngModel)]=\"selectedQuery\"\n [filterable]=\"true\"\n (filterChange)=\"onFilterChange($event)\"\n (valueChange)=\"onValueChange($event)\"\n [placeholder]=\"placeholder\"\n [loading]=\"isLoading\"\n [disabled]=\"disabled\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"query-item\">\n <span class=\"query-name\">{{ dataItem.name }}</span>\n @if (dataItem.description) {\n <span class=\"query-description\">{{ dataItem.description }}</span>\n }\n </div>\n </ng-template>\n </kendo-combobox>\n @if (hint) {\n <p class=\"field-hint\">{{ hint }}</p>\n }\n </div>\n `,\n styles: [`\n .query-selector {\n width: 100%;\n }\n\n .query-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .query-name {\n font-weight: 500;\n }\n\n .query-description {\n font-size: 0.85em;\n opacity: 0.7;\n }\n\n .field-hint {\n font-size: 0.85em;\n margin-top: 4px;\n opacity: 0.7;\n }\n `]\n})\nexport class QuerySelectorComponent implements OnInit, ControlValueAccessor {\n private readonly getSystemPersistentQueriesGQL = inject(GetSystemPersistentQueriesDtoGQL);\n\n /** Placeholder text for the combobox */\n @Input() placeholder = 'Select a Query...';\n\n /** Hint text shown below the combobox */\n @Input() hint?: string;\n\n /** Whether the component is disabled */\n @Input() disabled = false;\n\n /** Whether to load queries automatically on init */\n @Input() autoLoad = true;\n\n /** Emitted when a query is selected */\n @Output() querySelected = new EventEmitter<PersistentQueryItem | null>();\n\n /** Emitted when queries are loaded */\n @Output() queriesLoaded = new EventEmitter<PersistentQueryItem[]>();\n\n queries: PersistentQueryItem[] = [];\n selectedQuery: PersistentQueryItem | null = null;\n isLoading = false;\n\n // ControlValueAccessor (initialized as noop, set by registerOnChange/registerOnTouched)\n private onChange: (value: PersistentQueryItem | null) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n ngOnInit(): void {\n if (this.autoLoad) {\n this.loadQueries();\n }\n }\n\n /**\n * Loads persistent queries with optional search text filter\n */\n async loadQueries(searchText?: string): Promise<void> {\n this.isLoading = true;\n\n try {\n const result = await firstValueFrom(this.getSystemPersistentQueriesGQL.fetch({\n variables: {\n first: 100,\n searchFilter: searchText ? { searchTerm: searchText, language: 'de' } : undefined\n }\n }));\n\n const items = result.data?.runtime?.systemPersistentQuery?.items || [];\n this.queries = items\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .map(item => ({\n rtId: item.rtId,\n name: item.name ?? '',\n description: item.description,\n queryCkTypeId: item.queryCkTypeId\n }));\n\n this.queriesLoaded.emit(this.queries);\n } catch (error) {\n console.error('Error loading queries:', error);\n this.queries = [];\n } finally {\n this.isLoading = false;\n }\n }\n\n /**\n * Called when the combobox filter changes (user types)\n */\n onFilterChange(filter: string): void {\n this.loadQueries(filter);\n }\n\n /**\n * Called when a query is selected\n */\n onValueChange(query: PersistentQueryItem | null): void {\n this.selectedQuery = query;\n this.onChange(query);\n this.onTouched();\n this.querySelected.emit(query);\n }\n\n /**\n * Sets the selected query by rtId (useful for loading existing config)\n */\n async selectByRtId(rtId: string): Promise<PersistentQueryItem | null> {\n // First ensure queries are loaded\n if (this.queries.length === 0) {\n await this.loadQueries();\n }\n\n // Try to find in loaded queries\n let query = this.queries.find(q => q.rtId === rtId);\n\n if (!query) {\n // Query not in initial list, search for it\n await this.loadQueries(rtId);\n query = this.queries.find(q => q.rtId === rtId);\n }\n\n if (query) {\n this.selectedQuery = query;\n this.onChange(query);\n }\n\n return query ?? null;\n }\n\n // ControlValueAccessor implementation\n writeValue(value: PersistentQueryItem | null): void {\n this.selectedQuery = value;\n }\n\n registerOnChange(fn: (value: PersistentQueryItem | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n}\n","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type GetEntitiesByCkTypeQueryVariablesDto = Types.Exact<{\n ckTypeId: Types.Scalars['String']['input'];\n rtId?: Types.InputMaybe<Types.Scalars['OctoObjectId']['input']>;\n after?: Types.InputMaybe<Types.Scalars['String']['input']>;\n first?: Types.InputMaybe<Types.Scalars['Int']['input']>;\n searchFilter?: Types.InputMaybe<Types.SearchFilterDto>;\n fieldFilters?: Types.InputMaybe<Array<Types.InputMaybe<Types.FieldFilterDto>> | Types.InputMaybe<Types.FieldFilterDto>>;\n sort?: Types.InputMaybe<Array<Types.InputMaybe<Types.SortDto>> | Types.InputMaybe<Types.SortDto>>;\n}>;\n\n\nexport type GetEntitiesByCkTypeQueryDto = { __typename?: 'OctoQuery', runtime?: { __typename?: 'RuntimeModelQuery', runtimeEntities?: { __typename?: 'RtEntityGenericDtoConnection', totalCount?: number | null, items?: Array<{ __typename?: 'RtEntity', rtId: any, ckTypeId: any, rtWellKnownName?: string | null, rtCreationDateTime?: any | null, rtChangedDateTime?: any | null, attributes?: { __typename?: 'RtEntityAttributeDtoConnection', items?: Array<{ __typename?: 'RtEntityAttribute', attributeName?: string | null, value?: any | null } | null> | null } | null } | null> | null } | null } | null };\n\nexport const GetEntitiesByCkTypeDocumentDto = gql`\n query getEntitiesByCkType($ckTypeId: String!, $rtId: OctoObjectId, $after: String, $first: Int, $searchFilter: SearchFilter, $fieldFilters: [FieldFilter], $sort: [Sort]) {\n runtime {\n runtimeEntities(\n ckId: $ckTypeId\n rtId: $rtId\n after: $after\n first: $first\n searchFilter: $searchFilter\n fieldFilter: $fieldFilters\n sortOrder: $sort\n ) {\n totalCount\n items {\n rtId\n ckTypeId\n rtWellKnownName\n rtCreationDateTime\n rtChangedDateTime\n attributes(resolveEnumValuesToNames: true) {\n items {\n attributeName\n value\n }\n }\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class GetEntitiesByCkTypeDtoGQL extends Apollo.Query<GetEntitiesByCkTypeQueryDto, GetEntitiesByCkTypeQueryVariablesDto> {\n document = GetEntitiesByCkTypeDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import { Component, Input, Output, EventEmitter, inject, ViewChild, forwardRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CkTypeSelectorInputComponent } from '@meshmakers/octo-ui';\nimport { CkTypeSelectorItem, CkTypeSelectorService } from '@meshmakers/octo-services';\nimport { EntitySelectInputComponent } from '@meshmakers/shared-ui';\nimport { GetEntitiesByCkTypeDtoGQL } from '../../graphQL/getEntitiesByCkType';\nimport {\n RuntimeEntityItem,\n RuntimeEntitySelectDataSource,\n RuntimeEntityDialogDataSource\n} from '../../utils/runtime-entity-data-sources';\n\n/**\n * Value object for the runtime entity selector\n */\nexport interface RuntimeEntitySelectorValue {\n ckTypeId: string;\n rtCkTypeId: string;\n rtId?: string;\n displayName?: string;\n}\n\n/**\n * Reusable component for selecting a runtime entity.\n * Combines CK Type selector and Entity selector into a single component.\n *\n * Usage:\n * ```html\n * <mm-runtime-entity-selector\n * [(ngModel)]=\"selectedEntity\"\n * (entitySelected)=\"onEntitySelected($event)\"\n * ckTypeLabel=\"Runtime Entities\"\n * entityLabel=\"Entity\">\n * </mm-runtime-entity-selector>\n * ```\n */\n@Component({\n selector: 'mm-runtime-entity-selector',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n CkTypeSelectorInputComponent,\n EntitySelectInputComponent\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RuntimeEntitySelectorComponent),\n multi: true\n }\n ],\n template: `\n <div class=\"runtime-entity-selector\">\n <!-- CK Type Selection -->\n <div class=\"form-field\">\n <label>{{ ckTypeLabel }} @if (ckTypeRequired) { <span class=\"required\">*</span> }</label>\n <mm-ck-type-selector-input\n #ckTypeSelector\n [placeholder]=\"ckTypePlaceholder\"\n [minSearchLength]=\"2\"\n [dialogTitle]=\"ckTypeDialogTitle\"\n [ngModel]=\"selectedCkType\"\n (ckTypeSelected)=\"onCkTypeSelected($event)\"\n (ckTypeCleared)=\"onCkTypeCleared()\">\n </mm-ck-type-selector-input>\n @if (ckTypeHint) {\n <p class=\"field-hint\">{{ ckTypeHint }}</p>\n }\n </div>\n\n <!-- Entity Selection (only shown when CK Type is selected) -->\n @if (showEntitySelector) {\n <div class=\"form-field\" [class.disabled]=\"!selectedCkType\">\n <label>{{ entityLabel }} @if (entityRequired) { <span class=\"required\">*</span> }</label>\n @if (selectedCkType && entityDataSource) {\n <mm-entity-select-input\n #entitySelector\n [dataSource]=\"entityDataSource\"\n [dialogDataSource]=\"entityDialogDataSource\"\n [placeholder]=\"entityPlaceholder\"\n [dialogTitle]=\"entityDialogTitle\"\n [minSearchLength]=\"1\"\n [ngModel]=\"selectedEntity\"\n (entitySelected)=\"onEntitySelected($event)\"\n (entityCleared)=\"onEntityCleared()\">\n </mm-entity-select-input>\n } @else {\n <input\n kendoTextBox\n [placeholder]=\"entityPlaceholder\"\n disabled />\n }\n @if (entityHint) {\n <p class=\"field-hint\">{{ entityHint }}</p>\n }\n </div>\n }\n </div>\n `,\n styles: [`\n .runtime-entity-selector {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .form-field label {\n font-weight: 500;\n }\n\n .form-field.disabled {\n opacity: 0.6;\n }\n\n .field-hint {\n font-size: 0.85em;\n margin: 0;\n opacity: 0.7;\n }\n\n .required {\n color: #dc3545;\n }\n `]\n})\nexport class RuntimeEntitySelectorComponent implements ControlValueAccessor {\n private readonly getEntitiesByCkTypeGQL = inject(GetEntitiesByCkTypeDtoGQL);\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n\n @ViewChild('ckTypeSelector') ckTypeSelector!: CkTypeSelectorInputComponent;\n @ViewChild('entitySelector') entitySelector?: EntitySelectInputComponent;\n\n // CK Type configuration\n @Input() ckTypeLabel = 'Runtime Entities';\n @Input() ckTypePlaceholder = 'Select Runtime Entities...';\n @Input() ckTypeDialogTitle = 'Select Runtime Entities';\n @Input() ckTypeHint = 'Select the type of entities to choose from.';\n @Input() ckTypeRequired = false;\n\n // Entity configuration\n @Input() entityLabel = 'Entity';\n @Input() entityPlaceholder = 'Search for an entity...';\n @Input() entityDialogTitle = 'Select Entity';\n @Input() entityHint = 'Select the specific entity.';\n @Input() entityRequired = false;\n\n /** Whether to show the entity selector (set to false if only CK Type selection is needed) */\n @Input() showEntitySelector = true;\n\n /** Whether the component is disabled */\n @Input() disabled = false;\n\n /** Emitted when a CK Type is selected */\n @Output() ckTypeSelected = new EventEmitter<CkTypeSelectorItem>();\n\n /** Emitted when the CK Type is cleared */\n @Output() ckTypeCleared = new EventEmitter<void>();\n\n /** Emitted when an entity is selected */\n @Output() entitySelected = new EventEmitter<RuntimeEntityItem>();\n\n /** Emitted when the entity is cleared */\n @Output() entityCleared = new EventEmitter<void>();\n\n /** Emitted when the full value changes */\n @Output() valueChange = new EventEmitter<RuntimeEntitySelectorValue | null>();\n\n selectedCkType: CkTypeSelectorItem | null = null;\n selectedEntity: RuntimeEntityItem | null = null;\n entityDataSource?: RuntimeEntitySelectDataSource;\n entityDialogDataSource?: RuntimeEntityDialogDataSource;\n\n // ControlValueAccessor (initialized as noop, set by registerOnChange/registerOnTouched)\n private onChange: (value: RuntimeEntitySelectorValue | null) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n /**\n * Called when a CK Type is selected\n */\n onCkTypeSelected(ckType: CkTypeSelectorItem): void {\n this.selectedCkType = ckType;\n this.selectedEntity = null;\n\n // Create new data sources for entity selection\n this.entityDataSource = new RuntimeEntitySelectDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n this.entityDialogDataSource = new RuntimeEntityDialogDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n\n this.ckTypeSelected.emit(ckType);\n this.emitValue();\n }\n\n /**\n * Called when the CK Type is cleared\n */\n onCkTypeCleared(): void {\n this.selectedCkType = null;\n this.selectedEntity = null;\n this.entityDataSource = undefined;\n this.entityDialogDataSource = undefined;\n\n this.ckTypeCleared.emit();\n this.emitValue();\n }\n\n /**\n * Called when an entity is selected\n */\n onEntitySelected(entity: RuntimeEntityItem): void {\n this.selectedEntity = entity;\n this.entitySelected.emit(entity);\n this.emitValue();\n }\n\n /**\n * Called when the entity is cleared\n */\n onEntityCleared(): void {\n this.selectedEntity = null;\n this.entityCleared.emit();\n this.emitValue();\n }\n\n /**\n * Sets the value by loading CK Type and Entity by their IDs\n */\n async setValueByIds(ckTypeId: string, rtId?: string): Promise<void> {\n // Load CK Type\n const ckType = await this.loadCkTypeByRtCkTypeId(ckTypeId);\n\n if (ckType) {\n this.selectedCkType = ckType;\n\n // Create data sources\n this.entityDataSource = new RuntimeEntitySelectDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n this.entityDialogDataSource = new RuntimeEntityDialogDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n\n // Set the CK Type in the selector\n if (this.ckTypeSelector) {\n this.ckTypeSelector.writeValue(ckType);\n }\n\n // Load entity if rtId is provided\n if (rtId && this.entityDataSource) {\n const entityResult = await this.entityDataSource.onFilter(rtId, 1);\n if (entityResult.items.length > 0) {\n this.selectedEntity = entityResult.items[0];\n }\n }\n }\n }\n\n /**\n * Loads a CK Type by its rtCkTypeId\n */\n private async loadCkTypeByRtCkTypeId(rtCkTypeId: string): Promise<CkTypeSelectorItem | null> {\n try {\n const result = await this.ckTypeSelectorService.getCkTypeByRtCkTypeId(rtCkTypeId).toPromise();\n return result ?? null;\n } catch {\n console.error(`Failed to load CK Type: ${rtCkTypeId}`);\n return null;\n }\n }\n\n /**\n * Emits the current value\n */\n private emitValue(): void {\n const value = this.getCurrentValue();\n this.onChange(value);\n this.onTouched();\n this.valueChange.emit(value);\n }\n\n /**\n * Gets the current value\n */\n private getCurrentValue(): RuntimeEntitySelectorValue | null {\n if (!this.selectedCkType) {\n return null;\n }\n\n return {\n ckTypeId: this.selectedCkType.fullName,\n rtCkTypeId: this.selectedCkType.rtCkTypeId,\n rtId: this.selectedEntity?.rtId,\n displayName: this.selectedEntity?.displayName\n };\n }\n\n // ControlValueAccessor implementation\n writeValue(value: RuntimeEntitySelectorValue | null): void {\n if (value) {\n // Defer loading to allow component to initialize\n setTimeout(() => this.setValueByIds(value.rtCkTypeId, value.rtId), 0);\n } else {\n this.selectedCkType = null;\n this.selectedEntity = null;\n this.entityDataSource = undefined;\n this.entityDialogDataSource = undefined;\n }\n }\n\n registerOnChange(fn: (value: RuntimeEntitySelectorValue | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n}\n","import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Shared component to display a consistent \"widget not configured\" message.\n * Used by all widget types when they are not properly configured.\n */\n@Component({\n selector: 'mm-widget-not-configured',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"widget-not-configured\">\n <span class=\"warning-icon\">!</span>\n <span class=\"message\">Widget not configured</span>\n </div>\n `,\n styles: [`\n .widget-not-configured {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 8px;\n color: var(--kendo-color-error, #dc3545);\n }\n\n .warning-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: rgba(220, 53, 69, 0.1);\n font-weight: bold;\n font-size: 1.25rem;\n }\n\n .message {\n font-size: 0.875rem;\n text-align: center;\n }\n `]\n})\nexport class WidgetNotConfiguredComponent {}\n","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type GetDashboardsQueryVariablesDto = Types.Exact<{\n first?: Types.InputMaybe<Types.Scalars['Int']['input']>;\n}>;\n\n\nexport type GetDashboardsQueryDto = { __typename?: 'OctoQuery', runtime?: { __typename?: 'RuntimeModelQuery', systemUIDashboard?: { __typename?: 'SystemUIDashboardConnection', totalCount?: number | null, items?: Array<{ __typename?: 'SystemUIDashboard', rtId: any, ckTypeId: any, rtWellKnownName?: string | null, name: string, description: string, columns: number, rowHeight: number, gap: number, rtCreationDateTime?: any | null, rtChangedDateTime?: any | null } | null> | null } | null } | null };\n\nexport const GetDashboardsDocumentDto = gql`\n query getDashboards($first: Int) {\n runtime {\n systemUIDashboard(first: $first) {\n totalCount\n items {\n rtId\n ckTypeId\n rtWellKnownName\n name\n description\n columns\n rowHeight\n gap\n rtCreationDateTime\n rtChangedDateTime\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class GetDashboardsDtoGQL extends Apollo.Query<GetDashboardsQueryDto, GetDashboardsQueryVariablesDto> {\n document = GetDashboardsDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type CreateDashboardMutationVariablesDto = Types.Exact<{\n entities: Array<Types.InputMaybe<Types.SystemUiDashboardInputDto>> | Types.InputMaybe<Types.SystemUiDashboardInputDto>;\n}>;\n\n\nexport type CreateDashboardMutationDto = { __typename?: 'OctoMutation', runtime?: { __typename?: 'Runtime', systemUIDashboards?: { __typename?: 'SystemUIDashboardMutations', create?: Array<{ __typename?: 'SystemUIDashboard', rtId: any, ckTypeId: any, rtWellKnownName?: string | null, name: string, description: string, columns: number, rowHeight: number, gap: number, rtCreationDateTime?: any | null } | null> | null } | null } | null };\n\nexport const CreateDashboardDocumentDto = gql`\n mutation createDashboard($entities: [SystemUIDashboardInput]!) {\n runtime {\n systemUIDashboards {\n create(entities: $entities) {\n rtId\n ckTypeId\n rtWellKnownName\n name\n description\n columns\n rowHeight\n gap\n rtCreationDateTime\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class CreateDashboardDtoGQL extends Apollo.Mutation<CreateDashboardMutationDto, CreateDashboardMutationVariablesDto> {\n document = CreateDashboardDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type UpdateDashboardMutationVariablesDto = Types.Exact<{\n entities: Array<Types.InputMaybe<Types.SystemUiDashboardInputUpdateDto>> | Types.InputMaybe<Types.SystemUiDashboardInputUpdateDto>;\n}>;\n\n\nexport type UpdateDashboardMutationDto = { __typename?: 'OctoMutation', runtime?: { __typename?: 'Runtime', systemUIDashboards?: { __typename?: 'SystemUIDashboardMutations', update?: Array<{ __typename?: 'SystemUIDashboard', rtId: any, ckTypeId: any, rtWellKnownName?: string | null, name: string, description: string, columns: number, rowHeight: number, gap: number, rtChangedDateTime?: any | null } | null> | null } | null } | null };\n\nexport const UpdateDashboardDocumentDto = gql`\n mutation updateDashboard($entities: [SystemUIDashboardInputUpdate]!) {\n runtime {\n systemUIDashboards {\n update(entities: $entities) {\n rtId\n ckTypeId\n rtWellKnownName\n name\n description\n columns\n rowHeight\n gap\n rtChangedDateTime\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class UpdateDashboardDtoGQL extends Apollo.Mutation<UpdateDashboardMutationDto, UpdateDashboardMutationVariablesDto> {\n document = UpdateDashboardDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type CreateDashboardWidgetMutationVariablesDto = Types.Exact<{\n entities: Array<Types.InputMaybe<Types.SystemUiDashboardWidgetInputDto>> | Types.InputMaybe<Types.SystemUiDashboardWidgetInputDto>;\n}>;\n\n\nexport type CreateDashboardWidgetMutationDto = { __typename?: 'OctoMutation', runtime?: { __typename?: 'Runtime', systemUIDashboardWidgets?: { __typename?: 'SystemUIDashboardWidgetMutations', create?: Array<{ __typename?: 'SystemUIDashboardWidget', rtId: any, ckTypeId: any, name: string, type: string, col: number, row: number, colSpan: number, rowSpan: number, dataSourceType: string, dataSourceCkTypeId?: string | null, dataSourceRtId?: string | null, config: string, rtCreationDateTime?: any | null } | null> | null } | null } | null };\n\nexport const CreateDashboardWidgetDocumentDto = gql`\n mutation createDashboardWidget($entities: [SystemUIDashboardWidgetInput]!) {\n runtime {\n systemUIDashboardWidgets {\n create(entities: $entities) {\n rtId\n ckTypeId\n name\n type\n col\n row\n colSpan\n rowSpan\n dataSourceType\n dataSourceCkTypeId\n dataSourceRtId\n config\n rtCreationDateTime\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class CreateDashboardWidgetDtoGQL extends Apollo.Mutation<CreateDashboardWidgetMutationDto, CreateDashboardWidgetMutationVariablesDto> {\n document = CreateDashboardWidgetDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type UpdateDashboardWidgetMutationVariablesDto = Types.Exact<{\n entities: Array<Types.InputMaybe<Types.SystemUiDashboardWidgetInputUpdateDto>> | Types.InputMaybe<Types.SystemUiDashboardWidgetInputUpdateDto>;\n}>;\n\n\nexport type UpdateDashboardWidgetMutationDto = { __typename?: 'OctoMutation', runtime?: { __typename?: 'Runtime', systemUIDashboardWidgets?: { __typename?: 'SystemUIDashboardWidgetMutations', update?: Array<{ __typename?: 'SystemUIDashboardWidget', rtId: any, ckTypeId: any, name: string, type: string, col: number, row: number, colSpan: number, rowSpan: number, dataSourceType: string, dataSourceCkTypeId?: string | null, dataSourceRtId?: string | null, config: string, rtChangedDateTime?: any | null } | null> | null } | null } | null };\n\nexport const UpdateDashboardWidgetDocumentDto = gql`\n mutation updateDashboardWidget($entities: [SystemUIDashboardWidgetInputUpdate]!) {\n runtime {\n systemUIDashboardWidgets {\n update(entities: $entities) {\n rtId\n ckTypeId\n name\n type\n col\n row\n colSpan\n rowSpan\n dataSourceType\n dataSourceCkTypeId\n dataSourceRtId\n config\n rtChangedDateTime\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class UpdateDashboardWidgetDtoGQL extends Apollo.Mutation<UpdateDashboardWidgetMutationDto, UpdateDashboardWidgetMutationVariablesDto> {\n document = UpdateDashboardWidgetDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type DeleteEntitiesMutationVariablesDto = Types.Exact<{\n rtEntityIds: Array<Types.InputMaybe<Types.RtEntityIdDto>> | Types.InputMaybe<Types.RtEntityIdDto>;\n deleteStrategy?: Types.DeleteStrategiesDto;\n}>;\n\n\nexport type DeleteEntitiesMutationDto = { __typename?: 'OctoMutation', runtime?: { __typename?: 'Runtime', runtimeEntities?: { __typename?: 'RtEntityMutations', delete?: boolean | null } | null } | null };\n\nexport const DeleteEntitiesDocumentDto = gql`\n mutation deleteEntities($rtEntityIds: [RtEntityId]!, $deleteStrategy: DeleteStrategies! = ARCHIVE) {\n runtime {\n runtimeEntities {\n delete(entities: $rtEntityIds, options: $deleteStrategy)\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class DeleteEntitiesDtoGQL extends Apollo.Mutation<DeleteEntitiesMutationDto, DeleteEntitiesMutationVariablesDto> {\n document = DeleteEntitiesDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type GetDashboardWithWidgetsQueryVariablesDto = Types.Exact<{\n rtId: Types.Scalars['OctoObjectId']['input'];\n}>;\n\n\nexport type GetDashboardWithWidgetsQueryDto = { __typename?: 'OctoQuery', runtime?: { __typename?: 'RuntimeModelQuery', systemUIDashboard?: { __typename?: 'SystemUIDashboardConnection', items?: Array<{ __typename?: 'SystemUIDashboard', rtId: any, ckTypeId: any, rtWellKnownName?: string | null, name: string, description: string, columns: number, rowHeight: number, gap: number, rtCreationDateTime?: any | null, rtChangedDateTime?: any | null, children?: { __typename?: 'SystemUIDashboardWidget_ChildrenUnionConnection', items?: Array<{ __typename?: 'SystemUIDashboardWidget', rtId: any, ckTypeId: any, name: string, type: string, col: number, row: number, colSpan: number, rowSpan: number, dataSourceType: string, dataSourceCkTypeId?: string | null, dataSourceRtId?: string | null, config: string } | null> | null } | null } | null> | null } | null } | null };\n\nexport const GetDashboardWithWidgetsDocumentDto = gql`\n query getDashboardWithWidgets($rtId: OctoObjectId!) {\n runtime {\n systemUIDashboard(rtId: $rtId, first: 1) {\n items {\n rtId\n ckTypeId\n rtWellKnownName\n name\n description\n columns\n rowHeight\n gap\n rtCreationDateTime\n rtChangedDateTime\n children(first: 100, ckTypeIds: [\"System.UI/DashboardWidget\"]) {\n items {\n ... on SystemUIDashboardWidget {\n rtId\n ckTypeId\n name\n type\n col\n row\n colSpan\n rowSpan\n dataSourceType\n dataSourceCkTypeId\n dataSourceRtId\n config\n }\n }\n }\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class GetDashboardWithWidgetsDtoGQL extends Apollo.Query<GetDashboardWithWidgetsQueryDto, GetDashboardWithWidgetsQueryVariablesDto> {\n document = GetDashboardWithWidgetsDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","// Re-export all GraphQL types from @meshmakers/octo-services\n// This file is NOT generated - it imports shared types from the library\nexport * from '@meshmakers/octo-services';\n","import { Injectable, Type, inject, Injector, EnvironmentInjector, createComponent, ApplicationRef } from '@angular/core';\nimport { Observable, Subject, firstValueFrom } from 'rxjs';\nimport { AnyWidgetConfig, WidgetType, RuntimeEntityDataSource, DataSourceType } from '../models/meshboard.models';\n\n/**\n * Base interface for all widget config dialog results.\n * Each dialog must return at least the data source info.\n */\nexport interface WidgetConfigResult {\n ckTypeId: string;\n rtId?: string;\n}\n\n/**\n * Base configuration passed to widget factory functions.\n * Contains common fields that all widgets need.\n */\nexport interface BaseWidgetConfig {\n id: string;\n title: string;\n col: number;\n row: number;\n colSpan: number;\n rowSpan: number;\n configurable?: boolean;\n}\n\n/**\n * Persisted widget data from the backend.\n * Used for deserializing widgets from storage.\n */\nexport interface PersistedWidgetData {\n rtId: string;\n ckTypeId: string;\n name: string;\n type: string;\n col: number;\n row: number;\n colSpan: number;\n rowSpan: number;\n dataSourceType: string;\n dataSourceCkTypeId?: string | null;\n dataSourceRtId?: string | null;\n config: string;\n}\n\n/**\n * Data structure for widget persistence.\n * Returned by toPersistedConfig to serialize widget-specific config.\n */\nexport interface WidgetPersistenceData {\n /** Data source type for storage (note: 'persistentQuery' maps to 'systemQuery' in backend) */\n dataSourceType: DataSourceType;\n /** CkTypeId for runtimeEntity data sources */\n dataSourceCkTypeId?: string;\n /** RtId for runtimeEntity or queryRtId for persistentQuery */\n dataSourceRtId?: string;\n /** Widget-specific configuration as JSON-serializable object */\n config: Record<string, unknown>;\n}\n\n/**\n * Interface that config dialog components must implement.\n * Uses EventEmitters for save/cancelled events.\n */\nexport interface WidgetConfigDialog<TResult extends WidgetConfigResult = WidgetConfigResult> {\n // Initial values - set via inputs\n initialCkTypeId?: string;\n initialRtId?: string;\n\n // Events - dialog emits these\n save: Subject<TResult>;\n cancelled: Subject<void>;\n}\n\n/**\n * Function type for applying config result to widget.\n * Takes the current widget and config result, returns updated widget.\n */\nexport type ConfigResultApplier<\n TWidget extends AnyWidgetConfig = AnyWidgetConfig,\n TResult extends WidgetConfigResult = WidgetConfigResult\n> = (widget: TWidget, result: TResult) => TWidget;\n\n/**\n * Registration for a widget type including display component, config dialog, and result handler.\n * This is the central definition for each widget type - all widget-specific logic lives here.\n */\nexport interface WidgetRegistration<\n TWidget extends AnyWidgetConfig = AnyWidgetConfig,\n TResult extends WidgetConfigResult = WidgetConfigResult\n> {\n /** Widget type identifier */\n type: WidgetType;\n\n /** Display name for UI */\n label: string;\n\n /** Component that renders the widget */\n component: Type<unknown>;\n\n /** Config dialog component (optional - some widgets may not be configurable) */\n configDialogComponent?: Type<WidgetConfigDialog<TResult>>;\n\n /** Function to apply config result to widget config */\n applyConfigResult?: ConfigResultApplier<TWidget, TResult>;\n\n /** Default size for the widget */\n defaultSize: { colSpan: number; rowSpan: number };\n\n /** Function to extract initial config values for dialog */\n getInitialConfig?: (widget: TWidget) => Record<string, unknown>;\n\n /**\n * Data source types that this widget supports.\n * Used by config dialogs to show only relevant options.\n * If not specified, all data source types are assumed to be supported.\n */\n supportedDataSources?: DataSourceType[];\n\n // ========== SOLID: Factory and Persistence Functions ==========\n\n /**\n * Creates a new widget with default configuration.\n * Called when adding a new widget to the dashboard.\n */\n createDefaultConfig: (baseConfig: BaseWidgetConfig) => TWidget;\n\n /**\n * Serializes widget configuration for persistence.\n * Extracts widget-specific data for storage in the backend.\n */\n toPersistedConfig: (widget: TWidget) => WidgetPersistenceData;\n\n /**\n * Deserializes persisted data back to widget configuration.\n * Called when loading a dashboard from the backend.\n */\n fromPersistedConfig: (data: PersistedWidgetData, baseConfig: BaseWidgetConfig) => TWidget;\n}\n\n/**\n * Result of opening a config dialog\n */\nexport interface ConfigDialogResult<TResult extends WidgetConfigResult = WidgetConfigResult> {\n saved: boolean;\n result?: TResult;\n}\n\n/**\n * Central registry for widget types.\n * Manages widget components, config dialogs, and their interactions.\n *\n * Usage:\n * 1. Widgets register themselves via registerWidget()\n * 2. Dashboard uses getRegisteredWidgets() for \"Add Widget\" dialog\n * 3. Dashboard uses getWidgetComponent() for rendering\n * 4. Dashboard uses openConfigDialog() for configuration\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class WidgetRegistryService {\n private readonly injector = inject(Injector);\n private readonly envInjector = inject(EnvironmentInjector);\n private readonly appRef = inject(ApplicationRef);\n\n private readonly registry = new Map<WidgetType, WidgetRegistration>();\n\n /**\n * Registers a widget type with its components and handlers.\n */\n registerWidget<\n TWidget extends AnyWidgetConfig = AnyWidgetConfig,\n TResult extends WidgetConfigResult = WidgetConfigResult\n >(registration: WidgetRegistration<TWidget, TResult>): void {\n // Use unknown as intermediate type to avoid generic constraint issues\n this.registry.set(registration.type, registration as unknown as WidgetRegistration);\n }\n\n /**\n * Gets all registered widget types for the \"Add Widget\" dialog.\n */\n getRegisteredWidgets(): { type: WidgetType; label: string }[] {\n return Array.from(this.registry.values()).map(reg => ({\n type: reg.type,\n label: reg.label\n }));\n }\n\n /**\n * Gets the display component for a widget type.\n */\n getWidgetComponent(type: WidgetType): Type<unknown> | undefined {\n return this.registry.get(type)?.component;\n }\n\n /**\n * Gets the default size for a widget type.\n */\n getDefaultSize(type: WidgetType): { colSpan: number; rowSpan: number } {\n return this.registry.get(type)?.defaultSize ?? { colSpan: 2, rowSpan: 1 };\n }\n\n /**\n * Gets the full registration for a widget type.\n * Used by factory and persistence services to delegate widget-specific logic.\n */\n getRegistration(type: WidgetType): WidgetRegistration | undefined {\n return this.registry.get(type);\n }\n\n /**\n * Gets the supported data source types for a widget.\n * Returns all types if not specified in registration.\n */\n getSupportedDataSources(type: WidgetType): DataSourceType[] {\n const registration = this.registry.get(type);\n if (registration?.supportedDataSources) {\n return registration.supportedDataSources;\n }\n // Default: all data source types\n return ['runtimeEntity', 'persistentQuery', 'aggregation', 'serviceCall', 'constructionKitQuery', 'static'];\n }\n\n // ========== SOLID: Factory Methods ==========\n\n /**\n * Creates a new widget with default configuration.\n * Delegates to the widget's createDefaultConfig function.\n */\n createWidget(type: WidgetType, baseConfig: BaseWidgetConfig): AnyWidgetConfig {\n const registration = this.registry.get(type);\n if (!registration) {\n throw new Error(`Unknown widget type: ${type}`);\n }\n return registration.createDefaultConfig(baseConfig);\n }\n\n // ========== SOLID: Persistence Methods ==========\n\n /**\n * Serializes a widget for persistence.\n * Delegates to the widget's toPersistedConfig function.\n */\n serializeWidget(widget: AnyWidgetConfig): WidgetPersistenceData {\n const registration = this.registry.get(widget.type);\n if (!registration) {\n throw new Error(`Unknown widget type: ${widget.type}`);\n }\n return registration.toPersistedConfig(widget);\n }\n\n /**\n * Deserializes persisted data back to a widget configuration.\n * Delegates to the widget's fromPersistedConfig function.\n */\n deserializeWidget(data: PersistedWidgetData): AnyWidgetConfig {\n const type = data.type as WidgetType;\n const registration = this.registry.get(type);\n if (!registration) {\n // Fallback for unknown types - return a basic KPI widget\n console.warn(`Unknown widget type: ${type}, falling back to KPI`);\n const kpiRegistration = this.registry.get('kpi');\n if (!kpiRegistration) {\n throw new Error('KPI widget registration not found for fallback');\n }\n const baseConfig = this.buildBaseConfig(data);\n return kpiRegistration.fromPersistedConfig(data, baseConfig);\n }\n\n const baseConfig = this.buildBaseConfig(data);\n return registration.fromPersistedConfig(data, baseConfig);\n }\n\n /**\n * Builds base configuration from persisted data.\n */\n private buildBaseConfig(data: PersistedWidgetData): BaseWidgetConfig {\n return {\n id: data.rtId,\n title: data.name,\n col: data.col,\n row: data.row,\n colSpan: data.colSpan,\n rowSpan: data.rowSpan,\n configurable: true\n };\n }\n\n /**\n * Checks if a widget type has a config dialog.\n */\n hasConfigDialog(type: WidgetType): boolean {\n return this.registry.get(type)?.configDialogComponent !== undefined;\n }\n\n /**\n * Gets the config dialog component for a widget type.\n */\n getConfigDialogComponent(type: WidgetType): Type<WidgetConfigDialog> | undefined {\n return this.registry.get(type)?.configDialogComponent;\n }\n\n /**\n * Gets the initial config values for a widget's config dialog.\n */\n getInitialConfig(widget: AnyWidgetConfig): Record<string, unknown> {\n const registration = this.registry.get(widget.type);\n if (!registration?.getInitialConfig) {\n // Default: extract data source info\n return {\n initialCkTypeId: this.getCkTypeId(widget),\n initialRtId: this.getRtId(widget)\n };\n }\n return registration.getInitialConfig(widget);\n }\n\n /**\n * Applies config result to a widget.\n */\n applyConfigResult(widget: AnyWidgetConfig, result: WidgetConfigResult): AnyWidgetConfig {\n const registration = this.registry.get(widget.type);\n\n if (registration?.applyConfigResult) {\n return registration.applyConfigResult(widget, result);\n }\n\n // Default: just update data source\n const newDataSource: RuntimeEntityDataSource = {\n type: 'runtimeEntity',\n ckTypeId: result.ckTypeId,\n rtId: result.rtId\n };\n\n return {\n ...widget,\n dataSource: newDataSource\n } as AnyWidgetConfig;\n }\n\n /**\n * Opens a config dialog for a widget and returns an Observable with the result.\n * The dialog is created dynamically and destroyed after closing.\n */\n openConfigDialog(widget: AnyWidgetConfig): Observable<ConfigDialogResult> {\n return new Observable(subscriber => {\n const registration = this.registry.get(widget.type);\n\n if (!registration?.configDialogComponent) {\n subscriber.next({ saved: false });\n subscriber.complete();\n return;\n }\n\n // Create the dialog component dynamically\n const componentRef = createComponent(registration.configDialogComponent, {\n environmentInjector: this.envInjector,\n elementInjector: this.injector\n });\n\n // Set initial values on the dialog component\n const initialConfig = this.getInitialConfig(widget);\n const instance = componentRef.instance as unknown as Record<string, unknown>;\n Object.entries(initialConfig).forEach(([key, value]) => {\n instance[key] = value;\n });\n\n // Subscribe to dialog events\n const saveSubscription = componentRef.instance.save.subscribe((result: WidgetConfigResult) => {\n subscriber.next({ saved: true, result });\n subscriber.complete();\n cleanup();\n });\n\n const cancelSubscription = componentRef.instance.cancelled.subscribe(() => {\n subscriber.next({ saved: false });\n subscriber.complete();\n cleanup();\n });\n\n // Attach to DOM\n this.appRef.attachView(componentRef.hostView);\n const domElement = (componentRef.hostView as unknown as { rootNodes: Node[] }).rootNodes[0];\n document.body.appendChild(domElement);\n\n // Cleanup function\n const cleanup = () => {\n saveSubscription.unsubscribe();\n cancelSubscription.unsubscribe();\n this.appRef.detachView(componentRef.hostView);\n componentRef.destroy();\n };\n\n // Return cleanup on unsubscribe\n return cleanup;\n });\n }\n\n /**\n * Opens a config dialog and waits for result (Promise version).\n */\n async openConfigDialogAsync(widget: AnyWidgetConfig): Promise<ConfigDialogResult> {\n return firstValueFrom(this.openConfigDialog(widget));\n }\n\n /**\n * Helper to extract ckTypeId from widget.\n */\n private getCkTypeId(widget: AnyWidgetConfig): string | undefined {\n if (widget.dataSource.type === 'runtimeEntity') {\n return widget.dataSource.ckTypeId;\n }\n return undefined;\n }\n\n /**\n * Helper to extract rtId from widget.\n */\n private getRtId(widget: AnyWidgetConfig): string | undefined {\n if (widget.dataSource.type === 'runtimeEntity') {\n return widget.dataSource.rtId;\n }\n return undefined;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { GetDashboardsDtoGQL } from '../graphQL/getDashboards';\nimport { CreateDashboardDtoGQL } from '../graphQL/createDashboard';\nimport { UpdateDashboardDtoGQL } from '../graphQL/updateDashboard';\nimport { CreateDashboardWidgetDtoGQL } from '../graphQL/createDashboardWidget';\nimport { UpdateDashboardWidgetDtoGQL } from '../graphQL/updateDashboardWidget';\nimport { DeleteEntitiesDtoGQL } from '../graphQL/deleteEntities';\nimport { GetDashboardWithWidgetsDtoGQL } from '../graphQL/getDashboardWithWidgets';\nimport { MeshBoardConfig, AnyWidgetConfig, MeshBoardVariable, MeshBoardTimeFilterConfig } from '../models/meshboard.models';\nimport { AssociationModOptionsDto, DeleteStrategiesDto, RtAssociationInputDto, SystemUiDashboardWidgetInputDto } from '../graphQL/globalTypes';\nimport { WidgetRegistryService, PersistedWidgetData } from './widget-registry.service';\n\n/**\n * Defines how parent associations should be handled when mapping widget input\n */\nexport type ParentAssociationMode =\n | { type: 'create'; dashboardRtId: string } // New widget: create association\n | { type: 'keep' } // Existing widget, same parent: no change\n | { type: 'move'; oldDashboardRtId: string; newDashboardRtId: string }; // Widget moved: delete old, create new\n\nexport interface PersistedMeshBoard {\n rtId: string;\n ckTypeId: string;\n rtWellKnownName?: string | null;\n name: string;\n description: string;\n columns: number;\n rowHeight: number;\n gap: number;\n}\n\n/** @deprecated Use PersistedMeshBoard instead */\nexport type PersistedDashboard = PersistedMeshBoard;\n\nexport interface PersistedWidget {\n rtId: string;\n ckTypeId: string;\n name: string;\n type: string;\n col: number;\n row: number;\n colSpan: number;\n rowSpan: number;\n dataSourceType: string;\n dataSourceCkTypeId?: string | null;\n dataSourceRtId?: string | null;\n config: string;\n}\n\n/**\n * Result of updating a dashboard, including created widget mappings\n */\nexport interface UpdateDashboardResult {\n createdWidgets: { localId: string; rtId: string }[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MeshBoardPersistenceService {\n private readonly getDashboardsGQL = inject(GetDashboardsDtoGQL);\n private readonly getDashboardWithWidgetsGQL = inject(GetDashboardWithWidgetsDtoGQL);\n private readonly createDashboardGQL = inject(CreateDashboardDtoGQL);\n private readonly updateDashboardGQL = inject(UpdateDashboardDtoGQL);\n private readonly createWidgetGQL = inject(CreateDashboardWidgetDtoGQL);\n private readonly updateWidgetGQL = inject(UpdateDashboardWidgetDtoGQL);\n private readonly deleteEntitiesGQL = inject(DeleteEntitiesDtoGQL);\n private readonly widgetRegistry = inject(WidgetRegistryService);\n\n private readonly DASHBOARD_CK_TYPE_ID = 'System.UI/Dashboard';\n private readonly WIDGET_CK_TYPE_ID = 'System.UI/DashboardWidget';\n\n /**\n * Separator used to encode variables in the description field.\n * Format: <description>\\n---MESHBOARD_VARIABLES---\\n<json>\n *\n * Note: This is a temporary solution until the backend schema is updated\n * to include a dedicated 'config' field for MeshBoard configuration.\n */\n private readonly VARIABLES_SEPARATOR = '\\n---MESHBOARD_VARIABLES---\\n';\n\n /**\n * Fetches all available MeshBoards\n */\n async getMeshBoards(first = 100): Promise<PersistedMeshBoard[]> {\n const result = await firstValueFrom(\n this.getDashboardsGQL.fetch({ variables: { first }, fetchPolicy: 'network-only' })\n );\n const items = result.data?.runtime?.systemUIDashboard?.items ?? [];\n\n return items\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .map(item => ({\n rtId: item.rtId,\n ckTypeId: item.ckTypeId,\n rtWellKnownName: item.rtWellKnownName,\n name: item.name,\n description: item.description,\n columns: item.columns,\n rowHeight: item.rowHeight,\n gap: item.gap\n }));\n }\n\n /**\n * Fetches a MeshBoard with all its widgets\n */\n async getMeshBoardWithWidgets(rtId: string): Promise<{ meshBoard: PersistedMeshBoard; widgets: PersistedWidget[] } | null> {\n const result = await firstValueFrom(\n this.getDashboardWithWidgetsGQL.fetch({ variables: { rtId }, fetchPolicy: 'network-only' })\n );\n const dashboard = result.data?.runtime?.systemUIDashboard?.items?.[0];\n\n if (!dashboard) {\n return null;\n }\n\n const widgets = dashboard.children?.items ?? [];\n\n return {\n meshBoard: {\n rtId: dashboard.rtId,\n ckTypeId: dashboard.ckTypeId,\n rtWellKnownName: dashboard.rtWellKnownName,\n name: dashboard.name,\n description: dashboard.description,\n columns: dashboard.columns,\n rowHeight: dashboard.rowHeight,\n gap: dashboard.gap\n },\n widgets: widgets\n .filter((w): w is NonNullable<typeof w> => w !== null)\n .map(w => ({\n rtId: w.rtId,\n ckTypeId: w.ckTypeId,\n name: w.name,\n type: w.type,\n col: w.col,\n row: w.row,\n colSpan: w.colSpan,\n rowSpan: w.rowSpan,\n dataSourceType: w.dataSourceType,\n dataSourceCkTypeId: w.dataSourceCkTypeId,\n dataSourceRtId: w.dataSourceRtId,\n config: w.config\n }))\n };\n }\n\n /**\n * Creates a new MeshBoard with its widgets\n */\n async createMeshBoard(config: MeshBoardConfig): Promise<string> {\n // Encode variables and timeFilter in description field (temporary until backend adds config field)\n const encodedDescription = this.encodeVariablesInDescription(\n config.description ?? '',\n config.variables,\n config.timeFilter\n );\n\n const dashboardInput: Record<string, unknown> = {\n name: config.name,\n description: encodedDescription,\n columns: config.columns,\n rowHeight: config.rowHeight,\n gap: config.gap\n };\n\n // Only set rtWellKnownName if provided\n if (config.rtWellKnownName) {\n dashboardInput['rtWellKnownName'] = config.rtWellKnownName;\n }\n\n const result = await firstValueFrom(\n this.createDashboardGQL.mutate({ variables: { entities: [dashboardInput] } })\n );\n\n const createdDashboard = result.data?.runtime?.systemUIDashboards?.create?.[0];\n if (!createdDashboard) {\n throw new Error('Failed to create dashboard');\n }\n\n const dashboardRtId = createdDashboard.rtId;\n\n // Create widgets with parent association to dashboard\n if (config.widgets.length > 0) {\n const widgetInputs = config.widgets.map(widget =>\n this.mapWidgetToInput(widget, { type: 'create', dashboardRtId })\n );\n await firstValueFrom(\n this.createWidgetGQL.mutate({ variables: { entities: widgetInputs } })\n );\n }\n\n return dashboardRtId;\n }\n\n /**\n * Updates an existing MeshBoard and its widgets.\n * Returns mapping of created widgets (localId -> rtId) for state synchronization.\n */\n async updateMeshBoard(rtId: string, config: MeshBoardConfig, existingWidgetRtIds: string[] = []): Promise<UpdateDashboardResult> {\n const result: UpdateDashboardResult = { createdWidgets: [] };\n\n // Encode variables and timeFilter in description field (temporary until backend adds config field)\n const encodedDescription = this.encodeVariablesInDescription(\n config.description ?? '',\n config.variables,\n config.timeFilter\n );\n\n const dashboardItem: Record<string, unknown> = {\n name: config.name,\n description: encodedDescription,\n columns: config.columns,\n rowHeight: config.rowHeight,\n gap: config.gap\n };\n\n // Include rtWellKnownName in update (can be set or cleared)\n dashboardItem['rtWellKnownName'] = config.rtWellKnownName || null;\n\n const dashboardUpdate = {\n rtId,\n item: dashboardItem\n };\n\n // Update dashboard\n await firstValueFrom(\n this.updateDashboardGQL.mutate({ variables: { entities: [dashboardUpdate] } })\n );\n\n // Find widgets to delete (exist in backend but not in current config)\n // Use rtId for comparison since that's the backend identifier\n const currentWidgetRtIds = config.widgets\n .map(w => w.rtId)\n .filter((id): id is string => id !== undefined);\n const widgetsToDelete = existingWidgetRtIds.filter(id => !currentWidgetRtIds.includes(id));\n\n // Delete removed widgets\n if (widgetsToDelete.length > 0) {\n const deleteInput = widgetsToDelete.map(widgetRtId => ({\n rtId: widgetRtId,\n ckTypeId: this.WIDGET_CK_TYPE_ID\n }));\n await firstValueFrom(\n this.deleteEntitiesGQL.mutate({ variables: { rtEntityIds: deleteInput, deleteStrategy: DeleteStrategiesDto.EraseDto } })\n );\n }\n\n // Update existing widgets and create new ones\n const updatePromises: Promise<unknown>[] = [];\n\n for (const widget of config.widgets) {\n if (widget.rtId && existingWidgetRtIds.includes(widget.rtId)) {\n // Update existing widget - use rtId for the update\n const widgetUpdate = {\n rtId: widget.rtId,\n item: this.mapWidgetToInput(widget, { type: 'keep' })\n };\n updatePromises.push(\n firstValueFrom(this.updateWidgetGQL.mutate({ variables: { entities: [widgetUpdate] } }))\n );\n } else {\n // Create new widget - create association to this dashboard\n const widgetInput = this.mapWidgetToInput(widget, { type: 'create', dashboardRtId: rtId });\n const createPromise = firstValueFrom(\n this.createWidgetGQL.mutate({ variables: { entities: [widgetInput] } })\n ).then(createResult => {\n const createdWidget = createResult.data?.runtime?.systemUIDashboardWidgets?.create?.[0];\n if (createdWidget?.rtId) {\n result.createdWidgets.push({ localId: widget.id, rtId: createdWidget.rtId });\n }\n });\n updatePromises.push(createPromise);\n }\n }\n\n if (updatePromises.length > 0) {\n await Promise.all(updatePromises);\n }\n\n return result;\n }\n\n /**\n * Converts a persisted MeshBoard to MeshBoardConfig\n */\n toMeshBoardConfig(meshBoard: PersistedMeshBoard, widgets: PersistedWidget[]): MeshBoardConfig {\n // Decode variables and timeFilter from description field (temporary until backend adds config field)\n const { description, variables, timeFilter } = this.decodeVariablesFromDescription(meshBoard.description);\n\n return {\n id: meshBoard.rtId,\n name: meshBoard.name,\n description,\n rtWellKnownName: meshBoard.rtWellKnownName,\n columns: meshBoard.columns,\n rowHeight: meshBoard.rowHeight,\n gap: meshBoard.gap,\n variables,\n timeFilter,\n widgets: widgets.map(w => this.toWidgetConfig(w))\n };\n }\n\n /**\n * Converts a persisted widget to AnyWidgetConfig.\n * Delegates to WidgetRegistryService for widget-specific deserialization (SOLID: Open/Closed Principle).\n */\n private toWidgetConfig(widget: PersistedWidget): AnyWidgetConfig {\n // Convert PersistedWidget to PersistedWidgetData format expected by registry\n const persistedData: PersistedWidgetData = {\n rtId: widget.rtId,\n ckTypeId: widget.ckTypeId,\n name: widget.name,\n type: widget.type,\n col: widget.col,\n row: widget.row,\n colSpan: widget.colSpan,\n rowSpan: widget.rowSpan,\n dataSourceType: widget.dataSourceType,\n dataSourceCkTypeId: widget.dataSourceCkTypeId,\n dataSourceRtId: widget.dataSourceRtId,\n config: widget.config\n };\n\n // Delegate to registry - no switch statement needed!\n return this.widgetRegistry.deserializeWidget(persistedData);\n }\n\n /**\n * Maps widget config to GraphQL input.\n * Delegates to WidgetRegistryService for widget-specific serialization (SOLID: Open/Closed Principle).\n */\n private mapWidgetToInput(widget: AnyWidgetConfig, associationMode: ParentAssociationMode): SystemUiDashboardWidgetInputDto {\n // Delegate to registry for widget-specific serialization - no switch statement needed!\n const persistenceData = this.widgetRegistry.serializeWidget(widget);\n\n // Build parent association based on mode\n const parentAssociations = this.buildParentAssociations(associationMode);\n\n // Map persistentQuery to systemQuery for backend storage\n const dataSourceType = persistenceData.dataSourceType === 'persistentQuery' ? 'systemQuery' : persistenceData.dataSourceType;\n\n const result: SystemUiDashboardWidgetInputDto = {\n name: widget.title,\n type: widget.type,\n col: Math.round(widget.col),\n row: Math.round(widget.row),\n colSpan: Math.round(widget.colSpan),\n rowSpan: Math.round(widget.rowSpan),\n dataSourceType,\n dataSourceCkTypeId: persistenceData.dataSourceCkTypeId ?? '',\n dataSourceRtId: persistenceData.dataSourceRtId ?? '',\n config: JSON.stringify(persistenceData.config)\n };\n\n // Only include parent if there are association changes\n if (parentAssociations.length > 0) {\n result.parent = parentAssociations;\n }\n\n return result;\n }\n\n /**\n * Builds parent association array based on the association mode\n */\n private buildParentAssociations(mode: ParentAssociationMode): RtAssociationInputDto[] {\n switch (mode.type) {\n case 'create':\n // New widget: create association to dashboard\n return [{\n modOption: AssociationModOptionsDto.CreateDto,\n target: { rtId: mode.dashboardRtId, ckTypeId: this.DASHBOARD_CK_TYPE_ID }\n }];\n\n case 'keep':\n // Existing widget, same parent: no association changes\n return [];\n\n case 'move':\n // Widget moved to different dashboard: delete old, create new\n return [\n {\n modOption: AssociationModOptionsDto.DeleteDto,\n target: { rtId: mode.oldDashboardRtId, ckTypeId: this.DASHBOARD_CK_TYPE_ID }\n },\n {\n modOption: AssociationModOptionsDto.CreateDto,\n target: { rtId: mode.newDashboardRtId, ckTypeId: this.DASHBOARD_CK_TYPE_ID }\n }\n ];\n }\n }\n\n /**\n * Deletes a MeshBoard and all its widgets (via cascade delete)\n */\n async deleteMeshBoard(rtId: string): Promise<void> {\n await firstValueFrom(\n this.deleteEntitiesGQL.mutate({\n variables: {\n rtEntityIds: [{ rtId, ckTypeId: this.DASHBOARD_CK_TYPE_ID }],\n deleteStrategy: DeleteStrategiesDto.EraseDto\n }\n })\n );\n }\n\n /**\n * Renames a MeshBoard (updates name and description)\n */\n async renameMeshBoard(rtId: string, name: string, description: string): Promise<void> {\n await firstValueFrom(\n this.updateDashboardGQL.mutate({\n variables: {\n entities: [{\n rtId,\n item: { name, description }\n }]\n }\n })\n );\n }\n\n // ============================================================================\n // Variable Persistence Helpers\n // ============================================================================\n\n /**\n * Encodes variables and timeFilter into the description field.\n * Format: <description>\\n---MESHBOARD_VARIABLES---\\n<json>\n *\n * Note: Only static variables are persisted. TimeFilter variables are derived\n * from the timeFilter selection when the MeshBoard is loaded.\n */\n private encodeVariablesInDescription(\n description: string,\n variables?: MeshBoardVariable[],\n timeFilter?: MeshBoardTimeFilterConfig\n ): string {\n // Filter out timeFilter variables (they are derived, not persisted directly)\n const staticVariables = variables?.filter(v => v.source !== 'timeFilter');\n\n // Check if there's anything to encode\n if ((!staticVariables || staticVariables.length === 0) && !timeFilter?.enabled) {\n return description;\n }\n\n try {\n const data: { variables?: MeshBoardVariable[]; timeFilter?: MeshBoardTimeFilterConfig } = {};\n\n if (staticVariables && staticVariables.length > 0) {\n data.variables = staticVariables;\n }\n\n if (timeFilter?.enabled) {\n data.timeFilter = timeFilter;\n }\n\n const dataJson = JSON.stringify(data);\n return `${description}${this.VARIABLES_SEPARATOR}${dataJson}`;\n } catch (error) {\n console.error('Failed to encode MeshBoard config data:', error);\n return description;\n }\n }\n\n /**\n * Decodes variables and timeFilter from the description field.\n * Returns the original description, parsed variables, and timeFilter config.\n *\n * Handles both legacy format (just variables array) and new format (object with variables and timeFilter).\n */\n private decodeVariablesFromDescription(rawDescription: string): {\n description: string;\n variables: MeshBoardVariable[];\n timeFilter?: MeshBoardTimeFilterConfig;\n } {\n if (!rawDescription.includes(this.VARIABLES_SEPARATOR)) {\n return { description: rawDescription, variables: [] };\n }\n\n const parts = rawDescription.split(this.VARIABLES_SEPARATOR);\n const description = parts[0];\n\n try {\n const parsed = JSON.parse(parts[1]);\n\n // Handle legacy format: direct array of variables\n if (Array.isArray(parsed)) {\n return { description, variables: parsed as MeshBoardVariable[] };\n }\n\n // New format: object with variables and timeFilter\n return {\n description,\n variables: parsed.variables ?? [],\n timeFilter: parsed.timeFilter\n };\n } catch (error) {\n console.error('Failed to decode MeshBoard config data:', error);\n return { description: rawDescription, variables: [] };\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AnyWidgetConfig } from '../models/meshboard.models';\n\nexport interface GridCell {\n col: number;\n row: number;\n}\n\nexport interface GridPosition {\n col: number;\n row: number;\n}\n\n/**\n * Service for MeshBoard grid layout calculations and collision detection.\n * Handles widget positioning, overlap detection, and finding available positions.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class MeshBoardGridService {\n\n /**\n * Returns all grid cells occupied by a widget at the given position/size.\n */\n getCells(col: number, row: number, colSpan: number, rowSpan: number): GridCell[] {\n const cells: GridCell[] = [];\n for (let c = col; c < col + colSpan; c++) {\n for (let r = row; r < row + rowSpan; r++) {\n cells.push({ col: c, row: r });\n }\n }\n return cells;\n }\n\n /**\n * Checks if placing a widget at the given position/size would overlap with any other widget.\n * Uses the model (not DOM) for accurate, predictable collision detection.\n */\n wouldCauseOverlap(\n widgets: AnyWidgetConfig[],\n widgetId: string,\n col: number,\n row: number,\n colSpan: number,\n rowSpan: number\n ): boolean {\n const widgetCells = this.getCells(col, row, colSpan, rowSpan);\n\n for (const other of widgets) {\n if (other.id === widgetId) continue;\n\n const otherCells = this.getCells(other.col, other.row, other.colSpan, other.rowSpan);\n\n for (const cell of widgetCells) {\n if (otherCells.some(c => c.col === cell.col && c.row === cell.row)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Checks if a widget would extend beyond the grid boundaries.\n */\n isOutOfBounds(col: number, colSpan: number, maxColumns: number): boolean {\n return col + colSpan - 1 > maxColumns;\n }\n\n /**\n * Finds an available position for a widget of the given size.\n */\n findAvailablePosition(\n widgets: AnyWidgetConfig[],\n colSpan: number,\n rowSpan: number,\n maxColumns: number\n ): GridPosition {\n const occupiedCells = this.getOccupiedCells(widgets);\n\n // Search row by row, column by column\n for (let row = 1; row <= 100; row++) {\n for (let col = 1; col <= maxColumns - colSpan + 1; col++) {\n const cells = this.getCells(col, row, colSpan, rowSpan);\n const fits = cells.every(c => c.col <= maxColumns && !occupiedCells.has(`${c.row},${c.col}`));\n\n if (fits) {\n return { col, row };\n }\n }\n }\n\n // Fallback: place at the bottom\n const maxRow = Math.max(...widgets.map(w => w.row + w.rowSpan), 1);\n return { col: 1, row: maxRow };\n }\n\n /**\n * Resolves overlapping widgets by moving them to non-overlapping positions.\n * Modifies the widgets array in place.\n * Returns the list of widgets that were moved.\n */\n resolveOverlaps(widgets: AnyWidgetConfig[], maxColumns: number): AnyWidgetConfig[] {\n const movedWidgets: AnyWidgetConfig[] = [];\n const occupiedCells = new Set<string>();\n\n for (const widget of widgets) {\n const cells = this.getCells(widget.col, widget.row, widget.colSpan, widget.rowSpan);\n const hasOverlap = cells.some(c => occupiedCells.has(`${c.row},${c.col}`));\n\n if (hasOverlap) {\n // Find a new position for this widget\n const newPos = this.findAvailablePositionWithOccupied(\n widget.colSpan,\n widget.rowSpan,\n maxColumns,\n occupiedCells\n );\n widget.col = newPos.col;\n widget.row = newPos.row;\n movedWidgets.push(widget);\n }\n\n // Mark cells as occupied\n const finalCells = this.getCells(widget.col, widget.row, widget.colSpan, widget.rowSpan);\n for (const cell of finalCells) {\n occupiedCells.add(`${cell.row},${cell.col}`);\n }\n }\n\n return movedWidgets;\n }\n\n /**\n * Gets all widgets that would be outside the grid if columns were reduced.\n */\n getWidgetsOutOfBounds(widgets: AnyWidgetConfig[], newColumns: number): AnyWidgetConfig[] {\n return widgets.filter(w => w.col + w.colSpan - 1 > newColumns);\n }\n\n /**\n * Calculates the maximum row used by any widget.\n */\n getMaxRow(widgets: AnyWidgetConfig[]): number {\n if (widgets.length === 0) return 0;\n return Math.max(...widgets.map(w => w.row + w.rowSpan - 1));\n }\n\n /**\n * Creates a set of all occupied cell keys from the widgets.\n */\n private getOccupiedCells(widgets: AnyWidgetConfig[]): Set<string> {\n const occupiedCells = new Set<string>();\n for (const widget of widgets) {\n const cells = this.getCells(widget.col, widget.row, widget.colSpan, widget.rowSpan);\n for (const cell of cells) {\n occupiedCells.add(`${cell.row},${cell.col}`);\n }\n }\n return occupiedCells;\n }\n\n /**\n * Finds an available position using a pre-computed set of occupied cells.\n */\n private findAvailablePositionWithOccupied(\n colSpan: number,\n rowSpan: number,\n maxColumns: number,\n occupiedCells: Set<string>\n ): GridPosition {\n // Search row by row, column by column\n for (let row = 1; row <= 100; row++) {\n for (let col = 1; col <= maxColumns - colSpan + 1; col++) {\n const cells = this.getCells(col, row, colSpan, rowSpan);\n const fits = cells.every(c => c.col <= maxColumns && !occupiedCells.has(`${c.row},${c.col}`));\n\n if (fits) {\n return { col, row };\n }\n }\n }\n\n // Fallback: place at the bottom (find highest row in occupied cells)\n let maxRow = 1;\n for (const key of occupiedCells) {\n const [row] = key.split(',').map(Number);\n maxRow = Math.max(maxRow, row + 1);\n }\n return { col: 1, row: maxRow };\n }\n}\n\n/** @deprecated Use MeshBoardGridService instead */\nexport const DashboardGridService = MeshBoardGridService;\n","import { Injectable, inject, signal, computed } from '@angular/core';\nimport { CkModelService } from '@meshmakers/octo-services';\nimport { MeshBoardPersistenceService, PersistedMeshBoard } from './meshboard-persistence.service';\nimport { MeshBoardGridService } from './meshboard-grid.service';\nimport {\n MeshBoardConfig,\n AnyWidgetConfig,\n MeshBoardVariable,\n MeshBoardTimeFilterConfig,\n TimeRangeSelection\n} from '../models/meshboard.models';\n\n/** The CK model required for the MeshBoard feature */\nconst REQUIRED_CK_MODEL = 'System.UI';\nconst REQUIRED_CK_MODEL_MIN_VERSION = '1.0.1';\n\n/**\n * Service that manages MeshBoard state and persistence.\n * Coordinates loading, saving, and switching between MeshBoards.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class MeshBoardStateService {\n private readonly ckModelService = inject(CkModelService);\n private readonly persistenceService = inject(MeshBoardPersistenceService);\n private readonly gridService = inject(MeshBoardGridService);\n\n // Reactive state signals\n private readonly _meshBoardConfig = signal<MeshBoardConfig>(this.createDefaultConfig());\n private readonly _persistedMeshBoardId = signal<string | null>(null);\n /** Stores the rtIds of widgets that exist in the backend */\n private readonly _existingWidgetRtIds = signal<string[]>([]);\n private readonly _availableMeshBoards = signal<PersistedMeshBoard[]>([]);\n private readonly _isLoading = signal(false);\n private readonly _isModelAvailable = signal<boolean | null>(null);\n\n // Public computed signals\n readonly meshBoardConfig = computed(() => this._meshBoardConfig());\n readonly persistedMeshBoardId = computed(() => this._persistedMeshBoardId());\n /** @deprecated Use existingWidgetRtIds instead */\n readonly existingWidgetIds = computed(() => this._existingWidgetRtIds());\n readonly existingWidgetRtIds = computed(() => this._existingWidgetRtIds());\n readonly availableMeshBoards = computed(() => this._availableMeshBoards());\n readonly isLoading = computed(() => this._isLoading());\n readonly widgets = computed(() => this._meshBoardConfig().widgets);\n readonly isModelAvailable = computed(() => this._isModelAvailable());\n\n // Deprecated aliases for backward compatibility\n /** @deprecated Use meshBoardConfig instead */\n readonly dashboardConfig = this.meshBoardConfig;\n /** @deprecated Use persistedMeshBoardId instead */\n readonly persistedDashboardId = this.persistedMeshBoardId;\n /** @deprecated Use availableMeshBoards instead */\n readonly availableDashboards = this.availableMeshBoards;\n\n /**\n * Creates the default MeshBoard configuration.\n */\n private createDefaultConfig(): MeshBoardConfig {\n return {\n id: 'demo-meshboard',\n name: 'Demo MeshBoard',\n description: 'A demonstration of the MeshBoard widget system',\n columns: 6,\n rowHeight: 200,\n gap: 16,\n widgets: []\n };\n }\n\n /**\n * Loads the initial MeshBoard from backend or starts with empty MeshBoard.\n * Only loads if the required CK model (System.UI) is available.\n */\n async loadInitialMeshBoard(): Promise<AnyWidgetConfig[]> {\n this._isLoading.set(true);\n\n try {\n // Check if the required CK model is available with minimum version\n const modelAvailable = await this.ckModelService.isModelAvailableWithMinVersion(\n REQUIRED_CK_MODEL,\n REQUIRED_CK_MODEL_MIN_VERSION\n );\n this._isModelAvailable.set(modelAvailable);\n\n if (!modelAvailable) {\n console.warn(\n `MeshBoard feature not available: CK model '${REQUIRED_CK_MODEL}' >= ${REQUIRED_CK_MODEL_MIN_VERSION} is not installed in this tenant.`\n );\n return [];\n }\n\n const meshBoards = await this.persistenceService.getMeshBoards();\n this._availableMeshBoards.set(meshBoards);\n\n if (meshBoards.length > 0) {\n return await this.switchToMeshBoard(meshBoards[0].rtId);\n } else {\n // No MeshBoards exist - start with empty MeshBoard\n this._persistedMeshBoardId.set(null);\n this._existingWidgetRtIds.set([]);\n return [];\n }\n } catch (err) {\n console.error('Error loading MeshBoard:', err);\n return [];\n } finally {\n this._isLoading.set(false);\n }\n }\n\n /** @deprecated Use loadInitialMeshBoard instead */\n async loadInitialDashboard(): Promise<AnyWidgetConfig[]> {\n return this.loadInitialMeshBoard();\n }\n\n /**\n * Switches to a different MeshBoard by rtId.\n * Returns the widgets for data loading.\n */\n async switchToMeshBoard(rtId: string): Promise<AnyWidgetConfig[]> {\n this._isLoading.set(true);\n\n try {\n const result = await this.persistenceService.getMeshBoardWithWidgets(rtId);\n\n if (result) {\n const config = this.persistenceService.toMeshBoardConfig(result.meshBoard, result.widgets);\n\n // Fix any overlapping widgets from backend data\n const movedWidgets = this.gridService.resolveOverlaps(config.widgets, config.columns);\n if (movedWidgets.length > 0) {\n console.warn(`Resolved ${movedWidgets.length} overlapping widget(s)`);\n }\n\n this._meshBoardConfig.set(config);\n this._persistedMeshBoardId.set(result.meshBoard.rtId);\n this._existingWidgetRtIds.set(result.widgets.map(w => w.rtId));\n\n return config.widgets;\n } else {\n console.error('MeshBoard not found:', rtId);\n return this._meshBoardConfig().widgets;\n }\n } catch (err) {\n console.error('Error switching MeshBoard:', err);\n return this._meshBoardConfig().widgets;\n } finally {\n this._isLoading.set(false);\n }\n }\n\n /** @deprecated Use switchToMeshBoard instead */\n async switchToDashboard(rtId: string): Promise<AnyWidgetConfig[]> {\n return this.switchToMeshBoard(rtId);\n }\n\n /**\n * Switches to a MeshBoard identified by its rtWellKnownName.\n * Loads initial MeshBoards if not already loaded.\n * Returns the widgets for data loading, or null if not found.\n */\n async switchToMeshBoardByWellKnownName(wellKnownName: string): Promise<AnyWidgetConfig[] | null> {\n this._isLoading.set(true);\n\n try {\n // Ensure MeshBoards are loaded\n if (this._availableMeshBoards().length === 0) {\n await this.loadInitialMeshBoard();\n }\n\n // Find MeshBoard by well-known name\n const meshBoard = this._availableMeshBoards().find(\n mb => mb.rtWellKnownName === wellKnownName\n );\n\n if (meshBoard) {\n return await this.switchToMeshBoard(meshBoard.rtId);\n } else {\n console.warn(`MeshBoard with rtWellKnownName '${wellKnownName}' not found`);\n return null;\n }\n } catch (err) {\n console.error('Error switching to MeshBoard by well-known name:', err);\n return null;\n } finally {\n this._isLoading.set(false);\n }\n }\n\n /**\n * Saves the current MeshBoard configuration to the backend.\n */\n async saveMeshBoard(): Promise<void> {\n const config = this._meshBoardConfig();\n const persistedId = this._persistedMeshBoardId();\n const existingRtIds = this._existingWidgetRtIds();\n\n try {\n if (persistedId) {\n // Update existing MeshBoard\n const result = await this.persistenceService.updateMeshBoard(persistedId, config, existingRtIds);\n console.log('MeshBoard updated successfully');\n\n // Update rtIds for newly created widgets\n if (result.createdWidgets.length > 0) {\n this.updateConfig(c => ({\n ...c,\n widgets: c.widgets.map(w => {\n const created = result.createdWidgets.find(cw => cw.localId === w.id);\n if (created) {\n return { ...w, rtId: created.rtId };\n }\n return w;\n })\n }));\n }\n\n // Update existingWidgetRtIds with all current widget rtIds\n const updatedConfig = this._meshBoardConfig();\n this._existingWidgetRtIds.set(\n updatedConfig.widgets\n .map(w => w.rtId)\n .filter((rtId): rtId is string => rtId !== undefined)\n );\n } else {\n // Create new MeshBoard\n const meshBoardId = await this.persistenceService.createMeshBoard(config);\n console.log('MeshBoard created with ID:', meshBoardId);\n this._persistedMeshBoardId.set(meshBoardId);\n this.updateConfig(c => ({ ...c, id: meshBoardId }));\n\n // For new MeshBoards, reload to get the widget rtIds from backend\n await this.switchToMeshBoard(meshBoardId);\n }\n } catch (err) {\n console.error('Error saving MeshBoard:', err);\n throw err; // Re-throw so caller can handle\n }\n }\n\n /** @deprecated Use saveMeshBoard instead */\n async saveDashboard(): Promise<void> {\n return this.saveMeshBoard();\n }\n\n /**\n * Updates the MeshBoard configuration.\n */\n updateConfig(updater: (config: MeshBoardConfig) => MeshBoardConfig): void {\n this._meshBoardConfig.update(updater);\n }\n\n /**\n * Sets the MeshBoard configuration directly.\n */\n setConfig(config: MeshBoardConfig): void {\n this._meshBoardConfig.set(config);\n }\n\n /**\n * Gets the current MeshBoard configuration (non-reactive).\n */\n getConfig(): MeshBoardConfig {\n return this._meshBoardConfig();\n }\n\n /**\n * Adds a widget to the MeshBoard.\n */\n addWidget(widget: AnyWidgetConfig): void {\n this.updateConfig(config => ({\n ...config,\n widgets: [...config.widgets, widget]\n }));\n }\n\n /**\n * Removes a widget from the MeshBoard.\n */\n removeWidget(widgetId: string): void {\n this.updateConfig(config => ({\n ...config,\n widgets: config.widgets.filter(w => w.id !== widgetId)\n }));\n }\n\n /**\n * Updates a specific widget in the MeshBoard.\n */\n updateWidget(widgetId: string, updater: (widget: AnyWidgetConfig) => AnyWidgetConfig): void {\n this.updateConfig(config => ({\n ...config,\n widgets: config.widgets.map(w => w.id === widgetId ? updater(w) : w)\n }));\n }\n\n /**\n * Gets a widget by ID.\n */\n getWidget(widgetId: string): AnyWidgetConfig | undefined {\n return this._meshBoardConfig().widgets.find(w => w.id === widgetId);\n }\n\n /**\n * Updates MeshBoard settings (name, description, columns, variables, timeFilter, etc.).\n */\n updateSettings(settings: {\n name: string;\n description: string;\n rtWellKnownName?: string;\n columns: number;\n rowHeight: number;\n gap: number;\n variables?: MeshBoardVariable[];\n timeFilter?: MeshBoardTimeFilterConfig;\n }): void {\n this.updateConfig(config => ({\n ...config,\n name: settings.name,\n description: settings.description,\n rtWellKnownName: settings.rtWellKnownName || null,\n columns: settings.columns,\n rowHeight: settings.rowHeight,\n gap: settings.gap,\n variables: settings.variables ?? config.variables,\n timeFilter: settings.timeFilter ?? config.timeFilter\n }));\n\n // If time filter is disabled, clear the time filter variables\n if (settings.timeFilter && !settings.timeFilter.enabled) {\n this.clearTimeFilterVariables();\n }\n }\n\n /**\n * Gets current settings for the settings dialog.\n */\n getCurrentSettings(): {\n name: string;\n description: string;\n rtWellKnownName?: string | null;\n columns: number;\n rowHeight: number;\n gap: number;\n variables: MeshBoardVariable[];\n timeFilter?: MeshBoardTimeFilterConfig;\n } {\n const config = this._meshBoardConfig();\n return {\n name: config.name,\n description: config.description ?? '',\n rtWellKnownName: config.rtWellKnownName,\n columns: config.columns,\n rowHeight: config.rowHeight,\n gap: config.gap,\n variables: config.variables ?? [],\n timeFilter: config.timeFilter\n };\n }\n\n /**\n * Triggers a refresh of all widgets by creating new config references.\n * This causes ngOnChanges to fire in each widget, triggering data reload.\n */\n triggerRefresh(): void {\n this.updateConfig(config => ({\n ...config,\n widgets: config.widgets.map(w => ({ ...w }))\n }));\n }\n\n /**\n * Refreshes the list of available MeshBoards from the backend.\n */\n async refreshMeshBoardList(): Promise<void> {\n const meshBoards = await this.persistenceService.getMeshBoards();\n this._availableMeshBoards.set(meshBoards);\n }\n\n /** @deprecated Use refreshMeshBoardList instead */\n async refreshDashboardList(): Promise<void> {\n return this.refreshMeshBoardList();\n }\n\n /**\n * Creates a new MeshBoard and switches to it.\n */\n async createNewMeshBoard(name: string, description: string): Promise<string> {\n const config: MeshBoardConfig = {\n id: '',\n name,\n description,\n columns: 6,\n rowHeight: 200,\n gap: 16,\n widgets: []\n };\n\n const rtId = await this.persistenceService.createMeshBoard(config);\n await this.refreshMeshBoardList();\n await this.switchToMeshBoard(rtId);\n\n return rtId;\n }\n\n /** @deprecated Use createNewMeshBoard instead */\n async createNewDashboard(name: string, description: string): Promise<string> {\n return this.createNewMeshBoard(name, description);\n }\n\n /**\n * Renames the specified MeshBoard.\n */\n async renameMeshBoard(rtId: string, name: string, description: string): Promise<void> {\n await this.persistenceService.renameMeshBoard(rtId, name, description);\n await this.refreshMeshBoardList();\n\n // Update current config if it's the active MeshBoard\n if (this._persistedMeshBoardId() === rtId) {\n this.updateConfig(c => ({ ...c, name, description }));\n }\n }\n\n /** @deprecated Use renameMeshBoard instead */\n async renameDashboard(rtId: string, name: string, description: string): Promise<void> {\n return this.renameMeshBoard(rtId, name, description);\n }\n\n /**\n * Deletes a MeshBoard.\n * If the deleted MeshBoard was the current one, switches to the first available.\n */\n async deleteMeshBoard(rtId: string): Promise<void> {\n await this.persistenceService.deleteMeshBoard(rtId);\n await this.refreshMeshBoardList();\n\n // If deleted MeshBoard was current, switch to first available\n if (this._persistedMeshBoardId() === rtId) {\n const meshBoards = this._availableMeshBoards();\n if (meshBoards.length > 0) {\n await this.switchToMeshBoard(meshBoards[0].rtId);\n } else {\n // No MeshBoards left - reset to empty state\n this._persistedMeshBoardId.set(null);\n this._existingWidgetRtIds.set([]);\n this._meshBoardConfig.set(this.createDefaultConfig());\n }\n }\n }\n\n /** @deprecated Use deleteMeshBoard instead */\n async deleteDashboard(rtId: string): Promise<void> {\n return this.deleteMeshBoard(rtId);\n }\n\n // ============================================================================\n // Variable Management\n // ============================================================================\n\n /**\n * Gets all variables from the current MeshBoard configuration.\n */\n getVariables(): MeshBoardVariable[] {\n return this._meshBoardConfig().variables ?? [];\n }\n\n /**\n * Gets a specific variable by name.\n */\n getVariable(name: string): MeshBoardVariable | undefined {\n return this.getVariables().find(v => v.name === name);\n }\n\n /**\n * Updates all variables in the MeshBoard configuration.\n */\n updateVariables(variables: MeshBoardVariable[]): void {\n this.updateConfig(config => ({\n ...config,\n variables\n }));\n }\n\n /**\n * Sets the value of a single variable.\n */\n setVariableValue(name: string, value: string): void {\n const variables = [...this.getVariables()];\n const index = variables.findIndex(v => v.name === name);\n\n if (index >= 0) {\n variables[index] = { ...variables[index], value };\n this.updateVariables(variables);\n }\n }\n\n /**\n * Adds a new variable to the MeshBoard.\n */\n addVariable(variable: MeshBoardVariable): void {\n const variables = [...this.getVariables(), variable];\n this.updateVariables(variables);\n }\n\n /**\n * Removes a variable by name.\n */\n removeVariable(name: string): void {\n const variables = this.getVariables().filter(v => v.name !== name);\n this.updateVariables(variables);\n }\n\n // ============================================================================\n // Time Filter Management\n // ============================================================================\n\n /**\n * Checks if the time filter is enabled.\n */\n isTimeFilterEnabled(): boolean {\n return this._meshBoardConfig().timeFilter?.enabled ?? false;\n }\n\n /**\n * Gets the time filter configuration.\n */\n getTimeFilterConfig(): MeshBoardTimeFilterConfig | undefined {\n return this._meshBoardConfig().timeFilter;\n }\n\n /**\n * Updates the time filter configuration.\n */\n updateTimeFilterConfig(config: MeshBoardTimeFilterConfig): void {\n this.updateConfig(c => ({ ...c, timeFilter: config }));\n }\n\n /**\n * Updates the time filter selection and sets the predefined variables.\n */\n updateTimeFilterSelection(selection: TimeRangeSelection, fromISO: string, toISO: string): void {\n // Update selection in config\n this.updateConfig(c => ({\n ...c,\n timeFilter: {\n ...c.timeFilter,\n enabled: true,\n selection\n }\n }));\n\n // Update predefined variables\n this.setTimeFilterVariables(fromISO, toISO);\n }\n\n /**\n * Sets the time filter variables ($timeRangeFrom, $timeRangeTo).\n * Removes any existing timeFilter variables and adds the new ones.\n */\n setTimeFilterVariables(fromISO: string, toISO: string): void {\n // Filter out existing timeFilter variables\n const currentVars = this.getVariables().filter(v => v.source !== 'timeFilter');\n\n // Create new time filter variables\n const timeFilterVars: MeshBoardVariable[] = [\n {\n name: 'timeRangeFrom',\n type: 'datetime',\n source: 'timeFilter',\n value: fromISO\n },\n {\n name: 'timeRangeTo',\n type: 'datetime',\n source: 'timeFilter',\n value: toISO\n }\n ];\n\n // Update with combined variables\n this.updateVariables([...currentVars, ...timeFilterVars]);\n }\n\n /**\n * Clears time filter variables (called when time filter is disabled).\n */\n clearTimeFilterVariables(): void {\n const currentVars = this.getVariables().filter(v => v.source !== 'timeFilter');\n this.updateVariables(currentVars);\n }\n}\n","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type GetDashboardEntityQueryVariablesDto = Types.Exact<{\n rtId: Types.Scalars['OctoObjectId']['input'];\n ckTypeId: Types.Scalars['String']['input'];\n}>;\n\n\nexport type GetDashboardEntityQueryDto = { __typename?: 'OctoQuery', runtime?: { __typename?: 'RuntimeModelQuery', runtimeEntities?: { __typename?: 'RtEntityGenericDtoConnection', items?: Array<{ __typename?: 'RtEntity', rtId: any, ckTypeId: any, rtWellKnownName?: string | null, rtCreationDateTime?: any | null, rtChangedDateTime?: any | null, attributes?: { __typename?: 'RtEntityAttributeDtoConnection', items?: Array<{ __typename?: 'RtEntityAttribute', attributeName?: string | null, value?: any | null } | null> | null } | null, associations?: { __typename?: 'RtEntityGenericAssociation', definitions?: { __typename?: 'RtAssociationDtoConnection', totalCount?: number | null, items?: Array<{ __typename?: 'RtAssociation', targetRtId: any, targetCkTypeId: any, originRtId: any, originCkTypeId: any, ckAssociationRoleId: any } | null> | null } | null } | null } | null> | null } | null } | null };\n\nexport const GetDashboardEntityDocumentDto = gql`\n query getDashboardEntity($rtId: OctoObjectId!, $ckTypeId: String!) {\n runtime {\n runtimeEntities(rtId: $rtId, ckId: $ckTypeId, first: 1) {\n items {\n rtId\n ckTypeId\n rtWellKnownName\n rtCreationDateTime\n rtChangedDateTime\n attributes(resolveEnumValuesToNames: true) {\n items {\n attributeName\n value\n }\n }\n associations {\n definitions(direction: ANY) {\n totalCount\n items {\n targetRtId\n targetCkTypeId\n originRtId\n originCkTypeId\n ckAssociationRoleId\n }\n }\n }\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class GetDashboardEntityDtoGQL extends Apollo.Query<GetDashboardEntityQueryDto, GetDashboardEntityQueryVariablesDto> {\n document = GetDashboardEntityDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type GetCkModelsWithStateQueryVariablesDto = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type GetCkModelsWithStateQueryDto = { __typename?: 'OctoQuery', constructionKit?: { __typename?: 'ConstructionKitQuery', models?: { __typename?: 'CkModelDtoConnection', totalCount?: number | null, items?: Array<{ __typename?: 'CkModel', modelState?: Types.ModelStateDto | null, id: { __typename?: 'CkModelId', name: string, version: any, fullName: string, semanticVersionedFullName: string } } | null> | null } | null } | null };\n\nexport const GetCkModelsWithStateDocumentDto = gql`\n query getCkModelsWithState {\n constructionKit {\n models {\n totalCount\n items {\n id {\n name\n version\n fullName\n semanticVersionedFullName\n }\n modelState\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class GetCkModelsWithStateDtoGQL extends Apollo.Query<GetCkModelsWithStateQueryDto, GetCkModelsWithStateQueryVariablesDto> {\n document = GetCkModelsWithStateDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type ExecuteRuntimeQueryQueryVariablesDto = Types.Exact<{\n rtId: Types.Scalars['OctoObjectId']['input'];\n after?: Types.InputMaybe<Types.Scalars['String']['input']>;\n first?: Types.InputMaybe<Types.Scalars['Int']['input']>;\n fieldFilter?: Types.InputMaybe<Array<Types.InputMaybe<Types.FieldFilterDto>> | Types.InputMaybe<Types.FieldFilterDto>>;\n}>;\n\n\nexport type ExecuteRuntimeQueryQueryDto = { __typename?: 'OctoQuery', runtime?: { __typename?: 'RuntimeModelQuery', runtimeQuery?: { __typename?: 'RtQueryDtoConnection', items?: Array<{ __typename?: 'RtQuery', queryRtId: any, associatedCkTypeId: any, columns: Array<{ __typename?: 'RtQueryColumn', attributePath?: string | null, attributeValueType?: Types.AttributeValueTypeDto | null }>, rows?: { __typename?: 'RtQueryRowDtoConnection', totalCount?: number | null, items?: Array<\n | { __typename?: 'RtAggregationQueryRow', ckTypeId?: any | null, cells?: { __typename?: 'RtQueryCellDtoConnection', totalCount?: number | null, items?: Array<{ __typename?: 'RtQueryCell', attributePath: string, value?: any | null }> | null } | null }\n | { __typename?: 'RtGroupingAggregationQueryRow', ckTypeId?: any | null, cells?: { __typename?: 'RtQueryCellDtoConnection', totalCount?: number | null, items?: Array<{ __typename?: 'RtQueryCell', attributePath: string, value?: any | null }> | null } | null }\n | { __typename?: 'RtSimpleQueryRow', rtId?: any | null, ckTypeId?: any | null, cells?: { __typename?: 'RtQueryCellDtoConnection', totalCount?: number | null, items?: Array<{ __typename?: 'RtQueryCell', attributePath: string, value?: any | null }> | null } | null }\n > | null, pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null } } | null }> | null } | null } | null };\n\nexport const ExecuteRuntimeQueryDocumentDto = gql`\n query executeRuntimeQuery($rtId: OctoObjectId!, $after: String, $first: Int, $fieldFilter: [FieldFilter]) {\n runtime {\n runtimeQuery(rtId: $rtId) {\n items {\n queryRtId\n associatedCkTypeId\n columns {\n attributePath\n attributeValueType\n }\n rows(after: $after, first: $first, fieldFilter: $fieldFilter) {\n totalCount\n items {\n ... on RtSimpleQueryRow {\n rtId\n }\n ckTypeId\n cells {\n totalCount\n items {\n attributePath\n value\n }\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class ExecuteRuntimeQueryDtoGQL extends Apollo.Query<ExecuteRuntimeQueryQueryDto, ExecuteRuntimeQueryQueryVariablesDto> {\n document = ExecuteRuntimeQueryDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import { Injectable } from '@angular/core';\nimport { FieldFilterDto, FieldFilterOperatorsDto } from '@meshmakers/octo-services';\nimport { MeshBoardVariable, MeshBoardVariableType, WidgetFilterConfig } from '../models/meshboard.models';\n\n/**\n * Service for resolving MeshBoard variables in filter values.\n * Variables use the syntax $variableName and are replaced at query execution time.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class MeshBoardVariableService {\n\n /**\n * Resolves all variable placeholders in a string.\n * Supports both ${variableName} and $variableName syntax.\n * @param value The string containing variable placeholders\n * @param variables The variables to resolve from\n * @returns The string with all resolved variable values\n */\n resolveVariables(value: string, variables: MeshBoardVariable[]): string {\n if (!value || !variables?.length) {\n return value;\n }\n\n // Match both ${variableName} and $variableName formats\n return value.replace(/\\$\\{([^}]+)\\}|\\$([a-zA-Z_]\\w*)/g, (match, bracketName, simpleName) => {\n const varName = bracketName || simpleName;\n const variable = variables.find(v => v.name === varName);\n if (variable) {\n return variable.value ?? variable.defaultValue ?? match;\n }\n return match; // Keep placeholder if variable not found\n });\n }\n\n /**\n * Resolves variables in filter comparison values.\n * @param filters The filters with potential variable placeholders\n * @param variables The variables to resolve from\n * @returns New filter array with resolved values\n */\n resolveFilters(\n filters: WidgetFilterConfig[] | undefined,\n variables: MeshBoardVariable[]\n ): WidgetFilterConfig[] | undefined {\n if (!filters?.length) {\n return filters;\n }\n\n return filters.map(f => ({\n ...f,\n comparisonValue: this.resolveVariables(f.comparisonValue, variables)\n }));\n }\n\n /**\n * Converts filters to DTO format for GraphQL, resolving variables first.\n * @param filters The widget filters\n * @param variables The variables to resolve from\n * @returns FieldFilterDto array for GraphQL queries\n */\n convertToFieldFilterDto(\n filters: WidgetFilterConfig[] | undefined,\n variables: MeshBoardVariable[]\n ): FieldFilterDto[] | undefined {\n const resolved = this.resolveFilters(filters, variables);\n if (!resolved?.length) {\n return undefined;\n }\n\n return resolved.map(f => ({\n attributePath: f.attributePath,\n operator: f.operator as FieldFilterOperatorsDto,\n comparisonValue: f.comparisonValue\n }));\n }\n\n /**\n * Parses a value string to the correct JavaScript type.\n * @param value The string value to parse\n * @param type The target type\n * @returns The parsed value\n */\n parseValue(value: string, type: MeshBoardVariableType): unknown {\n switch (type) {\n case 'number':\n return parseFloat(value) || 0;\n case 'boolean':\n return value === 'true';\n case 'date':\n case 'datetime':\n return new Date(value);\n default:\n return value;\n }\n }\n\n /**\n * Validates a variable name.\n * Valid names: start with letter or underscore, followed by alphanumeric or underscore.\n * @param name The variable name to validate\n * @returns true if the name is valid\n */\n isValidVariableName(name: string): boolean {\n return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name);\n }\n\n /**\n * Generates a unique variable name based on a base name.\n * Appends a number if the name already exists.\n * @param baseName The desired base name\n * @param existingVariables Existing variables to check against\n * @returns A unique variable name\n */\n generateUniqueName(baseName: string, existingVariables: MeshBoardVariable[]): string {\n const existingNames = new Set(existingVariables.map(v => v.name));\n let name = baseName;\n let counter = 1;\n\n while (existingNames.has(name)) {\n name = `${baseName}${counter}`;\n counter++;\n }\n\n return name;\n }\n\n /**\n * Creates a default variable with the given type.\n * @param name Variable name\n * @param type Variable type\n * @returns A new MeshBoardVariable\n */\n createDefaultVariable(name: string, type: MeshBoardVariableType = 'string'): MeshBoardVariable {\n let defaultValue = '';\n\n switch (type) {\n case 'number':\n defaultValue = '0';\n break;\n case 'boolean':\n defaultValue = 'false';\n break;\n case 'date':\n defaultValue = new Date().toISOString().split('T')[0];\n break;\n case 'datetime':\n defaultValue = new Date().toISOString();\n break;\n }\n\n return {\n name,\n type,\n source: 'static',\n value: defaultValue,\n defaultValue\n };\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable, map, of } from 'rxjs';\nimport { GetDashboardEntityDtoGQL } from '../graphQL/getDashboardEntity';\nimport { GetCkModelsWithStateDtoGQL, GetCkModelsWithStateQueryDto } from '../graphQL/getCkModelsWithState';\nimport { GetEntitiesByCkTypeDtoGQL } from '../graphQL/getEntitiesByCkType';\nimport { ExecuteRuntimeQueryDtoGQL } from '../graphQL/executeRuntimeQuery';\nimport {\n DataSource,\n RuntimeEntityData,\n EntityAttribute,\n EntityAssociation,\n RuntimeEntityDataSource,\n AggregationQuery,\n ConstructionKitQueryDataSource,\n WidgetFilterConfig,\n RepeaterQueryDataSource\n} from '../models/meshboard.models';\nimport { FieldFilterDto } from '@meshmakers/octo-services';\nimport { firstValueFrom } from 'rxjs';\nimport { Apollo, gql } from 'apollo-angular';\nimport { MeshBoardStateService } from './meshboard-state.service';\nimport { MeshBoardVariableService } from './meshboard-variable.service';\n\n/**\n * Grouped data item for chart visualization\n */\nexport interface GroupedDataItem {\n category: string;\n value: number;\n}\n\n/**\n * Result of a CK query for charts\n */\nexport interface CkQueryResult {\n items: GroupedDataItem[];\n totalCount: number;\n}\n\n/**\n * A single data item from a repeater query.\n * Used by Widget Group to render child widgets.\n */\nexport interface RepeaterDataItem {\n /** Runtime ID of the entity/row */\n rtId: string;\n /** CK Type ID */\n ckTypeId: string;\n /** Well-known name of the entity */\n rtWellKnownName?: string;\n /** All attributes as a Map for easy access */\n attributes: Map<string, unknown>;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MeshBoardDataService {\n private readonly getDashboardEntityGQL = inject(GetDashboardEntityDtoGQL);\n private readonly getCkModelsWithStateGQL = inject(GetCkModelsWithStateDtoGQL);\n private readonly getEntitiesByCkTypeGQL = inject(GetEntitiesByCkTypeDtoGQL);\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n private readonly apollo = inject(Apollo);\n private readonly stateService = inject(MeshBoardStateService);\n private readonly variableService = inject(MeshBoardVariableService);\n\n /**\n * Fetches data based on the data source configuration\n */\n fetchData(dataSource: DataSource): Observable<RuntimeEntityData | RuntimeEntityData[] | null> {\n switch (dataSource.type) {\n case 'runtimeEntity':\n return this.fetchRuntimeEntity(dataSource);\n case 'static':\n return of(dataSource.data as RuntimeEntityData | RuntimeEntityData[]);\n default:\n return of(null);\n }\n }\n\n /**\n * Fetches a single runtime entity by rtId and ckTypeId\n */\n fetchRuntimeEntity(dataSource: RuntimeEntityDataSource): Observable<RuntimeEntityData | null> {\n if (!dataSource.rtId || !dataSource.ckTypeId) {\n return of(null);\n }\n\n return this.getDashboardEntityGQL.fetch({ variables: { rtId: dataSource.rtId, ckTypeId: dataSource.ckTypeId } }).pipe(\n map(result => {\n const entity = result.data?.runtime?.runtimeEntities?.items?.[0];\n if (!entity) return null;\n\n return this.mapToRuntimeEntityData(entity);\n })\n );\n }\n\n /**\n * Fetches a single entity with associations by rtId and ckTypeId (using generic query)\n */\n fetchEntityWithAssociations(rtId: string, ckTypeId: string): Observable<RuntimeEntityData | null> {\n return this.getDashboardEntityGQL.fetch({ variables: { rtId, ckTypeId } }).pipe(\n map(result => {\n const entity = result.data?.runtime?.runtimeEntities?.items?.[0];\n if (!entity) return null;\n\n return this.mapToRuntimeEntityData(entity);\n })\n );\n }\n\n /**\n * Maps GraphQL entity response to RuntimeEntityData\n */\n private mapToRuntimeEntityData(entity: {\n rtId: string;\n ckTypeId: string;\n rtWellKnownName?: string | null;\n rtCreationDateTime?: string | null;\n rtChangedDateTime?: string | null;\n attributes?: { items?: ({ attributeName?: string | null; value?: unknown } | null)[] | null } | null;\n associations?: {\n definitions?: {\n totalCount?: number | null;\n items?: ({\n targetRtId: string;\n targetCkTypeId: string;\n originRtId: string;\n originCkTypeId: string;\n ckAssociationRoleId: string;\n } | null)[] | null;\n } | null;\n } | null;\n }): RuntimeEntityData {\n const attributes: EntityAttribute[] = (entity.attributes?.items ?? [])\n .filter((attr): attr is NonNullable<typeof attr> => attr !== null && attr.attributeName !== null)\n .map(attr => ({\n attributeName: attr.attributeName!,\n value: attr.value\n }));\n\n const associations: EntityAssociation[] = (entity.associations?.definitions?.items ?? [])\n .filter((assoc): assoc is NonNullable<typeof assoc> => assoc !== null)\n .map(assoc => ({\n targetRtId: assoc.targetRtId,\n targetCkTypeId: assoc.targetCkTypeId,\n originRtId: assoc.originRtId,\n originCkTypeId: assoc.originCkTypeId,\n ckAssociationRoleId: assoc.ckAssociationRoleId\n }));\n\n return {\n rtId: entity.rtId,\n ckTypeId: entity.ckTypeId,\n rtWellKnownName: entity.rtWellKnownName ?? undefined,\n rtCreationDateTime: entity.rtCreationDateTime ?? undefined,\n rtChangedDateTime: entity.rtChangedDateTime ?? undefined,\n attributes,\n associations\n };\n }\n\n // ============================================================================\n // Aggregation Queries\n // ============================================================================\n\n // Pre-defined GraphQL queries for count aggregations\n private readonly CK_COUNTS_QUERY = gql`\n query getCkCounts {\n constructionKit {\n models { totalCount }\n types { totalCount }\n attributes { totalCount }\n associationRoles { totalCount }\n enums { totalCount }\n records { totalCount }\n }\n }\n `;\n\n /**\n * Fetches aggregation results for multiple queries.\n * Returns a Map of query ID to aggregated value.\n *\n * Supports:\n * - Construction Kit count queries (ConstructionKit/* types)\n * - Runtime entity count queries (any CK type)\n */\n async fetchAggregations(queries: AggregationQuery[]): Promise<Map<string, number>> {\n const results = new Map<string, number>();\n\n // Check if all queries are CK count queries - if so, use optimized batch query\n const ckQueries = queries.filter(q =>\n q.aggregation === 'count' && q.ckTypeId.startsWith('ConstructionKit/')\n );\n\n if (ckQueries.length > 0) {\n try {\n const ckCounts = await this.fetchCkCounts();\n\n for (const query of ckQueries) {\n const count = this.getCkCountFromResult(query.ckTypeId, ckCounts);\n results.set(query.id, count);\n }\n } catch (error) {\n console.error('Failed to fetch CK counts:', error);\n // Set all CK queries to 0 on error\n for (const query of ckQueries) {\n results.set(query.id, 0);\n }\n }\n }\n\n // Handle non-CK queries - count runtime entities\n const runtimeQueries = queries.filter(q =>\n q.aggregation === 'count' && !q.ckTypeId.startsWith('ConstructionKit/')\n );\n\n for (const query of runtimeQueries) {\n try {\n const count = await this.fetchRuntimeEntityCount(query.ckTypeId, query.filters);\n results.set(query.id, count);\n } catch (error) {\n console.error(`Failed to fetch count for ${query.ckTypeId}:`, error);\n results.set(query.id, 0);\n }\n }\n\n return results;\n }\n\n /**\n * Fetches the count of runtime entities for a given CK type.\n * Optionally applies field filters to narrow down the count.\n * Resolves MeshBoard variables in filter values.\n */\n private async fetchRuntimeEntityCount(ckTypeId: string, filters?: WidgetFilterConfig[]): Promise<number> {\n // Convert widget filters to GraphQL format with variable resolution\n const variables = this.stateService.getVariables();\n const fieldFilters: FieldFilterDto[] | undefined = this.variableService.convertToFieldFilterDto(filters, variables);\n\n const result = await firstValueFrom(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId,\n first: 1, // We only need the count, not the entities\n fieldFilters\n }\n })\n );\n\n return result.data?.runtime?.runtimeEntities?.totalCount ?? 0;\n }\n\n /**\n * Fetches all Construction Kit counts in a single query.\n */\n private async fetchCkCounts(): Promise<CkCountsResult> {\n const result = await firstValueFrom(\n this.apollo.query<{ constructionKit: CkCountsResult }>({\n query: this.CK_COUNTS_QUERY,\n fetchPolicy: 'network-only'\n })\n );\n\n return result.data?.constructionKit ?? {\n models: { totalCount: 0 },\n types: { totalCount: 0 },\n attributes: { totalCount: 0 },\n associationRoles: { totalCount: 0 },\n enums: { totalCount: 0 },\n records: { totalCount: 0 }\n };\n }\n\n /**\n * Extracts the count for a specific CK type from the query result.\n */\n private getCkCountFromResult(ckTypeId: string, counts: CkCountsResult): number {\n switch (ckTypeId) {\n case 'ConstructionKit/CkModel': return counts.models?.totalCount ?? 0;\n case 'ConstructionKit/CkType': return counts.types?.totalCount ?? 0;\n case 'ConstructionKit/CkAttribute': return counts.attributes?.totalCount ?? 0;\n case 'ConstructionKit/CkAssociationRole': return counts.associationRoles?.totalCount ?? 0;\n case 'ConstructionKit/CkEnum': return counts.enums?.totalCount ?? 0;\n case 'ConstructionKit/CkRecord': return counts.records?.totalCount ?? 0;\n default: return 0;\n }\n }\n\n // ============================================================================\n // Construction Kit Queries\n // ============================================================================\n\n /**\n * Fetches data from Construction Kit and groups it for chart visualization.\n * Supports grouping by fields like modelState for pie/bar charts.\n */\n async fetchCkQueryData(dataSource: ConstructionKitQueryDataSource): Promise<CkQueryResult> {\n switch (dataSource.queryTarget) {\n case 'models':\n return this.fetchCkModelsGrouped(dataSource.groupBy);\n default:\n console.warn(`CK query target not yet implemented: ${dataSource.queryTarget}`);\n return { items: [], totalCount: 0 };\n }\n }\n\n // ============================================================================\n // Repeater Queries (Widget Group)\n // ============================================================================\n\n /**\n * Fetches data for Widget Group repeater.\n * Supports two modes:\n * 1. Query Mode: Execute a persistent query and map rows to items\n * 2. Entity Mode: Load entities by CK type with optional filters\n *\n * @param dataSource The repeater query data source configuration\n * @returns Array of RepeaterDataItem objects for rendering child widgets\n */\n async fetchRepeaterData(dataSource: RepeaterQueryDataSource): Promise<RepeaterDataItem[]> {\n const maxItems = dataSource.maxItems ?? 50;\n\n if (dataSource.queryRtId) {\n // Query Mode: Execute persistent query\n return this.fetchRepeaterFromQuery(dataSource.queryRtId, maxItems);\n } else if (dataSource.ckTypeId) {\n // Entity Mode: Load entities by CK type\n return this.fetchRepeaterFromEntities(dataSource.ckTypeId, dataSource.filters, maxItems);\n }\n\n console.warn('RepeaterQueryDataSource has neither queryRtId nor ckTypeId configured');\n return [];\n }\n\n /**\n * Fetches repeater data from a persistent query.\n * Maps query rows to RepeaterDataItem objects.\n */\n private async fetchRepeaterFromQuery(queryRtId: string, maxItems: number): Promise<RepeaterDataItem[]> {\n try {\n const result = await firstValueFrom(\n this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: queryRtId,\n first: maxItems\n }\n })\n );\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n if (queryItems.length === 0) {\n return [];\n }\n\n const queryResult = queryItems[0];\n if (!queryResult) {\n return [];\n }\n\n const rows = queryResult.rows?.items ?? [];\n const items: RepeaterDataItem[] = [];\n\n for (const row of rows) {\n if (!row) continue;\n\n // Extract rtId from RtSimpleQueryRow if available\n const rtId = (row as { rtId?: string }).rtId ?? `row-${items.length}`;\n const ckTypeId = row.ckTypeId ?? queryResult.associatedCkTypeId ?? '';\n\n // Build attributes map from cells\n const attributes = new Map<string, unknown>();\n const cells = row.cells?.items ?? [];\n\n for (const cell of cells) {\n if (!cell?.attributePath) continue;\n // Sanitize the attribute path (replace dots with underscores)\n const sanitizedPath = cell.attributePath.replace(/\\./g, '_');\n attributes.set(sanitizedPath, cell.value);\n // Also store with original path for flexibility\n attributes.set(cell.attributePath, cell.value);\n }\n\n items.push({\n rtId,\n ckTypeId,\n rtWellKnownName: attributes.get('rtWellKnownName') as string | undefined,\n attributes\n });\n }\n\n return items;\n } catch (error) {\n console.error('Failed to fetch repeater data from query:', error);\n return [];\n }\n }\n\n /**\n * Fetches repeater data from entities by CK type.\n * Maps entities to RepeaterDataItem objects.\n */\n private async fetchRepeaterFromEntities(\n ckTypeId: string,\n filters?: WidgetFilterConfig[],\n maxItems?: number\n ): Promise<RepeaterDataItem[]> {\n try {\n // Convert widget filters to GraphQL format with variable resolution\n const variables = this.stateService.getVariables();\n const fieldFilters = this.variableService.convertToFieldFilterDto(filters, variables);\n\n const result = await firstValueFrom(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId,\n first: maxItems ?? 50,\n fieldFilters\n }\n })\n );\n\n const entities = result.data?.runtime?.runtimeEntities?.items ?? [];\n const items: RepeaterDataItem[] = [];\n\n for (const entity of entities) {\n if (!entity) continue;\n\n // Build attributes map\n const attributes = new Map<string, unknown>();\n const entityAttrs = entity.attributes?.items ?? [];\n\n for (const attr of entityAttrs) {\n if (!attr?.attributeName) continue;\n attributes.set(attr.attributeName, attr.value);\n }\n\n items.push({\n rtId: entity.rtId,\n ckTypeId: entity.ckTypeId,\n rtWellKnownName: entity.rtWellKnownName ?? undefined,\n attributes\n });\n }\n\n return items;\n } catch (error) {\n console.error('Failed to fetch repeater data from entities:', error);\n return [];\n }\n }\n\n // ============================================================================\n // Private Helper Methods\n // ============================================================================\n\n /**\n * Fetches CK models and groups them by a specified field.\n * Default groupBy is 'modelState'.\n */\n private async fetchCkModelsGrouped(groupBy = 'modelState'): Promise<CkQueryResult> {\n try {\n const result = await firstValueFrom(\n this.getCkModelsWithStateGQL.fetch()\n );\n\n const models = result.data?.constructionKit?.models;\n const items = models?.items ?? [];\n const totalCount = models?.totalCount ?? 0;\n\n // Group by the specified field\n const grouped = this.groupCkModels(items, groupBy);\n\n return {\n items: grouped,\n totalCount\n };\n } catch (error) {\n console.error('Failed to fetch CK models:', error);\n return { items: [], totalCount: 0 };\n }\n }\n\n /**\n * Groups CK model items by a specified field.\n */\n private groupCkModels(\n items: NonNullable<NonNullable<GetCkModelsWithStateQueryDto['constructionKit']>['models']>['items'],\n groupBy: string\n ): GroupedDataItem[] {\n const counts = new Map<string, number>();\n\n for (const item of items ?? []) {\n if (!item) continue;\n\n let categoryValue: string;\n\n if (groupBy === 'modelState') {\n categoryValue = item.modelState ?? 'Unknown';\n } else {\n // For other fields, try to access them dynamically\n categoryValue = String((item as Record<string, unknown>)[groupBy] ?? 'Unknown');\n }\n\n counts.set(categoryValue, (counts.get(categoryValue) ?? 0) + 1);\n }\n\n return Array.from(counts.entries()).map(([category, value]) => ({\n category,\n value\n }));\n }\n}\n\ninterface CkCountsResult {\n models?: { totalCount?: number | null } | null;\n types?: { totalCount?: number | null } | null;\n attributes?: { totalCount?: number | null } | null;\n associationRoles?: { totalCount?: number | null } | null;\n enums?: { totalCount?: number | null } | null;\n records?: { totalCount?: number | null } | null;\n}\n\n/** @deprecated Use MeshBoardDataService instead */\nexport const DashboardDataService = MeshBoardDataService;\n","import { Injectable, inject } from '@angular/core';\nimport { AnyWidgetConfig, WidgetType } from '../models/meshboard.models';\nimport { WidgetRegistryService } from './widget-registry.service';\n\nexport interface WidgetCreationOptions {\n title: string;\n type: WidgetType;\n col?: number;\n row?: number;\n colSpan?: number;\n rowSpan?: number;\n ckTypeId?: string;\n}\n\n/**\n * Service responsible for creating widget configurations.\n * Delegates to WidgetRegistryService for widget-specific logic (SOLID: Open/Closed Principle).\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class WidgetFactoryService {\n private readonly registry = inject(WidgetRegistryService);\n\n /**\n * Generates a unique widget ID.\n */\n generateId(): string {\n return `widget-${Date.now()}`;\n }\n\n /**\n * Creates a new widget with default configuration based on type.\n * Delegates to the widget registration's createDefaultConfig function.\n */\n createWidget(options: WidgetCreationOptions): AnyWidgetConfig {\n const id = this.generateId();\n const defaultSize = this.registry.getDefaultSize(options.type);\n\n const baseConfig = {\n id,\n title: options.title,\n col: options.col ?? 1,\n row: options.row ?? 1,\n colSpan: options.colSpan ?? defaultSize.colSpan,\n rowSpan: options.rowSpan ?? defaultSize.rowSpan,\n configurable: true\n };\n\n // Delegate to registry - no switch statement needed!\n return this.registry.createWidget(options.type, baseConfig);\n }\n\n /**\n * Gets the default size for a widget type.\n * Delegates to WidgetRegistryService.\n */\n getDefaultSize(type: WidgetType): { colSpan: number; rowSpan: number } {\n return this.registry.getDefaultSize(type);\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\n/**\n * Service that manages edit mode state and snapshot/restore functionality.\n * Provides a clean abstraction for entering/exiting edit mode with undo capability.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class EditModeStateService {\n // Reactive signals for state\n private readonly _isEditMode = signal(false);\n private readonly _isSaving = signal(false);\n private snapshot: string | null = null;\n\n // Public computed signals\n readonly isEditMode = computed(() => this._isEditMode());\n readonly isSaving = computed(() => this._isSaving());\n\n /**\n * Enters edit mode and creates a snapshot of the provided data.\n * @param data The data to snapshot for potential restoration\n */\n enterEditMode<T>(data: T): void {\n if (!this._isEditMode()) {\n this.snapshot = JSON.stringify(data);\n this._isEditMode.set(true);\n }\n }\n\n /**\n * Toggles edit mode. When entering, creates a snapshot of the provided data.\n * @param data The data to snapshot when entering edit mode\n * @returns true if now in edit mode, false if exited\n */\n toggleEditMode<T>(data: T): boolean {\n if (this._isEditMode()) {\n // Just exit without restoring - use cancelEdit for that\n this._isEditMode.set(false);\n this.snapshot = null;\n return false;\n } else {\n this.enterEditMode(data);\n return true;\n }\n }\n\n /**\n * Cancels edit mode and restores the original data from the snapshot.\n * @returns The restored data, or null if no snapshot exists\n */\n cancelEdit<T>(): T | null {\n if (this.snapshot) {\n const restored = JSON.parse(this.snapshot) as T;\n this.snapshot = null;\n this._isEditMode.set(false);\n return restored;\n }\n this._isEditMode.set(false);\n return null;\n }\n\n /**\n * Begins a save operation.\n */\n beginSave(): void {\n this._isSaving.set(true);\n }\n\n /**\n * Completes a save operation successfully, clearing the snapshot and exiting edit mode.\n */\n completeSave(): void {\n this._isSaving.set(false);\n this._isEditMode.set(false);\n this.snapshot = null;\n }\n\n /**\n * Handles a failed save operation, staying in edit mode.\n */\n failSave(): void {\n this._isSaving.set(false);\n // Stay in edit mode so user can retry or cancel\n }\n\n /**\n * Checks if there are unsaved changes (snapshot exists).\n */\n hasUnsavedChanges(): boolean {\n return this.snapshot !== null;\n }\n\n /**\n * Gets the current snapshot without modifying state.\n * Useful for comparing current state with original.\n */\n getSnapshot<T>(): T | null {\n return this.snapshot ? JSON.parse(this.snapshot) as T : null;\n }\n\n /**\n * Updates the snapshot with new data while staying in edit mode.\n * Useful when you want to update the \"base\" state during editing.\n */\n updateSnapshot<T>(data: T): void {\n if (this._isEditMode()) {\n this.snapshot = JSON.stringify(data);\n }\n }\n\n /**\n * Resets all state (useful for cleanup).\n */\n reset(): void {\n this._isEditMode.set(false);\n this._isSaving.set(false);\n this.snapshot = null;\n }\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EntityCardWidgetConfig, RuntimeEntityData } from '../../models/meshboard.models';\nimport { DashboardDataService } from '../../services/meshboard-data.service';\nimport { DashboardWidget } from '../widget.interface';\nimport { WidgetNotConfiguredComponent } from '../../components/widget-not-configured/widget-not-configured.component';\nimport { catchError, of } from 'rxjs';\n\n@Component({\n selector: 'mm-entity-card-widget',\n standalone: true,\n imports: [CommonModule, WidgetNotConfiguredComponent],\n templateUrl: './entity-card-widget.component.html',\n styleUrl: './entity-card-widget.component.scss'\n})\nexport class EntityCardWidgetComponent implements DashboardWidget<EntityCardWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {\n private readonly dataService = inject(DashboardDataService);\n\n @Input() config!: EntityCardWidgetConfig;\n\n // Widget state signals\n private readonly _isLoading = signal(false);\n private readonly _data = signal<RuntimeEntityData | null>(null);\n private readonly _error = signal<string | null>(null);\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly data = this._data.asReadonly();\n readonly error = this._error.asReadonly();\n\n /**\n * Check if widget is not configured (needs data source setup).\n * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.\n */\n isNotConfigured(): boolean {\n const dataSource = this.config?.dataSource;\n if (!dataSource) return true;\n if (dataSource.type === 'runtimeEntity') {\n return !dataSource.rtId && !dataSource.ckTypeId;\n }\n if (dataSource.type === 'static') {\n return false; // Static data is always \"configured\"\n }\n return false;\n }\n\n // Computed properties for template\n readonly entityTypeName = computed(() => {\n const data = this._data();\n if (!data?.ckTypeId) return 'Unknown';\n const parts = data.ckTypeId.split('/');\n return parts[parts.length - 1];\n });\n\n readonly displayName = computed(() => {\n const data = this._data();\n return data?.rtWellKnownName || data?.rtId || 'No Name';\n });\n\n readonly filteredAttributes = computed(() => {\n const data = this._data();\n if (!data?.attributes) return [];\n\n if (this.config?.attributeFilter?.length) {\n return data.attributes.filter(attr =>\n this.config.attributeFilter!.includes(attr.attributeName)\n );\n }\n\n return data.attributes;\n });\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Reload data when config changes (e.g., after configuration dialog)\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadData();\n }\n }\n\n refresh(): void {\n this.loadData();\n }\n\n private loadData(): void {\n // Skip loading if widget is not configured - isNotConfigured() handles the display\n if (this.isNotConfigured()) {\n return;\n }\n\n const dataSource = this.config.dataSource;\n\n // Handle static data\n if (dataSource.type === 'static') {\n const staticData = dataSource.data as RuntimeEntityData;\n this._data.set(staticData);\n this._error.set(null);\n return;\n }\n\n // Handle runtime entity data source\n // Note: isNotConfigured() check ensures rtId and ckTypeId are set\n if (dataSource.type === 'runtimeEntity') {\n this._isLoading.set(true);\n this._error.set(null);\n\n this.dataService.fetchEntityWithAssociations(dataSource.rtId!, dataSource.ckTypeId!)\n .pipe(\n catchError(err => {\n console.error('Error loading entity card data:', err);\n this._error.set('Failed to load data');\n return of(null);\n })\n )\n .subscribe(entityData => {\n this._data.set(entityData);\n this._isLoading.set(false);\n });\n }\n }\n\n formatValue(value: unknown): string {\n if (value === null || value === undefined) return '-';\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n return String(value);\n }\n\n formatAttributeName(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n }\n}\n","<div class=\"entity-card\" [class.no-data]=\"!data()\" [class.loading]=\"isLoading()\" [class.error]=\"error()\">\n @if (isNotConfigured()) {\n <mm-widget-not-configured></mm-widget-not-configured>\n } @else if (isLoading()) {\n <div class=\"loading-indicator\">\n <span>Loading...</span>\n </div>\n } @else if (error()) {\n <div class=\"error-message\">\n <span>{{ error() }}</span>\n </div>\n } @else if (data()) {\n <!-- Header (like UML class name) -->\n @if (config.showHeader !== false) {\n <div class=\"entity-header\">\n <span class=\"entity-stereotype\">«{{ entityTypeName() }}»</span>\n <span class=\"entity-name\">{{ displayName() }}</span>\n </div>\n }\n\n <!-- Attributes Section (like UML attributes) -->\n @if (config.showAttributes !== false && filteredAttributes().length > 0) {\n <div class=\"entity-attributes\">\n @for (attr of filteredAttributes(); track attr.attributeName) {\n <div class=\"attribute-row\">\n <span class=\"attribute-name\">{{ formatAttributeName(attr.attributeName) }}</span>\n <span class=\"attribute-value\">{{ formatValue(attr.value) }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Metadata Footer -->\n <div class=\"entity-footer\">\n <span class=\"entity-id\" title=\"Runtime ID\">{{ data()!.rtId }}</span>\n </div>\n } @else {\n <mm-widget-not-configured></mm-widget-not-configured>\n }\n</div>\n","import { Component, Input, Output, EventEmitter, OnInit, inject, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { CkTypeSelectorInputComponent } from '@meshmakers/octo-ui';\nimport { CkTypeSelectorItem, CkTypeSelectorService } from '@meshmakers/octo-services';\nimport { EntitySelectInputComponent } from '@meshmakers/shared-ui';\nimport { GetEntitiesByCkTypeDtoGQL } from '../../graphQL/getEntitiesByCkType';\nimport { firstValueFrom } from 'rxjs';\nimport {\n RuntimeEntityItem,\n RuntimeEntitySelectDataSource,\n RuntimeEntityDialogDataSource\n} from '../../utils/runtime-entity-data-sources';\n\n/**\n * Configuration result from the dialog\n */\nexport interface EntityCardConfigResult {\n ckTypeId: string;\n rtId: string;\n}\n\n/**\n * Configuration dialog for EntityCard and EntityAssociations widgets.\n * Allows selecting a Runtime Entities type and a specific entity.\n */\n@Component({\n selector: 'mm-entity-card-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n CkTypeSelectorInputComponent,\n EntitySelectInputComponent\n ],\n template: `\n <kendo-dialog\n title=\"Entity Configuration\"\n [minWidth]=\"500\"\n [width]=\"600\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\" [class.loading]=\"isLoadingInitial\">\n @if (isLoadingInitial) {\n <div class=\"loading-indicator\">Loading...</div>\n }\n <div class=\"form-field\">\n <label>Runtime Entities</label>\n <mm-ck-type-selector-input\n #ckTypeSelector\n placeholder=\"Select Runtime Entities...\"\n [minSearchLength]=\"2\"\n dialogTitle=\"Select Runtime Entities\"\n [ngModel]=\"selectedCkType\"\n (ckTypeSelected)=\"onCkTypeSelected($event)\"\n (ckTypeCleared)=\"onCkTypeCleared()\">\n </mm-ck-type-selector-input>\n <p class=\"field-hint\">Select the type of entities to choose from.</p>\n </div>\n\n <div class=\"form-field\" [class.disabled]=\"!selectedCkType\">\n <label>Entity</label>\n @if (selectedCkType && entityDataSource) {\n <mm-entity-select-input\n #entitySelector\n [dataSource]=\"entityDataSource\"\n [dialogDataSource]=\"entityDialogDataSource\"\n placeholder=\"Search for an entity...\"\n dialogTitle=\"Select Entity\"\n [minSearchLength]=\"1\"\n [ngModel]=\"selectedEntity\"\n (entitySelected)=\"onEntitySelected($event)\"\n (entityCleared)=\"onEntityCleared()\">\n </mm-entity-select-input>\n } @else {\n <kendo-textbox\n [disabled]=\"true\"\n placeholder=\"First select Runtime Entities...\">\n </kendo-textbox>\n }\n <p class=\"field-hint\">Select the specific entity to display in this widget.</p>\n </div>\n\n @if (selectedEntity) {\n <div class=\"selection-preview\">\n <h4>Selected Entity</h4>\n <div class=\"preview-content\">\n <p><strong>Type:</strong> {{ selectedCkType?.rtCkTypeId }}</p>\n <p><strong>RT-ID:</strong> {{ selectedEntity.rtId }}</p>\n @if (selectedEntity.rtWellKnownName) {\n <p><strong>Name:</strong> {{ selectedEntity.rtWellKnownName }}</p>\n }\n </div>\n </div>\n }\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 16px 0;\n position: relative;\n }\n\n .config-form.loading {\n opacity: 0.7;\n pointer-events: none;\n }\n\n .loading-indicator {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n text-align: center;\n padding: 8px;\n color: var(--kendo-color-primary, #0d6efd);\n font-style: italic;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-field.disabled {\n opacity: 0.6;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .selection-preview {\n padding: 12px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .selection-preview h4 {\n margin: 0 0 8px 0;\n font-size: 0.9rem;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .preview-content p {\n margin: 4px 0;\n font-size: 0.85rem;\n }\n `]\n})\nexport class EntityCardConfigDialogComponent implements OnInit {\n private readonly getEntitiesByCkTypeGQL = inject(GetEntitiesByCkTypeDtoGQL);\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n\n @ViewChild('ckTypeSelector') ckTypeSelectorInput?: CkTypeSelectorInputComponent;\n @ViewChild('entitySelector') entitySelectorInput?: EntitySelectInputComponent;\n\n @Input() initialCkTypeId?: string;\n @Input() initialRtId?: string;\n\n @Output() save = new EventEmitter<EntityCardConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n selectedCkType: CkTypeSelectorItem | null = null;\n selectedEntity: RuntimeEntityItem | null = null;\n entityDataSource?: RuntimeEntitySelectDataSource;\n entityDialogDataSource?: RuntimeEntityDialogDataSource;\n isLoadingInitial = false;\n\n get isValid(): boolean {\n return this.selectedCkType !== null && this.selectedEntity !== null;\n }\n\n async ngOnInit(): Promise<void> {\n if (this.initialCkTypeId) {\n await this.loadInitialValues();\n }\n }\n\n private async loadInitialValues(): Promise<void> {\n if (!this.initialCkTypeId) {\n return;\n }\n\n this.isLoadingInitial = true;\n\n try {\n // Use the direct lookup by rtCkTypeId\n const ckType = await firstValueFrom(\n this.ckTypeSelectorService.getCkTypeByRtCkTypeId(this.initialCkTypeId)\n );\n\n if (ckType) {\n // Set the CK type (this also creates the data sources)\n this.onCkTypeSelected(ckType);\n\n // If we also have an initial rtId, load the entity\n if (this.initialRtId && this.entityDataSource) {\n await this.loadInitialEntity();\n }\n } else {\n console.warn('Runtime Entities type not found:', this.initialCkTypeId);\n }\n } catch (error) {\n console.error('Error loading initial values:', error);\n } finally {\n this.isLoadingInitial = false;\n }\n }\n\n private async loadInitialEntity(): Promise<void> {\n if (!this.initialRtId || !this.initialCkTypeId){\n return;\n }\n\n try {\n // Fetch the entity by rtId\n const result = await firstValueFrom(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId: this.initialCkTypeId,\n rtId : this.initialRtId\n }\n })\n );\n\n const items = result.data?.runtime?.runtimeEntities?.items ?? [];\n const entity = items\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .find(item => item.rtId === this.initialRtId);\n\n if (entity) {\n this.selectedEntity = {\n rtId: entity.rtId,\n ckTypeId: entity.ckTypeId,\n rtWellKnownName: entity.rtWellKnownName ?? undefined,\n displayName: entity.rtWellKnownName || entity.rtId\n };\n }\n } catch (error) {\n console.error('Error loading initial entity:', error);\n }\n }\n\n onCkTypeSelected(ckType: CkTypeSelectorItem): void {\n this.selectedCkType = ckType;\n this.selectedEntity = null; // Reset entity when type changes\n\n // Create new data sources for the selected type\n this.entityDataSource = new RuntimeEntitySelectDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n this.entityDialogDataSource = new RuntimeEntityDialogDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n }\n\n onCkTypeCleared(): void {\n this.selectedCkType = null;\n this.selectedEntity = null;\n this.entityDataSource = undefined;\n this.entityDialogDataSource = undefined;\n }\n\n onEntitySelected(entity: RuntimeEntityItem): void {\n this.selectedEntity = entity;\n }\n\n onEntityCleared(): void {\n this.selectedEntity = null;\n }\n\n onSave(): void {\n if (this.selectedCkType && this.selectedEntity) {\n this.save.emit({\n ckTypeId: this.selectedCkType.rtCkTypeId,\n rtId: this.selectedEntity.rtId\n });\n }\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { KpiWidgetConfig, RuntimeEntityData, PersistentQueryDataSource, WidgetFilterConfig } from '../../models/meshboard.models';\nimport { DashboardDataService } from '../../services/meshboard-data.service';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { MeshBoardVariableService } from '../../services/meshboard-variable.service';\nimport { DashboardWidget } from '../widget.interface';\nimport { WidgetNotConfiguredComponent } from '../../components/widget-not-configured/widget-not-configured.component';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { arrowUpIcon, arrowDownIcon, minusIcon } from '@progress/kendo-svg-icons';\nimport { catchError, of, firstValueFrom } from 'rxjs';\nimport { ExecuteRuntimeQueryDtoGQL } from '../../graphQL/executeRuntimeQuery';\nimport { FieldFilterDto } from '@meshmakers/octo-services';\n\n@Component({\n selector: 'mm-kpi-widget',\n standalone: true,\n imports: [CommonModule, SVGIconModule, WidgetNotConfiguredComponent],\n templateUrl: './kpi-widget.component.html',\n styleUrl: './kpi-widget.component.scss'\n})\nexport class KpiWidgetComponent implements DashboardWidget<KpiWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {\n private readonly dataService = inject(DashboardDataService);\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n private readonly stateService = inject(MeshBoardStateService);\n private readonly variableService = inject(MeshBoardVariableService);\n\n @Input() config!: KpiWidgetConfig;\n\n protected readonly arrowUpIcon = arrowUpIcon;\n protected readonly arrowDownIcon = arrowDownIcon;\n protected readonly minusIcon = minusIcon;\n\n // Widget state signals\n private readonly _isLoading = signal(false);\n private readonly _data = signal<RuntimeEntityData | null>(null);\n private readonly _error = signal<string | null>(null);\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly data = this._data.asReadonly();\n readonly error = this._error.asReadonly();\n\n /**\n * Check if widget is not configured (needs data source setup).\n * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.\n */\n isNotConfigured(): boolean {\n const dataSource = this.config?.dataSource;\n if (!dataSource) return true;\n if (dataSource.type === 'runtimeEntity') {\n // For _count aggregation, only need ckTypeId\n if (this.config?.valueAttribute === '_count') {\n return !dataSource.ckTypeId;\n }\n return !dataSource.rtId && !dataSource.ckTypeId;\n }\n if (dataSource.type === 'persistentQuery') {\n return !dataSource.queryRtId;\n }\n if (dataSource.type === 'static') {\n return false; // Static data is always \"configured\"\n }\n return false;\n }\n\n readonly value = computed(() => {\n const data = this._data();\n if (!data) return '-';\n\n // For persistent queries, look for _queryValue; otherwise use configured valueAttribute\n const attributeName = this.config?.dataSource?.type === 'persistentQuery'\n ? '_queryValue'\n : this.config?.valueAttribute;\n\n // First check for system properties (direct properties on RuntimeEntityData)\n const systemValue = this.getSystemPropertyValue(data, attributeName);\n if (systemValue !== undefined) {\n return this.formatDisplayValue(systemValue);\n }\n\n // Then check in the attributes array\n if (!data.attributes) return '-';\n const attr = data.attributes.find(a => a.attributeName === attributeName);\n if (!attr) return '-';\n\n return this.formatDisplayValue(attr.value);\n });\n\n /**\n * Gets a system property value from RuntimeEntityData.\n * System properties are top-level properties like rtId, ckTypeId, rtWellKnownName.\n */\n private getSystemPropertyValue(data: RuntimeEntityData, propertyName?: string): unknown | undefined {\n if (!propertyName) return undefined;\n\n // Support both with and without underscore prefix for system properties\n const normalizedName = propertyName.startsWith('_') ? propertyName.substring(1) : propertyName;\n\n switch (normalizedName) {\n case 'rtId':\n return data.rtId;\n case 'ckTypeId':\n return data.ckTypeId;\n case 'rtWellKnownName':\n return data.rtWellKnownName;\n case 'rtCreationDateTime':\n return data.rtCreationDateTime;\n case 'rtChangedDateTime':\n return data.rtChangedDateTime;\n default:\n return undefined;\n }\n }\n\n /**\n * Formats a value for display in the KPI widget.\n * Numbers are formatted with locale, strings are displayed as-is.\n */\n private formatDisplayValue(value: unknown): string {\n // Handle null/undefined/string \"null\"\n if (value === null || value === undefined || value === 'null') {\n return '-';\n }\n\n const numValue = typeof value === 'number' ? value : parseFloat(String(value));\n\n if (isNaN(numValue)) {\n // Not a number, return as string\n return String(value);\n }\n\n return numValue.toLocaleString('de-AT', {\n minimumFractionDigits: numValue % 1 !== 0 ? 2 : 0,\n maximumFractionDigits: 2\n });\n }\n\n readonly label = computed(() => {\n const data = this._data();\n if (!this.config?.labelAttribute || !data) return '';\n\n // First check for system properties\n const systemValue = this.getSystemPropertyValue(data, this.config.labelAttribute);\n if (systemValue !== null && systemValue !== undefined && systemValue !== 'null') {\n return String(systemValue);\n }\n\n // Then check in the attributes array\n if (data.attributes) {\n const attr = data.attributes.find(a => a.attributeName === this.config.labelAttribute);\n if (attr && attr.value !== null && attr.value !== undefined && attr.value !== 'null') {\n return String(attr.value);\n }\n }\n return '';\n });\n\n readonly trendIcon = computed(() => {\n switch (this.config?.trend) {\n case 'up': return this.arrowUpIcon;\n case 'down': return this.arrowDownIcon;\n default: return this.minusIcon;\n }\n });\n\n readonly trendClass = computed(() => {\n switch (this.config?.trend) {\n case 'up': return 'trend-up';\n case 'down': return 'trend-down';\n default: return 'trend-neutral';\n }\n });\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadData();\n }\n }\n\n refresh(): void {\n this.loadData();\n }\n\n private loadData(): void {\n // Skip loading if widget is not configured - isNotConfigured() handles the display\n if (this.isNotConfigured()) {\n return;\n }\n\n const dataSource = this.config?.dataSource;\n\n if (dataSource.type === 'static') {\n const staticData = dataSource.data as RuntimeEntityData;\n this._data.set(staticData);\n this._error.set(null);\n return;\n }\n\n if (dataSource.type === 'persistentQuery') {\n this.loadPersistentQueryData();\n return;\n }\n\n if (dataSource.type === 'runtimeEntity') {\n // Special case: _count needs to fetch multiple entities and count them\n if (this.config.valueAttribute === '_count') {\n this.loadCountData();\n return;\n }\n\n // Normal case: fetch single entity and display attribute\n // Note: isNotConfigured() check at top of loadData() ensures rtId and ckTypeId are set\n this._isLoading.set(true);\n this._error.set(null);\n\n this.dataService.fetchEntityWithAssociations(dataSource.rtId!, dataSource.ckTypeId!)\n .pipe(\n catchError(err => {\n console.error('Error loading KPI data:', err);\n this._error.set('Failed to load data');\n return of(null);\n })\n )\n .subscribe(entityData => {\n this._data.set(entityData);\n this._isLoading.set(false);\n });\n }\n }\n\n private async loadCountData(): Promise<void> {\n // Note: isNotConfigured() check in loadData() ensures ckTypeId is set\n const dataSource = this.config.dataSource;\n if (dataSource.type !== 'runtimeEntity') return;\n\n this._isLoading.set(true);\n this._error.set(null);\n\n try {\n // Use aggregation queries for count, passing any configured filters\n const queries = [{\n id: 'count',\n aggregation: 'count' as const,\n ckTypeId: dataSource.ckTypeId!,\n filters: this.config.filters\n }];\n\n const results = await this.dataService.fetchAggregations(queries);\n const count = results.get('count') ?? 0;\n\n // Create a synthetic entity with the count as an attribute\n const countEntity: RuntimeEntityData = {\n rtId: 'count-entity',\n ckTypeId: 'system.count',\n attributes: [{ attributeName: '_count', value: count }],\n associations: []\n };\n this._data.set(countEntity);\n } catch (err) {\n console.error('Error loading count data:', err);\n this._error.set('Failed to load count');\n } finally {\n this._isLoading.set(false);\n }\n }\n\n private async loadPersistentQueryData(): Promise<void> {\n // Note: isNotConfigured() check in loadData() ensures queryRtId is set\n const dataSource = this.config.dataSource as PersistentQueryDataSource;\n\n this._isLoading.set(true);\n this._error.set(null);\n\n try {\n // Convert widget filters to GraphQL format\n const fieldFilter = this.convertFiltersToDto(this.config.filters);\n\n const result = await firstValueFrom(\n this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: dataSource.queryRtId,\n first: 100,\n fieldFilter\n }\n }).pipe(\n catchError(err => {\n console.error('Error loading KPI query data:', err);\n throw err;\n })\n )\n );\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n if (queryItems.length === 0) {\n this._error.set('Query returned no results');\n this._isLoading.set(false);\n return;\n }\n\n const queryResult = queryItems[0];\n if (!queryResult) {\n this._error.set('Query returned no results');\n this._isLoading.set(false);\n return;\n }\n\n let value: number | string = 0;\n const queryMode = this.config.queryMode ?? 'simpleCount';\n\n switch (queryMode) {\n case 'simpleCount':\n // Use totalCount from the query\n value = queryResult.rows?.totalCount ?? 0;\n break;\n\n case 'aggregation':\n // Get the single value from aggregation query (1 row, 1 column)\n value = this.extractAggregationValue(queryResult);\n break;\n\n case 'groupedAggregation':\n // Find the row matching the selected category and get its value\n value = this.extractGroupedAggregationValue(queryResult);\n break;\n }\n\n // Create a synthetic entity with the value\n const kpiEntity: RuntimeEntityData = {\n rtId: 'query-entity',\n ckTypeId: 'system.query',\n attributes: [{ attributeName: '_queryValue', value }],\n associations: []\n };\n this._data.set(kpiEntity);\n this._isLoading.set(false);\n\n } catch (err) {\n console.error('Error loading KPI query data:', err);\n this._error.set('Failed to load data');\n this._isLoading.set(false);\n }\n }\n\n private extractAggregationValue(queryResult: {\n rows?: { items?: ({ __typename?: string; cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null } | null)[] | null } | null\n }): number | string {\n const rows = queryResult.rows?.items ?? [];\n const supportedRowTypes = ['RtAggregationQueryRow', 'RtGroupingAggregationQueryRow'];\n\n // Get the first row\n const firstRow = rows.find(row => row && supportedRowTypes.includes(row.__typename ?? ''));\n if (!firstRow) return 0;\n\n const queryRow = firstRow as { cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null };\n const cells = queryRow.cells?.items ?? [];\n\n // Find the value field or use the first cell\n const valueField = this.config.queryValueField;\n for (const cell of cells) {\n if (!cell?.attributePath) continue;\n\n const sanitizedPath = this.sanitizeFieldName(cell.attributePath);\n if (valueField && sanitizedPath === valueField) {\n return this.extractCellValue(cell.value);\n }\n }\n\n // Fallback: return first cell value if no specific field configured\n const firstCell = cells.find(c => c !== null);\n return firstCell ? this.extractCellValue(firstCell.value) : 0;\n }\n\n private extractGroupedAggregationValue(queryResult: {\n rows?: { items?: ({ __typename?: string; cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null } | null)[] | null } | null\n }): number | string {\n const rows = queryResult.rows?.items ?? [];\n const supportedRowTypes = ['RtGroupingAggregationQueryRow', 'RtAggregationQueryRow'];\n\n const categoryField = this.config.queryCategoryField;\n const categoryValue = this.config.queryCategoryValue;\n const valueField = this.config.queryValueField;\n\n if (!categoryField || !categoryValue || !valueField) {\n return 0;\n }\n\n // Find the row where category matches\n for (const row of rows) {\n if (!row || !supportedRowTypes.includes(row.__typename ?? '')) continue;\n\n const queryRow = row as { cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null };\n const cells = queryRow.cells?.items ?? [];\n\n let categoryMatch = false;\n let value: number | string = 0;\n\n for (const cell of cells) {\n if (!cell?.attributePath) continue;\n\n const sanitizedPath = this.sanitizeFieldName(cell.attributePath);\n\n if (sanitizedPath === categoryField && String(cell.value) === categoryValue) {\n categoryMatch = true;\n }\n\n if (sanitizedPath === valueField) {\n value = this.extractCellValue(cell.value);\n }\n }\n\n if (categoryMatch) {\n return value;\n }\n }\n\n return 0;\n }\n\n private parseNumericValue(value: unknown): number {\n if (typeof value === 'number') return value;\n const parsed = parseFloat(String(value));\n return isNaN(parsed) ? 0 : parsed;\n }\n\n /**\n * Extracts a cell value, preserving strings and converting numbers.\n * Returns the value as-is if it's a string, or parses it as a number.\n */\n private extractCellValue(value: unknown): number | string {\n if (value === null || value === undefined) return 0;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n // Try to parse as number first\n const parsed = parseFloat(value);\n // If it's a valid number, return as number; otherwise return the string\n return isNaN(parsed) ? value : parsed;\n }\n // For other types (boolean, object), convert to string\n return String(value);\n }\n\n private sanitizeFieldName(fieldName: string): string {\n return fieldName.replace(/\\./g, '_');\n }\n\n /**\n * Converts widget filter configuration to GraphQL FieldFilterDto format.\n * Resolves MeshBoard variables in filter values before conversion.\n */\n private convertFiltersToDto(filters?: WidgetFilterConfig[]): FieldFilterDto[] | undefined {\n const variables = this.stateService.getVariables();\n return this.variableService.convertToFieldFilterDto(filters, variables);\n }\n}\n","<div class=\"kpi-widget\" [class.loading]=\"isLoading()\" [class.error]=\"error()\">\n @if (isNotConfigured()) {\n <mm-widget-not-configured></mm-widget-not-configured>\n } @else if (isLoading()) {\n <div class=\"loading-indicator\">\n <span>...</span>\n </div>\n } @else if (error()) {\n <div class=\"error-message\">\n <span>{{ error() }}</span>\n </div>\n } @else {\n <div class=\"kpi-content\">\n <div class=\"kpi-value-container\">\n @if (config.prefix) {\n <span class=\"kpi-prefix\">{{ config.prefix }}</span>\n }\n <span class=\"kpi-value\">{{ value() }}</span>\n @if (config.suffix) {\n <span class=\"kpi-suffix\">{{ config.suffix }}</span>\n }\n </div>\n\n @if (label()) {\n <div class=\"kpi-label\">{{ label() }}</div>\n }\n </div>\n\n @if (config.trend) {\n <div class=\"kpi-trend\" [ngClass]=\"trendClass()\">\n <kendo-svg-icon [icon]=\"trendIcon()\" size=\"medium\"></kendo-svg-icon>\n </div>\n }\n }\n</div>\n","import { Component, Input, Output, EventEmitter, OnInit, inject, ViewChild, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { CkTypeSelectorInputComponent, FieldFilterEditorComponent, FieldFilterItem, FilterVariable } from '@meshmakers/octo-ui';\nimport { CkTypeSelectorItem, CkTypeSelectorService, FieldFilterOperatorsDto, AttributeSelectorService, AttributeItem, FieldFilterDto, GetCkTypeAvailableQueryColumnsDtoGQL } from '@meshmakers/octo-services';\nimport {\n EntitySelectInputComponent\n} from '@meshmakers/shared-ui';\nimport { GetEntitiesByCkTypeDtoGQL } from '../../graphQL/getEntitiesByCkType';\nimport { ExecuteRuntimeQueryDtoGQL } from '../../graphQL/executeRuntimeQuery';\nimport { firstValueFrom } from 'rxjs';\nimport { KpiQueryMode, WidgetFilterConfig } from '../../models/meshboard.models';\nimport { WidgetConfigResult } from '../../services/widget-registry.service';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { RuntimeEntityItem, PersistentQueryItem, QueryColumnItem, CategoryValueItem, RuntimeEntitySelectDataSource, RuntimeEntityDialogDataSource } from '../../utils/runtime-entity-data-sources';\nimport { QuerySelectorComponent } from '../../components/query-selector/query-selector.component';\n\n/**\n * Data source type for KPI\n */\nexport type KpiDataSourceType = 'runtimeEntity' | 'persistentQuery';\n\n/**\n * Configuration result from the KPI dialog\n */\nexport interface KpiConfigResult extends WidgetConfigResult {\n dataSourceType: KpiDataSourceType;\n // Runtime entity fields\n ckTypeId: string;\n rtId?: string;\n valueAttribute: string;\n labelAttribute?: string;\n // Persistent query fields\n queryRtId?: string;\n queryName?: string;\n queryMode?: KpiQueryMode;\n queryValueField?: string;\n queryCategoryField?: string;\n queryCategoryValue?: string;\n // Display options\n prefix?: string;\n suffix?: string;\n trend?: 'up' | 'down' | 'neutral';\n // Filters\n filters?: FieldFilterDto[];\n}\n\ninterface TrendOption {\n value: 'up' | 'down' | 'neutral' | undefined;\n label: string;\n}\n\n/**\n * Configuration dialog for KPI widgets.\n * Allows selecting data source, value attribute, and display options.\n */\n@Component({\n selector: 'mm-kpi-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n DropDownsModule,\n CkTypeSelectorInputComponent,\n EntitySelectInputComponent,\n FieldFilterEditorComponent,\n QuerySelectorComponent\n ],\n template: `\n <kendo-dialog\n title=\"KPI Configuration\"\n [minWidth]=\"500\"\n [width]=\"650\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\" [class.loading]=\"isLoadingInitial\">\n @if (isLoadingInitial) {\n <div class=\"loading-indicator\">Loading...</div>\n }\n\n <!-- Data Source Type Selection -->\n <div class=\"form-field\">\n <label>Data Source</label>\n <div class=\"mode-toggle\">\n <button\n kendoButton\n [fillMode]=\"dataSourceType === 'runtimeEntity' ? 'solid' : 'outline'\"\n [themeColor]=\"dataSourceType === 'runtimeEntity' ? 'primary' : 'base'\"\n (click)=\"onDataSourceTypeChange('runtimeEntity')\">\n Runtime Entity\n </button>\n <button\n kendoButton\n [fillMode]=\"dataSourceType === 'persistentQuery' ? 'solid' : 'outline'\"\n [themeColor]=\"dataSourceType === 'persistentQuery' ? 'primary' : 'base'\"\n (click)=\"onDataSourceTypeChange('persistentQuery')\">\n Query\n </button>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- RUNTIME ENTITY DATA SOURCE -->\n <!-- ============================================================ -->\n @if (dataSourceType === 'runtimeEntity') {\n <!-- Runtime Entities Selection -->\n <div class=\"form-field\">\n <label>Runtime Entities</label>\n <mm-ck-type-selector-input\n #ckTypeSelector\n placeholder=\"Select Runtime Entities...\"\n [minSearchLength]=\"2\"\n dialogTitle=\"Select Runtime Entities\"\n [ngModel]=\"selectedCkType\"\n (ckTypeSelected)=\"onCkTypeSelected($event)\"\n (ckTypeCleared)=\"onCkTypeCleared()\">\n </mm-ck-type-selector-input>\n <p class=\"field-hint\">Select the type of Runtime Entities for the data source.</p>\n </div>\n\n <!-- Mode Selection (Count vs Single Entity) -->\n <div class=\"form-field\">\n <label>Mode</label>\n <div class=\"mode-toggle\">\n <button\n kendoButton\n [fillMode]=\"isCountMode ? 'solid' : 'outline'\"\n [themeColor]=\"isCountMode ? 'primary' : 'base'\"\n (click)=\"setCountMode(true)\">\n Count Entities\n </button>\n <button\n kendoButton\n [fillMode]=\"!isCountMode ? 'solid' : 'outline'\"\n [themeColor]=\"!isCountMode ? 'primary' : 'base'\"\n (click)=\"setCountMode(false)\">\n Single Entity Value\n </button>\n </div>\n <p class=\"field-hint\">\n {{ isCountMode ? 'Display the count of all entities of the selected type.' : 'Display a specific attribute value from a single entity.' }}\n </p>\n </div>\n\n <!-- Entity Selection (only for single entity mode) -->\n @if (!isCountMode) {\n <div class=\"form-field\" [class.disabled]=\"!selectedCkType\">\n <label>Entity</label>\n @if (selectedCkType && entityDataSource) {\n <mm-entity-select-input\n #entitySelector\n [dataSource]=\"entityDataSource\"\n [dialogDataSource]=\"entityDialogDataSource\"\n placeholder=\"Search for an entity...\"\n dialogTitle=\"Select Entity\"\n [minSearchLength]=\"1\"\n [ngModel]=\"selectedEntity\"\n (entitySelected)=\"onEntitySelected($event)\"\n (entityCleared)=\"onEntityCleared()\">\n </mm-entity-select-input>\n } @else {\n <kendo-textbox\n [disabled]=\"true\"\n placeholder=\"First select Runtime Entities...\">\n </kendo-textbox>\n }\n </div>\n\n <!-- Value Attribute -->\n <div class=\"form-field\" [class.disabled]=\"!selectedCkType\">\n <label>Value Attribute</label>\n @if (selectedCkType && !isLoadingAttributes()) {\n <kendo-combobox\n [data]=\"filteredValueAttributes()\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.valueAttribute\"\n [filterable]=\"true\"\n (filterChange)=\"onValueAttributeFilter($event)\"\n placeholder=\"Search or select an attribute...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"attribute-item\">\n <span class=\"attribute-path\">{{ dataItem.attributePath }}</span>\n <span class=\"attribute-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else if (isLoadingAttributes()) {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading attributes...\"></kendo-textbox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"First select Runtime Entities...\"></kendo-textbox>\n }\n <p class=\"field-hint\">The attribute path to display as the KPI value.</p>\n </div>\n\n <!-- Label Attribute -->\n <div class=\"form-field\" [class.disabled]=\"!selectedCkType\">\n <label>Label Attribute (optional)</label>\n @if (selectedCkType && !isLoadingAttributes()) {\n <kendo-combobox\n [data]=\"filteredLabelAttributes()\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.labelAttribute\"\n [filterable]=\"true\"\n (filterChange)=\"onLabelAttributeFilter($event)\"\n placeholder=\"Search or select an attribute...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"attribute-item\">\n <span class=\"attribute-path\">{{ dataItem.attributePath }}</span>\n <span class=\"attribute-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else if (isLoadingAttributes()) {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading attributes...\"></kendo-textbox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"First select Runtime Entities...\"></kendo-textbox>\n }\n <p class=\"field-hint\">Optional attribute to use as a dynamic label.</p>\n </div>\n }\n }\n\n <!-- ============================================================ -->\n <!-- PERSISTENT QUERY DATA SOURCE -->\n <!-- ============================================================ -->\n @if (dataSourceType === 'persistentQuery') {\n <!-- Query Selection -->\n <div class=\"form-field\">\n <label>Query <span class=\"required\">*</span></label>\n <mm-query-selector\n #querySelector\n [(ngModel)]=\"selectedPersistentQuery\"\n (querySelected)=\"onQuerySelected($event)\"\n placeholder=\"Select a Query...\"\n hint=\"Select a query to provide data for this KPI.\">\n </mm-query-selector>\n </div>\n\n <!-- Query Mode Selection -->\n <div class=\"form-field\">\n <label>Query Mode</label>\n <kendo-dropdownlist\n [data]=\"queryModeOptions\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"queryMode\"\n (valueChange)=\"onQueryModeChange($event)\">\n </kendo-dropdownlist>\n <p class=\"field-hint\">\n @switch (queryMode) {\n @case ('simpleCount') { Shows the total count of query results. }\n @case ('aggregation') { Shows the aggregated value from the query. }\n @case ('groupedAggregation') { Shows the value for a specific category. }\n }\n </p>\n </div>\n\n <!-- Aggregation: Value Field Selection -->\n @if (queryMode === 'aggregation' && selectedPersistentQuery) {\n <div class=\"form-field\">\n <label>Value Field <span class=\"required\">*</span></label>\n @if (!isLoadingQueryColumns) {\n <kendo-combobox\n [data]=\"queryColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.queryValueField\"\n placeholder=\"Select value field...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading columns...\"></kendo-textbox>\n }\n <p class=\"field-hint\">The column containing the aggregated value.</p>\n </div>\n }\n\n <!-- Grouped Aggregation: Category and Value Field Selection -->\n @if (queryMode === 'groupedAggregation' && selectedPersistentQuery) {\n <div class=\"form-field\">\n <label>Category Field <span class=\"required\">*</span></label>\n @if (!isLoadingQueryColumns) {\n <kendo-combobox\n [data]=\"queryColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.queryCategoryField\"\n (valueChange)=\"onCategoryFieldChange($event)\"\n placeholder=\"Select category field...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading columns...\"></kendo-textbox>\n }\n <p class=\"field-hint\">The grouping column (e.g., legalEntityType).</p>\n </div>\n\n <div class=\"form-field\" [class.disabled]=\"!form.queryCategoryField\">\n <label>Category Value <span class=\"required\">*</span></label>\n @if (!isLoadingCategoryValues && form.queryCategoryField) {\n <kendo-combobox\n [data]=\"categoryValues\"\n [textField]=\"'displayValue'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.queryCategoryValue\"\n placeholder=\"Select category value...\">\n </kendo-combobox>\n } @else if (isLoadingCategoryValues) {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading values...\"></kendo-textbox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"First select a category field...\"></kendo-textbox>\n }\n <p class=\"field-hint\">The specific category to display (e.g., LegalPerson).</p>\n </div>\n\n <div class=\"form-field\">\n <label>Value Field <span class=\"required\">*</span></label>\n @if (!isLoadingQueryColumns) {\n <kendo-combobox\n [data]=\"queryColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.queryValueField\"\n placeholder=\"Select value field...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading columns...\"></kendo-textbox>\n }\n <p class=\"field-hint\">The column containing the numeric value.</p>\n </div>\n }\n }\n\n <!-- Display Options -->\n <div class=\"form-section\">\n <h4>Display Options</h4>\n\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label>Prefix</label>\n <kendo-textbox\n [(ngModel)]=\"form.prefix\"\n placeholder=\"e.g., $, EUR...\">\n </kendo-textbox>\n </div>\n <div class=\"form-field flex-1\">\n <label>Suffix</label>\n <kendo-textbox\n [(ngModel)]=\"form.suffix\"\n placeholder=\"e.g., %, units...\">\n </kendo-textbox>\n </div>\n </div>\n\n <div class=\"form-field\">\n <label>Trend</label>\n <kendo-dropdownlist\n [data]=\"trendOptions\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.trend\">\n </kendo-dropdownlist>\n </div>\n </div>\n\n <!-- Filters Section -->\n @if (filterAttributes.length > 0) {\n <div class=\"form-section\">\n <h4>Filters</h4>\n <p class=\"section-hint\">Define filters to narrow down the data.</p>\n <mm-field-filter-editor\n [availableAttributes]=\"filterAttributes\"\n [filters]=\"filters\"\n [enableVariables]=\"filterVariables.length > 0\"\n [availableVariables]=\"filterVariables\"\n (filtersChange)=\"onFiltersChange($event)\">\n </mm-field-filter-editor>\n </div>\n }\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 16px 0;\n position: relative;\n }\n\n .config-form.loading {\n opacity: 0.7;\n pointer-events: none;\n }\n\n .loading-indicator {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n text-align: center;\n padding: 8px;\n color: var(--kendo-color-primary, #0d6efd);\n font-style: italic;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-field.disabled {\n opacity: 0.6;\n }\n\n .form-field.flex-1 {\n flex: 1;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .form-section {\n padding: 16px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .form-section h4 {\n margin: 0 0 16px 0;\n font-size: 0.95rem;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .section-hint {\n margin: 0 0 12px 0;\n font-size: 0.85rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .form-row {\n display: flex;\n gap: 16px;\n }\n\n .mode-toggle {\n display: flex;\n gap: 8px;\n }\n\n .mode-toggle button {\n flex: 1;\n }\n\n .attribute-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n width: 100%;\n }\n\n .attribute-path {\n flex: 1;\n }\n\n .attribute-type {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle, #6c757d);\n background: var(--kendo-color-surface-alt, #f8f9fa);\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .required {\n color: var(--kendo-color-error, #dc3545);\n }\n\n .query-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .query-name {\n font-weight: 500;\n }\n\n .query-description {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .column-item {\n display: flex;\n justify-content: space-between;\n gap: 16px;\n }\n\n .column-path {\n font-weight: 500;\n }\n\n .column-type {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n `]\n})\nexport class KpiConfigDialogComponent implements OnInit {\n private readonly getEntitiesByCkTypeGQL = inject(GetEntitiesByCkTypeDtoGQL);\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n private readonly attributeSelectorService = inject(AttributeSelectorService);\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n private readonly getCkTypeAvailableQueryColumnsGQL = inject(GetCkTypeAvailableQueryColumnsDtoGQL);\n private readonly meshBoardStateService = inject(MeshBoardStateService);\n\n @ViewChild('ckTypeSelector') ckTypeSelectorInput?: CkTypeSelectorInputComponent;\n @ViewChild('entitySelector') entitySelectorInput?: EntitySelectInputComponent;\n @ViewChild('querySelector') querySelector?: QuerySelectorComponent;\n\n // Initial values for editing - Runtime Entity\n @Input() initialCkTypeId?: string;\n @Input() initialRtId?: string;\n @Input() initialValueAttribute?: string;\n @Input() initialLabelAttribute?: string;\n @Input() initialPrefix?: string;\n @Input() initialSuffix?: string;\n @Input() initialTrend?: 'up' | 'down' | 'neutral';\n\n // Initial values for editing - Persistent Query\n @Input() initialDataSourceType?: KpiDataSourceType;\n @Input() initialQueryRtId?: string;\n @Input() initialQueryName?: string;\n @Input() initialQueryMode?: KpiQueryMode;\n @Input() initialQueryValueField?: string;\n @Input() initialQueryCategoryField?: string;\n @Input() initialQueryCategoryValue?: string;\n\n // Initial values for filters\n @Input() initialFilters?: WidgetFilterConfig[];\n\n @Output() save = new EventEmitter<KpiConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n // Data source type selection\n dataSourceType: KpiDataSourceType = 'runtimeEntity';\n\n // Runtime Entity state\n selectedCkType: CkTypeSelectorItem | null = null;\n selectedEntity: RuntimeEntityItem | null = null;\n entityDataSource?: RuntimeEntitySelectDataSource;\n entityDialogDataSource?: RuntimeEntityDialogDataSource;\n isLoadingInitial = false;\n isCountMode = false;\n\n // Persistent Query state\n selectedPersistentQuery: PersistentQueryItem | null = null;\n queryColumns: QueryColumnItem[] = [];\n categoryValues: CategoryValueItem[] = [];\n queryMode: KpiQueryMode = 'simpleCount';\n isLoadingQueryColumns = false;\n isLoadingCategoryValues = false;\n\n // Attribute selection\n readonly isLoadingAttributes = signal(false);\n readonly availableAttributes = signal<AttributeItem[]>([]);\n readonly filteredValueAttributes = signal<AttributeItem[]>([]);\n readonly filteredLabelAttributes = signal<AttributeItem[]>([]);\n\n // Filter state\n filters: FieldFilterItem[] = [];\n filterAttributes: AttributeItem[] = [];\n filterVariables: FilterVariable[] = [];\n\n form = {\n valueAttribute: '',\n labelAttribute: '',\n prefix: '',\n suffix: '',\n trend: undefined as 'up' | 'down' | 'neutral' | undefined,\n // Query-specific form fields\n queryValueField: '',\n queryCategoryField: '',\n queryCategoryValue: ''\n };\n\n trendOptions: TrendOption[] = [\n { value: undefined, label: 'None' },\n { value: 'up', label: 'Up (positive)' },\n { value: 'down', label: 'Down (negative)' },\n { value: 'neutral', label: 'Neutral' }\n ];\n\n queryModeOptions = [\n { value: 'simpleCount' as KpiQueryMode, label: 'Total Count (Simple Query)' },\n { value: 'aggregation' as KpiQueryMode, label: 'Aggregation Value' },\n { value: 'groupedAggregation' as KpiQueryMode, label: 'Grouped Aggregation' }\n ];\n\n get isValid(): boolean {\n if (this.dataSourceType === 'persistentQuery') {\n if (!this.selectedPersistentQuery) return false;\n if (this.queryMode === 'simpleCount') return true;\n if (this.queryMode === 'aggregation') return this.form.queryValueField !== '';\n if (this.queryMode === 'groupedAggregation') {\n return this.form.queryCategoryField !== '' &&\n this.form.queryCategoryValue !== '' &&\n this.form.queryValueField !== '';\n }\n return false;\n }\n // Runtime entity validation\n if (!this.selectedCkType) return false;\n if (this.isCountMode) return true;\n return this.selectedEntity !== null && (this.form.valueAttribute?.trim() ?? '') !== '';\n }\n\n async ngOnInit(): Promise<void> {\n // Initialize filter variables from MeshBoard state\n this.filterVariables = this.meshBoardStateService.getVariables().map(v => ({\n name: v.name,\n label: v.label || v.name,\n type: v.type\n }));\n\n // Initialize form with initial values\n this.form.valueAttribute = this.initialValueAttribute || '';\n this.form.labelAttribute = this.initialLabelAttribute || '';\n this.form.prefix = this.initialPrefix || '';\n this.form.suffix = this.initialSuffix || '';\n this.form.trend = this.initialTrend;\n this.form.queryValueField = this.initialQueryValueField || '';\n this.form.queryCategoryField = this.initialQueryCategoryField || '';\n this.form.queryCategoryValue = this.initialQueryCategoryValue || '';\n\n // Initialize filters\n if (this.initialFilters && this.initialFilters.length > 0) {\n this.filters = this.initialFilters.map((f, index) => ({\n id: index + 1,\n attributePath: f.attributePath,\n operator: f.operator as FieldFilterOperatorsDto,\n comparisonValue: f.comparisonValue\n }));\n }\n\n // Determine data source type\n this.dataSourceType = this.initialDataSourceType || 'runtimeEntity';\n this.queryMode = this.initialQueryMode || 'simpleCount';\n\n // Check if this is count mode (for runtime entity)\n this.isCountMode = this.initialValueAttribute === '_count';\n\n if (this.dataSourceType === 'persistentQuery' && this.initialQueryRtId) {\n this.isLoadingInitial = true;\n setTimeout(async () => {\n if (this.querySelector) {\n const query = await this.querySelector.selectByRtId(this.initialQueryRtId!);\n if (query) {\n this.selectedPersistentQuery = query;\n await this.loadQueryColumnsAndValues();\n if (query.queryCkTypeId) {\n await this.loadFilterAttributesFromCkType(query.queryCkTypeId);\n }\n }\n }\n this.isLoadingInitial = false;\n }, 100);\n } else if (this.initialCkTypeId) {\n await this.loadInitialValues();\n }\n }\n\n private async loadInitialValues(): Promise<void> {\n if (!this.initialCkTypeId) return;\n\n this.isLoadingInitial = true;\n\n try {\n const ckType = await firstValueFrom(\n this.ckTypeSelectorService.getCkTypeByRtCkTypeId(this.initialCkTypeId)\n );\n\n if (ckType) {\n this.onCkTypeSelected(ckType);\n\n if (this.initialRtId && this.entityDataSource && !this.isCountMode) {\n await this.loadInitialEntity();\n }\n }\n } catch (error) {\n console.error('Error loading initial values:', error);\n } finally {\n this.isLoadingInitial = false;\n }\n }\n\n private async loadInitialEntity(): Promise<void> {\n if (!this.initialRtId || !this.initialCkTypeId) return;\n\n try {\n const result = await firstValueFrom(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId: this.initialCkTypeId,\n rtId: this.initialRtId\n }\n })\n );\n\n const items = result.data?.runtime?.runtimeEntities?.items ?? [];\n const entity = items\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .find(item => item.rtId === this.initialRtId);\n\n if (entity) {\n this.selectedEntity = {\n rtId: entity.rtId,\n ckTypeId: entity.ckTypeId,\n rtWellKnownName: entity.rtWellKnownName ?? undefined,\n displayName: entity.rtWellKnownName || entity.rtId\n };\n }\n } catch (error) {\n console.error('Error loading initial entity:', error);\n }\n }\n\n setCountMode(countMode: boolean): void {\n this.isCountMode = countMode;\n if (countMode) {\n this.selectedEntity = null;\n this.form.valueAttribute = '_count';\n this.form.labelAttribute = '';\n } else {\n this.form.valueAttribute = '';\n }\n }\n\n onCkTypeSelected(ckType: CkTypeSelectorItem): void {\n this.selectedCkType = ckType;\n this.selectedEntity = null;\n\n this.entityDataSource = new RuntimeEntitySelectDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.fullName\n );\n this.entityDialogDataSource = new RuntimeEntityDialogDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n\n // Load available attributes for this CK type (fullName is required for the GraphQL query)\n this.loadAvailableAttributes(ckType.fullName);\n }\n\n onCkTypeCleared(): void {\n this.selectedCkType = null;\n this.selectedEntity = null;\n this.entityDataSource = undefined;\n this.entityDialogDataSource = undefined;\n this.availableAttributes.set([]);\n this.filteredValueAttributes.set([]);\n this.filteredLabelAttributes.set([]);\n this.filterAttributes = [];\n this.filters = [];\n }\n\n private loadAvailableAttributes(ckTypeId: string): void {\n this.isLoadingAttributes.set(true);\n this.attributeSelectorService.getAvailableAttributes(ckTypeId).subscribe({\n next: (result) => {\n this.availableAttributes.set(result.items);\n this.filteredValueAttributes.set(result.items);\n this.filteredLabelAttributes.set(result.items);\n // Also set filter attributes for the filter editor\n this.filterAttributes = result.items;\n this.isLoadingAttributes.set(false);\n },\n error: (err) => {\n console.error('Error loading attributes:', err);\n this.availableAttributes.set([]);\n this.filteredValueAttributes.set([]);\n this.filteredLabelAttributes.set([]);\n this.filterAttributes = [];\n this.isLoadingAttributes.set(false);\n }\n });\n }\n\n onValueAttributeFilter(filter: string): void {\n const filterLower = filter.toLowerCase();\n const filtered = this.availableAttributes().filter(attr =>\n attr.attributePath.toLowerCase().includes(filterLower)\n );\n this.filteredValueAttributes.set(filtered);\n }\n\n onLabelAttributeFilter(filter: string): void {\n const filterLower = filter.toLowerCase();\n const filtered = this.availableAttributes().filter(attr =>\n attr.attributePath.toLowerCase().includes(filterLower)\n );\n this.filteredLabelAttributes.set(filtered);\n }\n\n onEntitySelected(entity: RuntimeEntityItem): void {\n this.selectedEntity = entity;\n }\n\n onEntityCleared(): void {\n this.selectedEntity = null;\n }\n\n onSave(): void {\n // Convert filters to DTO format\n const filtersDto: FieldFilterDto[] | undefined = this.filters.length > 0\n ? this.filters.map(f => ({\n attributePath: f.attributePath,\n operator: f.operator,\n comparisonValue: f.comparisonValue\n }))\n : undefined;\n\n if (this.dataSourceType === 'persistentQuery' && this.selectedPersistentQuery) {\n this.save.emit({\n dataSourceType: 'persistentQuery',\n ckTypeId: '',\n rtId: undefined,\n valueAttribute: '',\n queryRtId: this.selectedPersistentQuery.rtId,\n queryName: this.selectedPersistentQuery.name,\n queryMode: this.queryMode,\n queryValueField: this.form.queryValueField || undefined,\n queryCategoryField: this.form.queryCategoryField || undefined,\n queryCategoryValue: this.form.queryCategoryValue || undefined,\n prefix: this.form.prefix || undefined,\n suffix: this.form.suffix || undefined,\n trend: this.form.trend,\n filters: filtersDto\n });\n } else if (this.selectedCkType) {\n this.save.emit({\n dataSourceType: 'runtimeEntity',\n ckTypeId: this.selectedCkType.rtCkTypeId,\n rtId: this.isCountMode ? undefined : this.selectedEntity?.rtId,\n valueAttribute: this.isCountMode ? '_count' : this.form.valueAttribute,\n labelAttribute: this.form.labelAttribute || undefined,\n prefix: this.form.prefix || undefined,\n suffix: this.form.suffix || undefined,\n trend: this.form.trend,\n filters: filtersDto\n });\n }\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n\n // ============================================================================\n // Data Source Type Selection\n // ============================================================================\n\n onDataSourceTypeChange(type: KpiDataSourceType): void {\n this.dataSourceType = type;\n }\n\n // ============================================================================\n // Persistent Query Methods\n // ============================================================================\n\n async onQuerySelected(query: PersistentQueryItem | null): Promise<void> {\n this.selectedPersistentQuery = query;\n this.queryColumns = [];\n this.categoryValues = [];\n this.filterAttributes = [];\n this.filters = [];\n this.form.queryValueField = '';\n this.form.queryCategoryField = '';\n this.form.queryCategoryValue = '';\n\n if (query) {\n // Load query columns for field mapping\n await this.loadQueryColumnsAndValues(query.rtId);\n\n // Load filter attributes from CK type\n if (query.queryCkTypeId) {\n await this.loadFilterAttributesFromCkType(query.queryCkTypeId);\n }\n }\n }\n\n async onQueryModeChange(mode: KpiQueryMode): Promise<void> {\n this.queryMode = mode;\n this.form.queryValueField = '';\n this.form.queryCategoryField = '';\n this.form.queryCategoryValue = '';\n this.categoryValues = [];\n\n // Query columns should already be loaded, but reload if needed for category values\n if (this.selectedPersistentQuery && mode === 'groupedAggregation' && this.queryColumns.length === 0) {\n await this.loadQueryColumnsAndValues(this.selectedPersistentQuery.rtId);\n }\n }\n\n private async loadQueryColumnsAndValues(queryRtId?: string): Promise<void> {\n const rtId = queryRtId || this.selectedPersistentQuery?.rtId;\n if (!rtId) return;\n\n this.isLoadingQueryColumns = true;\n\n try {\n const result = await firstValueFrom(this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: rtId,\n first: 100 // Fetch rows for category values\n }\n }));\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n if (queryItems.length > 0 && queryItems[0]) {\n const queryResult = queryItems[0];\n\n // Extract columns\n const columns = queryResult.columns ?? [];\n const filteredColumns = columns\n .filter((c): c is NonNullable<typeof c> => c !== null);\n\n // queryColumns use sanitized paths for UI display and matching with query results\n this.queryColumns = filteredColumns.map(c => ({\n attributePath: this.sanitizeFieldName(c.attributePath ?? ''),\n attributeValueType: c.attributeValueType ?? ''\n }));\n\n // Extract category values for grouped aggregation\n if (this.queryMode === 'groupedAggregation') {\n await this.extractCategoryValues(queryResult);\n }\n }\n } catch (error) {\n console.error('Error loading query columns:', error);\n this.queryColumns = [];\n } finally {\n this.isLoadingQueryColumns = false;\n }\n }\n\n /**\n * Loads all available filter attributes from the CK type.\n * Uses getCkTypeAvailableQueryColumns to get all attributes, not just query result columns.\n */\n private async loadFilterAttributesFromCkType(queryCkTypeId: string): Promise<void> {\n try {\n const result = await firstValueFrom(this.getCkTypeAvailableQueryColumnsGQL.fetch({\n variables: { rtCkId: queryCkTypeId, first: 1000 }\n }));\n\n const columns = result.data?.constructionKit?.types?.items?.[0]?.availableQueryColumns?.items || [];\n this.filterAttributes = columns\n .filter((c): c is NonNullable<typeof c> => c !== null)\n .map(c => ({\n attributePath: c.attributePath || '',\n attributeValueType: c.attributeValueType\n }));\n } catch (error) {\n console.error('Error loading filter attributes:', error);\n this.filterAttributes = [];\n }\n }\n\n async onCategoryFieldChange(categoryField: string): Promise<void> {\n this.form.queryCategoryField = categoryField;\n this.form.queryCategoryValue = '';\n this.categoryValues = [];\n\n if (this.selectedPersistentQuery && categoryField) {\n await this.loadCategoryValuesForField(this.selectedPersistentQuery.rtId, categoryField);\n }\n }\n\n private async loadCategoryValuesForField(queryRtId: string, categoryField: string): Promise<void> {\n this.isLoadingCategoryValues = true;\n\n try {\n const result = await firstValueFrom(this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: queryRtId,\n first: 100\n }\n }));\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n if (queryItems.length > 0 && queryItems[0]) {\n const queryResult = queryItems[0];\n const rows = queryResult.rows?.items ?? [];\n const supportedRowTypes = ['RtSimpleQueryRow', 'RtAggregationQueryRow', 'RtGroupingAggregationQueryRow'];\n\n const values = new Set<string>();\n\n for (const row of rows) {\n if (!row || !supportedRowTypes.includes(row.__typename ?? '')) continue;\n\n const queryRow = row as { cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null };\n const cells = queryRow.cells?.items ?? [];\n\n for (const cell of cells) {\n if (!cell?.attributePath) continue;\n\n const sanitizedPath = this.sanitizeFieldName(cell.attributePath);\n if (sanitizedPath === categoryField && cell.value !== null && cell.value !== undefined) {\n values.add(String(cell.value));\n }\n }\n }\n\n this.categoryValues = Array.from(values).map(v => ({\n value: v,\n displayValue: v\n }));\n }\n } catch (error) {\n console.error('Error loading category values:', error);\n this.categoryValues = [];\n } finally {\n this.isLoadingCategoryValues = false;\n }\n }\n\n private async extractCategoryValues(_queryResult: { rows?: { items?: ({ __typename?: string; cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null } | null)[] | null } | null }): Promise<void> {\n // Load category values if a category field is already selected\n if (this.queryColumns.length > 0 && this.form.queryCategoryField && this.selectedPersistentQuery) {\n await this.loadCategoryValuesForField(this.selectedPersistentQuery.rtId, this.form.queryCategoryField);\n }\n }\n\n private sanitizeFieldName(fieldName: string): string {\n return fieldName.replace(/\\./g, '_');\n }\n\n // ============================================================================\n // Filter Methods\n // ============================================================================\n\n onFiltersChange(updatedFilters: FieldFilterItem[]): void {\n this.filters = updatedFilters;\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { PropertyGridComponent, PropertyGridItem, PropertyGridConfig, AttributeValueTypeDto } from '@meshmakers/octo-ui';\nimport { GetDashboardEntityDtoGQL } from '../../graphQL/getDashboardEntity';\nimport { firstValueFrom } from 'rxjs';\n\n/**\n * Dialog component for displaying entity details using property grid.\n * Shows all attributes of an entity with their names, values, and types.\n */\n@Component({\n selector: 'mm-entity-detail-dialog',\n standalone: true,\n imports: [\n CommonModule,\n DialogsModule,\n ButtonsModule,\n PropertyGridComponent\n ],\n template: `\n <kendo-dialog\n [title]=\"dialogTitle\"\n [minWidth]=\"600\"\n [width]=\"700\"\n (close)=\"onClose()\">\n\n <div class=\"entity-detail-content\">\n @if (isLoading()) {\n <div class=\"loading-indicator\">Loading entity details...</div>\n } @else if (error()) {\n <div class=\"error-message\">{{ error() }}</div>\n } @else {\n <div class=\"entity-header\">\n <div class=\"entity-info\">\n <div class=\"info-row\">\n <span class=\"label\">RT-ID:</span>\n <span class=\"value\">{{ rtId }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">CK Type:</span>\n <span class=\"value\">{{ formatCkTypeId(ckTypeId) }}</span>\n </div>\n @if (rtWellKnownName()) {\n <div class=\"info-row\">\n <span class=\"label\">Name:</span>\n <span class=\"value\">{{ rtWellKnownName() }}</span>\n </div>\n }\n </div>\n </div>\n\n <div class=\"attributes-section\">\n <h4>Attributes</h4>\n <mm-property-grid\n [data]=\"propertyGridData()\"\n [config]=\"propertyGridConfig\"\n [showTypeColumn]=\"true\">\n </mm-property-grid>\n </div>\n }\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton (click)=\"onClose()\">Close</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .entity-detail-content {\n display: flex;\n flex-direction: column;\n gap: 16px;\n min-height: 400px;\n }\n\n .loading-indicator, .error-message {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .error-message {\n color: var(--kendo-color-error, #dc3545);\n }\n\n .entity-header {\n padding: 12px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .entity-info {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .info-row {\n display: flex;\n gap: 8px;\n font-size: 0.875rem;\n }\n\n .info-row .label {\n font-weight: 600;\n color: var(--kendo-color-subtle, #6c757d);\n min-width: 80px;\n }\n\n .info-row .value {\n color: var(--kendo-color-on-surface, #212529);\n word-break: break-all;\n }\n\n .attributes-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n .attributes-section h4 {\n margin: 0 0 8px 0;\n font-size: 0.9rem;\n color: var(--kendo-color-primary, #0d6efd);\n }\n `]\n})\nexport class EntityDetailDialogComponent implements OnInit {\n private readonly getDashboardEntityGQL = inject(GetDashboardEntityDtoGQL);\n\n @Input() rtId!: string;\n @Input() ckTypeId!: string;\n\n @Output() closed = new EventEmitter<void>();\n\n readonly isLoading = signal(false);\n readonly error = signal<string | null>(null);\n readonly rtWellKnownName = signal<string | null>(null);\n readonly propertyGridData = signal<PropertyGridItem[]>([]);\n\n readonly propertyGridConfig: PropertyGridConfig = {\n readOnlyMode: true,\n showSearch: true,\n showTypeIcons: true,\n height: '350px'\n };\n\n get dialogTitle(): string {\n return `Entity Details: ${this.formatCkTypeId(this.ckTypeId)}`;\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadEntityDetails();\n }\n\n formatCkTypeId(ckTypeId: string): string {\n if (!ckTypeId) return '';\n const parts = ckTypeId.split('/');\n return parts[parts.length - 1];\n }\n\n private async loadEntityDetails(): Promise<void> {\n if (!this.rtId || !this.ckTypeId) {\n this.error.set('No entity specified');\n return;\n }\n\n this.isLoading.set(true);\n this.error.set(null);\n\n try {\n const result = await firstValueFrom(\n this.getDashboardEntityGQL.fetch({\n variables: {\n rtId: this.rtId,\n ckTypeId: this.ckTypeId\n }\n })\n );\n\n const entity = result.data?.runtime?.runtimeEntities?.items?.[0];\n\n if (!entity) {\n this.error.set('Entity not found');\n return;\n }\n\n this.rtWellKnownName.set(entity.rtWellKnownName ?? null);\n\n // Map attributes to PropertyGridItem format\n const attributes = entity.attributes?.items ?? [];\n const gridItems: PropertyGridItem[] = attributes\n .filter((attr): attr is NonNullable<typeof attr> => attr !== null && attr.attributeName !== null)\n .map((attr, index) => ({\n id: `attr-${index}`,\n name: attr.attributeName!,\n displayName: this.formatAttributeName(attr.attributeName!),\n value: attr.value,\n type: this.inferAttributeType(attr.value),\n readOnly: true\n }));\n\n this.propertyGridData.set(gridItems);\n } catch (err) {\n console.error('Error loading entity details:', err);\n this.error.set('Failed to load entity details');\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private formatAttributeName(name: string): string {\n // Convert camelCase to Title Case with spaces\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n }\n\n private inferAttributeType(value: unknown): AttributeValueTypeDto {\n if (value === null || value === undefined) {\n return AttributeValueTypeDto.StringDto;\n }\n\n if (typeof value === 'boolean') {\n return AttributeValueTypeDto.BooleanDto;\n }\n\n if (typeof value === 'number') {\n return Number.isInteger(value) ? AttributeValueTypeDto.IntegerDto : AttributeValueTypeDto.DoubleDto;\n }\n\n if (typeof value === 'string') {\n // Check for date patterns\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n return AttributeValueTypeDto.DateTimeDto;\n }\n return AttributeValueTypeDto.StringDto;\n }\n\n if (Array.isArray(value)) {\n if (value.length > 0 && typeof value[0] === 'object') {\n return AttributeValueTypeDto.RecordArrayDto;\n }\n if (value.length > 0 && typeof value[0] === 'string') {\n return AttributeValueTypeDto.StringArrayDto;\n }\n if (value.length > 0 && typeof value[0] === 'number') {\n return AttributeValueTypeDto.IntegerArrayDto;\n }\n return AttributeValueTypeDto.StringArrayDto;\n }\n\n if (typeof value === 'object') {\n return AttributeValueTypeDto.RecordDto;\n }\n\n return AttributeValueTypeDto.StringDto;\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EntityWithAssociationsWidgetConfig, RuntimeEntityData, EntityAssociation } from '../../models/meshboard.models';\nimport { DashboardDataService } from '../../services/meshboard-data.service';\nimport { DashboardWidget } from '../widget.interface';\nimport { WidgetNotConfiguredComponent } from '../../components/widget-not-configured/widget-not-configured.component';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { arrowRightIcon, arrowLeftIcon, linkIcon, chevronDownIcon, chevronRightIcon } from '@progress/kendo-svg-icons';\nimport { catchError, of } from 'rxjs';\nimport { EntityDetailDialogComponent } from './entity-detail-dialog.component';\n\ninterface GroupedAssociation {\n roleId: string;\n roleName: string;\n targetType: string;\n direction: 'in' | 'out';\n count: number;\n associations: EntityAssociation[];\n isExpanded: boolean;\n}\n\ninterface TargetEntity {\n rtId: string;\n ckTypeId: string;\n displayName: string;\n}\n\n@Component({\n selector: 'mm-entity-associations-widget',\n standalone: true,\n imports: [CommonModule, SVGIconModule, EntityDetailDialogComponent, WidgetNotConfiguredComponent],\n templateUrl: './entity-associations-widget.component.html',\n styleUrl: './entity-associations-widget.component.scss'\n})\nexport class EntityAssociationsWidgetComponent implements DashboardWidget<EntityWithAssociationsWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {\n private readonly dataService = inject(DashboardDataService);\n\n @Input() config!: EntityWithAssociationsWidgetConfig;\n\n protected readonly arrowRightIcon = arrowRightIcon;\n protected readonly arrowLeftIcon = arrowLeftIcon;\n protected readonly linkIcon = linkIcon;\n protected readonly chevronDownIcon = chevronDownIcon;\n protected readonly chevronRightIcon = chevronRightIcon;\n\n // Widget state signals\n private readonly _isLoading = signal(false);\n private readonly _data = signal<RuntimeEntityData | null>(null);\n private readonly _error = signal<string | null>(null);\n private readonly _expandedGroups = signal<Set<string>>(new Set());\n\n // Detail dialog state\n protected showDetailDialog = false;\n protected detailEntityRtId = '';\n protected detailEntityCkTypeId = '';\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly data = this._data.asReadonly();\n readonly error = this._error.asReadonly();\n\n /**\n * Check if widget is not configured (needs data source setup).\n * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.\n */\n isNotConfigured(): boolean {\n const dataSource = this.config?.dataSource;\n if (!dataSource) return true;\n if (dataSource.type === 'runtimeEntity') {\n return !dataSource.rtId && !dataSource.ckTypeId;\n }\n if (dataSource.type === 'static') {\n return false; // Static data is always \"configured\"\n }\n return false;\n }\n\n readonly entityName = computed(() => {\n const data = this._data();\n if (!data?.ckTypeId) return 'Entity';\n const parts = data.ckTypeId.split('/');\n return parts[parts.length - 1];\n });\n\n readonly entityRtId = computed(() => {\n return this._data()?.rtId ?? '';\n });\n\n readonly entityCkTypeId = computed(() => {\n return this._data()?.ckTypeId ?? '';\n });\n\n readonly displayMode = computed(() => {\n return this.config?.displayMode ?? 'expandable';\n });\n\n readonly groupedAssociations = computed(() => {\n const data = this._data();\n if (!data?.associations) return [];\n\n const showIncoming = this.config?.showIncoming ?? true;\n const showOutgoing = this.config?.showOutgoing ?? true;\n const roleFilter = this.config?.roleFilter ?? [];\n const sourceRtId = data.rtId;\n\n const grouped = new Map<string, GroupedAssociation>();\n\n for (const assoc of data.associations) {\n // Determine direction based on origin vs target\n const isOutgoing = assoc.originRtId === sourceRtId;\n const direction: 'in' | 'out' = isOutgoing ? 'out' : 'in';\n\n // Apply direction filter\n if (direction === 'in' && !showIncoming) continue;\n if (direction === 'out' && !showOutgoing) continue;\n\n // Apply role filter\n if (roleFilter.length > 0 && !roleFilter.includes(assoc.ckAssociationRoleId)) {\n continue;\n }\n\n const targetCkTypeId = isOutgoing ? assoc.targetCkTypeId : assoc.originCkTypeId;\n const key = `${direction}-${assoc.ckAssociationRoleId}-${targetCkTypeId}`;\n\n if (!grouped.has(key)) {\n const targetParts = targetCkTypeId.split('/');\n grouped.set(key, {\n roleId: assoc.ckAssociationRoleId,\n roleName: this.formatRoleName(assoc.ckAssociationRoleId),\n targetType: targetParts[targetParts.length - 1],\n direction,\n count: 0,\n associations: [],\n isExpanded: this._expandedGroups().has(key)\n });\n }\n\n const group = grouped.get(key)!;\n group.count++;\n group.associations.push(assoc);\n }\n\n let result = Array.from(grouped.values());\n\n // Sort: outgoing first, then by role name\n result.sort((a, b) => {\n if (a.direction !== b.direction) {\n return a.direction === 'out' ? -1 : 1;\n }\n return a.roleName.localeCompare(b.roleName);\n });\n\n if (this.config?.maxAssociations) {\n result = result.slice(0, this.config.maxAssociations);\n }\n\n return result;\n });\n\n readonly totalAssociations = computed(() => {\n return this.groupedAssociations().reduce((sum, g) => sum + g.count, 0);\n });\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadData();\n }\n }\n\n refresh(): void {\n this.loadData();\n }\n\n protected toggleGroup(group: GroupedAssociation): void {\n if (this.displayMode() !== 'expandable') return;\n\n const key = `${group.direction}-${group.roleId}-${group.targetType}`;\n const expanded = new Set(this._expandedGroups());\n\n if (expanded.has(key)) {\n expanded.delete(key);\n } else {\n expanded.add(key);\n }\n\n this._expandedGroups.set(expanded);\n\n // Update the group's expanded state\n group.isExpanded = expanded.has(key);\n }\n\n protected isGroupExpanded(group: GroupedAssociation): boolean {\n const key = `${group.direction}-${group.roleId}-${group.targetType}`;\n return this._expandedGroups().has(key);\n }\n\n protected getTargetEntities(group: GroupedAssociation): TargetEntity[] {\n const sourceRtId = this._data()?.rtId;\n return group.associations.map(assoc => {\n const isOutgoing = assoc.originRtId === sourceRtId;\n const rtId = isOutgoing ? assoc.targetRtId : assoc.originRtId;\n const ckTypeId = isOutgoing ? assoc.targetCkTypeId : assoc.originCkTypeId;\n return {\n rtId,\n ckTypeId,\n displayName: rtId // Could be enhanced with wellKnownName if available\n };\n });\n }\n\n protected onTargetClick(target: TargetEntity): void {\n this.detailEntityRtId = target.rtId;\n this.detailEntityCkTypeId = target.ckTypeId;\n this.showDetailDialog = true;\n }\n\n protected onDetailDialogClosed(): void {\n this.showDetailDialog = false;\n this.detailEntityRtId = '';\n this.detailEntityCkTypeId = '';\n }\n\n private loadData(): void {\n // Skip loading if widget is not configured - isNotConfigured() handles the display\n if (this.isNotConfigured()) {\n return;\n }\n\n const dataSource = this.config.dataSource;\n\n if (dataSource.type === 'static') {\n const staticData = dataSource.data as RuntimeEntityData;\n this._data.set(staticData);\n this._error.set(null);\n return;\n }\n\n // Note: isNotConfigured() check ensures rtId and ckTypeId are set\n if (dataSource.type === 'runtimeEntity') {\n this._isLoading.set(true);\n this._error.set(null);\n\n this.dataService.fetchEntityWithAssociations(dataSource.rtId!, dataSource.ckTypeId!)\n .pipe(\n catchError(err => {\n console.error('Error loading associations data:', err);\n this._error.set('Failed to load data');\n return of(null);\n })\n )\n .subscribe(entityData => {\n this._data.set(entityData);\n this._isLoading.set(false);\n });\n }\n }\n\n private formatRoleName(roleId: string): string {\n // Extract the last part after the last '/'\n const parts = roleId.split('/');\n const name = parts[parts.length - 1];\n\n // Convert camelCase/PascalCase to space-separated\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n }\n}\n","<div class=\"associations-widget\" [class.no-data]=\"!data()\" [class.loading]=\"isLoading()\" [class.error]=\"error()\">\n @if (isNotConfigured()) {\n <mm-widget-not-configured></mm-widget-not-configured>\n } @else if (isLoading()) {\n <div class=\"loading-indicator\">\n <span>Loading...</span>\n </div>\n } @else if (error()) {\n <div class=\"error-message\">\n <span>{{ error() }}</span>\n </div>\n } @else if (data()) {\n <!-- Entity Info Header -->\n <div class=\"entity-header\">\n <div class=\"entity-box\">\n <span class=\"entity-name\">{{ entityName() }}</span>\n </div>\n <div class=\"entity-details\">\n <span class=\"entity-id\" title=\"{{ entityCkTypeId() }}\">{{ entityRtId() }}</span>\n </div>\n </div>\n\n <!-- Associations List -->\n <div class=\"associations-container\">\n @for (group of groupedAssociations(); track group.roleId + group.direction) {\n <div class=\"association-group\" [class.expanded]=\"isGroupExpanded(group)\">\n <!-- Group Header -->\n <div class=\"group-header\"\n [class.clickable]=\"displayMode() === 'expandable'\"\n (click)=\"toggleGroup(group)\">\n <div class=\"direction-indicator\">\n @if (group.direction === 'out') {\n <kendo-svg-icon [icon]=\"arrowRightIcon\" size=\"small\"></kendo-svg-icon>\n } @else {\n <kendo-svg-icon [icon]=\"arrowLeftIcon\" size=\"small\"></kendo-svg-icon>\n }\n </div>\n <div class=\"group-info\">\n <span class=\"role-name\">{{ group.roleName }}</span>\n <span class=\"target-type\">{{ group.targetType }}</span>\n <span class=\"count-badge\">{{ group.count }}</span>\n </div>\n @if (displayMode() === 'expandable') {\n <div class=\"expand-icon\">\n @if (isGroupExpanded(group)) {\n <kendo-svg-icon [icon]=\"chevronDownIcon\" size=\"small\"></kendo-svg-icon>\n } @else {\n <kendo-svg-icon [icon]=\"chevronRightIcon\" size=\"small\"></kendo-svg-icon>\n }\n </div>\n }\n </div>\n\n <!-- Expanded Target List -->\n @if (displayMode() === 'expandable' && isGroupExpanded(group)) {\n <div class=\"target-list\">\n @for (target of getTargetEntities(group); track target.rtId) {\n <div class=\"target-item\" (click)=\"onTargetClick(target)\">\n <span class=\"target-id\">{{ target.displayName }}</span>\n <span class=\"target-type-hint\">{{ target.ckTypeId | slice:-30 }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Summary Footer -->\n <div class=\"associations-summary\">\n <kendo-svg-icon [icon]=\"linkIcon\" size=\"small\"></kendo-svg-icon>\n <span>{{ totalAssociations() }} relationship(s)</span>\n </div>\n } @else {\n <mm-widget-not-configured></mm-widget-not-configured>\n }\n</div>\n\n<!-- Entity Detail Dialog -->\n@if (showDetailDialog) {\n <mm-entity-detail-dialog\n [rtId]=\"detailEntityRtId\"\n [ckTypeId]=\"detailEntityCkTypeId\"\n (closed)=\"onDetailDialogClosed()\">\n </mm-entity-detail-dialog>\n}\n","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type GetCkTypeAssociationRolesQueryVariablesDto = Types.Exact<{\n ckTypeId: Types.Scalars['String']['input'];\n}>;\n\n\nexport type GetCkTypeAssociationRolesQueryDto = { __typename?: 'OctoQuery', constructionKit?: { __typename?: 'ConstructionKitQuery', types?: { __typename?: 'CkTypeDtoConnection', items?: Array<{ __typename?: 'CkType', rtCkTypeId: any, associations?: { __typename?: 'CkTypeAssociationDirection', in?: { __typename?: 'CkTypeAssociationSource', all?: Array<{ __typename?: 'CkTypeAssociation', navigationPropertyName: string, multiplicity: Types.MultiplicitiesDto, roleId: { __typename?: 'CkAssociationRoleId', fullName: string, semanticVersionedFullName: string }, targetCkTypeId: { __typename?: 'CkTypeId', fullName: string } } | null> | null } | null, out?: { __typename?: 'CkTypeAssociationSource', all?: Array<{ __typename?: 'CkTypeAssociation', navigationPropertyName: string, multiplicity: Types.MultiplicitiesDto, roleId: { __typename?: 'CkAssociationRoleId', fullName: string, semanticVersionedFullName: string }, targetCkTypeId: { __typename?: 'CkTypeId', fullName: string } } | null> | null } | null } | null } | null> | null } | null } | null };\n\nexport const GetCkTypeAssociationRolesDocumentDto = gql`\n query getCkTypeAssociationRoles($ckTypeId: String!) {\n constructionKit {\n types(rtCkId: $ckTypeId, first: 1) {\n items {\n rtCkTypeId\n associations {\n in {\n all {\n roleId {\n fullName\n semanticVersionedFullName\n }\n navigationPropertyName\n multiplicity\n targetCkTypeId {\n fullName\n }\n }\n }\n out {\n all {\n roleId {\n fullName\n semanticVersionedFullName\n }\n navigationPropertyName\n multiplicity\n targetCkTypeId {\n fullName\n }\n }\n }\n }\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class GetCkTypeAssociationRolesDtoGQL extends Apollo.Query<GetCkTypeAssociationRolesQueryDto, GetCkTypeAssociationRolesQueryVariablesDto> {\n document = GetCkTypeAssociationRolesDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import { Component, Input, Output, EventEmitter, OnInit, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule, CheckBoxModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { CkTypeSelectorInputComponent } from '@meshmakers/octo-ui';\nimport { CkTypeSelectorItem, CkTypeSelectorService, FieldFilterOperatorsDto } from '@meshmakers/octo-services';\nimport {\n EntitySelectInputComponent,\n EntitySelectDialogDataSource,\n DialogFetchOptions,\n DialogFetchResult,\n ColumnDefinition\n} from '@meshmakers/shared-ui';\nimport { EntitySelectDataSource, EntitySelectResult } from '@meshmakers/shared-services';\nimport { GetEntitiesByCkTypeDtoGQL } from '../../graphQL/getEntitiesByCkType';\nimport { GetCkTypeAssociationRolesDtoGQL } from '../../graphQL/getCkTypeAssociationRoles';\nimport { firstValueFrom, Observable, from, map } from 'rxjs';\n\n/**\n * Represents a runtime entity for selection\n */\nexport interface RuntimeEntityItem {\n rtId: string;\n ckTypeId: string;\n rtWellKnownName?: string;\n displayName: string;\n}\n\n/**\n * Represents an association role for selection\n */\nexport interface AssociationRoleItem {\n roleId: string;\n navigationPropertyName: string;\n direction: 'in' | 'out';\n targetCkTypeId: string;\n multiplicity: string;\n displayName: string;\n}\n\n/**\n * Configuration result from the dialog\n */\nexport interface AssociationsConfigResult {\n ckTypeId: string;\n rtId: string;\n showIncoming: boolean;\n showOutgoing: boolean;\n roleFilter: string[];\n displayMode: 'count' | 'expandable';\n}\n\n/**\n * Data source for entity autocomplete - filters by ckTypeId\n */\nclass RuntimeEntitySelectDataSource implements EntitySelectDataSource<RuntimeEntityItem> {\n constructor(\n private getEntitiesByCkTypeGQL: GetEntitiesByCkTypeDtoGQL,\n private ckTypeId: string\n ) {}\n\n async onFilter(filter: string, take?: number): Promise<EntitySelectResult<RuntimeEntityItem>> {\n const result = await firstValueFrom(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId: this.ckTypeId,\n first: take ?? 10,\n fieldFilters: [\n { attributePath: 'rtId', operator: FieldFilterOperatorsDto.LikeDto, comparisonValue: filter }\n ]\n }\n })\n );\n\n const items = (result.data?.runtime?.runtimeEntities?.items ?? [])\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .map(item => ({\n rtId: item.rtId,\n ckTypeId: item.ckTypeId,\n rtWellKnownName: item.rtWellKnownName ?? undefined,\n displayName: item.rtWellKnownName || item.rtId\n }));\n\n return {\n totalCount: result.data?.runtime?.runtimeEntities?.totalCount ?? 0,\n items\n };\n }\n\n onDisplayEntity(entity: RuntimeEntityItem): string {\n return entity.displayName;\n }\n\n getIdEntity(entity: RuntimeEntityItem): string {\n return entity.rtId;\n }\n}\n\n/**\n * Dialog data source for entity selection grid\n */\nclass RuntimeEntityDialogDataSource implements EntitySelectDialogDataSource<RuntimeEntityItem> {\n constructor(\n private getEntitiesByCkTypeGQL: GetEntitiesByCkTypeDtoGQL,\n private ckTypeId: string\n ) {}\n\n getColumns(): ColumnDefinition[] {\n return [\n { field: 'rtId', displayName: 'RT-ID' },\n { field: 'rtWellKnownName', displayName: 'Name' },\n { field: 'ckTypeId', displayName: 'CK Type' }\n ];\n }\n\n fetchData(options: DialogFetchOptions): Observable<DialogFetchResult<RuntimeEntityItem>> {\n // Build field filters for text search\n const fieldFilters: { attributePath: string; operator: FieldFilterOperatorsDto; comparisonValue: string }[] = [];\n if (options.textSearch && options.textSearch.trim()) {\n fieldFilters.push({\n attributePath: 'rtId',\n operator: FieldFilterOperatorsDto.LikeDto,\n comparisonValue: options.textSearch.trim()\n });\n }\n\n return from(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId: this.ckTypeId,\n first: options.take,\n after: options.skip > 0 ? btoa(`arrayconnection:${options.skip - 1}`) : undefined,\n fieldFilters: fieldFilters.length > 0 ? fieldFilters : undefined\n }\n })\n ).pipe(\n map(result => {\n const items = (result.data?.runtime?.runtimeEntities?.items ?? [])\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .map(item => ({\n rtId: item.rtId,\n ckTypeId: item.ckTypeId,\n rtWellKnownName: item.rtWellKnownName ?? undefined,\n displayName: item.rtWellKnownName || item.rtId\n }));\n\n return {\n data: items,\n totalCount: result.data?.runtime?.runtimeEntities?.totalCount ?? 0\n };\n })\n );\n }\n\n onDisplayEntity(entity: RuntimeEntityItem): string {\n return entity.displayName;\n }\n\n getIdEntity(entity: RuntimeEntityItem): string {\n return entity.rtId;\n }\n}\n\n/**\n * Configuration dialog for EntityWithAssociations widget.\n * Allows selecting a CK Type, runtime entity, direction filters, and role filters.\n */\n@Component({\n selector: 'mm-associations-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n CheckBoxModule,\n DropDownsModule,\n CkTypeSelectorInputComponent,\n EntitySelectInputComponent\n ],\n template: `\n <kendo-dialog\n title=\"Associations Widget Configuration\"\n [minWidth]=\"550\"\n [width]=\"650\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\" [class.loading]=\"isLoadingInitial\">\n @if (isLoadingInitial) {\n <div class=\"loading-indicator\">Loading...</div>\n }\n\n <!-- CK Type Selection -->\n <div class=\"form-field\">\n <label>CK Type</label>\n <mm-ck-type-selector-input\n placeholder=\"Select a CK Type...\"\n [minSearchLength]=\"2\"\n dialogTitle=\"Select CK Type\"\n [ngModel]=\"selectedCkType\"\n (ckTypeSelected)=\"onCkTypeSelected($event)\"\n (ckTypeCleared)=\"onCkTypeCleared()\">\n </mm-ck-type-selector-input>\n <p class=\"field-hint\">Select the Construction Kit Type for the source entity.</p>\n </div>\n\n <!-- Entity Selection -->\n <div class=\"form-field\" [class.disabled]=\"!selectedCkType\">\n <label>Entity</label>\n @if (selectedCkType && entityDataSource) {\n <mm-entity-select-input\n [dataSource]=\"entityDataSource\"\n [dialogDataSource]=\"entityDialogDataSource\"\n placeholder=\"Search for an entity...\"\n dialogTitle=\"Select Entity\"\n [minSearchLength]=\"1\"\n [ngModel]=\"selectedEntity\"\n (entitySelected)=\"onEntitySelected($event)\"\n (entityCleared)=\"onEntityCleared()\">\n </mm-entity-select-input>\n } @else {\n <kendo-textbox\n [disabled]=\"true\"\n placeholder=\"First select a CK Type...\">\n </kendo-textbox>\n }\n <p class=\"field-hint\">Select the source entity whose associations to display.</p>\n </div>\n\n <!-- Direction Filters -->\n <div class=\"form-field\">\n <label>Direction Filter</label>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox [(ngModel)]=\"showIncoming\" />\n <span>Incoming associations</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox [(ngModel)]=\"showOutgoing\" />\n <span>Outgoing associations</span>\n </label>\n </div>\n <p class=\"field-hint\">Filter which direction of associations to show.</p>\n </div>\n\n <!-- Role Filter -->\n <div class=\"form-field\" [class.disabled]=\"!selectedCkType || availableRoles().length === 0\">\n <label>Role Filter (optional)</label>\n @if (isLoadingRoles()) {\n <div class=\"loading-roles\">Loading available roles...</div>\n } @else if (availableRoles().length > 0) {\n <kendo-multiselect\n [data]=\"filteredRoles()\"\n [textField]=\"'displayName'\"\n [valueField]=\"'roleId'\"\n [(ngModel)]=\"selectedRoles\"\n placeholder=\"All roles (no filter)\"\n [filterable]=\"true\"\n (filterChange)=\"onRoleFilterChange($event)\">\n </kendo-multiselect>\n } @else {\n <kendo-textbox\n [disabled]=\"true\"\n placeholder=\"No roles available\">\n </kendo-textbox>\n }\n <p class=\"field-hint\">Optionally filter to specific association roles.</p>\n </div>\n\n <!-- Display Mode -->\n <div class=\"form-field\">\n <label>Display Mode</label>\n <div class=\"radio-group\">\n <label class=\"radio-label\">\n <input type=\"radio\" name=\"displayMode\" value=\"expandable\" [(ngModel)]=\"displayMode\" />\n <span>Expandable groups</span>\n </label>\n <label class=\"radio-label\">\n <input type=\"radio\" name=\"displayMode\" value=\"count\" [(ngModel)]=\"displayMode\" />\n <span>Count only</span>\n </label>\n </div>\n <p class=\"field-hint\">How to display association targets.</p>\n </div>\n\n <!-- Selection Preview -->\n @if (selectedEntity) {\n <div class=\"selection-preview\">\n <h4>Selected Entity</h4>\n <div class=\"preview-content\">\n <p><strong>CK Type:</strong> {{ selectedCkType?.rtCkTypeId }}</p>\n <p><strong>RT-ID:</strong> {{ selectedEntity.rtId }}</p>\n @if (selectedEntity.rtWellKnownName) {\n <p><strong>Name:</strong> {{ selectedEntity.rtWellKnownName }}</p>\n }\n </div>\n </div>\n }\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px 0;\n position: relative;\n }\n\n .config-form.loading {\n opacity: 0.7;\n pointer-events: none;\n }\n\n .loading-indicator {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n text-align: center;\n padding: 8px;\n color: var(--kendo-color-primary, #0d6efd);\n font-style: italic;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-field.disabled {\n opacity: 0.6;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .checkbox-group, .radio-group {\n display: flex;\n gap: 16px;\n }\n\n .checkbox-label, .radio-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: normal;\n cursor: pointer;\n }\n\n .loading-roles {\n padding: 8px;\n color: var(--kendo-color-subtle, #6c757d);\n font-style: italic;\n }\n\n .selection-preview {\n padding: 12px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .selection-preview h4 {\n margin: 0 0 8px 0;\n font-size: 0.9rem;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .preview-content p {\n margin: 4px 0;\n font-size: 0.85rem;\n }\n `]\n})\nexport class AssociationsConfigDialogComponent implements OnInit {\n private readonly getEntitiesByCkTypeGQL = inject(GetEntitiesByCkTypeDtoGQL);\n private readonly getCkTypeAssociationRolesGQL = inject(GetCkTypeAssociationRolesDtoGQL);\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n\n @Input() initialCkTypeId?: string;\n @Input() initialRtId?: string;\n @Input() initialShowIncoming?: boolean;\n @Input() initialShowOutgoing?: boolean;\n @Input() initialRoleFilter?: string[];\n @Input() initialDisplayMode?: 'count' | 'expandable';\n\n @Output() save = new EventEmitter<AssociationsConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n selectedCkType: CkTypeSelectorItem | null = null;\n selectedEntity: RuntimeEntityItem | null = null;\n entityDataSource?: RuntimeEntitySelectDataSource;\n entityDialogDataSource?: RuntimeEntityDialogDataSource;\n\n showIncoming = true;\n showOutgoing = true;\n selectedRoles: AssociationRoleItem[] = [];\n displayMode: 'count' | 'expandable' = 'expandable';\n\n isLoadingInitial = false;\n readonly isLoadingRoles = signal(false);\n readonly availableRoles = signal<AssociationRoleItem[]>([]);\n readonly filteredRoles = signal<AssociationRoleItem[]>([]);\n\n private roleFilterText = '';\n\n get isValid(): boolean {\n return this.selectedCkType !== null &&\n this.selectedEntity !== null &&\n (this.showIncoming || this.showOutgoing);\n }\n\n async ngOnInit(): Promise<void> {\n // Set initial values\n if (this.initialShowIncoming !== undefined) {\n this.showIncoming = this.initialShowIncoming;\n }\n if (this.initialShowOutgoing !== undefined) {\n this.showOutgoing = this.initialShowOutgoing;\n }\n if (this.initialDisplayMode) {\n this.displayMode = this.initialDisplayMode;\n }\n\n if (this.initialCkTypeId) {\n await this.loadInitialValues();\n }\n }\n\n private async loadInitialValues(): Promise<void> {\n if (!this.initialCkTypeId) {\n return;\n }\n\n this.isLoadingInitial = true;\n\n try {\n const ckType = await firstValueFrom(\n this.ckTypeSelectorService.getCkTypeByRtCkTypeId(this.initialCkTypeId)\n );\n\n if (ckType) {\n await this.onCkTypeSelected(ckType);\n\n if (this.initialRtId && this.entityDataSource) {\n await this.loadInitialEntity();\n }\n\n // Set initial role filter after roles are loaded\n if (this.initialRoleFilter && this.initialRoleFilter.length > 0) {\n const allRoles = this.availableRoles();\n this.selectedRoles = allRoles.filter(r =>\n this.initialRoleFilter!.includes(r.roleId)\n );\n }\n }\n } catch (error) {\n console.error('Error loading initial values:', error);\n } finally {\n this.isLoadingInitial = false;\n }\n }\n\n private async loadInitialEntity(): Promise<void> {\n if (!this.initialRtId || !this.initialCkTypeId) {\n return;\n }\n\n try {\n const result = await firstValueFrom(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId: this.initialCkTypeId,\n rtId: this.initialRtId\n }\n })\n );\n\n const items = result.data?.runtime?.runtimeEntities?.items ?? [];\n const entity = items\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .find(item => item.rtId === this.initialRtId);\n\n if (entity) {\n this.selectedEntity = {\n rtId: entity.rtId,\n ckTypeId: entity.ckTypeId,\n rtWellKnownName: entity.rtWellKnownName ?? undefined,\n displayName: entity.rtWellKnownName || entity.rtId\n };\n }\n } catch (error) {\n console.error('Error loading initial entity:', error);\n }\n }\n\n async onCkTypeSelected(ckType: CkTypeSelectorItem): Promise<void> {\n this.selectedCkType = ckType;\n this.selectedEntity = null;\n this.selectedRoles = [];\n\n // Create data sources for entity selection\n this.entityDataSource = new RuntimeEntitySelectDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n this.entityDialogDataSource = new RuntimeEntityDialogDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n\n // Load available association roles\n await this.loadAssociationRoles(ckType.rtCkTypeId);\n }\n\n onCkTypeCleared(): void {\n this.selectedCkType = null;\n this.selectedEntity = null;\n this.entityDataSource = undefined;\n this.entityDialogDataSource = undefined;\n this.availableRoles.set([]);\n this.filteredRoles.set([]);\n this.selectedRoles = [];\n }\n\n onEntitySelected(entity: RuntimeEntityItem): void {\n this.selectedEntity = entity;\n }\n\n onEntityCleared(): void {\n this.selectedEntity = null;\n }\n\n onRoleFilterChange(filter: string): void {\n this.roleFilterText = filter.toLowerCase();\n this.updateFilteredRoles();\n }\n\n private updateFilteredRoles(): void {\n const all = this.availableRoles();\n if (!this.roleFilterText) {\n this.filteredRoles.set(all);\n } else {\n this.filteredRoles.set(\n all.filter(r => r.displayName.toLowerCase().includes(this.roleFilterText))\n );\n }\n }\n\n private async loadAssociationRoles(ckTypeId: string): Promise<void> {\n this.isLoadingRoles.set(true);\n this.availableRoles.set([]);\n this.filteredRoles.set([]);\n\n try {\n const result = await firstValueFrom(\n this.getCkTypeAssociationRolesGQL.fetch({\n variables: { ckTypeId }\n })\n );\n\n const ckType = result.data?.constructionKit?.types?.items?.[0];\n if (!ckType?.associations) {\n return;\n }\n\n const roles: AssociationRoleItem[] = [];\n\n // Process incoming associations\n const inAssocs = ckType.associations.in?.all ?? [];\n for (const assoc of inAssocs) {\n if (!assoc) continue;\n roles.push({\n roleId: assoc.roleId.semanticVersionedFullName,\n navigationPropertyName: assoc.navigationPropertyName,\n direction: 'in',\n targetCkTypeId: assoc.targetCkTypeId.fullName,\n multiplicity: assoc.multiplicity,\n displayName: `[IN] ${assoc.navigationPropertyName} (${this.formatTypeName(assoc.targetCkTypeId.fullName)})`\n });\n }\n\n // Process outgoing associations\n const outAssocs = ckType.associations.out?.all ?? [];\n for (const assoc of outAssocs) {\n if (!assoc) continue;\n roles.push({\n roleId: assoc.roleId.semanticVersionedFullName,\n navigationPropertyName: assoc.navigationPropertyName,\n direction: 'out',\n targetCkTypeId: assoc.targetCkTypeId.fullName,\n multiplicity: assoc.multiplicity,\n displayName: `[OUT] ${assoc.navigationPropertyName} (${this.formatTypeName(assoc.targetCkTypeId.fullName)})`\n });\n }\n\n this.availableRoles.set(roles);\n this.filteredRoles.set(roles);\n } catch (error) {\n console.error('Error loading association roles:', error);\n } finally {\n this.isLoadingRoles.set(false);\n }\n }\n\n private formatTypeName(fullName: string): string {\n const parts = fullName.split('/');\n return parts[parts.length - 1];\n }\n\n onSave(): void {\n if (this.selectedCkType && this.selectedEntity) {\n this.save.emit({\n ckTypeId: this.selectedCkType.rtCkTypeId,\n rtId: this.selectedEntity.rtId,\n showIncoming: this.showIncoming,\n showOutgoing: this.showOutgoing,\n roleFilter: this.selectedRoles.map(r => r.roleId),\n displayMode: this.displayMode\n });\n }\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n","import { Directive, forwardRef, inject, Input, signal, Signal, Output, EventEmitter } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { OctoGraphQlDataSource } from '@meshmakers/octo-ui';\nimport { DataSourceBase, FetchDataOptions, FetchResultTyped, ListViewComponent } from '@meshmakers/shared-ui';\nimport { GraphQL, FieldFilterDto } from '@meshmakers/octo-services';\nimport { TableWidgetConfig, TableColumn, PersistentQueryDataSource, WidgetFilterConfig } from '../../models/meshboard.models';\nimport { GetEntitiesByCkTypeDtoGQL } from '../../graphQL/getEntitiesByCkType';\nimport { ExecuteRuntimeQueryDtoGQL } from '../../graphQL/executeRuntimeQuery';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { MeshBoardVariableService } from '../../services/meshboard-variable.service';\n\n/**\n * Column info derived from a persistent query response\n */\nexport interface QueryColumn {\n attributePath: string;\n attributeValueType: string;\n}\n\n/**\n * DataSource directive for the Table Widget.\n * Fetches entities based on the widget configuration (ckTypeId, filters, sorting).\n * Supports both RuntimeEntity and PersistentQuery data sources.\n */\n@Directive({\n selector: '[mmTableWidgetDataSource]',\n exportAs: 'mmTableWidgetDataSource',\n providers: [\n {\n provide: DataSourceBase,\n useExisting: forwardRef(() => TableWidgetDataSourceDirective)\n }\n ]\n})\nexport class TableWidgetDataSourceDirective extends OctoGraphQlDataSource<Record<string, unknown>> {\n private readonly getEntitiesByCkTypeGQL = inject(GetEntitiesByCkTypeDtoGQL);\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n private readonly stateService = inject(MeshBoardStateService);\n private readonly variableService = inject(MeshBoardVariableService);\n\n private _config: TableWidgetConfig | null = null;\n\n /** Signal for dynamically derived columns from persistent query */\n private readonly _queryColumns = signal<QueryColumn[]>([]);\n\n /** Exposed signal for reading derived columns */\n readonly queryColumns: Signal<QueryColumn[]> = this._queryColumns.asReadonly();\n\n /** Derived TableColumn array from persistent query columns */\n readonly derivedColumns: Signal<TableColumn[]> = signal([]);\n\n /** Event emitted when query columns are loaded from a persistent query */\n @Output() queryColumnsLoaded = new EventEmitter<QueryColumn[]>();\n\n @Input() set config(value: TableWidgetConfig | null) {\n this._config = value;\n if (value) {\n // Set search filter attribute paths based on columns (for runtimeEntity)\n if (value.dataSource.type === 'runtimeEntity') {\n this.searchFilterAttributePaths = value.columns.map(c => c.field);\n }\n }\n }\n\n get config(): TableWidgetConfig | null {\n return this._config;\n }\n\n constructor() {\n const listViewComponent = inject(ListViewComponent);\n super(listViewComponent);\n }\n\n public override fetchData(queryOptions: FetchDataOptions): Observable<FetchResultTyped<Record<string, unknown>> | null> {\n if (!this._config) {\n return of(new FetchResultTyped<Record<string, unknown>>([], 0));\n }\n\n const dataSource = this._config.dataSource;\n\n // Handle persistent query data source\n if (dataSource.type === 'persistentQuery') {\n return this.fetchPersistentQueryData(dataSource, queryOptions);\n }\n\n // Handle runtime entity data source\n if (dataSource.type !== 'runtimeEntity' || !dataSource.ckTypeId) {\n return of(new FetchResultTyped<Record<string, unknown>>([], 0));\n }\n\n // Get sort, filter definitions from query options (from grid state)\n const sort = this.getSortDefinitions(queryOptions.state);\n const searchFilterDto = this.getSearchFilterDefinitions(queryOptions.textSearch);\n const gridFieldFilters = this.getFieldFilterDefinitions(queryOptions.state);\n\n // Merge widget-configured filters with grid filters\n let allFilters: FieldFilterDto[] = [];\n\n // Add widget-configured filters (with variable resolution)\n if (this._config.filters && this._config.filters.length > 0) {\n const resolvedFilters = this.convertFiltersToDto(this._config.filters);\n if (resolvedFilters) {\n allFilters = [...resolvedFilters];\n }\n }\n\n // Add grid filters (from row filter or other grid interactions)\n if (gridFieldFilters && gridFieldFilters.length > 0) {\n allFilters = [...allFilters, ...gridFieldFilters];\n }\n\n return this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId: dataSource.ckTypeId,\n first: queryOptions.state.take ?? this._config.pageSize ?? 10,\n after: GraphQL.offsetToCursor(queryOptions.state.skip ?? 0),\n sort: sort,\n fieldFilters: allFilters.length > 0 ? allFilters : undefined,\n searchFilter: searchFilterDto\n },\n fetchPolicy: queryOptions.forceRefresh ? 'network-only' : 'cache-first'\n }).pipe(\n map(result => {\n const items = result.data?.runtime?.runtimeEntities?.items ?? [];\n const totalCount = result.data?.runtime?.runtimeEntities?.totalCount ?? 0;\n\n // Transform items to flat records for the grid\n const data = items\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .map(item => {\n const record: Record<string, unknown> = {\n rtId: item.rtId,\n ckTypeId: item.ckTypeId,\n rtWellKnownName: item.rtWellKnownName\n };\n\n // Flatten attributes into the record (including nested record attributes)\n if (item.attributes?.items) {\n this.flattenAttributes(item.attributes.items, record, '');\n }\n\n return record;\n });\n\n return new FetchResultTyped<Record<string, unknown>>(data, totalCount);\n }),\n catchError(err => {\n console.error('Error fetching table data:', err);\n return of(new FetchResultTyped<Record<string, unknown>>([], 0));\n })\n );\n }\n\n /**\n * Recursively flattens attributes into the record using dot notation for nested attributes.\n * Handles nested CkRecord attributes by extracting their inner attributes.\n */\n private flattenAttributes(\n attributes: ({ attributeName?: string | null; value?: unknown } | null)[] | null | undefined,\n record: Record<string, unknown>,\n prefix: string\n ): void {\n if (!attributes) return;\n\n for (const attr of attributes) {\n if (!attr?.attributeName) continue;\n\n const key = prefix ? `${prefix}.${attr.attributeName}` : attr.attributeName;\n const value = attr.value;\n\n // Check if the value is a nested CkRecord (has ckRecordId and attributes)\n if (value && typeof value === 'object' && 'ckRecordId' in value) {\n const nestedRecord = value as {\n ckRecordId?: string;\n attributes?: ({ attributeName?: string | null; value?: unknown } | null)[] |\n { items?: ({ attributeName?: string | null; value?: unknown } | null)[] }\n };\n\n // Store the ckRecordId as well\n record[`${key}.ckRecordId`] = nestedRecord.ckRecordId;\n\n // Recursively flatten nested attributes\n // Handle both direct array and { items: [] } structure\n if (nestedRecord.attributes) {\n if (Array.isArray(nestedRecord.attributes)) {\n // Direct array of attributes\n this.flattenAttributes(nestedRecord.attributes, record, key);\n } else if ('items' in nestedRecord.attributes && nestedRecord.attributes.items) {\n // Connection type with items\n this.flattenAttributes(nestedRecord.attributes.items, record, key);\n }\n }\n } else {\n // Simple attribute - store directly\n record[key] = value;\n }\n }\n }\n\n /**\n * Fetches data from a persistent query.\n * Extracts columns from the query response and transforms cells to flat records.\n */\n private fetchPersistentQueryData(\n dataSource: PersistentQueryDataSource,\n queryOptions: FetchDataOptions\n ): Observable<FetchResultTyped<Record<string, unknown>>> {\n // Convert widget-configured filters to GraphQL format (with variable resolution)\n const fieldFilter = this.convertFiltersToDto(this._config?.filters);\n\n return this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: dataSource.queryRtId,\n first: queryOptions.state.take ?? this._config?.pageSize ?? 10,\n after: GraphQL.offsetToCursor(queryOptions.state.skip ?? 0),\n fieldFilter\n }\n }).pipe(\n map(result => {\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n\n if (queryItems.length === 0) {\n return new FetchResultTyped<Record<string, unknown>>([], 0);\n }\n\n const queryResult = queryItems[0];\n if (!queryResult) {\n return new FetchResultTyped<Record<string, unknown>>([], 0);\n }\n\n // Extract columns from query response and update signal\n // Replace dots with underscores for grid compatibility (Kendo treats dots as nested paths)\n const columns: QueryColumn[] = (queryResult.columns ?? [])\n .filter((c): c is NonNullable<typeof c> => c !== null)\n .map(c => ({\n attributePath: this.sanitizeFieldName(c.attributePath ?? ''),\n attributeValueType: c.attributeValueType ?? ''\n }));\n this._queryColumns.set(columns);\n // Emit event to notify component that columns have been loaded\n this.queryColumnsLoaded.emit(columns);\n\n // Extract rows\n const rows = queryResult.rows?.items ?? [];\n const totalCount = queryResult.rows?.totalCount ?? 0;\n\n // Check which standard fields are in the query columns\n const columnPaths = new Set(columns.map(c => c.attributePath));\n const hasRtIdColumn = columnPaths.has('rtId');\n const hasCkTypeIdColumn = columnPaths.has('ckTypeId');\n\n // Transform rows to flat records (handle union type by checking __typename)\n // Support RtSimpleQueryRow, RtAggregationQueryRow, and RtGroupingAggregationQueryRow\n const supportedRowTypes = ['RtSimpleQueryRow', 'RtAggregationQueryRow', 'RtGroupingAggregationQueryRow'];\n const data = rows\n .filter((row): row is NonNullable<typeof row> => row !== null)\n .filter(row => supportedRowTypes.includes(row.__typename ?? ''))\n .map((row, index) => {\n // Both row types have ckTypeId and cells, but only RtSimpleQueryRow has rtId\n const queryRow = row as { rtId?: string; ckTypeId?: string; cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null };\n\n const record: Record<string, unknown> = {};\n\n // Only add rtId/ckTypeId if they're explicitly in the query columns\n if (hasRtIdColumn) {\n record['rtId'] = queryRow.rtId ?? `agg-${index}`;\n }\n if (hasCkTypeIdColumn) {\n record['ckTypeId'] = queryRow.ckTypeId ?? '';\n }\n\n // Flatten cells into the record (sanitize field names for grid compatibility)\n // Only add fields that are in the query columns\n const cells = queryRow.cells?.items ?? [];\n for (const cell of cells) {\n if (cell?.attributePath) {\n const sanitizedPath = this.sanitizeFieldName(cell.attributePath);\n if (columnPaths.has(sanitizedPath)) {\n record[sanitizedPath] = cell.value;\n }\n }\n }\n\n return record;\n });\n\n return new FetchResultTyped<Record<string, unknown>>(data, totalCount);\n }),\n catchError(err => {\n console.error('Error fetching query data:', err);\n return of(new FetchResultTyped<Record<string, unknown>>([], 0));\n })\n );\n }\n\n /**\n * Converts query columns to TableColumn format for display.\n */\n getTableColumnsFromQuery(): TableColumn[] {\n return this._queryColumns().map(col => ({\n field: col.attributePath,\n title: this.formatColumnTitle(col.attributePath),\n width: undefined\n }));\n }\n\n /**\n * Clears the cached query columns. Call this before fetching new data\n * when the query configuration changes.\n */\n clearQueryColumns(): void {\n this._queryColumns.set([]);\n }\n\n private formatColumnTitle(field: string): string {\n // Convert camelCase/PascalCase to Title Case\n // Also handle underscore-separated paths (e.g., \"contact_firstName\" -> \"Contact First Name\")\n return field\n .replace(/_/g, ' ')\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .replace(/\\s+/g, ' ')\n .trim();\n }\n\n /**\n * Sanitizes field names for Kendo Grid compatibility.\n * Kendo interprets dots as nested object paths, so we replace them with underscores.\n */\n private sanitizeFieldName(fieldName: string): string {\n return fieldName.replace(/\\./g, '_');\n }\n\n /**\n * Converts widget filter configuration to GraphQL FieldFilterDto format.\n * Resolves MeshBoard variables in filter values before conversion.\n */\n private convertFiltersToDto(filters?: WidgetFilterConfig[]): FieldFilterDto[] | undefined {\n const variables = this.stateService.getVariables();\n return this.variableService.convertToFieldFilterDto(filters, variables);\n }\n}\n","import { Component, Input, OnChanges, SimpleChanges, ViewChild, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TableWidgetConfig, PersistentQueryDataSource } from '../../models/meshboard.models';\nimport { DashboardWidget } from '../widget.interface';\nimport { ListViewComponent, TableColumn as ListViewTableColumn } from '@meshmakers/shared-ui';\nimport { TableWidgetDataSourceDirective, QueryColumn } from './table-widget-data-source.directive';\n\n@Component({\n selector: 'mm-table-widget',\n standalone: true,\n imports: [\n CommonModule,\n ListViewComponent,\n TableWidgetDataSourceDirective\n ],\n template: `\n <div class=\"table-widget\">\n @if (hasValidConfig()) {\n <mm-list-view\n mmTableWidgetDataSource\n #dataSource=\"mmTableWidgetDataSource\"\n [config]=\"config\"\n [columns]=\"listViewColumns()\"\n [pageSize]=\"config.pageSize ?? 10\"\n [sortable]=\"config.sortable ?? false\"\n [rowFilterEnabled]=\"false\"\n [searchTextBoxEnabled]=\"false\"\n [selectable]=\"{ enabled: false }\"\n [showRowCheckBoxes]=\"false\"\n [showRowSelectAllCheckBox]=\"false\"\n [rowIsClickable]=\"false\"\n (queryColumnsLoaded)=\"onQueryColumnsLoaded($event)\">\n </mm-list-view>\n } @else {\n <div class=\"no-config-overlay\">\n <span>Table not configured</span>\n </div>\n }\n </div>\n `,\n styles: [`\n .table-widget {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .no-config-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: var(--kendo-color-subtle, #6c757d);\n font-style: italic;\n }\n\n :host ::ng-deep mm-list-view {\n height: 100%;\n }\n\n :host ::ng-deep .k-grid {\n height: 100%;\n }\n `]\n})\nexport class TableWidgetComponent implements DashboardWidget<TableWidgetConfig, Record<string, unknown>[]>, OnChanges {\n @Input() config!: TableWidgetConfig;\n\n @ViewChild('dataSource') dataSource?: TableWidgetDataSourceDirective;\n\n // Widget state signals\n private readonly _isLoading = signal(false);\n private readonly _data = signal<Record<string, unknown>[]>([]);\n private readonly _error = signal<string | null>(null);\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly data = this._data.asReadonly();\n readonly error = this._error.asReadonly();\n\n /** Signal to track query columns from data source (for persistent queries) */\n private readonly _queryColumnsForView = signal<ListViewTableColumn[]>([]);\n\n /**\n * Called when the data source emits queryColumnsLoaded event.\n * Updates the view columns directly from the emitted columns.\n */\n onQueryColumnsLoaded(columns: QueryColumn[]): void {\n if (columns.length > 0) {\n this._queryColumnsForView.set(columns.map(col => ({\n field: col.attributePath,\n displayName: this.formatColumnTitle(col.attributePath),\n dataType: 'text' as const\n })));\n }\n }\n\n /**\n * Converts TableWidgetConfig columns to ListViewComponent TableColumn format.\n * For persistent queries, uses dynamically derived columns from the query response.\n */\n readonly listViewColumns = computed((): ListViewTableColumn[] => {\n // For persistent query, use derived columns\n if (this.config?.dataSource?.type === 'persistentQuery') {\n // Return query-derived columns if available\n const queryColumns = this._queryColumnsForView();\n if (queryColumns.length > 0) {\n return queryColumns;\n }\n // Return empty array while waiting for first data load\n return [];\n }\n\n // For runtime entity, use configured columns\n if (!this.config?.columns) return [];\n\n return this.config.columns.map(col => ({\n field: col.field,\n displayName: col.title,\n dataType: 'text' as const,\n width: col.width\n }));\n });\n\n /**\n * Checks if the widget has a valid configuration.\n * Supports both runtimeEntity and persistentQuery data sources.\n */\n hasValidConfig(): boolean {\n if (!this.config?.dataSource) return false;\n\n const dataSource = this.config.dataSource;\n\n if (dataSource.type === 'runtimeEntity') {\n return !!(dataSource.ckTypeId && this.config.columns?.length > 0);\n }\n\n if (dataSource.type === 'persistentQuery') {\n return !!(dataSource as PersistentQueryDataSource).queryRtId;\n }\n\n return false;\n }\n\n /**\n * Checks if columns are ready to be displayed.\n * For persistent queries, columns are derived from the query response.\n * Returns true once columns are available.\n */\n readonly columnsReady = computed((): boolean => {\n if (!this.config?.dataSource) return false;\n\n if (this.config.dataSource.type === 'persistentQuery') {\n // For persistent query, wait until columns are loaded from query response\n return this._queryColumnsForView().length > 0;\n }\n\n // For runtime entity, columns come from config\n return (this.config.columns?.length ?? 0) > 0;\n });\n\n private formatColumnTitle(field: string): string {\n return field\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n // Clear cached query columns when config changes (for persistent queries)\n if (this.config?.dataSource?.type === 'persistentQuery') {\n this._queryColumnsForView.set([]);\n }\n // Defer refresh to next microtask to allow Angular to propagate config to directive\n Promise.resolve().then(() => this.refresh());\n }\n }\n\n refresh(): void {\n if (this.dataSource) {\n // Clear query columns in directive before fetching new data\n this.dataSource.clearQueryColumns();\n this.dataSource.fetchAgain();\n }\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, inject, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule, NumericTextBoxModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { columnsIcon, sortAscIcon, filterIcon, searchIcon } from '@progress/kendo-svg-icons';\nimport { NotificationService } from '@progress/kendo-angular-notification';\nimport {\n CkTypeSelectorInputComponent,\n AttributeSelectorDialogService,\n AttributeSortSelectorDialogService,\n FieldFilterEditorComponent,\n FieldFilterItem,\n AttributeSortItem,\n FilterVariable\n} from '@meshmakers/octo-ui';\nimport {\n CkTypeSelectorItem,\n CkTypeSelectorService,\n AttributeItem,\n FieldFilterDto,\n SortDto,\n SortOrdersDto,\n GetCkTypeAvailableQueryColumnsDtoGQL\n} from '@meshmakers/octo-services';\nimport { firstValueFrom } from 'rxjs';\nimport { TableColumn } from '../../models/meshboard.models';\nimport { PersistentQueryItem } from '../../utils/runtime-entity-data-sources';\nimport { QuerySelectorComponent } from '../../components/query-selector/query-selector.component';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\n\n/**\n * Data source type for table widget\n */\nexport type TableDataSourceType = 'runtimeEntity' | 'persistentQuery';\n\n/**\n * Configuration result from the Table dialog\n */\nexport interface TableConfigResult {\n dataSourceType: TableDataSourceType;\n // For runtimeEntity:\n ckTypeId: string;\n columns: TableColumn[];\n sorting: SortDto[];\n filters: FieldFilterDto[];\n // For persistentQuery:\n queryRtId?: string;\n queryName?: string;\n // Common:\n pageSize: number;\n sortable: boolean;\n}\n\n/**\n * Configuration dialog for Table widgets.\n * Uses the standard dialogs from octo-ui for column, sorting, and filter configuration.\n */\n@Component({\n selector: 'mm-table-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n NumericTextBoxModule,\n DropDownsModule,\n SVGIconModule,\n CkTypeSelectorInputComponent,\n FieldFilterEditorComponent,\n QuerySelectorComponent\n ],\n providers: [\n AttributeSelectorDialogService,\n AttributeSortSelectorDialogService\n ],\n template: `\n <kendo-dialog\n title=\"Table Configuration\"\n [minWidth]=\"550\"\n [width]=\"700\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\" [class.loading]=\"isLoadingInitial\">\n @if (isLoadingInitial) {\n <div class=\"loading-indicator\">Loading...</div>\n }\n\n <!-- Data Source Type Selection -->\n <div class=\"form-field data-source-type\">\n <label>Data Source <span class=\"required\">*</span></label>\n <div class=\"radio-group\">\n <label class=\"radio-label\">\n <input type=\"radio\"\n name=\"dataSourceType\"\n value=\"runtimeEntity\"\n [(ngModel)]=\"dataSourceType\"\n (change)=\"onDataSourceTypeChange()\"\n kendoRadioButton />\n <span>Runtime Entity</span>\n </label>\n <label class=\"radio-label\">\n <input type=\"radio\"\n name=\"dataSourceType\"\n value=\"persistentQuery\"\n [(ngModel)]=\"dataSourceType\"\n (change)=\"onDataSourceTypeChange()\"\n kendoRadioButton />\n <span>Query</span>\n </label>\n </div>\n </div>\n\n <!-- Runtime Entity Configuration -->\n @if (dataSourceType === 'runtimeEntity') {\n <!-- CK Type Selection -->\n <div class=\"form-field\">\n <label>Runtime Entities <span class=\"required\">*</span></label>\n <mm-ck-type-selector-input\n #ckTypeSelector\n placeholder=\"Select a CK Type...\"\n [minSearchLength]=\"2\"\n dialogTitle=\"Select CK Type\"\n [ngModel]=\"selectedCkType\"\n (ckTypeSelected)=\"onCkTypeSelected($event)\"\n (ckTypeCleared)=\"onCkTypeCleared()\">\n </mm-ck-type-selector-input>\n <p class=\"field-hint\">Select the type of runtime entities for the table data.</p>\n </div>\n\n <!-- Columns Configuration -->\n <div class=\"config-card\">\n <div class=\"card-header\">\n <kendo-svgicon [icon]=\"columnsIcon\"></kendo-svgicon>\n <span class=\"card-title\">Columns</span>\n <span class=\"card-count\">({{ selectedColumns.length }})</span>\n </div>\n <div class=\"card-content\">\n <p class=\"config-summary\">{{ getColumnsSummary() }}</p>\n <button kendoButton\n fillMode=\"flat\"\n (click)=\"openColumnSelector()\"\n [disabled]=\"!selectedCkType\">\n Configure Columns...\n </button>\n </div>\n </div>\n\n <!-- Sorting Configuration -->\n <div class=\"config-card\">\n <div class=\"card-header\">\n <kendo-svgicon [icon]=\"sortIcon\"></kendo-svgicon>\n <span class=\"card-title\">Sorting</span>\n <span class=\"card-count\">({{ sorting.length }})</span>\n </div>\n <div class=\"card-content\">\n <p class=\"config-summary\">{{ getSortingSummary() }}</p>\n <button kendoButton\n fillMode=\"flat\"\n (click)=\"openSortSelector()\"\n [disabled]=\"!selectedCkType\">\n Configure Sorting...\n </button>\n </div>\n </div>\n\n <!-- Filters Section -->\n <div class=\"config-card filters-card\">\n <div class=\"card-header\">\n <kendo-svgicon [icon]=\"filterIcon\"></kendo-svgicon>\n <span class=\"card-title\">Filters</span>\n <span class=\"card-count\">({{ filters.length }})</span>\n </div>\n <div class=\"card-content filter-content\">\n <mm-field-filter-editor\n #filterEditor\n [availableAttributes]=\"availableAttributes\"\n [filters]=\"filters\"\n [enableVariables]=\"filterVariables.length > 0\"\n [availableVariables]=\"filterVariables\"\n (filtersChange)=\"onFiltersChange($event)\">\n </mm-field-filter-editor>\n </div>\n </div>\n }\n\n <!-- Query Configuration -->\n @if (dataSourceType === 'persistentQuery') {\n <div class=\"form-field\">\n <label>Query <span class=\"required\">*</span></label>\n <mm-query-selector\n #querySelector\n [(ngModel)]=\"selectedPersistentQuery\"\n (querySelected)=\"onQuerySelected($event)\"\n placeholder=\"Select a Query...\"\n hint=\"Select a query to provide data for this table.\">\n </mm-query-selector>\n </div>\n\n @if (selectedPersistentQuery) {\n <div class=\"config-card\">\n <div class=\"card-header\">\n <kendo-svgicon [icon]=\"searchIcon\"></kendo-svgicon>\n <span class=\"card-title\">Query Info</span>\n </div>\n <div class=\"card-content query-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Name:</span>\n <span class=\"info-value\">{{ selectedPersistentQuery.name }}</span>\n </div>\n @if (selectedPersistentQuery.description) {\n <div class=\"info-row\">\n <span class=\"info-label\">Description:</span>\n <span class=\"info-value\">{{ selectedPersistentQuery.description }}</span>\n </div>\n }\n @if (selectedPersistentQuery.queryCkTypeId) {\n <div class=\"info-row\">\n <span class=\"info-label\">Target CK Type:</span>\n <span class=\"info-value\">{{ selectedPersistentQuery.queryCkTypeId }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Filters Section for Persistent Query -->\n <div class=\"config-card filters-card\">\n <div class=\"card-header\">\n <kendo-svgicon [icon]=\"filterIcon\"></kendo-svgicon>\n <span class=\"card-title\">Filters</span>\n <span class=\"card-count\">({{ filters.length }})</span>\n </div>\n <div class=\"card-content filter-content\">\n <mm-field-filter-editor\n [availableAttributes]=\"queryFilterAttributes\"\n [filters]=\"filters\"\n [enableVariables]=\"filterVariables.length > 0\"\n [availableVariables]=\"filterVariables\"\n (filtersChange)=\"onFiltersChange($event)\">\n </mm-field-filter-editor>\n </div>\n </div>\n }\n }\n\n <!-- Table Options (common for both types) -->\n <div class=\"config-card options-card\">\n <div class=\"card-header\">\n <span class=\"card-title\">Options</span>\n </div>\n <div class=\"card-content options-content\">\n <div class=\"form-field\">\n <label>Page Size</label>\n <kendo-numerictextbox\n [(ngModel)]=\"form.pageSize\"\n [min]=\"5\"\n [max]=\"100\"\n [step]=\"5\"\n format=\"n0\">\n </kendo-numerictextbox>\n </div>\n <div class=\"form-field checkbox-field\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"form.sortable\" kendoCheckBox />\n Sortable\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px 0;\n position: relative;\n }\n\n .config-form.loading {\n opacity: 0.7;\n pointer-events: none;\n }\n\n .loading-indicator {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n text-align: center;\n padding: 8px;\n color: var(--kendo-color-primary, #0d6efd);\n font-style: italic;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .required {\n color: var(--kendo-color-error, #dc3545);\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .config-card {\n padding: 12px 16px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .card-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .card-header kendo-svgicon {\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .card-title {\n font-weight: 600;\n font-size: 0.95rem;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .card-count {\n color: var(--kendo-color-subtle, #6c757d);\n font-size: 0.85rem;\n }\n\n .card-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n }\n\n .config-summary {\n margin: 0;\n font-size: 0.85rem;\n color: var(--kendo-color-on-app-surface, #212529);\n flex: 1;\n }\n\n .filters-card .card-content {\n flex-direction: column;\n align-items: stretch;\n }\n\n .filter-content {\n width: 100%;\n }\n\n .options-card .options-content {\n display: flex;\n gap: 24px;\n align-items: flex-end;\n }\n\n .checkbox-field {\n flex-direction: row;\n align-items: center;\n }\n\n .checkbox-field label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .data-source-type .radio-group {\n display: flex;\n gap: 24px;\n }\n\n .radio-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-weight: normal;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .radio-label span {\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .query-info {\n flex-direction: column;\n align-items: stretch;\n gap: 8px;\n }\n\n .info-row {\n display: flex;\n gap: 8px;\n }\n\n .info-label {\n font-weight: 600;\n min-width: 100px;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .info-value {\n flex: 1;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n `]\n})\nexport class TableConfigDialogComponent implements OnInit {\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n private readonly attributeSelectorDialog = inject(AttributeSelectorDialogService);\n private readonly attributeSortSelectorDialog = inject(AttributeSortSelectorDialogService);\n private readonly notificationService = inject(NotificationService);\n private readonly getCkTypeAvailableQueryColumnsGQL = inject(GetCkTypeAvailableQueryColumnsDtoGQL);\n private readonly stateService = inject(MeshBoardStateService);\n\n @ViewChild('ckTypeSelector') ckTypeSelectorInput?: CkTypeSelectorInputComponent;\n @ViewChild('filterEditor') filterEditor?: FieldFilterEditorComponent;\n @ViewChild('querySelector') querySelector?: QuerySelectorComponent;\n\n // Initial values for editing\n @Input() initialDataSourceType?: TableDataSourceType;\n @Input() initialCkTypeId?: string;\n @Input() initialColumns?: TableColumn[];\n @Input() initialSorting?: { attributePath: string; sortOrder: string }[];\n @Input() initialFilters?: { attributePath: string; operator: string; comparisonValue: string }[];\n @Input() initialPageSize?: number;\n @Input() initialSortable?: boolean;\n @Input() initialQueryRtId?: string;\n @Input() initialQueryName?: string;\n\n @Output() save = new EventEmitter<TableConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n protected readonly columnsIcon = columnsIcon;\n protected readonly sortIcon = sortAscIcon;\n protected readonly filterIcon = filterIcon;\n protected readonly searchIcon = searchIcon;\n\n // Data source type selection\n dataSourceType: TableDataSourceType = 'runtimeEntity';\n\n // Runtime Entity configuration\n selectedCkType: CkTypeSelectorItem | null = null;\n isLoadingInitial = false;\n\n // Selected columns (attribute paths)\n selectedColumns: string[] = [];\n // Sorting configuration\n sorting: SortDto[] = [];\n // Filter configuration\n filters: FieldFilterItem[] = [];\n // Available attributes for the selected CK Type\n availableAttributes: AttributeItem[] = [];\n\n // Query configuration\n selectedPersistentQuery: PersistentQueryItem | null = null;\n isLoadingQueryColumns = false;\n queryFilterAttributes: AttributeItem[] = [];\n\n // Variables for filter editor\n filterVariables: FilterVariable[] = [];\n\n form = {\n pageSize: 10,\n sortable: true\n };\n\n get isValid(): boolean {\n if (this.dataSourceType === 'runtimeEntity') {\n return this.selectedCkType !== null && this.selectedColumns.length > 0;\n } else {\n return this.selectedPersistentQuery !== null;\n }\n }\n\n async ngOnInit(): Promise<void> {\n // Initialize filter variables from state service\n this.filterVariables = this.stateService.getVariables().map(v => ({\n name: v.name,\n label: v.label || v.name,\n type: v.type\n }));\n\n // Initialize data source type\n this.dataSourceType = this.initialDataSourceType ?? 'runtimeEntity';\n\n // Initialize form with initial values\n this.selectedColumns = this.initialColumns?.map(c => c.field) || [];\n this.form.pageSize = this.initialPageSize ?? 10;\n this.form.sortable = this.initialSortable ?? true;\n\n // Convert initial sorting from string-based format to SortDto\n if (this.initialSorting) {\n this.sorting = this.initialSorting.map(s => ({\n attributePath: s.attributePath,\n sortOrder: s.sortOrder === 'AscendingDto' ? SortOrdersDto.AscendingDto : SortOrdersDto.DescendingDto\n }));\n }\n\n // Convert initial filters to FieldFilterItem (add IDs and convert operator)\n if (this.initialFilters) {\n let nextId = 1;\n this.filters = this.initialFilters.map(f => ({\n attributePath: f.attributePath,\n operator: f.operator as unknown as import('@meshmakers/octo-services').FieldFilterOperatorsDto,\n comparisonValue: f.comparisonValue,\n id: nextId++\n }));\n }\n\n if (this.dataSourceType === 'runtimeEntity' && this.initialCkTypeId) {\n await this.loadInitialValues();\n } else if (this.dataSourceType === 'persistentQuery' && this.initialQueryRtId) {\n // Use setTimeout to wait for ViewChild to be available after view init\n setTimeout(async () => {\n if (this.querySelector && this.initialQueryRtId) {\n const query = await this.querySelector.selectByRtId(this.initialQueryRtId);\n if (query) {\n this.selectedPersistentQuery = query;\n // Load filter attributes from CK type\n if (query.queryCkTypeId) {\n await this.loadFilterAttributesForQuery(query.queryCkTypeId);\n }\n }\n }\n });\n }\n }\n\n private async loadInitialValues(): Promise<void> {\n if (!this.initialCkTypeId) return;\n\n this.isLoadingInitial = true;\n\n try {\n const ckType = await firstValueFrom(\n this.ckTypeSelectorService.getCkTypeByRtCkTypeId(this.initialCkTypeId)\n );\n\n if (ckType) {\n this.selectedCkType = ckType;\n await this.loadAvailableAttributes(ckType.rtCkTypeId);\n }\n } catch (error) {\n console.error('Error loading initial values:', error);\n } finally {\n this.isLoadingInitial = false;\n }\n }\n\n private async loadAvailableAttributes(ckTypeId: string): Promise<void> {\n try {\n const result = await firstValueFrom(this.getCkTypeAvailableQueryColumnsGQL.fetch({\n variables: { rtCkId: ckTypeId, first: 1000 }\n }));\n\n const columns = result.data?.constructionKit?.types?.items?.[0]?.availableQueryColumns?.items || [];\n this.availableAttributes = columns\n .filter((c): c is NonNullable<typeof c> => c !== null)\n .map(c => ({\n attributePath: c.attributePath || '',\n attributeValueType: c.attributeValueType\n }));\n } catch (err) {\n console.error('Error loading available attributes:', err);\n this.availableAttributes = [];\n }\n }\n\n async onCkTypeSelected(ckType: CkTypeSelectorItem): Promise<void> {\n this.selectedCkType = ckType;\n await this.loadAvailableAttributes(ckType.rtCkTypeId);\n }\n\n onCkTypeCleared(): void {\n this.selectedCkType = null;\n this.availableAttributes = [];\n this.selectedColumns = [];\n this.sorting = [];\n this.filters = [];\n }\n\n // Query methods\n onDataSourceTypeChange(): void {\n // QuerySelectorComponent handles loading queries automatically\n }\n\n async onQuerySelected(query: PersistentQueryItem | null): Promise<void> {\n this.selectedPersistentQuery = query;\n this.queryFilterAttributes = [];\n this.filters = [];\n\n if (query) {\n // Load filter attributes from CK type (not from query columns)\n if (query.queryCkTypeId) {\n await this.loadFilterAttributesForQuery(query.queryCkTypeId);\n }\n }\n }\n\n /**\n * Loads all available filter attributes from the CK type.\n * Uses getCkTypeAvailableQueryColumns instead of query result columns.\n */\n private async loadFilterAttributesForQuery(queryCkTypeId: string): Promise<void> {\n this.isLoadingQueryColumns = true;\n\n try {\n const result = await firstValueFrom(this.getCkTypeAvailableQueryColumnsGQL.fetch({\n variables: { rtCkId: queryCkTypeId, first: 1000 }\n }));\n\n const columns = result.data?.constructionKit?.types?.items?.[0]?.availableQueryColumns?.items || [];\n this.queryFilterAttributes = columns\n .filter((c): c is NonNullable<typeof c> => c !== null)\n .map(c => ({\n attributePath: c.attributePath || '',\n attributeValueType: c.attributeValueType\n }));\n } catch (error) {\n console.error('Error loading filter attributes:', error);\n this.queryFilterAttributes = [];\n } finally {\n this.isLoadingQueryColumns = false;\n }\n }\n\n async openColumnSelector(): Promise<void> {\n if (!this.selectedCkType?.fullName) {\n this.notificationService.show({\n content: 'Please select a CK Type first',\n hideAfter: 3000,\n position: { horizontal: 'right', vertical: 'top' },\n animation: { type: 'fade', duration: 400 },\n type: { style: 'warning', icon: true }\n });\n return;\n }\n\n const result = await this.attributeSelectorDialog.openAttributeSelector(\n this.selectedCkType.fullName,\n this.selectedColumns,\n 'Select Columns'\n );\n\n if (result?.confirmed && result.selectedAttributes) {\n this.selectedColumns = result.selectedAttributes.map(a => a.attributePath);\n }\n }\n\n async openSortSelector(): Promise<void> {\n if (!this.selectedCkType?.fullName) {\n this.notificationService.show({\n content: 'Please select a CK Type first',\n hideAfter: 3000,\n position: { horizontal: 'right', vertical: 'top' },\n animation: { type: 'fade', duration: 400 },\n type: { style: 'warning', icon: true }\n });\n return;\n }\n\n const preSelected: AttributeSortItem[] = this.sorting.map(s => ({\n attributePath: s.attributePath,\n attributeValueType: this.availableAttributes.find(a => a.attributePath === s.attributePath)?.attributeValueType || '',\n sortOrder: s.sortOrder === SortOrdersDto.AscendingDto ? 'ascending' : 'descending'\n }));\n\n const result = await this.attributeSortSelectorDialog.openAttributeSortSelector(\n this.selectedCkType.fullName,\n preSelected,\n 'Configure Sorting'\n );\n\n if (result?.confirmed && result.selectedAttributes) {\n this.sorting = result.selectedAttributes\n .filter(a => a.sortOrder !== 'standard')\n .map(a => ({\n attributePath: a.attributePath,\n sortOrder: a.sortOrder === 'ascending' ? SortOrdersDto.AscendingDto : SortOrdersDto.DescendingDto\n }));\n }\n }\n\n onFiltersChange(filters: FieldFilterItem[]): void {\n this.filters = filters;\n }\n\n getColumnsSummary(): string {\n if (this.selectedColumns.length === 0) return 'No columns selected';\n if (this.selectedColumns.length <= 3) return this.selectedColumns.join(', ');\n return `${this.selectedColumns.slice(0, 3).join(', ')} +${this.selectedColumns.length - 3} more`;\n }\n\n getSortingSummary(): string {\n if (this.sorting.length === 0) return 'No sorting configured';\n return this.sorting.map(s =>\n `${s.attributePath} ${s.sortOrder === SortOrdersDto.AscendingDto ? '↑' : '↓'}`\n ).join(', ');\n }\n\n onSave(): void {\n if (this.dataSourceType === 'runtimeEntity' && this.selectedCkType) {\n // Convert selected columns to TableColumn format\n const columns: TableColumn[] = this.selectedColumns.map(field => ({\n field,\n title: this.formatColumnTitle(field),\n width: undefined\n }));\n\n // Convert filters (remove IDs)\n const filterDtos: FieldFilterDto[] = this.filters.map(f => ({\n attributePath: f.attributePath,\n operator: f.operator,\n comparisonValue: f.comparisonValue\n }));\n\n this.save.emit({\n dataSourceType: 'runtimeEntity',\n ckTypeId: this.selectedCkType.rtCkTypeId,\n columns,\n sorting: this.sorting,\n filters: filterDtos,\n pageSize: this.form.pageSize,\n sortable: this.form.sortable\n });\n } else if (this.dataSourceType === 'persistentQuery' && this.selectedPersistentQuery) {\n // Convert filters (remove IDs)\n const queryFilterDtos: FieldFilterDto[] = this.filters.map(f => ({\n attributePath: f.attributePath,\n operator: f.operator,\n comparisonValue: f.comparisonValue\n }));\n\n this.save.emit({\n dataSourceType: 'persistentQuery',\n ckTypeId: '', // Not used for persistent query\n columns: [], // Will be derived from query\n sorting: [],\n filters: queryFilterDtos,\n queryRtId: this.selectedPersistentQuery.rtId,\n queryName: this.selectedPersistentQuery.name,\n pageSize: this.form.pageSize,\n sortable: this.form.sortable\n });\n }\n }\n\n private formatColumnTitle(field: string): string {\n // Convert camelCase/PascalCase to Title Case\n return field\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { GaugeWidgetConfig, RuntimeEntityData, PersistentQueryDataSource, WidgetFilterConfig } from '../../models/meshboard.models';\nimport { DashboardDataService } from '../../services/meshboard-data.service';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { MeshBoardVariableService } from '../../services/meshboard-variable.service';\nimport { DashboardWidget } from '../widget.interface';\nimport { WidgetNotConfiguredComponent } from '../../components/widget-not-configured/widget-not-configured.component';\nimport { catchError, of, firstValueFrom } from 'rxjs';\nimport { ExecuteRuntimeQueryDtoGQL } from '../../graphQL/executeRuntimeQuery';\nimport {CollectionChangesService, KENDO_GAUGES} from \"@progress/kendo-angular-gauges\";\nimport { FieldFilterDto } from '@meshmakers/octo-services';\n\n@Component({\n selector: 'mm-gauge-widget',\n standalone: true,\n imports: [\n CommonModule,\n KENDO_GAUGES,\n WidgetNotConfiguredComponent\n ],\n providers: [CollectionChangesService],\n template: `\n <div class=\"gauge-widget\" [class.loading]=\"isLoading()\" [class.error]=\"error()\">\n @if (isNotConfigured()) {\n <mm-widget-not-configured></mm-widget-not-configured>\n } @else if (isLoading()) {\n <div class=\"loading-indicator\">\n <span>...</span>\n </div>\n } @else if (error()) {\n <div class=\"error-message\">\n <span>{{ error() }}</span>\n </div>\n } @else {\n <div class=\"gauge-container\">\n @switch (config.gaugeType) {\n @case ('arc') {\n <kendo-arcgauge\n [value]=\"numericValue()\"\n [transitions]=\"true\">\n <kendo-arcgauge-scale\n [min]=\"config.min ?? 0\"\n [max]=\"config.max ?? 100\"\n [reverse]=\"config.reverse ?? false\">\n </kendo-arcgauge-scale>\n @if (config.ranges && config.ranges.length > 0) {\n <kendo-arcgauge-colors>\n @for (range of config.ranges; track range.from) {\n <kendo-arcgauge-color\n [from]=\"range.from\"\n [to]=\"range.to\"\n [color]=\"range.color\">\n </kendo-arcgauge-color>\n }\n </kendo-arcgauge-colors>\n }\n @if (config.showLabel !== false) {\n <ng-template kendoArcGaugeCenterTemplate let-value=\"value\">\n <div class=\"gauge-center-label\">\n <span class=\"value-text\">\n {{ config.prefix ?? '' }}{{ formattedValue() }}{{ config.suffix ?? '' }}\n </span>\n @if (label()) {\n <span class=\"label-text\">{{ label() }}</span>\n }\n </div>\n </ng-template>\n }\n </kendo-arcgauge>\n }\n @case ('circular') {\n <kendo-circulargauge\n [value]=\"numericValue()\"\n [transitions]=\"true\">\n <kendo-circulargauge-scale\n [min]=\"config.min ?? 0\"\n [max]=\"config.max ?? 100\"\n [reverse]=\"config.reverse ?? false\">\n </kendo-circulargauge-scale>\n @if (config.showLabel !== false) {\n <ng-template kendoCircularGaugeCenterTemplate let-value=\"value\">\n <div class=\"gauge-center-label\">\n <span class=\"value-text\">\n {{ config.prefix ?? '' }}{{ formattedValue() }}{{ config.suffix ?? '' }}\n </span>\n @if (label()) {\n <span class=\"label-text\">{{ label() }}</span>\n }\n </div>\n </ng-template>\n }\n </kendo-circulargauge>\n }\n @case ('radial') {\n <kendo-radialgauge [transitions]=\"true\">\n <kendo-radialgauge-scale\n [min]=\"config.min ?? 0\"\n [max]=\"config.max ?? 100\"\n [reverse]=\"config.reverse ?? false\">\n @if (config.ranges && config.ranges.length > 0) {\n <kendo-radialgauge-scale-ranges>\n @for (range of config.ranges; track range.from) {\n <kendo-radialgauge-scale-range\n [from]=\"range.from\"\n [to]=\"range.to\"\n [color]=\"range.color\">\n </kendo-radialgauge-scale-range>\n }\n </kendo-radialgauge-scale-ranges>\n }\n </kendo-radialgauge-scale>\n <kendo-radialgauge-pointer [value]=\"numericValue()\">\n </kendo-radialgauge-pointer>\n </kendo-radialgauge>\n @if (config.showLabel !== false) {\n <div class=\"gauge-value-label\">\n {{ config.prefix ?? '' }}{{ formattedValue() }}{{ config.suffix ?? '' }}\n @if (label()) {\n <span class=\"label-text\">{{ label() }}</span>\n }\n </div>\n }\n }\n @case ('linear') {\n <div class=\"linear-gauge-wrapper\">\n @if (data()) {\n <kendo-lineargauge [transitions]=\"true\">\n <kendo-lineargauge-scale\n [min]=\"config.min ?? 0\"\n [max]=\"config.max ?? 100\"\n [reverse]=\"config.reverse ?? false\"\n [vertical]=\"true\">\n <kendo-lineargauge-scale-labels [visible]=\"true\"></kendo-lineargauge-scale-labels>\n @if (config.ranges && config.ranges.length > 0) {\n <kendo-lineargauge-scale-ranges>\n @for (range of config.ranges; track range.from) {\n <kendo-lineargauge-scale-range\n [from]=\"range.from\"\n [to]=\"range.to\"\n [color]=\"range.color\">\n </kendo-lineargauge-scale-range>\n }\n </kendo-lineargauge-scale-ranges>\n }\n </kendo-lineargauge-scale>\n <kendo-lineargauge-pointers>\n <kendo-lineargauge-pointer\n [value]=\"numericValue()\">\n </kendo-lineargauge-pointer>\n </kendo-lineargauge-pointers>\n </kendo-lineargauge>\n }\n @if (config.showLabel !== false) {\n <div class=\"gauge-value-label\">\n {{ config.prefix ?? '' }}{{ formattedValue() }}{{ config.suffix ?? '' }}\n @if (label()) {\n <span class=\"label-text\">{{ label() }}</span>\n }\n </div>\n }\n </div>\n }\n @default {\n <!-- Fallback to arc gauge if gaugeType is unknown -->\n <kendo-arcgauge\n [value]=\"numericValue()\"\n [transitions]=\"true\">\n <kendo-arcgauge-scale\n [min]=\"config.min ?? 0\"\n [max]=\"config.max ?? 100\"\n [reverse]=\"config.reverse ?? false\">\n </kendo-arcgauge-scale>\n @if (config.showLabel !== false) {\n <ng-template kendoArcGaugeCenterTemplate let-value=\"value\">\n <div class=\"gauge-center-label\">\n <span class=\"value-text\">\n {{ config.prefix ?? '' }}{{ formattedValue() }}{{ config.suffix ?? '' }}\n </span>\n @if (label()) {\n <span class=\"label-text\">{{ label() }}</span>\n }\n </div>\n </ng-template>\n }\n </kendo-arcgauge>\n }\n }\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .gauge-widget {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 8px;\n box-sizing: border-box;\n overflow: hidden;\n }\n\n .gauge-widget.loading,\n .gauge-widget.error {\n opacity: 0.7;\n }\n\n .loading-indicator,\n .error-message {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n }\n\n .loading-indicator span {\n font-size: 1.5rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .error-message span {\n color: var(--kendo-color-error, #dc3545);\n font-size: 0.875rem;\n }\n\n .gauge-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n }\n\n .gauge-center-label {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n }\n\n .gauge-center-label .value-text {\n font-size: 1.25rem;\n font-weight: 600;\n color: var(--kendo-color-on-surface, #212529);\n }\n\n .gauge-center-label .label-text {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle, #6c757d);\n margin-top: 2px;\n }\n\n .gauge-value-label {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 8px;\n font-size: 1.1rem;\n font-weight: 600;\n color: var(--kendo-color-on-surface, #212529);\n }\n\n .gauge-value-label .label-text {\n font-size: 0.75rem;\n font-weight: 400;\n color: var(--kendo-color-subtle, #6c757d);\n margin-top: 2px;\n }\n\n /* Kendo gauge sizing */\n kendo-arcgauge,\n kendo-circulargauge,\n kendo-radialgauge {\n width: 100%;\n max-width: 200px;\n height: auto;\n }\n\n .linear-gauge-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n gap: 8px;\n }\n\n .linear-gauge-wrapper .gauge-value-label {\n margin-top: 0;\n writing-mode: horizontal-tb;\n }\n\n kendo-lineargauge {\n height: 100%;\n max-height: 180px;\n width: auto;\n }\n `]\n})\nexport class GaugeWidgetComponent implements DashboardWidget<GaugeWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {\n\n public pointers = [\n {\n value: 10,\n color: \"#ffd246\",\n },\n {\n value: 20,\n color: \"#28b4c8\",\n },\n {\n value: 30,\n color: \"#78d237\",\n },\n ];\n\n private readonly dataService = inject(DashboardDataService);\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n private readonly stateService = inject(MeshBoardStateService);\n private readonly variableService = inject(MeshBoardVariableService);\n\n @Input() config!: GaugeWidgetConfig;\n\n // Widget state signals\n private readonly _isLoading = signal(false);\n private readonly _data = signal<RuntimeEntityData | null>(null);\n private readonly _error = signal<string | null>(null);\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly data = this._data.asReadonly();\n readonly error = this._error.asReadonly();\n\n /**\n * Check if widget is not configured (needs data source setup).\n * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.\n */\n isNotConfigured(): boolean {\n const dataSource = this.config?.dataSource;\n if (!dataSource) return true;\n if (dataSource.type === 'runtimeEntity') {\n return !dataSource.rtId && !dataSource.ckTypeId;\n }\n if (dataSource.type === 'persistentQuery') {\n return !dataSource.queryRtId;\n }\n if (dataSource.type === 'static') {\n return false; // Static data is always \"configured\"\n }\n return false;\n }\n\n readonly numericValue = computed(() => {\n const data = this._data();\n if (!data?.attributes) return 0;\n\n // For persistent queries, look for _queryValue; otherwise use configured valueAttribute\n const attributeName = this.config?.dataSource?.type === 'persistentQuery'\n ? '_queryValue'\n : this.config?.valueAttribute;\n\n const attr = data.attributes.find(a => a.attributeName === attributeName);\n if (!attr) return 0;\n\n const numValue = typeof attr.value === 'number' ? attr.value : parseFloat(String(attr.value));\n return isNaN(numValue) ? 0 : numValue;\n });\n\n readonly formattedValue = computed(() => {\n const value = this.numericValue();\n return value.toLocaleString('de-AT', {\n minimumFractionDigits: value % 1 !== 0 ? 1 : 0,\n maximumFractionDigits: 2\n });\n });\n\n readonly label = computed(() => {\n const data = this._data();\n if (this.config?.labelAttribute && data?.attributes) {\n const attr = data.attributes.find(a => a.attributeName === this.config.labelAttribute);\n if (attr && attr.value !== null && attr.value !== undefined && attr.value !== 'null') {\n return String(attr.value);\n }\n }\n return '';\n });\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadData();\n }\n }\n\n refresh(): void {\n this.loadData();\n }\n\n private loadData(): void {\n // Skip loading if widget is not configured - isNotConfigured() handles the display\n if (this.isNotConfigured()) {\n return;\n }\n\n const dataSource = this.config?.dataSource;\n\n if (dataSource.type === 'static') {\n const staticData = dataSource.data as RuntimeEntityData;\n this._data.set(staticData);\n this._error.set(null);\n return;\n }\n\n if (dataSource.type === 'persistentQuery') {\n this.loadPersistentQueryData();\n return;\n }\n\n if (dataSource.type === 'runtimeEntity') {\n // Note: isNotConfigured() check at top ensures rtId and ckTypeId are set\n this._isLoading.set(true);\n this._error.set(null);\n\n this.dataService.fetchEntityWithAssociations(dataSource.rtId!, dataSource.ckTypeId!)\n .pipe(\n catchError(err => {\n console.error('Error loading Gauge data:', err);\n this._error.set('Failed to load data');\n return of(null);\n })\n )\n .subscribe(entityData => {\n this._data.set(entityData);\n this._isLoading.set(false);\n });\n }\n }\n\n private async loadPersistentQueryData(): Promise<void> {\n // Note: isNotConfigured() check in loadData() ensures queryRtId is set\n const dataSource = this.config.dataSource as PersistentQueryDataSource;\n\n this._isLoading.set(true);\n this._error.set(null);\n\n try {\n // Convert widget filters to GraphQL format\n const fieldFilter = this.convertFiltersToDto(this.config.filters);\n\n const result = await firstValueFrom(\n this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: dataSource.queryRtId,\n first: 100,\n fieldFilter\n }\n }).pipe(\n catchError(err => {\n console.error('Error loading Gauge query data:', err);\n throw err;\n })\n )\n );\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n if (queryItems.length === 0) {\n this._error.set('Query returned no results');\n this._isLoading.set(false);\n return;\n }\n\n const queryResult = queryItems[0];\n if (!queryResult) {\n this._error.set('Query returned no results');\n this._isLoading.set(false);\n return;\n }\n\n let value = 0;\n const queryMode = this.config.queryMode ?? 'simpleCount';\n\n switch (queryMode) {\n case 'simpleCount':\n // Use totalCount from the query\n value = queryResult.rows?.totalCount ?? 0;\n break;\n\n case 'aggregation':\n // Get the single value from aggregation query (1 row, 1 column)\n value = this.extractAggregationValue(queryResult);\n break;\n\n case 'groupedAggregation':\n // Find the row matching the selected category and get its value\n value = this.extractGroupedAggregationValue(queryResult);\n break;\n }\n\n // Create a synthetic entity with the value\n const gaugeEntity: RuntimeEntityData = {\n rtId: 'query-entity',\n ckTypeId: 'system.query',\n attributes: [{ attributeName: '_queryValue', value }],\n associations: []\n };\n this._data.set(gaugeEntity);\n this._isLoading.set(false);\n\n } catch (err) {\n console.error('Error loading Gauge query data:', err);\n this._error.set('Failed to load data');\n this._isLoading.set(false);\n }\n }\n\n private extractAggregationValue(queryResult: {\n rows?: { items?: ({ __typename?: string; cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null } | null)[] | null } | null\n }): number {\n const rows = queryResult.rows?.items ?? [];\n const supportedRowTypes = ['RtAggregationQueryRow', 'RtGroupingAggregationQueryRow'];\n\n // Get the first row\n const firstRow = rows.find(row => row && supportedRowTypes.includes(row.__typename ?? ''));\n if (!firstRow) return 0;\n\n const queryRow = firstRow as { cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null };\n const cells = queryRow.cells?.items ?? [];\n\n // Find the value field or use the first numeric cell\n const valueField = this.config.queryValueField;\n for (const cell of cells) {\n if (!cell?.attributePath) continue;\n\n const sanitizedPath = this.sanitizeFieldName(cell.attributePath);\n if (valueField && sanitizedPath === valueField) {\n return this.parseNumericValue(cell.value);\n }\n }\n\n // Fallback: return first cell value if no specific field configured\n const firstCell = cells.find(c => c !== null);\n return firstCell ? this.parseNumericValue(firstCell.value) : 0;\n }\n\n private extractGroupedAggregationValue(queryResult: {\n rows?: { items?: ({ __typename?: string; cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null } | null)[] | null } | null\n }): number {\n const rows = queryResult.rows?.items ?? [];\n const supportedRowTypes = ['RtGroupingAggregationQueryRow', 'RtAggregationQueryRow'];\n\n const categoryField = this.config.queryCategoryField;\n const categoryValue = this.config.queryCategoryValue;\n const valueField = this.config.queryValueField;\n\n if (!categoryField || !categoryValue || !valueField) {\n return 0;\n }\n\n // Find the row where category matches\n for (const row of rows) {\n if (!row || !supportedRowTypes.includes(row.__typename ?? '')) continue;\n\n const queryRow = row as { cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null };\n const cells = queryRow.cells?.items ?? [];\n\n let categoryMatch = false;\n let value = 0;\n\n for (const cell of cells) {\n if (!cell?.attributePath) continue;\n\n const sanitizedPath = this.sanitizeFieldName(cell.attributePath);\n\n if (sanitizedPath === categoryField && String(cell.value) === categoryValue) {\n categoryMatch = true;\n }\n\n if (sanitizedPath === valueField) {\n value = this.parseNumericValue(cell.value);\n }\n }\n\n if (categoryMatch) {\n return value;\n }\n }\n\n return 0;\n }\n\n private parseNumericValue(value: unknown): number {\n if (typeof value === 'number') return value;\n const parsed = parseFloat(String(value));\n return isNaN(parsed) ? 0 : parsed;\n }\n\n private sanitizeFieldName(fieldName: string): string {\n return fieldName.replace(/\\./g, '_');\n }\n\n /**\n * Converts widget filter configuration to GraphQL FieldFilterDto format.\n * Resolves MeshBoard variables in filter values before conversion.\n */\n private convertFiltersToDto(filters?: WidgetFilterConfig[]): FieldFilterDto[] | undefined {\n const variables = this.stateService.getVariables();\n return this.variableService.convertToFieldFilterDto(filters, variables);\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, inject, ViewChild, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { CkTypeSelectorInputComponent, FieldFilterEditorComponent, FieldFilterItem, FilterVariable } from '@meshmakers/octo-ui';\nimport { CkTypeSelectorItem, CkTypeSelectorService, FieldFilterOperatorsDto, AttributeSelectorService, AttributeItem, FieldFilterDto, GetCkTypeAvailableQueryColumnsDtoGQL } from '@meshmakers/octo-services';\nimport { EntitySelectInputComponent } from '@meshmakers/shared-ui';\nimport { GetEntitiesByCkTypeDtoGQL } from '../../graphQL/getEntitiesByCkType';\nimport { ExecuteRuntimeQueryDtoGQL } from '../../graphQL/executeRuntimeQuery';\nimport { firstValueFrom } from 'rxjs';\nimport { GaugeType, GaugeRange, KpiQueryMode, WidgetFilterConfig } from '../../models/meshboard.models';\nimport { WidgetConfigResult } from '../../services/widget-registry.service';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { RuntimeEntityItem, PersistentQueryItem, QueryColumnItem, CategoryValueItem, RuntimeEntitySelectDataSource, RuntimeEntityDialogDataSource } from '../../utils/runtime-entity-data-sources';\nimport { QuerySelectorComponent } from '../../components/query-selector/query-selector.component';\n\n/**\n * Data source type for Gauge\n */\nexport type GaugeDataSourceType = 'runtimeEntity' | 'persistentQuery';\n\n/**\n * Configuration result from the Gauge dialog\n */\nexport interface GaugeConfigResult extends WidgetConfigResult {\n dataSourceType: GaugeDataSourceType;\n // Runtime entity fields\n ckTypeId: string;\n rtId?: string;\n valueAttribute: string;\n labelAttribute?: string;\n // Persistent query fields\n queryRtId?: string;\n queryName?: string;\n queryMode?: KpiQueryMode;\n queryValueField?: string;\n queryCategoryField?: string;\n queryCategoryValue?: string;\n // Gauge options\n gaugeType: GaugeType;\n min?: number;\n max?: number;\n ranges?: GaugeRange[];\n showLabel?: boolean;\n prefix?: string;\n suffix?: string;\n reverse?: boolean;\n // Filters\n filters?: FieldFilterDto[];\n}\n\ninterface GaugeTypeOption {\n value: GaugeType;\n label: string;\n description: string;\n}\n\n/**\n * Configuration dialog for Gauge widgets.\n * Allows selecting data source, gauge type, value attribute, and display options.\n */\n@Component({\n selector: 'mm-gauge-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n DropDownsModule,\n CkTypeSelectorInputComponent,\n EntitySelectInputComponent,\n FieldFilterEditorComponent,\n QuerySelectorComponent\n ],\n template: `\n <kendo-dialog\n title=\"Gauge Configuration\"\n [minWidth]=\"500\"\n [width]=\"650\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\" [class.loading]=\"isLoadingInitial\">\n @if (isLoadingInitial) {\n <div class=\"loading-indicator\">Loading...</div>\n }\n\n <!-- Data Source Type Selection -->\n <div class=\"form-field\">\n <label>Data Source</label>\n <div class=\"mode-toggle\">\n <button\n kendoButton\n [fillMode]=\"dataSourceType === 'runtimeEntity' ? 'solid' : 'outline'\"\n [themeColor]=\"dataSourceType === 'runtimeEntity' ? 'primary' : 'base'\"\n (click)=\"onDataSourceTypeChange('runtimeEntity')\">\n Runtime Entity\n </button>\n <button\n kendoButton\n [fillMode]=\"dataSourceType === 'persistentQuery' ? 'solid' : 'outline'\"\n [themeColor]=\"dataSourceType === 'persistentQuery' ? 'primary' : 'base'\"\n (click)=\"onDataSourceTypeChange('persistentQuery')\">\n Query\n </button>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- RUNTIME ENTITY DATA SOURCE -->\n <!-- ============================================================ -->\n @if (dataSourceType === 'runtimeEntity') {\n <!-- Runtime Entities Selection -->\n <div class=\"form-field\">\n <label>Runtime Entities</label>\n <mm-ck-type-selector-input\n #ckTypeSelector\n placeholder=\"Select Runtime Entities...\"\n [minSearchLength]=\"2\"\n dialogTitle=\"Select Runtime Entities\"\n [ngModel]=\"selectedCkType\"\n (ckTypeSelected)=\"onCkTypeSelected($event)\"\n (ckTypeCleared)=\"onCkTypeCleared()\">\n </mm-ck-type-selector-input>\n <p class=\"field-hint\">Select the type of Runtime Entities for the data source.</p>\n </div>\n\n <!-- Entity Selection -->\n <div class=\"form-field\" [class.disabled]=\"!selectedCkType\">\n <label>Entity</label>\n @if (selectedCkType && entityDataSource) {\n <mm-entity-select-input\n #entitySelector\n [dataSource]=\"entityDataSource\"\n [dialogDataSource]=\"entityDialogDataSource\"\n placeholder=\"Search for an entity...\"\n dialogTitle=\"Select Entity\"\n [minSearchLength]=\"1\"\n [ngModel]=\"selectedEntity\"\n (entitySelected)=\"onEntitySelected($event)\"\n (entityCleared)=\"onEntityCleared()\">\n </mm-entity-select-input>\n } @else {\n <kendo-textbox\n [disabled]=\"true\"\n placeholder=\"First select Runtime Entities...\">\n </kendo-textbox>\n }\n </div>\n\n <!-- Value Attribute (Runtime Entity) -->\n <div class=\"form-field\" [class.disabled]=\"!selectedCkType\">\n <label>Value Attribute</label>\n @if (selectedCkType && !isLoadingAttributes()) {\n <kendo-combobox\n [data]=\"filteredValueAttributes()\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.valueAttribute\"\n [filterable]=\"true\"\n (filterChange)=\"onValueAttributeFilter($event)\"\n placeholder=\"Search or select an attribute...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"attribute-item\">\n <span class=\"attribute-path\">{{ dataItem.attributePath }}</span>\n <span class=\"attribute-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else if (isLoadingAttributes()) {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading attributes...\"></kendo-textbox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"First select Runtime Entities...\"></kendo-textbox>\n }\n <p class=\"field-hint\">The numeric attribute to display on the gauge.</p>\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- PERSISTENT QUERY DATA SOURCE -->\n <!-- ============================================================ -->\n @if (dataSourceType === 'persistentQuery') {\n <!-- Query Selection -->\n <div class=\"form-field\">\n <label>Query <span class=\"required\">*</span></label>\n <mm-query-selector\n #querySelector\n [(ngModel)]=\"selectedPersistentQuery\"\n (querySelected)=\"onQuerySelected($event)\"\n placeholder=\"Select a Query...\"\n hint=\"Select a query to provide data for this gauge.\">\n </mm-query-selector>\n </div>\n\n <!-- Query Mode Selection -->\n <div class=\"form-field\">\n <label>Query Mode</label>\n <kendo-dropdownlist\n [data]=\"queryModeOptions\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"queryMode\"\n (valueChange)=\"onQueryModeChange($event)\">\n </kendo-dropdownlist>\n <p class=\"field-hint\">\n @switch (queryMode) {\n @case ('simpleCount') { Shows the total count of query results. }\n @case ('aggregation') { Shows the aggregated value from the query. }\n @case ('groupedAggregation') { Shows the value for a specific category. }\n }\n </p>\n </div>\n\n <!-- Aggregation: Value Field Selection -->\n @if (queryMode === 'aggregation' && selectedPersistentQuery) {\n <div class=\"form-field\">\n <label>Value Field <span class=\"required\">*</span></label>\n @if (!isLoadingQueryColumns) {\n <kendo-combobox\n [data]=\"queryColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.queryValueField\"\n placeholder=\"Select value field...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading columns...\"></kendo-textbox>\n }\n </div>\n }\n\n <!-- Grouped Aggregation: Category and Value Field Selection -->\n @if (queryMode === 'groupedAggregation' && selectedPersistentQuery) {\n <div class=\"form-field\">\n <label>Category Field <span class=\"required\">*</span></label>\n @if (!isLoadingQueryColumns) {\n <kendo-combobox\n [data]=\"queryColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.queryCategoryField\"\n (valueChange)=\"onCategoryFieldChange($event)\"\n placeholder=\"Select category field...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading columns...\"></kendo-textbox>\n }\n </div>\n\n <div class=\"form-field\" [class.disabled]=\"!form.queryCategoryField\">\n <label>Category Value <span class=\"required\">*</span></label>\n @if (!isLoadingCategoryValues && form.queryCategoryField) {\n <kendo-combobox\n [data]=\"categoryValues\"\n [textField]=\"'displayValue'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.queryCategoryValue\"\n placeholder=\"Select category value...\">\n </kendo-combobox>\n } @else if (isLoadingCategoryValues) {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading values...\"></kendo-textbox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"First select a category field...\"></kendo-textbox>\n }\n </div>\n\n <div class=\"form-field\">\n <label>Value Field <span class=\"required\">*</span></label>\n @if (!isLoadingQueryColumns) {\n <kendo-combobox\n [data]=\"queryColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.queryValueField\"\n placeholder=\"Select value field...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading columns...\"></kendo-textbox>\n }\n </div>\n }\n }\n\n <!-- Gauge Type Selection -->\n <div class=\"form-field\">\n <label>Gauge Type</label>\n <kendo-dropdownlist\n [data]=\"gaugeTypeOptions\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.gaugeType\">\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n <div class=\"gauge-type-item\">\n <span class=\"gauge-type-label\">{{ dataItem.label }}</span>\n <span class=\"gauge-type-desc\">{{ dataItem.description }}</span>\n </div>\n </ng-template>\n </kendo-dropdownlist>\n </div>\n\n <!-- Scale Settings -->\n <div class=\"form-section\">\n <h4>Scale Settings</h4>\n\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label>Minimum</label>\n <kendo-numerictextbox\n [(ngModel)]=\"form.min\"\n [decimals]=\"2\"\n [spinners]=\"false\"\n placeholder=\"0\">\n </kendo-numerictextbox>\n </div>\n <div class=\"form-field flex-1\">\n <label>Maximum</label>\n <kendo-numerictextbox\n [(ngModel)]=\"form.max\"\n [decimals]=\"2\"\n [spinners]=\"false\"\n placeholder=\"100\">\n </kendo-numerictextbox>\n </div>\n </div>\n\n <div class=\"form-field\">\n <label>\n <input type=\"checkbox\" kendoCheckBox [(ngModel)]=\"form.reverse\">\n <span class=\"checkbox-label\">Reverse Scale</span>\n </label>\n </div>\n </div>\n\n <!-- Display Options -->\n <div class=\"form-section\">\n <h4>Display Options</h4>\n\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label>Prefix</label>\n <kendo-textbox\n [(ngModel)]=\"form.prefix\"\n placeholder=\"e.g., $, EUR...\">\n </kendo-textbox>\n </div>\n <div class=\"form-field flex-1\">\n <label>Suffix</label>\n <kendo-textbox\n [(ngModel)]=\"form.suffix\"\n placeholder=\"e.g., %, units...\">\n </kendo-textbox>\n </div>\n </div>\n\n <div class=\"form-field\">\n <label>\n <input type=\"checkbox\" kendoCheckBox [(ngModel)]=\"form.showLabel\">\n <span class=\"checkbox-label\">Show Value Label</span>\n </label>\n </div>\n\n <!-- Label Attribute (only for runtime entity) -->\n @if (dataSourceType === 'runtimeEntity') {\n <div class=\"form-field\" [class.disabled]=\"!selectedCkType\">\n <label>Label Attribute (optional)</label>\n @if (selectedCkType && !isLoadingAttributes()) {\n <kendo-combobox\n [data]=\"filteredLabelAttributes()\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.labelAttribute\"\n [filterable]=\"true\"\n (filterChange)=\"onLabelAttributeFilter($event)\"\n placeholder=\"Search or select an attribute...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"attribute-item\">\n <span class=\"attribute-path\">{{ dataItem.attributePath }}</span>\n <span class=\"attribute-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else if (isLoadingAttributes()) {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading attributes...\"></kendo-textbox>\n } @else {\n <kendo-textbox [disabled]=\"true\" placeholder=\"First select Runtime Entities...\"></kendo-textbox>\n }\n <p class=\"field-hint\">Optional attribute to use as a dynamic label.</p>\n </div>\n }\n </div>\n\n <!-- Filters Section -->\n @if (filterAttributes.length > 0) {\n <div class=\"form-section\">\n <h4>Filters</h4>\n <p class=\"section-hint\">Define filters to narrow down the data.</p>\n <mm-field-filter-editor\n [availableAttributes]=\"filterAttributes\"\n [filters]=\"filters\"\n [enableVariables]=\"filterVariables.length > 0\"\n [availableVariables]=\"filterVariables\"\n (filtersChange)=\"onFiltersChange($event)\">\n </mm-field-filter-editor>\n </div>\n }\n\n <!-- Color Ranges -->\n <div class=\"form-section\">\n <h4>Color Ranges (optional)</h4>\n <p class=\"field-hint\">Define color zones for different value ranges.</p>\n\n @for (range of form.ranges; track $index) {\n <div class=\"range-row\">\n <kendo-numerictextbox\n [(ngModel)]=\"range.from\"\n [decimals]=\"0\"\n [spinners]=\"false\"\n placeholder=\"From\"\n class=\"range-input\">\n </kendo-numerictextbox>\n <span class=\"range-separator\">-</span>\n <kendo-numerictextbox\n [(ngModel)]=\"range.to\"\n [decimals]=\"0\"\n [spinners]=\"false\"\n placeholder=\"To\"\n class=\"range-input\">\n </kendo-numerictextbox>\n <input\n type=\"color\"\n [(ngModel)]=\"range.color\"\n class=\"color-picker\">\n <button kendoButton [fillMode]=\"'flat'\" [icon]=\"'x'\" (click)=\"removeRange($index)\"></button>\n </div>\n }\n\n <button kendoButton [fillMode]=\"'outline'\" (click)=\"addRange()\">\n Add Range\n </button>\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 16px 0;\n position: relative;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .config-form.loading {\n opacity: 0.7;\n pointer-events: none;\n }\n\n .loading-indicator {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n text-align: center;\n padding: 8px;\n color: var(--kendo-color-primary, #0d6efd);\n font-style: italic;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-field.disabled {\n opacity: 0.6;\n }\n\n .form-field.flex-1 {\n flex: 1;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .form-section {\n padding: 16px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .form-section h4 {\n margin: 0 0 16px 0;\n font-size: 0.95rem;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .section-hint {\n margin: 0 0 12px 0;\n font-size: 0.85rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .form-row {\n display: flex;\n gap: 16px;\n }\n\n .checkbox-label {\n margin-left: 8px;\n font-weight: normal;\n }\n\n .gauge-type-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .gauge-type-label {\n font-weight: 500;\n }\n\n .gauge-type-desc {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .attribute-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n width: 100%;\n }\n\n .attribute-path {\n flex: 1;\n }\n\n .attribute-type {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle, #6c757d);\n background: var(--kendo-color-surface-alt, #f8f9fa);\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .range-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .range-input {\n width: 80px;\n }\n\n .range-separator {\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .color-picker {\n width: 40px;\n height: 32px;\n padding: 2px;\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n cursor: pointer;\n }\n\n .mode-toggle {\n display: flex;\n gap: 8px;\n }\n\n .mode-toggle button {\n flex: 1;\n }\n\n .required {\n color: var(--kendo-color-error, #dc3545);\n }\n\n .query-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .query-name {\n font-weight: 500;\n }\n\n .query-description {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .column-item {\n display: flex;\n justify-content: space-between;\n gap: 16px;\n }\n\n .column-path {\n font-weight: 500;\n }\n\n .column-type {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n `]\n})\nexport class GaugeConfigDialogComponent implements OnInit {\n private readonly getEntitiesByCkTypeGQL = inject(GetEntitiesByCkTypeDtoGQL);\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n private readonly attributeSelectorService = inject(AttributeSelectorService);\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n private readonly getCkTypeAvailableQueryColumnsGQL = inject(GetCkTypeAvailableQueryColumnsDtoGQL);\n private readonly meshBoardStateService = inject(MeshBoardStateService);\n\n @ViewChild('ckTypeSelector') ckTypeSelectorInput?: CkTypeSelectorInputComponent;\n @ViewChild('entitySelector') entitySelectorInput?: EntitySelectInputComponent;\n @ViewChild('querySelector') querySelector?: QuerySelectorComponent;\n\n // Initial values for editing - Runtime Entity\n @Input() initialCkTypeId?: string;\n @Input() initialRtId?: string;\n @Input() initialGaugeType?: GaugeType;\n @Input() initialValueAttribute?: string;\n @Input() initialLabelAttribute?: string;\n @Input() initialMin?: number;\n @Input() initialMax?: number;\n @Input() initialRanges?: GaugeRange[];\n @Input() initialShowLabel?: boolean;\n @Input() initialPrefix?: string;\n @Input() initialSuffix?: string;\n @Input() initialReverse?: boolean;\n\n // Initial values for editing - Persistent Query\n @Input() initialDataSourceType?: GaugeDataSourceType;\n @Input() initialQueryRtId?: string;\n @Input() initialQueryName?: string;\n @Input() initialQueryMode?: KpiQueryMode;\n @Input() initialQueryValueField?: string;\n @Input() initialQueryCategoryField?: string;\n @Input() initialQueryCategoryValue?: string;\n\n // Initial values for filters\n @Input() initialFilters?: WidgetFilterConfig[];\n\n @Output() save = new EventEmitter<GaugeConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n // Data source type selection\n dataSourceType: GaugeDataSourceType = 'runtimeEntity';\n\n // Runtime Entity state\n selectedCkType: CkTypeSelectorItem | null = null;\n selectedEntity: RuntimeEntityItem | null = null;\n entityDataSource?: RuntimeEntitySelectDataSource;\n entityDialogDataSource?: RuntimeEntityDialogDataSource;\n isLoadingInitial = false;\n\n // Persistent Query state\n selectedPersistentQuery: PersistentQueryItem | null = null;\n queryColumns: QueryColumnItem[] = [];\n categoryValues: CategoryValueItem[] = [];\n queryMode: KpiQueryMode = 'simpleCount';\n isLoadingQueryColumns = false;\n isLoadingCategoryValues = false;\n\n // Attribute selection\n readonly isLoadingAttributes = signal(false);\n readonly availableAttributes = signal<AttributeItem[]>([]);\n readonly filteredValueAttributes = signal<AttributeItem[]>([]);\n readonly filteredLabelAttributes = signal<AttributeItem[]>([]);\n\n // Filter state\n filters: FieldFilterItem[] = [];\n filterAttributes: AttributeItem[] = [];\n filterVariables: FilterVariable[] = [];\n\n form: {\n gaugeType: GaugeType;\n valueAttribute: string;\n labelAttribute: string;\n min: number | null;\n max: number | null;\n ranges: GaugeRange[];\n showLabel: boolean;\n prefix: string;\n suffix: string;\n reverse: boolean;\n // Query-specific form fields\n queryValueField: string;\n queryCategoryField: string;\n queryCategoryValue: string;\n } = {\n gaugeType: 'arc',\n valueAttribute: '',\n labelAttribute: '',\n min: 0,\n max: 100,\n ranges: [],\n showLabel: true,\n prefix: '',\n suffix: '',\n reverse: false,\n queryValueField: '',\n queryCategoryField: '',\n queryCategoryValue: ''\n };\n\n gaugeTypeOptions: GaugeTypeOption[] = [\n { value: 'arc', label: 'Arc Gauge', description: 'Semi-circular gauge with center label' },\n { value: 'circular', label: 'Circular Gauge', description: 'Full circle gauge with center label' },\n { value: 'radial', label: 'Radial Gauge', description: 'Classic speedometer style with pointer' },\n { value: 'linear', label: 'Linear Gauge', description: 'Vertical bar gauge with pointer' }\n ];\n\n queryModeOptions = [\n { value: 'simpleCount' as KpiQueryMode, label: 'Total Count (Simple Query)' },\n { value: 'aggregation' as KpiQueryMode, label: 'Aggregation Value' },\n { value: 'groupedAggregation' as KpiQueryMode, label: 'Grouped Aggregation' }\n ];\n\n get isValid(): boolean {\n if (this.dataSourceType === 'persistentQuery') {\n if (!this.selectedPersistentQuery) return false;\n if (this.queryMode === 'simpleCount') return true;\n if (this.queryMode === 'aggregation') return this.form.queryValueField !== '';\n if (this.queryMode === 'groupedAggregation') {\n return this.form.queryCategoryField !== '' &&\n this.form.queryCategoryValue !== '' &&\n this.form.queryValueField !== '';\n }\n return false;\n }\n // Runtime entity validation\n return (\n this.selectedCkType !== null &&\n this.selectedEntity !== null &&\n (this.form.valueAttribute?.trim() ?? '') !== ''\n );\n }\n\n async ngOnInit(): Promise<void> {\n // Initialize filter variables from MeshBoard state\n this.filterVariables = this.meshBoardStateService.getVariables().map(v => ({\n name: v.name,\n label: v.label || v.name,\n type: v.type\n }));\n\n // Initialize form with initial values\n this.form.gaugeType = this.initialGaugeType || 'arc';\n this.form.valueAttribute = this.initialValueAttribute || '';\n this.form.labelAttribute = this.initialLabelAttribute || '';\n this.form.min = this.initialMin ?? 0;\n this.form.max = this.initialMax ?? 100;\n this.form.ranges = this.initialRanges ? [...this.initialRanges] : [];\n this.form.showLabel = this.initialShowLabel !== false;\n this.form.prefix = this.initialPrefix || '';\n this.form.suffix = this.initialSuffix || '';\n this.form.reverse = this.initialReverse ?? false;\n this.form.queryValueField = this.initialQueryValueField || '';\n this.form.queryCategoryField = this.initialQueryCategoryField || '';\n this.form.queryCategoryValue = this.initialQueryCategoryValue || '';\n\n // Initialize filters\n if (this.initialFilters && this.initialFilters.length > 0) {\n this.filters = this.initialFilters.map((f, index) => ({\n id: index + 1,\n attributePath: f.attributePath,\n operator: f.operator as FieldFilterOperatorsDto,\n comparisonValue: f.comparisonValue\n }));\n }\n\n // Determine data source type\n this.dataSourceType = this.initialDataSourceType || 'runtimeEntity';\n this.queryMode = this.initialQueryMode || 'simpleCount';\n\n if (this.dataSourceType === 'persistentQuery' && this.initialQueryRtId) {\n this.isLoadingInitial = true;\n setTimeout(async () => {\n if (this.querySelector) {\n const query = await this.querySelector.selectByRtId(this.initialQueryRtId!);\n if (query) {\n this.selectedPersistentQuery = query;\n await this.loadQueryColumnsAndValues(query.rtId);\n if (query.queryCkTypeId) {\n await this.loadFilterAttributesFromCkType(query.queryCkTypeId);\n }\n }\n }\n this.isLoadingInitial = false;\n }, 100);\n } else if (this.initialCkTypeId) {\n await this.loadInitialValues();\n }\n }\n\n private async loadInitialValues(): Promise<void> {\n if (!this.initialCkTypeId) return;\n\n this.isLoadingInitial = true;\n\n try {\n const ckType = await firstValueFrom(\n this.ckTypeSelectorService.getCkTypeByRtCkTypeId(this.initialCkTypeId)\n );\n\n if (ckType) {\n this.onCkTypeSelected(ckType);\n\n if (this.initialRtId && this.entityDataSource) {\n await this.loadInitialEntity();\n }\n }\n } catch (error) {\n console.error('Error loading initial values:', error);\n } finally {\n this.isLoadingInitial = false;\n }\n }\n\n private async loadInitialEntity(): Promise<void> {\n if (!this.initialRtId || !this.initialCkTypeId) return;\n\n try {\n const result = await firstValueFrom(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId: this.initialCkTypeId,\n rtId: this.initialRtId\n }\n })\n );\n\n const items = result.data?.runtime?.runtimeEntities?.items ?? [];\n const entity = items\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .find(item => item.rtId === this.initialRtId);\n\n if (entity) {\n this.selectedEntity = {\n rtId: entity.rtId,\n ckTypeId: entity.ckTypeId,\n rtWellKnownName: entity.rtWellKnownName ?? undefined,\n displayName: entity.rtWellKnownName || entity.rtId\n };\n }\n } catch (error) {\n console.error('Error loading initial entity:', error);\n }\n }\n\n onCkTypeSelected(ckType: CkTypeSelectorItem): void {\n this.selectedCkType = ckType;\n this.selectedEntity = null;\n\n this.entityDataSource = new RuntimeEntitySelectDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.fullName\n );\n this.entityDialogDataSource = new RuntimeEntityDialogDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n\n // Load available attributes for this CK type (fullName is required for the GraphQL query)\n this.loadAvailableAttributes(ckType.fullName);\n }\n\n onCkTypeCleared(): void {\n this.selectedCkType = null;\n this.selectedEntity = null;\n this.entityDataSource = undefined;\n this.entityDialogDataSource = undefined;\n this.availableAttributes.set([]);\n this.filteredValueAttributes.set([]);\n this.filteredLabelAttributes.set([]);\n this.filterAttributes = [];\n this.filters = [];\n }\n\n private loadAvailableAttributes(ckTypeId: string): void {\n this.isLoadingAttributes.set(true);\n this.attributeSelectorService.getAvailableAttributes(ckTypeId).subscribe({\n next: (result) => {\n this.availableAttributes.set(result.items);\n this.filteredValueAttributes.set(result.items);\n this.filteredLabelAttributes.set(result.items);\n // Also set filter attributes for the filter editor\n this.filterAttributes = result.items;\n this.isLoadingAttributes.set(false);\n },\n error: (err) => {\n console.error('Error loading attributes:', err);\n this.availableAttributes.set([]);\n this.filteredValueAttributes.set([]);\n this.filteredLabelAttributes.set([]);\n this.filterAttributes = [];\n this.isLoadingAttributes.set(false);\n }\n });\n }\n\n onValueAttributeFilter(filter: string): void {\n const filterLower = filter.toLowerCase();\n const filtered = this.availableAttributes().filter(attr =>\n attr.attributePath.toLowerCase().includes(filterLower)\n );\n this.filteredValueAttributes.set(filtered);\n }\n\n onLabelAttributeFilter(filter: string): void {\n const filterLower = filter.toLowerCase();\n const filtered = this.availableAttributes().filter(attr =>\n attr.attributePath.toLowerCase().includes(filterLower)\n );\n this.filteredLabelAttributes.set(filtered);\n }\n\n onEntitySelected(entity: RuntimeEntityItem): void {\n this.selectedEntity = entity;\n }\n\n onEntityCleared(): void {\n this.selectedEntity = null;\n }\n\n addRange(): void {\n const lastRange = this.form.ranges[this.form.ranges.length - 1];\n const newFrom = lastRange ? lastRange.to : 0;\n const newTo = Math.min(newFrom + 25, this.form.max ?? 100);\n\n this.form.ranges.push({\n from: newFrom,\n to: newTo,\n color: '#4caf50'\n });\n }\n\n removeRange(index: number): void {\n this.form.ranges.splice(index, 1);\n }\n\n onSave(): void {\n // Convert filters to DTO format\n const filtersDto: FieldFilterDto[] | undefined = this.filters.length > 0\n ? this.filters.map(f => ({\n attributePath: f.attributePath,\n operator: f.operator,\n comparisonValue: f.comparisonValue\n }))\n : undefined;\n\n if (this.dataSourceType === 'persistentQuery' && this.selectedPersistentQuery) {\n this.save.emit({\n dataSourceType: 'persistentQuery',\n ckTypeId: '',\n rtId: undefined,\n valueAttribute: '',\n queryRtId: this.selectedPersistentQuery.rtId,\n queryName: this.selectedPersistentQuery.name,\n queryMode: this.queryMode,\n queryValueField: this.form.queryValueField || undefined,\n queryCategoryField: this.form.queryCategoryField || undefined,\n queryCategoryValue: this.form.queryCategoryValue || undefined,\n gaugeType: this.form.gaugeType,\n min: this.form.min ?? undefined,\n max: this.form.max ?? undefined,\n ranges: this.form.ranges.length > 0 ? this.form.ranges : undefined,\n showLabel: this.form.showLabel,\n prefix: this.form.prefix || undefined,\n suffix: this.form.suffix || undefined,\n reverse: this.form.reverse || undefined,\n filters: filtersDto\n });\n } else if (this.selectedCkType && this.selectedEntity) {\n this.save.emit({\n dataSourceType: 'runtimeEntity',\n ckTypeId: this.selectedCkType.rtCkTypeId,\n rtId: this.selectedEntity.rtId,\n gaugeType: this.form.gaugeType,\n valueAttribute: this.form.valueAttribute,\n labelAttribute: this.form.labelAttribute || undefined,\n min: this.form.min ?? undefined,\n max: this.form.max ?? undefined,\n ranges: this.form.ranges.length > 0 ? this.form.ranges : undefined,\n showLabel: this.form.showLabel,\n prefix: this.form.prefix || undefined,\n suffix: this.form.suffix || undefined,\n reverse: this.form.reverse || undefined,\n filters: filtersDto\n });\n }\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n\n // ============================================================================\n // Data Source Type Selection\n // ============================================================================\n\n onDataSourceTypeChange(type: GaugeDataSourceType): void {\n this.dataSourceType = type;\n }\n\n // ============================================================================\n // Persistent Query Methods\n // ============================================================================\n\n async onQuerySelected(query: PersistentQueryItem | null): Promise<void> {\n this.selectedPersistentQuery = query;\n this.queryColumns = [];\n this.categoryValues = [];\n this.filterAttributes = [];\n this.filters = [];\n this.form.queryValueField = '';\n this.form.queryCategoryField = '';\n this.form.queryCategoryValue = '';\n\n if (query) {\n // Load query columns for field mapping\n await this.loadQueryColumnsAndValues(query.rtId);\n\n // Load filter attributes from CK type\n if (query.queryCkTypeId) {\n await this.loadFilterAttributesFromCkType(query.queryCkTypeId);\n }\n }\n }\n\n async onQueryModeChange(mode: KpiQueryMode): Promise<void> {\n this.queryMode = mode;\n this.form.queryValueField = '';\n this.form.queryCategoryField = '';\n this.form.queryCategoryValue = '';\n this.categoryValues = [];\n\n // Query columns should already be loaded, but reload if needed for category values\n if (this.selectedPersistentQuery && mode === 'groupedAggregation' && this.queryColumns.length === 0) {\n await this.loadQueryColumnsAndValues(this.selectedPersistentQuery.rtId);\n }\n }\n\n private async loadQueryColumnsAndValues(queryRtId: string): Promise<void> {\n this.isLoadingQueryColumns = true;\n\n try {\n const result = await firstValueFrom(this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: queryRtId,\n first: 100 // Fetch rows for category values\n }\n }));\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n if (queryItems.length > 0 && queryItems[0]) {\n const queryResult = queryItems[0];\n\n // Extract columns\n const columns = queryResult.columns ?? [];\n const filteredColumns = columns\n .filter((c): c is NonNullable<typeof c> => c !== null);\n\n // queryColumns use sanitized paths for UI display and matching with query results\n this.queryColumns = filteredColumns.map(c => ({\n attributePath: this.sanitizeFieldName(c.attributePath ?? ''),\n attributeValueType: c.attributeValueType ?? ''\n }));\n\n // Extract category values for grouped aggregation\n if (this.queryMode === 'groupedAggregation') {\n await this.extractCategoryValues(queryResult);\n }\n }\n } catch (error) {\n console.error('Error loading query columns:', error);\n this.queryColumns = [];\n } finally {\n this.isLoadingQueryColumns = false;\n }\n }\n\n /**\n * Loads all available filter attributes from the CK type.\n * Uses getCkTypeAvailableQueryColumns to get all attributes, not just query result columns.\n */\n private async loadFilterAttributesFromCkType(queryCkTypeId: string): Promise<void> {\n try {\n const result = await firstValueFrom(this.getCkTypeAvailableQueryColumnsGQL.fetch({\n variables: { rtCkId: queryCkTypeId, first: 1000 }\n }));\n\n const columns = result.data?.constructionKit?.types?.items?.[0]?.availableQueryColumns?.items || [];\n this.filterAttributes = columns\n .filter((c): c is NonNullable<typeof c> => c !== null)\n .map(c => ({\n attributePath: c.attributePath || '',\n attributeValueType: c.attributeValueType\n }));\n } catch (error) {\n console.error('Error loading filter attributes:', error);\n this.filterAttributes = [];\n }\n }\n\n async onCategoryFieldChange(categoryField: string): Promise<void> {\n this.form.queryCategoryField = categoryField;\n this.form.queryCategoryValue = '';\n this.categoryValues = [];\n\n if (this.selectedPersistentQuery && categoryField) {\n await this.loadCategoryValuesForField(this.selectedPersistentQuery.rtId, categoryField);\n }\n }\n\n private async loadCategoryValuesForField(queryRtId: string, categoryField: string): Promise<void> {\n this.isLoadingCategoryValues = true;\n\n try {\n const result = await firstValueFrom(this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: queryRtId,\n first: 100\n }\n }));\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n if (queryItems.length > 0 && queryItems[0]) {\n const queryResult = queryItems[0];\n const rows = queryResult.rows?.items ?? [];\n const supportedRowTypes = ['RtSimpleQueryRow', 'RtAggregationQueryRow', 'RtGroupingAggregationQueryRow'];\n\n const values = new Set<string>();\n\n for (const row of rows) {\n if (!row || !supportedRowTypes.includes(row.__typename ?? '')) continue;\n\n const queryRow = row as { cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null };\n const cells = queryRow.cells?.items ?? [];\n\n for (const cell of cells) {\n if (!cell?.attributePath) continue;\n\n const sanitizedPath = this.sanitizeFieldName(cell.attributePath);\n if (sanitizedPath === categoryField && cell.value !== null && cell.value !== undefined) {\n values.add(String(cell.value));\n }\n }\n }\n\n this.categoryValues = Array.from(values).map(v => ({\n value: v,\n displayValue: v\n }));\n }\n } catch (error) {\n console.error('Error loading category values:', error);\n this.categoryValues = [];\n } finally {\n this.isLoadingCategoryValues = false;\n }\n }\n\n private async extractCategoryValues(_queryResult: { rows?: { items?: ({ __typename?: string; cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null } | null)[] | null } | null }): Promise<void> {\n // Load category values if a category field is already selected\n if (this.queryColumns.length > 0 && this.form.queryCategoryField && this.selectedPersistentQuery) {\n await this.loadCategoryValuesForField(this.selectedPersistentQuery.rtId, this.form.queryCategoryField);\n }\n }\n\n private sanitizeFieldName(fieldName: string): string {\n return fieldName.replace(/\\./g, '_');\n }\n\n // ============================================================================\n // Filter Methods\n // ============================================================================\n\n onFiltersChange(updatedFilters: FieldFilterItem[]): void {\n this.filters = updatedFilters;\n }\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PieChartWidgetConfig, PersistentQueryDataSource, ConstructionKitQueryDataSource, WidgetFilterConfig } from '../../models/meshboard.models';\nimport { DashboardWidget } from '../widget.interface';\nimport { WidgetNotConfiguredComponent } from '../../components/widget-not-configured/widget-not-configured.component';\nimport { ChartsModule } from '@progress/kendo-angular-charts';\nimport { ExecuteRuntimeQueryDtoGQL } from '../../graphQL/executeRuntimeQuery';\nimport { MeshBoardDataService } from '../../services/meshboard-data.service';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { MeshBoardVariableService } from '../../services/meshboard-variable.service';\nimport { catchError, firstValueFrom } from 'rxjs';\nimport { FieldFilterDto } from '@meshmakers/octo-services';\n\n/**\n * Data item for the pie chart\n */\ninterface ChartDataItem {\n category: string;\n value: number;\n}\n\n@Component({\n selector: 'mm-pie-chart-widget',\n standalone: true,\n imports: [\n CommonModule,\n ChartsModule,\n WidgetNotConfiguredComponent\n ],\n template: `\n <div class=\"pie-chart-widget\" [class.loading]=\"isLoading()\" [class.error]=\"error()\">\n @if (isNotConfigured()) {\n <mm-widget-not-configured></mm-widget-not-configured>\n } @else if (isLoading()) {\n <div class=\"loading-indicator\">\n <span>...</span>\n </div>\n } @else if (error()) {\n <div class=\"error-message\">\n <span>{{ error() }}</span>\n </div>\n } @else {\n <kendo-chart class=\"chart-container\">\n <kendo-chart-series>\n <kendo-chart-series-item\n [type]=\"config.chartType\"\n [data]=\"chartData()\"\n field=\"value\"\n categoryField=\"category\"\n [labels]=\"labelSettings()\">\n </kendo-chart-series-item>\n </kendo-chart-series>\n <kendo-chart-legend\n [visible]=\"config.showLegend !== false\"\n [position]=\"config.legendPosition ?? 'right'\">\n </kendo-chart-legend>\n <kendo-chart-tooltip>\n <ng-template kendoChartSeriesTooltipTemplate let-value=\"value\" let-category=\"category\">\n <div class=\"chart-tooltip\">\n <strong>{{ category }}</strong>: {{ formatValue(value) }}\n </div>\n </ng-template>\n </kendo-chart-tooltip>\n </kendo-chart>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .pie-chart-widget {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 8px;\n box-sizing: border-box;\n overflow: hidden;\n }\n\n .pie-chart-widget.loading,\n .pie-chart-widget.error {\n opacity: 0.7;\n }\n\n .loading-indicator,\n .error-message,\n .no-config-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n }\n\n .loading-indicator span {\n font-size: 1.5rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .error-message span {\n color: var(--kendo-color-error, #dc3545);\n font-size: 0.875rem;\n }\n\n .no-config-overlay span {\n color: var(--kendo-color-subtle, #6c757d);\n font-style: italic;\n }\n\n .chart-container {\n width: 100%;\n height: 100%;\n }\n\n kendo-chart {\n width: 100%;\n height: 100%;\n }\n\n .chart-tooltip {\n padding: 4px 8px;\n }\n `]\n})\nexport class PieChartWidgetComponent implements DashboardWidget<PieChartWidgetConfig, ChartDataItem[]>, OnInit, OnChanges {\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n private readonly dataService = inject(MeshBoardDataService);\n private readonly stateService = inject(MeshBoardStateService);\n private readonly variableService = inject(MeshBoardVariableService);\n\n @Input() config!: PieChartWidgetConfig;\n\n // Widget state signals\n private readonly _isLoading = signal(false);\n private readonly _chartData = signal<ChartDataItem[]>([]);\n private readonly _error = signal<string | null>(null);\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly chartData = this._chartData.asReadonly();\n readonly error = this._error.asReadonly();\n\n readonly data = computed(() => this._chartData());\n\n /**\n * Check if widget is not configured (needs data source setup).\n * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.\n */\n isNotConfigured(): boolean {\n const dataSource = this.config?.dataSource;\n if (!dataSource) return true;\n\n if (dataSource.type === 'persistentQuery') {\n const ds = dataSource as PersistentQueryDataSource;\n return !ds.queryRtId || !this.config?.categoryField || !this.config?.valueField;\n }\n\n if (dataSource.type === 'constructionKitQuery') {\n const ds = dataSource as ConstructionKitQueryDataSource;\n return !ds.queryTarget;\n }\n\n return true; // Unknown data source type\n }\n\n readonly labelSettings = computed(() => ({\n visible: this.config?.showLabels !== false,\n content: (e: { category: string; value: number }) =>\n `${e.category}: ${this.formatValue(e.value)}`\n }));\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadData();\n }\n }\n\n refresh(): void {\n this.loadData();\n }\n\n hasValidConfig(): boolean {\n if (!this.config?.dataSource) return false;\n\n if (this.config.dataSource.type === 'persistentQuery') {\n const ds = this.config.dataSource as PersistentQueryDataSource;\n return !!(ds.queryRtId && this.config.categoryField && this.config.valueField);\n }\n\n if (this.config.dataSource.type === 'constructionKitQuery') {\n const ds = this.config.dataSource as ConstructionKitQueryDataSource;\n return !!ds.queryTarget;\n }\n\n return false;\n }\n\n formatValue(value: number): string {\n return value.toLocaleString('de-AT', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2\n });\n }\n\n private async loadData(): Promise<void> {\n // Skip loading if widget is not configured - isNotConfigured() handles the display\n if (this.isNotConfigured()) {\n return;\n }\n\n const dataSource = this.config?.dataSource;\n\n this._isLoading.set(true);\n this._error.set(null);\n\n try {\n if (dataSource.type === 'constructionKitQuery') {\n await this.loadCkQueryData(dataSource as ConstructionKitQueryDataSource);\n } else if (dataSource.type === 'persistentQuery') {\n await this.loadPersistentQueryData(dataSource as PersistentQueryDataSource);\n } else {\n this._error.set(`Data source type '${dataSource.type}' is not supported`);\n this._isLoading.set(false);\n }\n } catch (err) {\n console.error('Error loading Pie Chart data:', err);\n this._error.set('Failed to load data');\n this._isLoading.set(false);\n }\n }\n\n /**\n * Loads data from Construction Kit query data source.\n */\n private async loadCkQueryData(dataSource: ConstructionKitQueryDataSource): Promise<void> {\n const result = await this.dataService.fetchCkQueryData(dataSource);\n\n const chartData: ChartDataItem[] = result.items.map(item => ({\n category: item.category,\n value: item.value\n }));\n\n this._chartData.set(chartData);\n this._isLoading.set(false);\n }\n\n /**\n * Loads data from persistent query data source.\n * Note: isNotConfigured() check in loadData() ensures queryRtId is set.\n */\n private async loadPersistentQueryData(dataSource: PersistentQueryDataSource): Promise<void> {\n // Convert widget filters to GraphQL format\n const fieldFilter = this.convertFiltersToDto(this.config.filters);\n\n const result = await firstValueFrom(\n this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: dataSource.queryRtId,\n first: 100, // Limit for pie chart\n fieldFilter\n }\n }).pipe(\n catchError(err => {\n console.error('Error loading Pie Chart data:', err);\n throw err;\n })\n )\n );\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n\n if (queryItems.length === 0) {\n this._chartData.set([]);\n this._isLoading.set(false);\n return;\n }\n\n const queryResult = queryItems[0];\n if (!queryResult) {\n this._chartData.set([]);\n this._isLoading.set(false);\n return;\n }\n\n // Extract columns to find field indices\n const columns = (queryResult.columns ?? [])\n .filter((c): c is NonNullable<typeof c> => c !== null)\n .map(c => this.sanitizeFieldName(c.attributePath ?? ''));\n\n const categoryFieldIndex = columns.indexOf(this.sanitizeFieldName(this.config.categoryField));\n const valueFieldIndex = columns.indexOf(this.sanitizeFieldName(this.config.valueField));\n\n if (categoryFieldIndex === -1 || valueFieldIndex === -1) {\n this._error.set('Configured fields not found in query result');\n this._isLoading.set(false);\n return;\n }\n\n // Extract rows and transform to chart data\n const rows = queryResult.rows?.items ?? [];\n const supportedRowTypes = ['RtSimpleQueryRow', 'RtAggregationQueryRow', 'RtGroupingAggregationQueryRow'];\n\n const chartData: ChartDataItem[] = rows\n .filter((row): row is NonNullable<typeof row> => row !== null)\n .filter(row => supportedRowTypes.includes(row.__typename ?? ''))\n .map(row => {\n const queryRow = row as { cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null };\n const cells = queryRow.cells?.items ?? [];\n\n let category = '';\n let value = 0;\n\n for (const cell of cells) {\n if (!cell?.attributePath) continue;\n\n const sanitizedPath = this.sanitizeFieldName(cell.attributePath);\n\n if (sanitizedPath === this.sanitizeFieldName(this.config.categoryField)) {\n category = String(cell.value ?? '');\n }\n\n if (sanitizedPath === this.sanitizeFieldName(this.config.valueField)) {\n const numValue = typeof cell.value === 'number' ? cell.value : parseFloat(String(cell.value));\n value = isNaN(numValue) ? 0 : numValue;\n }\n }\n\n return { category, value };\n })\n .filter(item => item.category !== ''); // Filter out empty categories\n\n this._chartData.set(chartData);\n this._isLoading.set(false);\n }\n\n /**\n * Sanitizes field names for comparison.\n * Replaces dots with underscores (same as table widget).\n */\n private sanitizeFieldName(fieldName: string): string {\n return fieldName.replace(/\\./g, '_');\n }\n\n /**\n * Converts widget filter configuration to GraphQL FieldFilterDto format.\n * Resolves MeshBoard variables in filter values before conversion.\n */\n private convertFiltersToDto(filters?: WidgetFilterConfig[]): FieldFilterDto[] | undefined {\n const variables = this.stateService.getVariables();\n return this.variableService.convertToFieldFilterDto(filters, variables);\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, inject, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { searchIcon, chartPieIcon } from '@progress/kendo-svg-icons';\nimport { firstValueFrom } from 'rxjs';\nimport { PieChartType, CkQueryTarget, DataSourceType, WidgetFilterConfig } from '../../models/meshboard.models';\nimport { ExecuteRuntimeQueryDtoGQL } from '../../graphQL/executeRuntimeQuery';\nimport { WidgetConfigResult } from '../../services/widget-registry.service';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { FieldFilterEditorComponent, FieldFilterItem, FilterVariable } from '@meshmakers/octo-ui';\nimport { FieldFilterDto, FieldFilterOperatorsDto, AttributeItem, GetCkTypeAvailableQueryColumnsDtoGQL } from '@meshmakers/octo-services';\nimport { PersistentQueryItem, QueryColumnItem } from '../../utils/runtime-entity-data-sources';\nimport { QuerySelectorComponent } from '../../components/query-selector/query-selector.component';\n\n/**\n * Configuration result from the Pie Chart dialog\n */\nexport interface PieChartConfigResult extends WidgetConfigResult {\n dataSourceType: DataSourceType;\n // Persistent Query fields\n queryRtId?: string;\n queryName?: string;\n categoryField: string;\n valueField: string;\n // Construction Kit Query fields\n ckQueryTarget?: CkQueryTarget;\n ckGroupBy?: string;\n // Chart options\n chartType: PieChartType;\n showLabels: boolean;\n showLegend: boolean;\n legendPosition: 'top' | 'bottom' | 'left' | 'right';\n // Filters\n filters?: FieldFilterDto[];\n}\n\n/**\n * Configuration dialog for Pie Chart widgets.\n */\n@Component({\n selector: 'mm-pie-chart-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n DropDownsModule,\n SVGIconModule,\n FieldFilterEditorComponent,\n QuerySelectorComponent\n ],\n template: `\n <kendo-dialog\n title=\"Pie Chart Configuration\"\n [minWidth]=\"500\"\n [width]=\"600\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\" [class.loading]=\"isLoadingInitial\">\n @if (isLoadingInitial) {\n <div class=\"loading-indicator\">Loading...</div>\n }\n\n <!-- Data Source Type Section -->\n <div class=\"config-section\">\n <h3 class=\"section-title\">Data Source</h3>\n\n <div class=\"form-field\">\n <label>Data Source Type <span class=\"required\">*</span></label>\n <kendo-dropdownlist\n [data]=\"dataSourceTypes\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.dataSourceType\"\n (valueChange)=\"onDataSourceTypeChange($event)\">\n </kendo-dropdownlist>\n </div>\n\n <!-- Query Options -->\n @if (form.dataSourceType === 'persistentQuery') {\n <div class=\"form-field\">\n <label>Query <span class=\"required\">*</span></label>\n <mm-query-selector\n #querySelector\n [(ngModel)]=\"selectedPersistentQuery\"\n (querySelected)=\"onQuerySelected($event)\"\n placeholder=\"Select a Query...\"\n hint=\"Select a grouped aggregation query for the chart data.\">\n </mm-query-selector>\n </div>\n }\n\n <!-- Construction Kit Query Options -->\n @if (form.dataSourceType === 'constructionKitQuery') {\n <div class=\"form-field\">\n <label>Query Target <span class=\"required\">*</span></label>\n <kendo-dropdownlist\n [data]=\"ckQueryTargets\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.ckQueryTarget\"\n (valueChange)=\"onCkQueryTargetChange($event)\">\n </kendo-dropdownlist>\n <p class=\"field-hint\">What to query from the Construction Kit.</p>\n </div>\n\n <div class=\"form-field\">\n <label>Group By <span class=\"required\">*</span></label>\n <kendo-dropdownlist\n [data]=\"ckGroupByOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.ckGroupBy\">\n </kendo-dropdownlist>\n <p class=\"field-hint\">Field to group results by for chart segments.</p>\n </div>\n }\n </div>\n\n <!-- Field Mapping Section (only for persistent queries) -->\n @if (form.dataSourceType === 'persistentQuery' && selectedPersistentQuery && queryColumns.length > 0) {\n <div class=\"config-section\">\n <h3 class=\"section-title\">Field Mapping</h3>\n\n <div class=\"form-field\">\n <label>Category Field <span class=\"required\">*</span></label>\n <kendo-combobox\n [data]=\"queryColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.categoryField\"\n placeholder=\"Select category field...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n <p class=\"field-hint\">Field used for category labels (e.g., legalEntityType).</p>\n </div>\n\n <div class=\"form-field\">\n <label>Value Field <span class=\"required\">*</span></label>\n <kendo-combobox\n [data]=\"queryColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.valueField\"\n placeholder=\"Select value field...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n <p class=\"field-hint\">Field used for numeric values (e.g., count, sum).</p>\n </div>\n </div>\n }\n\n <!-- Filters Section (only for persistent queries with columns) -->\n @if (form.dataSourceType === 'persistentQuery' && filterAttributes.length > 0) {\n <div class=\"config-section\">\n <h3 class=\"section-title\">Filters</h3>\n <p class=\"section-hint\">Define filters to narrow down the data.</p>\n <mm-field-filter-editor\n [availableAttributes]=\"filterAttributes\"\n [filters]=\"filters\"\n [enableVariables]=\"filterVariables.length > 0\"\n [availableVariables]=\"filterVariables\"\n (filtersChange)=\"onFiltersChange($event)\">\n </mm-field-filter-editor>\n </div>\n }\n\n <!-- Chart Options Section -->\n <div class=\"config-section\">\n <h3 class=\"section-title\">Chart Options</h3>\n\n <div class=\"form-field\">\n <label>Chart Type</label>\n <div class=\"radio-group\">\n <label class=\"radio-label\">\n <input type=\"radio\"\n name=\"chartType\"\n value=\"pie\"\n [(ngModel)]=\"form.chartType\"\n kendoRadioButton />\n <span>Pie</span>\n </label>\n <label class=\"radio-label\">\n <input type=\"radio\"\n name=\"chartType\"\n value=\"donut\"\n [(ngModel)]=\"form.chartType\"\n kendoRadioButton />\n <span>Donut</span>\n </label>\n </div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-field checkbox-field\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"form.showLabels\" kendoCheckBox />\n Show Labels\n </label>\n </div>\n\n <div class=\"form-field checkbox-field\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"form.showLegend\" kendoCheckBox />\n Show Legend\n </label>\n </div>\n </div>\n\n @if (form.showLegend) {\n <div class=\"form-field\">\n <label>Legend Position</label>\n <kendo-dropdownlist\n [data]=\"legendPositions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.legendPosition\">\n </kendo-dropdownlist>\n </div>\n }\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 16px 0;\n position: relative;\n }\n\n .config-form.loading {\n opacity: 0.7;\n pointer-events: none;\n }\n\n .loading-indicator {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n text-align: center;\n padding: 8px;\n color: var(--kendo-color-primary, #0d6efd);\n font-style: italic;\n }\n\n .config-section {\n padding: 16px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .section-title {\n margin: 0 0 16px 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .section-hint {\n margin: 0 0 12px 0;\n font-size: 0.85rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 12px;\n }\n\n .form-field:last-child {\n margin-bottom: 0;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .required {\n color: var(--kendo-color-error, #dc3545);\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .radio-group {\n display: flex;\n gap: 24px;\n }\n\n .radio-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-weight: normal;\n }\n\n .form-row {\n display: flex;\n gap: 24px;\n }\n\n .checkbox-field {\n flex-direction: row;\n align-items: center;\n }\n\n .checkbox-field label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-weight: normal;\n }\n\n .query-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .query-name {\n font-weight: 500;\n }\n\n .query-description {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .column-item {\n display: flex;\n justify-content: space-between;\n gap: 16px;\n }\n\n .column-path {\n font-weight: 500;\n }\n\n .column-type {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n `]\n})\nexport class PieChartConfigDialogComponent implements OnInit {\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n private readonly getCkTypeAvailableQueryColumnsGQL = inject(GetCkTypeAvailableQueryColumnsDtoGQL);\n private readonly stateService = inject(MeshBoardStateService);\n\n @ViewChild('querySelector') querySelector?: QuerySelectorComponent;\n\n // Initial values for editing\n @Input() initialDataSourceType?: DataSourceType;\n @Input() initialQueryRtId?: string;\n @Input() initialQueryName?: string;\n @Input() initialChartType?: PieChartType;\n @Input() initialCategoryField?: string;\n @Input() initialValueField?: string;\n @Input() initialShowLabels?: boolean;\n @Input() initialShowLegend?: boolean;\n @Input() initialLegendPosition?: 'top' | 'bottom' | 'left' | 'right';\n @Input() initialCkQueryTarget?: CkQueryTarget;\n @Input() initialCkGroupBy?: string;\n @Input() initialFilters?: WidgetFilterConfig[];\n\n @Output() save = new EventEmitter<PieChartConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n protected readonly searchIcon = searchIcon;\n protected readonly chartPieIcon = chartPieIcon;\n\n // State\n isLoadingInitial = false;\n isLoadingColumns = false;\n\n // Data source types\n dataSourceTypes = [\n { value: 'persistentQuery', label: 'Query' },\n { value: 'constructionKitQuery', label: 'Construction Kit Query' }\n ];\n\n // CK Query targets\n ckQueryTargets = [\n { value: 'models', label: 'Models' },\n { value: 'types', label: 'Types' },\n { value: 'attributes', label: 'Attributes' },\n { value: 'associationRoles', label: 'Association Roles' },\n { value: 'enums', label: 'Enums' },\n { value: 'records', label: 'Records' }\n ];\n\n // CK Group By options (depends on selected query target)\n ckGroupByOptions: { value: string; label: string }[] = [];\n\n // Query selection state\n selectedPersistentQuery: PersistentQueryItem | null = null;\n queryColumns: QueryColumnItem[] = [];\n\n // Filter state\n filters: FieldFilterItem[] = [];\n filterAttributes: AttributeItem[] = [];\n filterVariables: FilterVariable[] = [];\n\n // Legend position options\n legendPositions = [\n { value: 'top', label: 'Top' },\n { value: 'bottom', label: 'Bottom' },\n { value: 'left', label: 'Left' },\n { value: 'right', label: 'Right' }\n ];\n\n // Form\n form = {\n dataSourceType: 'persistentQuery' as DataSourceType,\n chartType: 'pie' as PieChartType,\n categoryField: '',\n valueField: '',\n showLabels: true,\n showLegend: true,\n legendPosition: 'right' as 'top' | 'bottom' | 'left' | 'right',\n ckQueryTarget: 'models' as CkQueryTarget,\n ckGroupBy: 'modelState'\n };\n\n get isValid(): boolean {\n if (this.form.dataSourceType === 'persistentQuery') {\n return this.selectedPersistentQuery !== null &&\n this.form.categoryField !== '' &&\n this.form.valueField !== '';\n }\n\n if (this.form.dataSourceType === 'constructionKitQuery') {\n return this.form.ckQueryTarget !== undefined &&\n this.form.ckGroupBy !== '';\n }\n\n return false;\n }\n\n async ngOnInit(): Promise<void> {\n // Initialize filter variables from MeshBoard state\n this.filterVariables = this.stateService.getVariables().map(v => ({\n name: v.name,\n label: v.label || v.name,\n type: v.type\n }));\n\n // Initialize form with initial values\n this.form.dataSourceType = this.initialDataSourceType ?? 'persistentQuery';\n this.form.chartType = this.initialChartType ?? 'pie';\n this.form.categoryField = this.initialCategoryField ?? '';\n this.form.valueField = this.initialValueField ?? '';\n this.form.showLabels = this.initialShowLabels ?? true;\n this.form.showLegend = this.initialShowLegend ?? true;\n this.form.legendPosition = this.initialLegendPosition ?? 'right';\n this.form.ckQueryTarget = this.initialCkQueryTarget ?? 'models';\n this.form.ckGroupBy = this.initialCkGroupBy ?? 'modelState';\n\n // Initialize filters\n if (this.initialFilters && this.initialFilters.length > 0) {\n this.filters = this.initialFilters.map((f, index) => ({\n id: index + 1,\n attributePath: f.attributePath,\n operator: f.operator as FieldFilterOperatorsDto,\n comparisonValue: f.comparisonValue\n }));\n }\n\n // Initialize CK group by options\n this.updateCkGroupByOptions(this.form.ckQueryTarget);\n\n // If editing with initial query, load it after view init\n if (this.form.dataSourceType === 'persistentQuery' && this.initialQueryRtId) {\n this.isLoadingInitial = true;\n // Defer to allow QuerySelectorComponent to initialize\n setTimeout(async () => {\n if (this.querySelector) {\n const query = await this.querySelector.selectByRtId(this.initialQueryRtId!);\n if (query) {\n this.selectedPersistentQuery = query;\n await this.loadQueryColumns(query.rtId);\n if (query.queryCkTypeId) {\n await this.loadFilterAttributes(query.queryCkTypeId);\n }\n }\n }\n this.isLoadingInitial = false;\n }, 100);\n }\n }\n\n onDataSourceTypeChange(dataSourceType: DataSourceType): void {\n this.form.dataSourceType = dataSourceType;\n\n // Reset related fields when changing data source type\n if (dataSourceType !== 'persistentQuery') {\n this.selectedPersistentQuery = null;\n this.queryColumns = [];\n this.filterAttributes = [];\n this.filters = [];\n this.form.categoryField = '';\n this.form.valueField = '';\n }\n }\n\n onCkQueryTargetChange(target: CkQueryTarget): void {\n this.form.ckQueryTarget = target;\n this.updateCkGroupByOptions(target);\n }\n\n private updateCkGroupByOptions(target: CkQueryTarget): void {\n // Set group by options based on query target\n switch (target) {\n case 'models':\n this.ckGroupByOptions = [\n { value: 'modelState', label: 'Model State' }\n ];\n this.form.ckGroupBy = 'modelState';\n break;\n case 'types':\n this.ckGroupByOptions = [\n { value: 'isAbstract', label: 'Is Abstract' }\n ];\n this.form.ckGroupBy = 'isAbstract';\n break;\n default:\n this.ckGroupByOptions = [];\n this.form.ckGroupBy = '';\n break;\n }\n }\n\n async onQuerySelected(query: PersistentQueryItem | null): Promise<void> {\n this.selectedPersistentQuery = query;\n this.queryColumns = [];\n this.filterAttributes = [];\n this.filters = [];\n this.form.categoryField = '';\n this.form.valueField = '';\n\n if (query) {\n // Load query columns for field mapping\n await this.loadQueryColumns(query.rtId);\n\n // Load filter attributes from CK type\n if (query.queryCkTypeId) {\n await this.loadFilterAttributes(query.queryCkTypeId);\n }\n }\n }\n\n private async loadQueryColumns(queryRtId: string): Promise<void> {\n this.isLoadingColumns = true;\n\n try {\n const result = await firstValueFrom(this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: queryRtId,\n first: 1 // We only need columns, not data\n }\n }));\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n if (queryItems.length > 0 && queryItems[0]) {\n const columns = queryItems[0].columns ?? [];\n const filteredColumns = columns\n .filter((c): c is NonNullable<typeof c> => c !== null);\n\n // queryColumns use sanitized paths for UI display and matching with query results\n this.queryColumns = filteredColumns.map(c => ({\n attributePath: this.sanitizeFieldName(c.attributePath ?? ''),\n attributeValueType: c.attributeValueType ?? ''\n }));\n\n // Auto-select fields if only 2 columns (typical for grouped aggregations)\n if (this.queryColumns.length === 2 && !this.form.categoryField && !this.form.valueField) {\n // Assume first column is category, second is value (typical pattern)\n const numericTypes = ['INTEGER', 'FLOAT', 'DOUBLE', 'DECIMAL', 'LONG'];\n const valueColumn = this.queryColumns.find(c => numericTypes.includes(c.attributeValueType));\n const categoryColumn = this.queryColumns.find(c => c !== valueColumn);\n\n if (valueColumn && categoryColumn) {\n this.form.valueField = valueColumn.attributePath;\n this.form.categoryField = categoryColumn.attributePath;\n }\n }\n }\n } catch (error) {\n console.error('Error loading query columns:', error);\n this.queryColumns = [];\n } finally {\n this.isLoadingColumns = false;\n }\n }\n\n /**\n * Loads all available filter attributes from the CK type.\n * Uses getCkTypeAvailableQueryColumns to get all attributes, not just query result columns.\n */\n private async loadFilterAttributes(queryCkTypeId: string): Promise<void> {\n try {\n const result = await firstValueFrom(this.getCkTypeAvailableQueryColumnsGQL.fetch({\n variables: { rtCkId: queryCkTypeId, first: 1000 }\n }));\n\n const columns = result.data?.constructionKit?.types?.items?.[0]?.availableQueryColumns?.items || [];\n this.filterAttributes = columns\n .filter((c): c is NonNullable<typeof c> => c !== null)\n .map(c => ({\n attributePath: c.attributePath || '',\n attributeValueType: c.attributeValueType\n }));\n } catch (error) {\n console.error('Error loading filter attributes:', error);\n this.filterAttributes = [];\n }\n }\n\n private sanitizeFieldName(fieldName: string): string {\n return fieldName.replace(/\\./g, '_');\n }\n\n onFiltersChange(updatedFilters: FieldFilterItem[]): void {\n this.filters = updatedFilters;\n }\n\n onSave(): void {\n // Convert filters to DTO format\n const filtersDto: FieldFilterDto[] | undefined = this.filters.length > 0\n ? this.filters.map(f => ({\n attributePath: f.attributePath,\n operator: f.operator,\n comparisonValue: f.comparisonValue\n }))\n : undefined;\n\n const result: PieChartConfigResult = {\n ckTypeId: '', // Not used for pie chart\n rtId: '', // Not used for pie chart\n dataSourceType: this.form.dataSourceType,\n chartType: this.form.chartType,\n categoryField: this.form.categoryField,\n valueField: this.form.valueField,\n showLabels: this.form.showLabels,\n showLegend: this.form.showLegend,\n legendPosition: this.form.legendPosition,\n filters: filtersDto\n };\n\n if (this.form.dataSourceType === 'persistentQuery') {\n if (!this.selectedPersistentQuery) return;\n result.queryRtId = this.selectedPersistentQuery.rtId;\n result.queryName = this.selectedPersistentQuery.name;\n } else if (this.form.dataSourceType === 'constructionKitQuery') {\n result.ckQueryTarget = this.form.ckQueryTarget;\n result.ckGroupBy = this.form.ckGroupBy;\n }\n\n this.save.emit(result);\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BarChartWidgetConfig, BarChartType, PersistentQueryDataSource, WidgetFilterConfig } from '../../models/meshboard.models';\nimport { DashboardWidget } from '../widget.interface';\nimport { WidgetNotConfiguredComponent } from '../../components/widget-not-configured/widget-not-configured.component';\nimport { ChartsModule } from '@progress/kendo-angular-charts';\nimport { ExecuteRuntimeQueryDtoGQL } from '../../graphQL/executeRuntimeQuery';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { MeshBoardVariableService } from '../../services/meshboard-variable.service';\nimport { catchError, firstValueFrom } from 'rxjs';\nimport { FieldFilterDto } from '@meshmakers/octo-services';\n\n/**\n * Series data for the bar chart\n */\ninterface SeriesData {\n name: string;\n data: number[];\n color?: string;\n}\n\n/**\n * Mapping from our chart types to Kendo chart configuration\n */\ninterface KendoChartConfig {\n type: 'column' | 'bar';\n stack: boolean | string;\n}\n\nconst CHART_TYPE_MAPPING: Record<BarChartType, KendoChartConfig> = {\n column: { type: 'column', stack: false },\n bar: { type: 'bar', stack: false },\n stackedColumn: { type: 'column', stack: true },\n stackedBar: { type: 'bar', stack: true },\n stackedColumn100: { type: 'column', stack: '100%' },\n stackedBar100: { type: 'bar', stack: '100%' }\n};\n\n@Component({\n selector: 'mm-bar-chart-widget',\n standalone: true,\n imports: [\n CommonModule,\n ChartsModule,\n WidgetNotConfiguredComponent\n ],\n template: `\n <div class=\"bar-chart-widget\" [class.loading]=\"isLoading()\" [class.error]=\"error()\">\n @if (isNotConfigured()) {\n <mm-widget-not-configured></mm-widget-not-configured>\n } @else if (isLoading()) {\n <div class=\"loading-indicator\">\n <span>...</span>\n </div>\n } @else if (error()) {\n <div class=\"error-message\">\n <span>{{ error() }}</span>\n </div>\n } @else {\n <kendo-chart class=\"chart-container\">\n <kendo-chart-category-axis>\n <kendo-chart-category-axis-item [categories]=\"categories()\">\n <kendo-chart-category-axis-item-labels\n [rotation]=\"labelRotation()\">\n </kendo-chart-category-axis-item-labels>\n </kendo-chart-category-axis-item>\n </kendo-chart-category-axis>\n\n <kendo-chart-series>\n @for (series of seriesData(); track series.name) {\n <kendo-chart-series-item\n [type]=\"kendoChartType()\"\n [data]=\"series.data\"\n [name]=\"series.name\"\n [color]=\"series.color\"\n [stack]=\"stackConfig()\">\n @if (config.showDataLabels) {\n <kendo-chart-series-item-labels\n [visible]=\"true\"\n [format]=\"'{0:n0}'\">\n </kendo-chart-series-item-labels>\n }\n </kendo-chart-series-item>\n }\n </kendo-chart-series>\n\n <kendo-chart-legend\n [visible]=\"config.showLegend !== false\"\n [position]=\"config.legendPosition ?? 'right'\">\n </kendo-chart-legend>\n\n <kendo-chart-tooltip>\n <ng-template kendoChartSeriesTooltipTemplate let-value=\"value\" let-category=\"category\" let-series=\"series\">\n <div class=\"chart-tooltip\">\n <strong>{{ category }}</strong><br/>\n {{ series.name }}: {{ formatValue(value) }}\n </div>\n </ng-template>\n </kendo-chart-tooltip>\n </kendo-chart>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .bar-chart-widget {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 8px;\n box-sizing: border-box;\n overflow: hidden;\n }\n\n .bar-chart-widget.loading,\n .bar-chart-widget.error {\n opacity: 0.7;\n }\n\n .loading-indicator,\n .error-message,\n .no-config-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n }\n\n .loading-indicator span {\n font-size: 1.5rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .error-message span {\n color: var(--kendo-color-error, #dc3545);\n font-size: 0.875rem;\n }\n\n .no-config-overlay span {\n color: var(--kendo-color-subtle, #6c757d);\n font-style: italic;\n }\n\n .chart-container {\n width: 100%;\n height: 100%;\n }\n\n kendo-chart {\n width: 100%;\n height: 100%;\n }\n\n .chart-tooltip {\n padding: 4px 8px;\n }\n `]\n})\nexport class BarChartWidgetComponent implements DashboardWidget<BarChartWidgetConfig, SeriesData[]>, OnInit, OnChanges {\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n private readonly stateService = inject(MeshBoardStateService);\n private readonly variableService = inject(MeshBoardVariableService);\n\n @Input() config!: BarChartWidgetConfig;\n\n // Widget state signals\n private readonly _isLoading = signal(false);\n private readonly _categories = signal<string[]>([]);\n private readonly _seriesData = signal<SeriesData[]>([]);\n private readonly _error = signal<string | null>(null);\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly categories = this._categories.asReadonly();\n readonly seriesData = this._seriesData.asReadonly();\n readonly error = this._error.asReadonly();\n\n readonly data = computed(() => this._seriesData());\n\n /**\n * Check if widget is not configured (needs data source setup).\n * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.\n */\n isNotConfigured(): boolean {\n const dataSource = this.config?.dataSource;\n if (!dataSource) return true;\n\n if (dataSource.type === 'persistentQuery') {\n const ds = dataSource as PersistentQueryDataSource;\n if (!ds.queryRtId || !this.config?.categoryField) return true;\n\n // Dynamic Series Mode: seriesGroupField + valueField\n if (this.config?.seriesGroupField && this.config?.valueField) {\n return false;\n }\n\n // Static Series Mode: series array with at least one entry\n return !(this.config?.series?.length > 0);\n }\n\n return true; // Unknown data source type\n }\n\n readonly kendoChartType = computed(() => {\n const chartType = this.config?.chartType ?? 'column';\n return CHART_TYPE_MAPPING[chartType]?.type ?? 'column';\n });\n\n readonly stackConfig = computed(() => {\n const chartType = this.config?.chartType ?? 'column';\n return CHART_TYPE_MAPPING[chartType]?.stack ?? false;\n });\n\n readonly labelRotation = computed(() => {\n // Rotate labels for column charts if many categories\n const isColumn = this.kendoChartType() === 'column';\n const categoryCount = this._categories().length;\n return isColumn && categoryCount > 5 ? -45 : 0;\n });\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadData();\n }\n }\n\n refresh(): void {\n this.loadData();\n }\n\n hasValidConfig(): boolean {\n if (!this.config?.dataSource) return false;\n\n if (this.config.dataSource.type === 'persistentQuery') {\n const ds = this.config.dataSource as PersistentQueryDataSource;\n if (!ds.queryRtId || !this.config.categoryField) return false;\n\n // Dynamic Series Mode: seriesGroupField + valueField\n if (this.config.seriesGroupField && this.config.valueField) {\n return true;\n }\n\n // Static Series Mode: series array with at least one entry\n return !!(this.config.series?.length > 0);\n }\n\n return false;\n }\n\n /**\n * Checks if using dynamic series mode (seriesGroupField + valueField)\n */\n private isDynamicSeriesMode(): boolean {\n return !!(this.config.seriesGroupField && this.config.valueField);\n }\n\n formatValue(value: number): string {\n return value.toLocaleString('de-AT', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2\n });\n }\n\n private async loadData(): Promise<void> {\n // Skip loading if widget is not configured - isNotConfigured() handles the display\n if (this.isNotConfigured()) {\n return;\n }\n\n // Note: isNotConfigured() check ensures dataSource and queryRtId are set\n const queryDataSource = this.config.dataSource as PersistentQueryDataSource;\n\n this._isLoading.set(true);\n this._error.set(null);\n\n try {\n // Convert widget filters to GraphQL format\n const fieldFilter = this.convertFiltersToDto(this.config.filters);\n\n const result = await firstValueFrom(\n this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: queryDataSource.queryRtId,\n first: 100, // Limit for bar chart\n fieldFilter\n }\n }).pipe(\n catchError(err => {\n console.error('Error loading Bar Chart data:', err);\n throw err;\n })\n )\n );\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n\n if (queryItems.length === 0) {\n this._categories.set([]);\n this._seriesData.set([]);\n this._isLoading.set(false);\n return;\n }\n\n const queryResult = queryItems[0];\n if (!queryResult) {\n this._categories.set([]);\n this._seriesData.set([]);\n this._isLoading.set(false);\n return;\n }\n\n // Extract rows\n const rows = queryResult.rows?.items ?? [];\n const supportedRowTypes = ['RtSimpleQueryRow', 'RtAggregationQueryRow', 'RtGroupingAggregationQueryRow'];\n\n const filteredRows = rows\n .filter((row): row is NonNullable<typeof row> => row !== null)\n .filter(row => supportedRowTypes.includes(row.__typename ?? ''));\n\n // Process data based on mode\n if (this.isDynamicSeriesMode()) {\n this.processDynamicSeriesData(filteredRows);\n } else {\n this.processStaticSeriesData(filteredRows);\n }\n\n this._isLoading.set(false);\n\n } catch (err) {\n console.error('Error loading Bar Chart data:', err);\n this._error.set('Failed to load data');\n this._isLoading.set(false);\n }\n }\n\n /**\n * Processes data in Static Series Mode.\n * Each series in config.series corresponds to a separate numeric field.\n */\n private processStaticSeriesData(filteredRows: unknown[]): void {\n const categories: string[] = [];\n const seriesMap = new Map<string, number[]>();\n\n // Initialize series map from config\n for (const seriesConfig of (this.config.series ?? [])) {\n seriesMap.set(seriesConfig.field, []);\n }\n\n for (const row of filteredRows) {\n const queryRow = row as { cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null };\n const cells = queryRow.cells?.items ?? [];\n\n let categoryValue = '';\n const rowValues = new Map<string, number>();\n\n for (const cell of cells) {\n if (!cell?.attributePath) continue;\n\n const sanitizedPath = this.sanitizeFieldName(cell.attributePath);\n\n if (sanitizedPath === this.sanitizeFieldName(this.config.categoryField)) {\n categoryValue = String(cell.value ?? '');\n }\n\n // Check if this cell is one of our series fields\n for (const seriesConfig of (this.config.series ?? [])) {\n if (sanitizedPath === this.sanitizeFieldName(seriesConfig.field)) {\n const numValue = typeof cell.value === 'number' ? cell.value : parseFloat(String(cell.value));\n rowValues.set(seriesConfig.field, isNaN(numValue) ? 0 : numValue);\n }\n }\n }\n\n if (categoryValue !== '') {\n categories.push(categoryValue);\n\n // Add values for each series\n for (const seriesConfig of (this.config.series ?? [])) {\n const value = rowValues.get(seriesConfig.field) ?? 0;\n seriesMap.get(seriesConfig.field)?.push(value);\n }\n }\n }\n\n // Convert to series data array\n const seriesData: SeriesData[] = (this.config.series ?? []).map(seriesConfig => ({\n name: seriesConfig.name ?? seriesConfig.field,\n data: seriesMap.get(seriesConfig.field) ?? [],\n color: seriesConfig.color\n }));\n\n this._categories.set(categories);\n this._seriesData.set(seriesData);\n }\n\n /**\n * Processes data in Dynamic Series Mode.\n * Series are created dynamically from unique values of seriesGroupField.\n * Each row represents a combination of category + series group + value.\n *\n * Example data structure:\n * - Row 1: { legalEntityType: 'Company', billingType: 'Credit', quantity: 261721 }\n * - Row 2: { legalEntityType: 'Company', billingType: 'Debit', quantity: 65263 }\n * - ...\n *\n * Results in:\n * - Categories: ['Company', 'LegalPerson', 'LocalAuthority', 'NaturalPerson']\n * - Series 'Credit': [261721, 70343, 23140, 189794]\n * - Series 'Debit': [65263, 60153, 159636, 108225]\n */\n private processDynamicSeriesData(filteredRows: unknown[]): void {\n const categoryField = this.config.categoryField;\n const seriesGroupField = this.config.seriesGroupField!;\n const valueField = this.config.valueField!;\n\n // Build a map: category -> seriesGroup -> value\n const dataMap = new Map<string, Map<string, number>>();\n const allCategories = new Set<string>();\n const allSeriesGroups = new Set<string>();\n\n for (const row of filteredRows) {\n const queryRow = row as { cells?: { items?: ({ attributePath?: string; value?: unknown } | null)[] | null } | null };\n const cells = queryRow.cells?.items ?? [];\n\n let categoryValue = '';\n let seriesGroupValue = '';\n let numericValue = 0;\n\n for (const cell of cells) {\n if (!cell?.attributePath) continue;\n\n const sanitizedPath = this.sanitizeFieldName(cell.attributePath);\n\n if (sanitizedPath === this.sanitizeFieldName(categoryField)) {\n categoryValue = String(cell.value ?? '');\n } else if (sanitizedPath === this.sanitizeFieldName(seriesGroupField)) {\n seriesGroupValue = String(cell.value ?? '');\n } else if (sanitizedPath === this.sanitizeFieldName(valueField)) {\n const val = cell.value;\n numericValue = typeof val === 'number' ? val : parseFloat(String(val));\n if (isNaN(numericValue)) numericValue = 0;\n }\n }\n\n if (categoryValue && seriesGroupValue) {\n allCategories.add(categoryValue);\n allSeriesGroups.add(seriesGroupValue);\n\n if (!dataMap.has(categoryValue)) {\n dataMap.set(categoryValue, new Map());\n }\n dataMap.get(categoryValue)!.set(seriesGroupValue, numericValue);\n }\n }\n\n // Convert to arrays (maintain insertion order)\n const categories = Array.from(allCategories);\n const seriesGroups = Array.from(allSeriesGroups);\n\n // Build series data\n const seriesData: SeriesData[] = seriesGroups.map(seriesGroup => {\n const data = categories.map(category => {\n return dataMap.get(category)?.get(seriesGroup) ?? 0;\n });\n\n return {\n name: seriesGroup,\n data\n };\n });\n\n this._categories.set(categories);\n this._seriesData.set(seriesData);\n }\n\n /**\n * Sanitizes field names for comparison.\n * Replaces dots with underscores (same as table widget).\n */\n private sanitizeFieldName(fieldName: string): string {\n return fieldName.replace(/\\./g, '_');\n }\n\n /**\n * Converts widget filter configuration to GraphQL FieldFilterDto format.\n * Resolves MeshBoard variables in filter values before conversion.\n */\n private convertFiltersToDto(filters?: WidgetFilterConfig[]): FieldFilterDto[] | undefined {\n const variables = this.stateService.getVariables();\n return this.variableService.convertToFieldFilterDto(filters, variables);\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, inject, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { firstValueFrom } from 'rxjs';\nimport { BarChartType, BarChartSeries, WidgetFilterConfig } from '../../models/meshboard.models';\nimport { ExecuteRuntimeQueryDtoGQL } from '../../graphQL/executeRuntimeQuery';\nimport { WidgetConfigResult } from '../../services/widget-registry.service';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { FieldFilterEditorComponent, FieldFilterItem, FilterVariable } from '@meshmakers/octo-ui';\nimport { FieldFilterDto, FieldFilterOperatorsDto, AttributeItem, GetCkTypeAvailableQueryColumnsDtoGQL } from '@meshmakers/octo-services';\nimport { PersistentQueryItem, QueryColumnItem } from '../../utils/runtime-entity-data-sources';\nimport { QuerySelectorComponent } from '../../components/query-selector/query-selector.component';\n\n/**\n * Series configuration mode\n */\nexport type SeriesMode = 'static' | 'dynamic';\n\n/**\n * Configuration result from the Bar Chart dialog\n */\nexport interface BarChartConfigResult extends WidgetConfigResult {\n queryRtId: string;\n queryName?: string;\n chartType: BarChartType;\n categoryField: string;\n series: BarChartSeries[];\n /** Series Group Field for dynamic series mode */\n seriesGroupField?: string;\n /** Value Field for dynamic series mode */\n valueField?: string;\n showLegend: boolean;\n legendPosition: 'top' | 'bottom' | 'left' | 'right';\n showDataLabels: boolean;\n filters?: FieldFilterDto[];\n}\n\n/**\n * Configuration dialog for Bar Chart widgets.\n * Supports column, bar, stacked, and 100% stacked chart types.\n */\n@Component({\n selector: 'mm-bar-chart-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n DropDownsModule,\n SVGIconModule,\n FieldFilterEditorComponent,\n QuerySelectorComponent\n ],\n template: `\n <kendo-dialog\n title=\"Bar Chart Configuration\"\n [minWidth]=\"500\"\n [width]=\"650\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\" [class.loading]=\"isLoadingInitial\">\n @if (isLoadingInitial) {\n <div class=\"loading-indicator\">Loading...</div>\n }\n\n <!-- Data Source Section -->\n <div class=\"config-section\">\n <h3 class=\"section-title\">Data Source</h3>\n\n <div class=\"form-field\">\n <label>Query <span class=\"required\">*</span></label>\n <mm-query-selector\n #querySelector\n [(ngModel)]=\"selectedPersistentQuery\"\n (querySelected)=\"onQuerySelected($event)\"\n placeholder=\"Select a Query...\"\n hint=\"Select a grouped aggregation query for the chart data.\">\n </mm-query-selector>\n </div>\n </div>\n\n <!-- Field Mapping Section -->\n @if (selectedPersistentQuery && queryColumns.length > 0) {\n <div class=\"config-section\">\n <h3 class=\"section-title\">Field Mapping</h3>\n\n <div class=\"form-field\">\n <label>Category Field <span class=\"required\">*</span></label>\n <kendo-combobox\n [data]=\"queryColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.categoryField\"\n placeholder=\"Select category field...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n <p class=\"field-hint\">Field used for category labels (X-axis for column charts, Y-axis for bar charts).</p>\n </div>\n\n <div class=\"form-field\">\n <label>Series Mode</label>\n <kendo-dropdownlist\n [data]=\"seriesModeOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"seriesMode\">\n </kendo-dropdownlist>\n <p class=\"field-hint\">\n @if (seriesMode === 'static') {\n Select multiple numeric fields, each becomes a separate series.\n } @else {\n Group rows by a field value to create dynamic series from your data.\n }\n </p>\n </div>\n\n @if (seriesMode === 'static') {\n <!-- Static Series Mode: Multi-select for value fields -->\n <div class=\"form-field\">\n <label>Value Fields (Series) <span class=\"required\">*</span></label>\n <kendo-multiselect\n [data]=\"numericColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"selectedSeriesFields\"\n (valueChange)=\"onSeriesFieldsChange($event)\"\n placeholder=\"Select value fields...\">\n <ng-template kendoMultiSelectItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-multiselect>\n <p class=\"field-hint\">Select one or more numeric fields. Each becomes a series in the chart.</p>\n </div>\n } @else {\n <!-- Dynamic Series Mode: Series Group Field + Value Field -->\n <div class=\"form-field\">\n <label>Series Group Field <span class=\"required\">*</span></label>\n <kendo-combobox\n [data]=\"nonNumericColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"seriesGroupField\"\n placeholder=\"Select series group field...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n <p class=\"field-hint\">Each unique value in this field becomes a separate series (e.g., 'Credit', 'Debit').</p>\n </div>\n\n <div class=\"form-field\">\n <label>Value Field <span class=\"required\">*</span></label>\n <kendo-combobox\n [data]=\"numericColumns\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"valueField\"\n placeholder=\"Select value field...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n <p class=\"field-hint\">The numeric field to display for each category/series combination.</p>\n </div>\n }\n </div>\n }\n\n <!-- Filters Section -->\n @if (filterAttributes.length > 0) {\n <div class=\"config-section\">\n <h3 class=\"section-title\">Filters</h3>\n <p class=\"section-hint\">Define filters to narrow down the data.</p>\n <mm-field-filter-editor\n [availableAttributes]=\"filterAttributes\"\n [filters]=\"filters\"\n [enableVariables]=\"filterVariables.length > 0\"\n [availableVariables]=\"filterVariables\"\n (filtersChange)=\"onFiltersChange($event)\">\n </mm-field-filter-editor>\n </div>\n }\n\n <!-- Chart Options Section -->\n <div class=\"config-section\">\n <h3 class=\"section-title\">Chart Options</h3>\n\n <div class=\"form-field\">\n <label>Chart Type</label>\n <div class=\"chart-type-grid\">\n <label class=\"radio-label\">\n <input type=\"radio\"\n name=\"chartType\"\n value=\"column\"\n [(ngModel)]=\"form.chartType\"\n kendoRadioButton />\n <span>Column</span>\n </label>\n <label class=\"radio-label\">\n <input type=\"radio\"\n name=\"chartType\"\n value=\"bar\"\n [(ngModel)]=\"form.chartType\"\n kendoRadioButton />\n <span>Bar</span>\n </label>\n <label class=\"radio-label\">\n <input type=\"radio\"\n name=\"chartType\"\n value=\"stackedColumn\"\n [(ngModel)]=\"form.chartType\"\n kendoRadioButton />\n <span>Stacked Column</span>\n </label>\n <label class=\"radio-label\">\n <input type=\"radio\"\n name=\"chartType\"\n value=\"stackedBar\"\n [(ngModel)]=\"form.chartType\"\n kendoRadioButton />\n <span>Stacked Bar</span>\n </label>\n <label class=\"radio-label\">\n <input type=\"radio\"\n name=\"chartType\"\n value=\"stackedColumn100\"\n [(ngModel)]=\"form.chartType\"\n kendoRadioButton />\n <span>100% Column</span>\n </label>\n <label class=\"radio-label\">\n <input type=\"radio\"\n name=\"chartType\"\n value=\"stackedBar100\"\n [(ngModel)]=\"form.chartType\"\n kendoRadioButton />\n <span>100% Bar</span>\n </label>\n </div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-field checkbox-field\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"form.showLegend\" kendoCheckBox />\n Show Legend\n </label>\n </div>\n\n <div class=\"form-field checkbox-field\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"form.showDataLabels\" kendoCheckBox />\n Show Data Labels\n </label>\n </div>\n </div>\n\n @if (form.showLegend) {\n <div class=\"form-field\">\n <label>Legend Position</label>\n <kendo-dropdownlist\n [data]=\"legendPositions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.legendPosition\">\n </kendo-dropdownlist>\n </div>\n }\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 16px 0;\n position: relative;\n }\n\n .config-form.loading {\n opacity: 0.7;\n pointer-events: none;\n }\n\n .loading-indicator {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n text-align: center;\n padding: 8px;\n color: var(--kendo-color-primary, #0d6efd);\n font-style: italic;\n }\n\n .config-section {\n padding: 16px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .section-title {\n margin: 0 0 16px 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .section-hint {\n margin: 0 0 12px 0;\n font-size: 0.85rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 12px;\n }\n\n .form-field:last-child {\n margin-bottom: 0;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .required {\n color: var(--kendo-color-error, #dc3545);\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .chart-type-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n }\n\n .radio-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-weight: normal;\n }\n\n .form-row {\n display: flex;\n gap: 24px;\n }\n\n .checkbox-field {\n flex-direction: row;\n align-items: center;\n }\n\n .checkbox-field label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-weight: normal;\n }\n\n .query-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .query-name {\n font-weight: 500;\n }\n\n .query-description {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .column-item {\n display: flex;\n justify-content: space-between;\n gap: 16px;\n }\n\n .column-path {\n font-weight: 500;\n }\n\n .column-type {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n `]\n})\nexport class BarChartConfigDialogComponent implements OnInit {\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n private readonly getCkTypeAvailableQueryColumnsGQL = inject(GetCkTypeAvailableQueryColumnsDtoGQL);\n private readonly stateService = inject(MeshBoardStateService);\n\n @ViewChild('querySelector') querySelector?: QuerySelectorComponent;\n\n // Initial values for editing\n @Input() initialQueryRtId?: string;\n @Input() initialQueryName?: string;\n @Input() initialChartType?: BarChartType;\n @Input() initialCategoryField?: string;\n @Input() initialSeries?: BarChartSeries[];\n @Input() initialSeriesGroupField?: string;\n @Input() initialValueField?: string;\n @Input() initialShowLegend?: boolean;\n @Input() initialLegendPosition?: 'top' | 'bottom' | 'left' | 'right';\n @Input() initialShowDataLabels?: boolean;\n @Input() initialFilters?: WidgetFilterConfig[];\n\n @Output() save = new EventEmitter<BarChartConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n // State\n isLoadingInitial = false;\n isLoadingColumns = false;\n\n // Persistent Query\n selectedPersistentQuery: PersistentQueryItem | null = null;\n queryColumns: QueryColumnItem[] = [];\n numericColumns: QueryColumnItem[] = [];\n\n // Filter state\n filters: FieldFilterItem[] = [];\n filterAttributes: AttributeItem[] = [];\n filterVariables: FilterVariable[] = [];\n\n // Series mode and fields selection\n seriesMode: SeriesMode = 'static';\n selectedSeriesFields: string[] = []; // For static mode\n seriesGroupField = ''; // For dynamic mode\n valueField = ''; // For dynamic mode\n\n // Non-numeric columns for series grouping\n nonNumericColumns: QueryColumnItem[] = [];\n\n // Series mode options\n seriesModeOptions = [\n { value: 'static', label: 'Static Series (multiple value fields)' },\n { value: 'dynamic', label: 'Dynamic Series (group by field)' }\n ];\n\n // Legend position options\n legendPositions = [\n { value: 'top', label: 'Top' },\n { value: 'bottom', label: 'Bottom' },\n { value: 'left', label: 'Left' },\n { value: 'right', label: 'Right' }\n ];\n\n // Form\n form = {\n chartType: 'column' as BarChartType,\n categoryField: '',\n showLegend: true,\n legendPosition: 'right' as 'top' | 'bottom' | 'left' | 'right',\n showDataLabels: false\n };\n\n get isValid(): boolean {\n if (this.selectedPersistentQuery === null || this.form.categoryField === '') {\n return false;\n }\n\n if (this.seriesMode === 'dynamic') {\n return this.seriesGroupField !== '' && this.valueField !== '';\n } else {\n return this.selectedSeriesFields.length > 0;\n }\n }\n\n async ngOnInit(): Promise<void> {\n // Initialize filter variables from MeshBoard state\n this.filterVariables = this.stateService.getVariables().map(v => ({\n name: v.name,\n label: v.label || v.name,\n type: v.type\n }));\n\n // Initialize form with initial values\n this.form.chartType = this.initialChartType ?? 'column';\n this.form.categoryField = this.initialCategoryField ?? '';\n this.form.showLegend = this.initialShowLegend ?? true;\n this.form.legendPosition = this.initialLegendPosition ?? 'right';\n this.form.showDataLabels = this.initialShowDataLabels ?? false;\n\n // Determine series mode from initial values\n if (this.initialSeriesGroupField && this.initialValueField) {\n this.seriesMode = 'dynamic';\n this.seriesGroupField = this.initialSeriesGroupField;\n this.valueField = this.initialValueField;\n } else {\n this.seriesMode = 'static';\n // Initialize series fields from initial series\n if (this.initialSeries && this.initialSeries.length > 0) {\n this.selectedSeriesFields = this.initialSeries.map(s => s.field);\n }\n }\n\n // Initialize filters\n if (this.initialFilters && this.initialFilters.length > 0) {\n this.filters = this.initialFilters.map((f, index) => ({\n id: index + 1,\n attributePath: f.attributePath,\n operator: f.operator as FieldFilterOperatorsDto,\n comparisonValue: f.comparisonValue\n }));\n }\n\n // If editing with initial query, load it after view init\n if (this.initialQueryRtId) {\n this.isLoadingInitial = true;\n // Defer to allow QuerySelectorComponent to initialize\n setTimeout(async () => {\n if (this.querySelector) {\n const query = await this.querySelector.selectByRtId(this.initialQueryRtId!);\n if (query) {\n this.selectedPersistentQuery = query;\n await this.loadQueryColumns(query.rtId);\n if (query.queryCkTypeId) {\n await this.loadFilterAttributes(query.queryCkTypeId);\n }\n }\n }\n this.isLoadingInitial = false;\n }, 100);\n }\n }\n\n async onQuerySelected(query: PersistentQueryItem | null): Promise<void> {\n this.selectedPersistentQuery = query;\n this.queryColumns = [];\n this.numericColumns = [];\n this.nonNumericColumns = [];\n this.filterAttributes = [];\n this.filters = [];\n this.form.categoryField = '';\n this.selectedSeriesFields = [];\n this.seriesGroupField = '';\n this.valueField = '';\n\n if (query) {\n // Load query columns for field mapping\n await this.loadQueryColumns(query.rtId);\n\n // Load filter attributes from CK type\n if (query.queryCkTypeId) {\n await this.loadFilterAttributes(query.queryCkTypeId);\n }\n }\n }\n\n private async loadQueryColumns(queryRtId: string): Promise<void> {\n this.isLoadingColumns = true;\n\n try {\n const result = await firstValueFrom(this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: queryRtId,\n first: 1 // We only need columns, not data\n }\n }));\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n if (queryItems.length > 0 && queryItems[0]) {\n const columns = queryItems[0].columns ?? [];\n const filteredColumns = columns\n .filter((c): c is NonNullable<typeof c> => c !== null);\n\n // queryColumns use sanitized paths for UI display and matching with query results\n this.queryColumns = filteredColumns.map(c => ({\n attributePath: this.sanitizeFieldName(c.attributePath ?? ''),\n attributeValueType: c.attributeValueType ?? ''\n }));\n\n // Filter numeric and non-numeric columns\n const numericTypes = ['INTEGER', 'FLOAT', 'DOUBLE', 'DECIMAL', 'LONG'];\n this.numericColumns = this.queryColumns.filter(c =>\n numericTypes.includes(c.attributeValueType)\n );\n this.nonNumericColumns = this.queryColumns.filter(c =>\n !numericTypes.includes(c.attributeValueType)\n );\n\n // Auto-select fields if possible and not editing\n if (!this.initialQueryRtId && this.queryColumns.length >= 2) {\n // Find first non-numeric column for category\n const categoryColumn = this.queryColumns.find(c =>\n !numericTypes.includes(c.attributeValueType)\n );\n if (categoryColumn) {\n this.form.categoryField = categoryColumn.attributePath;\n }\n\n // Auto-select all numeric columns as series\n if (this.numericColumns.length > 0) {\n this.selectedSeriesFields = this.numericColumns.map(c => c.attributePath);\n }\n }\n }\n } catch (error) {\n console.error('Error loading query columns:', error);\n this.queryColumns = [];\n this.numericColumns = [];\n this.nonNumericColumns = [];\n } finally {\n this.isLoadingColumns = false;\n }\n }\n\n /**\n * Loads all available filter attributes from the CK type.\n * Uses getCkTypeAvailableQueryColumns to get all attributes, not just query result columns.\n */\n private async loadFilterAttributes(queryCkTypeId: string): Promise<void> {\n try {\n const result = await firstValueFrom(this.getCkTypeAvailableQueryColumnsGQL.fetch({\n variables: { rtCkId: queryCkTypeId, first: 1000 }\n }));\n\n const columns = result.data?.constructionKit?.types?.items?.[0]?.availableQueryColumns?.items || [];\n this.filterAttributes = columns\n .filter((c): c is NonNullable<typeof c> => c !== null)\n .map(c => ({\n attributePath: c.attributePath || '',\n attributeValueType: c.attributeValueType\n }));\n } catch (error) {\n console.error('Error loading filter attributes:', error);\n this.filterAttributes = [];\n }\n }\n\n private sanitizeFieldName(fieldName: string): string {\n return fieldName.replace(/\\./g, '_');\n }\n\n onSeriesFieldsChange(fields: string[]): void {\n this.selectedSeriesFields = fields;\n }\n\n onFiltersChange(updatedFilters: FieldFilterItem[]): void {\n this.filters = updatedFilters;\n }\n\n onSave(): void {\n if (!this.selectedPersistentQuery) return;\n\n // Build series array from selected fields (only for static mode)\n const series: BarChartSeries[] = this.seriesMode === 'static'\n ? this.selectedSeriesFields.map(field => {\n // Check if we have initial series with custom names/colors\n const existingSeries = this.initialSeries?.find(s => s.field === field);\n return {\n field,\n name: existingSeries?.name,\n color: existingSeries?.color\n };\n })\n : [];\n\n // Convert filters to DTO format\n const filtersDto: FieldFilterDto[] | undefined = this.filters.length > 0\n ? this.filters.map(f => ({\n attributePath: f.attributePath,\n operator: f.operator,\n comparisonValue: f.comparisonValue\n }))\n : undefined;\n\n const result: BarChartConfigResult = {\n ckTypeId: '',\n rtId: '',\n queryRtId: this.selectedPersistentQuery.rtId,\n queryName: this.selectedPersistentQuery.name,\n chartType: this.form.chartType,\n categoryField: this.form.categoryField,\n series,\n showLegend: this.form.showLegend,\n legendPosition: this.form.legendPosition,\n showDataLabels: this.form.showDataLabels,\n filters: filtersDto\n };\n\n // Add dynamic series fields if in dynamic mode\n if (this.seriesMode === 'dynamic') {\n result.seriesGroupField = this.seriesGroupField;\n result.valueField = this.valueField;\n }\n\n this.save.emit(result);\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, signal, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { StatsGridWidgetConfig, AggregationDataSource } from '../../models/meshboard.models';\nimport { MeshBoardDataService } from '../../services/meshboard-data.service';\nimport { WidgetNotConfiguredComponent } from '../../components/widget-not-configured/widget-not-configured.component';\n\nexport interface StatValue {\n label: string;\n value: number | null;\n color: string;\n prefix?: string;\n suffix?: string;\n isLoading: boolean;\n}\n\n@Component({\n selector: 'mm-stats-grid-widget',\n standalone: true,\n imports: [CommonModule, WidgetNotConfiguredComponent],\n templateUrl: './stats-grid-widget.component.html',\n styleUrl: './stats-grid-widget.component.scss'\n})\nexport class StatsGridWidgetComponent implements OnInit, OnChanges {\n private readonly dataService = inject(MeshBoardDataService);\n\n @Input() config!: StatsGridWidgetConfig;\n\n private readonly _isLoading = signal(false);\n private readonly _error = signal<string | null>(null);\n private readonly _statValues = signal<StatValue[]>([]);\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly error = this._error.asReadonly();\n readonly statValues = this._statValues.asReadonly();\n\n /**\n * Check if widget is not configured (needs stats configuration).\n * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.\n */\n isNotConfigured(): boolean {\n return !this.config?.stats?.length;\n }\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadData();\n }\n }\n\n refresh(): void {\n this.loadData();\n }\n\n private async loadData(): Promise<void> {\n // Skip loading if widget is not configured - isNotConfigured() handles the display\n if (this.isNotConfigured()) {\n return;\n }\n\n // Initialize stat values with loading state\n const initialValues: StatValue[] = this.config.stats.map(stat => ({\n label: stat.label,\n value: null,\n color: this.getColorClass(stat.color),\n prefix: stat.prefix,\n suffix: stat.suffix,\n isLoading: true\n }));\n this._statValues.set(initialValues);\n this._isLoading.set(true);\n this._error.set(null);\n\n try {\n const dataSource = this.config.dataSource as AggregationDataSource;\n if (dataSource?.type !== 'aggregation' || !dataSource.queries?.length) {\n // No aggregation queries configured - show zeros\n this._statValues.set(initialValues.map(v => ({ ...v, value: 0, isLoading: false })));\n return;\n }\n\n // Load all aggregation queries\n const results = await this.dataService.fetchAggregations(dataSource.queries);\n\n // Map results to stat values\n const updatedValues: StatValue[] = this.config.stats.map(stat => {\n const result = results.get(stat.queryId);\n return {\n label: stat.label,\n value: result ?? null,\n color: this.getColorClass(stat.color),\n prefix: stat.prefix,\n suffix: stat.suffix,\n isLoading: false\n };\n });\n\n this._statValues.set(updatedValues);\n } catch (err) {\n this._error.set(err instanceof Error ? err.message : 'Failed to load stats');\n // Set all to error state\n this._statValues.set(initialValues.map(v => ({ ...v, value: null, isLoading: false })));\n } finally {\n this._isLoading.set(false);\n }\n }\n\n private getColorClass(color?: string): string {\n switch (color) {\n case 'mint': return 'stat-mint';\n case 'cyan': return 'stat-cyan';\n case 'violet': return 'stat-violet';\n case 'toffee': return 'stat-toffee';\n case 'lilac': return 'stat-lilac';\n case 'bubblegum': return 'stat-bubblegum';\n default: return 'stat-default';\n }\n }\n\n formatValue(stat: StatValue): string {\n if (stat.value === null) return '-';\n\n let formatted = stat.value.toLocaleString();\n if (stat.prefix) formatted = stat.prefix + formatted;\n if (stat.suffix) formatted = formatted + stat.suffix;\n return formatted;\n }\n\n get gridColumns(): number {\n return this.config?.columns ?? 3;\n }\n}\n","<div class=\"stats-grid\" [style.--grid-columns]=\"gridColumns\">\n @if (isNotConfigured()) {\n <mm-widget-not-configured></mm-widget-not-configured>\n }\n @for (stat of statValues(); track stat.label) {\n <div class=\"stat-card\" [class]=\"stat.color\">\n @if (stat.isLoading) {\n <div class=\"stat-value loading\">...</div>\n } @else {\n <div class=\"stat-value\">{{ formatValue(stat) }}</div>\n }\n <div class=\"stat-label\">{{ stat.label }}</div>\n </div>\n }\n\n @if (error()) {\n <div class=\"stats-error\">\n {{ error() }}\n </div>\n }\n</div>\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { WidgetConfigResult } from '../../services/widget-registry.service';\nimport { StatItem, StatColor, AggregationQuery, AggregationType } from '../../models/meshboard.models';\n\nexport interface StatsGridConfigResult extends WidgetConfigResult {\n ckTypeId: string;\n stats: StatItem[];\n queries: AggregationQuery[];\n columns: number;\n}\n\ninterface ColorOption {\n value: StatColor;\n label: string;\n color: string;\n}\n\ninterface CkTypeOption {\n value: string;\n label: string;\n}\n\ninterface EditableStat {\n id: string;\n label: string;\n ckTypeId: string;\n aggregation: AggregationType;\n color: StatColor;\n prefix?: string;\n suffix?: string;\n}\n\n@Component({\n selector: 'mm-stats-grid-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n DropDownsModule\n ],\n template: `\n <kendo-dialog\n title=\"Stats Grid Configuration\"\n [minWidth]=\"600\"\n [width]=\"700\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\">\n <!-- Grid Columns -->\n <div class=\"form-field\">\n <label>Grid Columns</label>\n <kendo-numerictextbox\n [(ngModel)]=\"form.columns\"\n [min]=\"1\"\n [max]=\"6\"\n [step]=\"1\"\n [format]=\"'n0'\">\n </kendo-numerictextbox>\n <p class=\"field-hint\">Number of columns in the grid (1-6).</p>\n </div>\n\n <!-- Stats List -->\n <div class=\"form-section\">\n <div class=\"section-header\">\n <h4>Statistics</h4>\n <button kendoButton [icon]=\"'plus'\" (click)=\"addStat()\">Add Stat</button>\n </div>\n\n @if (form.stats.length === 0) {\n <div class=\"empty-state\">\n No statistics configured. Click \"Add Stat\" to add one.\n </div>\n }\n\n @for (stat of form.stats; track stat.id; let i = $index) {\n <div class=\"stat-item\">\n <div class=\"stat-header\">\n <span class=\"stat-number\">#{{ i + 1 }}</span>\n <button\n kendoButton\n [icon]=\"'trash'\"\n [fillMode]=\"'flat'\"\n [themeColor]=\"'error'\"\n (click)=\"removeStat(i)\">\n </button>\n </div>\n\n <div class=\"stat-form\">\n <div class=\"form-row\">\n <div class=\"form-field flex-2\">\n <label>Label <span class=\"required\">*</span></label>\n <kendo-textbox\n [(ngModel)]=\"stat.label\"\n placeholder=\"e.g., Types\">\n </kendo-textbox>\n </div>\n <div class=\"form-field flex-1\">\n <label>Color</label>\n <kendo-dropdownlist\n [data]=\"colorOptions\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"stat.color\">\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n <div class=\"color-item\">\n <span class=\"color-swatch\" [style.background]=\"dataItem.color\"></span>\n <span>{{ dataItem.label }}</span>\n </div>\n </ng-template>\n <ng-template kendoDropDownListValueTemplate let-dataItem>\n @if (dataItem) {\n <div class=\"color-item\">\n <span class=\"color-swatch\" [style.background]=\"dataItem.color\"></span>\n <span>{{ dataItem.label }}</span>\n </div>\n }\n </ng-template>\n </kendo-dropdownlist>\n </div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-field flex-2\">\n <label>CK Type <span class=\"required\">*</span></label>\n <kendo-dropdownlist\n [data]=\"ckTypeOptions\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"stat.ckTypeId\"\n [filterable]=\"true\"\n (filterChange)=\"onCkTypeFilter($event)\">\n </kendo-dropdownlist>\n </div>\n <div class=\"form-field flex-1\">\n <label>Aggregation</label>\n <kendo-dropdownlist\n [data]=\"aggregationOptions\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"stat.aggregation\">\n </kendo-dropdownlist>\n </div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label>Prefix</label>\n <kendo-textbox\n [(ngModel)]=\"stat.prefix\"\n placeholder=\"e.g., $\">\n </kendo-textbox>\n </div>\n <div class=\"form-field flex-1\">\n <label>Suffix</label>\n <kendo-textbox\n [(ngModel)]=\"stat.suffix\"\n placeholder=\"e.g., %\">\n </kendo-textbox>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 16px 0;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-field.flex-1 {\n flex: 1;\n }\n\n .form-field.flex-2 {\n flex: 2;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .form-section {\n padding: 16px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .section-header h4 {\n margin: 0;\n font-size: 0.95rem;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .form-row {\n display: flex;\n gap: 16px;\n }\n\n .required {\n color: var(--kendo-color-error, #dc3545);\n }\n\n .empty-state {\n text-align: center;\n padding: 24px;\n color: var(--kendo-color-subtle, #6c757d);\n font-style: italic;\n }\n\n .stat-item {\n padding: 16px;\n margin-bottom: 12px;\n background: var(--kendo-color-surface, #ffffff);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .stat-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n }\n\n .stat-number {\n font-weight: 600;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .stat-form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .color-item {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .color-swatch {\n width: 16px;\n height: 16px;\n border-radius: 3px;\n border: 1px solid rgba(0,0,0,0.1);\n }\n `]\n})\nexport class StatsGridConfigDialogComponent implements OnInit {\n @Input() initialStats?: StatItem[];\n @Input() initialQueries?: AggregationQuery[];\n @Input() initialColumns?: number;\n\n @Output() save = new EventEmitter<StatsGridConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n colorOptions: ColorOption[] = [\n { value: 'mint', label: 'Mint', color: '#98d9c2' },\n { value: 'cyan', label: 'Cyan', color: '#5bc0be' },\n { value: 'violet', label: 'Violet', color: '#9b5de5' },\n { value: 'toffee', label: 'Toffee', color: '#f4a261' },\n { value: 'lilac', label: 'Lilac', color: '#c9b1ff' },\n { value: 'bubblegum', label: 'Bubblegum', color: '#ff99c8' },\n { value: 'default', label: 'Default', color: '#6c757d' }\n ];\n\n ckTypeOptions: CkTypeOption[] = [\n { value: 'ConstructionKit/CkModel', label: 'CK Models' },\n { value: 'ConstructionKit/CkType', label: 'CK Types' },\n { value: 'ConstructionKit/CkAttribute', label: 'CK Attributes' },\n { value: 'ConstructionKit/CkAssociationRole', label: 'CK Association Roles' },\n { value: 'ConstructionKit/CkEnum', label: 'CK Enums' },\n { value: 'ConstructionKit/CkRecord', label: 'CK Records' }\n ];\n\n filteredCkTypeOptions: CkTypeOption[] = [];\n\n aggregationOptions: AggregationType[] = ['count', 'sum', 'avg', 'min', 'max'];\n\n form = {\n columns: 3,\n stats: [] as EditableStat[]\n };\n\n private nextId = 1;\n\n get isValid(): boolean {\n if (this.form.stats.length === 0) return false;\n return this.form.stats.every(stat =>\n stat.label?.trim() && stat.ckTypeId?.trim()\n );\n }\n\n ngOnInit(): void {\n this.filteredCkTypeOptions = [...this.ckTypeOptions];\n this.form.columns = this.initialColumns ?? 3;\n\n // Convert initial stats and queries to editable format\n if (this.initialStats && this.initialQueries) {\n this.form.stats = this.initialStats.map(stat => {\n const query = this.initialQueries?.find(q => q.id === stat.queryId);\n return {\n id: `stat-${this.nextId++}`,\n label: stat.label,\n ckTypeId: query?.ckTypeId ?? '',\n aggregation: query?.aggregation ?? 'count',\n color: stat.color ?? 'default',\n prefix: stat.prefix,\n suffix: stat.suffix\n };\n });\n }\n }\n\n onCkTypeFilter(filter: string): void {\n const filterLower = filter.toLowerCase();\n this.filteredCkTypeOptions = this.ckTypeOptions.filter(opt =>\n opt.label.toLowerCase().includes(filterLower) ||\n opt.value.toLowerCase().includes(filterLower)\n );\n }\n\n addStat(): void {\n this.form.stats.push({\n id: `stat-${this.nextId++}`,\n label: '',\n ckTypeId: 'ConstructionKit/CkType',\n aggregation: 'count',\n color: 'default'\n });\n }\n\n removeStat(index: number): void {\n this.form.stats.splice(index, 1);\n }\n\n onSave(): void {\n // Build stats and queries from form\n const stats: StatItem[] = [];\n const queries: AggregationQuery[] = [];\n\n for (const stat of this.form.stats) {\n const queryId = `query-${stat.id}`;\n\n stats.push({\n label: stat.label,\n queryId,\n color: stat.color,\n prefix: stat.prefix,\n suffix: stat.suffix\n });\n\n queries.push({\n id: queryId,\n ckTypeId: stat.ckTypeId,\n aggregation: stat.aggregation\n });\n }\n\n this.save.emit({\n ckTypeId: '',\n stats,\n queries,\n columns: this.form.columns\n });\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, signal, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { StatusIndicatorWidgetConfig, ServiceCallDataSource } from '../../models/meshboard.models';\nimport { CkModelService } from '@meshmakers/octo-services';\nimport { WidgetNotConfiguredComponent } from '../../components/widget-not-configured/widget-not-configured.component';\n\n@Component({\n selector: 'mm-status-indicator-widget',\n standalone: true,\n imports: [CommonModule, WidgetNotConfiguredComponent],\n templateUrl: './status-indicator-widget.component.html',\n styleUrl: './status-indicator-widget.component.scss'\n})\nexport class StatusIndicatorWidgetComponent implements OnInit, OnChanges {\n private readonly ckModelService = inject(CkModelService);\n\n @Input() config!: StatusIndicatorWidgetConfig;\n\n private readonly _isLoading = signal(true);\n private readonly _error = signal<string | null>(null);\n private readonly _status = signal<boolean | null>(null);\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly error = this._error.asReadonly();\n readonly status = this._status.asReadonly();\n\n /**\n * Check if widget is not configured (needs service call setup).\n * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.\n */\n isNotConfigured(): boolean {\n const dataSource = this.config?.dataSource as ServiceCallDataSource;\n return dataSource?.type !== 'serviceCall';\n }\n\n ngOnInit(): void {\n this.loadStatus();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadStatus();\n }\n }\n\n refresh(): void {\n this.loadStatus();\n }\n\n private async loadStatus(): Promise<void> {\n // Skip loading if widget is not configured - isNotConfigured() handles the display\n if (this.isNotConfigured()) {\n return;\n }\n\n this._isLoading.set(true);\n this._error.set(null);\n\n try {\n const dataSource = this.config.dataSource as ServiceCallDataSource;\n\n switch (dataSource.callType) {\n case 'modelAvailable':\n await this.checkModelAvailable(dataSource.modelName);\n break;\n case 'healthCheck':\n // For now, just show as healthy - real implementation would call health endpoint\n this._status.set(true);\n break;\n default:\n this._status.set(false);\n }\n } catch (err) {\n this._error.set(err instanceof Error ? err.message : 'Failed to check status');\n this._status.set(false);\n } finally {\n this._isLoading.set(false);\n }\n }\n\n private async checkModelAvailable(modelName?: string): Promise<void> {\n if (!modelName) {\n this._status.set(false);\n return;\n }\n\n try {\n const isAvailable = await this.ckModelService.isModelAvailable(modelName);\n this._status.set(isAvailable);\n } catch {\n this._status.set(false);\n }\n }\n\n get statusLabel(): string {\n if (this.isLoading()) return '...';\n if (this.error()) return 'ERROR';\n\n const isActive = this.status();\n if (isActive) {\n return this.config.trueLabel ?? 'ENABLED';\n } else {\n return this.config.falseLabel ?? 'DISABLED';\n }\n }\n\n get statusColor(): string {\n if (this.isLoading() || this.error()) return 'var(--kendo-color-subtle, #6c757d)';\n\n const isActive = this.status();\n if (isActive) {\n return this.config.trueColor ?? '#10b981';\n } else {\n return this.config.falseColor ?? '#ef4444';\n }\n }\n}\n","<div class=\"status-indicator\" [class.loading]=\"isLoading()\" [class.error]=\"error()\">\n @if (isNotConfigured()) {\n <mm-widget-not-configured></mm-widget-not-configured>\n } @else {\n <div class=\"status-badge\" [style.background-color]=\"statusColor\">\n <span class=\"status-text\">{{ statusLabel }}</span>\n </div>\n\n @if (error()) {\n <div class=\"status-error\">\n {{ error() }}\n </div>\n }\n }\n</div>\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { WidgetConfigResult } from '../../services/widget-registry.service';\nimport { ServiceCallDataSource } from '../../models/meshboard.models';\n\nexport interface StatusIndicatorConfigResult extends WidgetConfigResult {\n ckTypeId: string;\n callType: ServiceCallDataSource['callType'];\n modelName?: string;\n serviceType?: ServiceCallDataSource['serviceType'];\n trueLabel?: string;\n falseLabel?: string;\n trueColor?: string;\n falseColor?: string;\n}\n\ninterface CallTypeOption {\n value: ServiceCallDataSource['callType'];\n label: string;\n}\n\ninterface ServiceTypeOption {\n value: ServiceCallDataSource['serviceType'];\n label: string;\n}\n\n@Component({\n selector: 'mm-status-indicator-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n DropDownsModule\n ],\n template: `\n <kendo-dialog\n title=\"Status Indicator Configuration\"\n [minWidth]=\"450\"\n [width]=\"500\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\">\n <!-- Check Type Selection -->\n <div class=\"form-field\">\n <label>Check Type <span class=\"required\">*</span></label>\n <kendo-dropdownlist\n [data]=\"callTypeOptions\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.callType\"\n (valueChange)=\"onCallTypeChange($event)\">\n </kendo-dropdownlist>\n <p class=\"field-hint\">Select what to check for status.</p>\n </div>\n\n <!-- Model Name (for modelAvailable) -->\n @if (form.callType === 'modelAvailable') {\n <div class=\"form-field\">\n <label>Model Name <span class=\"required\">*</span></label>\n <kendo-textbox\n [(ngModel)]=\"form.modelName\"\n placeholder=\"e.g., System.Communication\">\n </kendo-textbox>\n <p class=\"field-hint\">The Construction Kit model to check for availability.</p>\n </div>\n }\n\n <!-- Service Type (for healthCheck) -->\n @if (form.callType === 'healthCheck') {\n <div class=\"form-field\">\n <label>Service Type <span class=\"required\">*</span></label>\n <kendo-dropdownlist\n [data]=\"serviceTypeOptions\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.serviceType\">\n </kendo-dropdownlist>\n <p class=\"field-hint\">Select the service to check.</p>\n </div>\n }\n\n <!-- Display Options -->\n <div class=\"form-section\">\n <h4>Labels</h4>\n\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label>True Label</label>\n <kendo-textbox\n [(ngModel)]=\"form.trueLabel\"\n placeholder=\"ENABLED\">\n </kendo-textbox>\n </div>\n <div class=\"form-field flex-1\">\n <label>False Label</label>\n <kendo-textbox\n [(ngModel)]=\"form.falseLabel\"\n placeholder=\"DISABLED\">\n </kendo-textbox>\n </div>\n </div>\n </div>\n\n <div class=\"form-section\">\n <h4>Colors</h4>\n\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label>True Color</label>\n <kendo-colorpicker\n [(ngModel)]=\"form.trueColor\"\n [format]=\"'hex'\"\n [view]=\"'palette'\">\n </kendo-colorpicker>\n </div>\n <div class=\"form-field flex-1\">\n <label>False Color</label>\n <kendo-colorpicker\n [(ngModel)]=\"form.falseColor\"\n [format]=\"'hex'\"\n [view]=\"'palette'\">\n </kendo-colorpicker>\n </div>\n </div>\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 16px 0;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-field.flex-1 {\n flex: 1;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .form-section {\n padding: 16px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .form-section h4 {\n margin: 0 0 16px 0;\n font-size: 0.95rem;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .form-row {\n display: flex;\n gap: 16px;\n }\n\n .required {\n color: var(--kendo-color-error, #dc3545);\n }\n `]\n})\nexport class StatusIndicatorConfigDialogComponent implements OnInit {\n @Input() initialCallType?: ServiceCallDataSource['callType'];\n @Input() initialModelName?: string;\n @Input() initialServiceType?: ServiceCallDataSource['serviceType'];\n @Input() initialTrueLabel?: string;\n @Input() initialFalseLabel?: string;\n @Input() initialTrueColor?: string;\n @Input() initialFalseColor?: string;\n\n @Output() save = new EventEmitter<StatusIndicatorConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n callTypeOptions: CallTypeOption[] = [\n { value: 'modelAvailable', label: 'Model Available' },\n { value: 'healthCheck', label: 'Health Check' }\n ];\n\n serviceTypeOptions: ServiceTypeOption[] = [\n { value: 'identity', label: 'Identity Service' },\n { value: 'asset-repository', label: 'Asset Repository' },\n { value: 'bot', label: 'Bot Service' },\n { value: 'communication-controller', label: 'Communication Controller' },\n { value: 'mesh-adapter', label: 'Mesh Adapter' }\n ];\n\n form = {\n callType: 'modelAvailable' as ServiceCallDataSource['callType'],\n modelName: '',\n serviceType: 'identity' as ServiceCallDataSource['serviceType'],\n trueLabel: 'ENABLED',\n falseLabel: 'DISABLED',\n trueColor: '#10b981',\n falseColor: '#ef4444'\n };\n\n get isValid(): boolean {\n if (!this.form.callType) return false;\n if (this.form.callType === 'modelAvailable' && !this.form.modelName?.trim()) return false;\n if (this.form.callType === 'healthCheck' && !this.form.serviceType) return false;\n return true;\n }\n\n ngOnInit(): void {\n this.form.callType = this.initialCallType ?? 'modelAvailable';\n this.form.modelName = this.initialModelName ?? '';\n this.form.serviceType = this.initialServiceType ?? 'identity';\n this.form.trueLabel = this.initialTrueLabel ?? 'ENABLED';\n this.form.falseLabel = this.initialFalseLabel ?? 'DISABLED';\n this.form.trueColor = this.initialTrueColor ?? '#10b981';\n this.form.falseColor = this.initialFalseColor ?? '#ef4444';\n }\n\n onCallTypeChange(callType: ServiceCallDataSource['callType']): void {\n this.form.callType = callType;\n }\n\n onSave(): void {\n this.save.emit({\n ckTypeId: '',\n callType: this.form.callType,\n modelName: this.form.callType === 'modelAvailable' ? this.form.modelName : undefined,\n serviceType: this.form.callType === 'healthCheck' ? this.form.serviceType : undefined,\n trueLabel: this.form.trueLabel || undefined,\n falseLabel: this.form.falseLabel || undefined,\n trueColor: this.form.trueColor || undefined,\n falseColor: this.form.falseColor || undefined\n });\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n","import { Component, Input, OnInit, OnChanges, OnDestroy, SimpleChanges, signal, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { ServiceHealthWidgetConfig, ServiceCallDataSource } from '../../models/meshboard.models';\nimport { HealthService } from '@meshmakers/octo-services';\nimport { Subscription, interval } from 'rxjs';\nimport { WidgetNotConfiguredComponent } from '../../components/widget-not-configured/widget-not-configured.component';\n\nexport type HealthStatus = 'healthy' | 'unhealthy' | 'unknown' | 'loading';\n\n@Component({\n selector: 'mm-service-health-widget',\n standalone: true,\n imports: [CommonModule, WidgetNotConfiguredComponent],\n templateUrl: './service-health-widget.component.html',\n styleUrl: './service-health-widget.component.scss'\n})\nexport class ServiceHealthWidgetComponent implements OnInit, OnChanges, OnDestroy {\n private readonly healthService = inject(HealthService);\n private readonly router = inject(Router);\n\n @Input() config!: ServiceHealthWidgetConfig;\n\n private readonly _healthStatus = signal<HealthStatus>('loading');\n private readonly _error = signal<string | null>(null);\n private readonly _lastChecked = signal<Date | null>(null);\n\n readonly healthStatus = this._healthStatus.asReadonly();\n readonly error = this._error.asReadonly();\n readonly lastChecked = this._lastChecked.asReadonly();\n\n /**\n * Check if widget is not configured (needs service call setup).\n * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.\n */\n isNotConfigured(): boolean {\n const dataSource = this.config?.dataSource as ServiceCallDataSource;\n return dataSource?.type !== 'serviceCall' || dataSource?.callType !== 'healthCheck';\n }\n\n private refreshSubscription?: Subscription;\n private readonly REFRESH_INTERVAL = 30000; // 30 seconds\n\n ngOnInit(): void {\n this.checkHealth();\n this.startAutoRefresh();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.checkHealth();\n }\n }\n\n ngOnDestroy(): void {\n this.stopAutoRefresh();\n }\n\n refresh(): void {\n this.checkHealth();\n }\n\n onClick(): void {\n if (this.config.navigateOnClick && this.config.detailRoute) {\n this.router.navigate([this.config.detailRoute]);\n }\n }\n\n private startAutoRefresh(): void {\n this.refreshSubscription = interval(this.REFRESH_INTERVAL).subscribe(() => {\n this.checkHealth();\n });\n }\n\n private stopAutoRefresh(): void {\n this.refreshSubscription?.unsubscribe();\n }\n\n private async checkHealth(): Promise<void> {\n // Skip loading if widget is not configured - isNotConfigured() handles the display\n if (this.isNotConfigured()) {\n return;\n }\n\n this._healthStatus.set('loading');\n this._error.set(null);\n\n try {\n const dataSource = this.config.dataSource as ServiceCallDataSource;\n\n const isHealthy = await this.performHealthCheck(dataSource);\n this._healthStatus.set(isHealthy ? 'healthy' : 'unhealthy');\n this._lastChecked.set(new Date());\n } catch (err) {\n this._error.set(err instanceof Error ? err.message : 'Health check failed');\n this._healthStatus.set('unhealthy');\n }\n }\n\n private async performHealthCheck(dataSource: ServiceCallDataSource): Promise<boolean> {\n let healthCheck;\n\n switch (dataSource.serviceType) {\n case 'identity':\n healthCheck = await this.healthService.getIdentityServiceAsync();\n break;\n case 'asset-repository':\n healthCheck = await this.healthService.getAssetRepoServiceHealthAsync();\n break;\n case 'bot':\n healthCheck = await this.healthService.getBotServiceAsync();\n break;\n case 'communication-controller':\n healthCheck = await this.healthService.getCommunicationControllerServiceAsync();\n break;\n case 'mesh-adapter':\n healthCheck = await this.healthService.getMeshAdapterAsync();\n break;\n case 'custom':\n // Custom endpoints not yet supported\n return false;\n default:\n return false;\n }\n\n // HealthCheck is considered healthy if it exists and status is 'Healthy'\n return healthCheck?.status === 'Healthy';\n }\n\n get serviceName(): string {\n const dataSource = this.config.dataSource as ServiceCallDataSource;\n if (dataSource?.type !== 'serviceCall') return 'Unknown';\n\n switch (dataSource.serviceType) {\n case 'identity': return 'Identity';\n case 'asset-repository': return 'Asset Repository';\n case 'bot': return 'Bot';\n case 'communication-controller': return 'Communication';\n case 'mesh-adapter': return 'Mesh Adapter';\n case 'custom': return 'Custom Service';\n default: return 'Unknown';\n }\n }\n\n get statusLabel(): string {\n switch (this.healthStatus()) {\n case 'healthy': return 'Healthy';\n case 'unhealthy': return 'Unhealthy';\n case 'loading': return 'Checking...';\n default: return 'Unknown';\n }\n }\n\n get showPulse(): boolean {\n return this.config.showPulse !== false && this.healthStatus() === 'healthy';\n }\n\n get isClickable(): boolean {\n return !!this.config.navigateOnClick && !!this.config.detailRoute;\n }\n}\n","@if (isNotConfigured()) {\n <mm-widget-not-configured></mm-widget-not-configured>\n} @else {\n <div\n class=\"service-health\"\n [class.clickable]=\"isClickable\"\n [class.healthy]=\"healthStatus() === 'healthy'\"\n [class.unhealthy]=\"healthStatus() === 'unhealthy'\"\n [class.loading]=\"healthStatus() === 'loading'\"\n (click)=\"onClick()\">\n\n <div class=\"health-indicator\">\n <div class=\"pulse-ring\" [class.pulse-active]=\"showPulse\"></div>\n <div class=\"health-dot\" [class.pulse-dot]=\"showPulse\"></div>\n </div>\n\n <div class=\"health-info\">\n <div class=\"service-name\">{{ serviceName }}</div>\n <div class=\"health-status\">{{ statusLabel }}</div>\n @if (lastChecked()) {\n <div class=\"last-checked\">\n Last checked: {{ lastChecked() | date:'HH:mm:ss' }}\n </div>\n }\n </div>\n\n @if (error()) {\n <div class=\"health-error\">\n {{ error() }}\n </div>\n }\n </div>\n}\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { WidgetConfigResult } from '../../services/widget-registry.service';\nimport { ServiceCallDataSource } from '../../models/meshboard.models';\n\nexport interface ServiceHealthConfigResult extends WidgetConfigResult {\n ckTypeId: string;\n serviceType: ServiceCallDataSource['serviceType'];\n customEndpoint?: string;\n showPulse: boolean;\n navigateOnClick: boolean;\n detailRoute?: string;\n}\n\ninterface ServiceTypeOption {\n value: ServiceCallDataSource['serviceType'];\n label: string;\n}\n\n@Component({\n selector: 'mm-service-health-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n DropDownsModule\n ],\n template: `\n <kendo-dialog\n title=\"Service Health Configuration\"\n [minWidth]=\"450\"\n [width]=\"500\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\">\n <!-- Service Type Selection -->\n <div class=\"form-field\">\n <label>Service Type <span class=\"required\">*</span></label>\n <kendo-dropdownlist\n [data]=\"serviceTypeOptions\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.serviceType\"\n (valueChange)=\"onServiceTypeChange($event)\">\n </kendo-dropdownlist>\n <p class=\"field-hint\">Select the service to monitor.</p>\n </div>\n\n <!-- Custom Endpoint (only for custom service) -->\n @if (form.serviceType === 'custom') {\n <div class=\"form-field\">\n <label>Custom Endpoint <span class=\"required\">*</span></label>\n <kendo-textbox\n [(ngModel)]=\"form.customEndpoint\"\n placeholder=\"https://example.com/api/\">\n </kendo-textbox>\n <p class=\"field-hint\">The base URL for the health check (must end with /).</p>\n </div>\n }\n\n <!-- Display Options -->\n <div class=\"form-section\">\n <h4>Display Options</h4>\n\n <div class=\"form-field\">\n <kendo-switch\n [(ngModel)]=\"form.showPulse\"\n [onLabel]=\"'Yes'\"\n [offLabel]=\"'No'\">\n </kendo-switch>\n <label class=\"switch-label\">Show pulse animation when healthy</label>\n </div>\n\n <div class=\"form-field\">\n <kendo-switch\n [(ngModel)]=\"form.navigateOnClick\"\n [onLabel]=\"'Yes'\"\n [offLabel]=\"'No'\">\n </kendo-switch>\n <label class=\"switch-label\">Navigate on click</label>\n </div>\n\n @if (form.navigateOnClick) {\n <div class=\"form-field\">\n <label>Detail Route</label>\n <kendo-textbox\n [(ngModel)]=\"form.detailRoute\"\n placeholder=\"/health/identity\">\n </kendo-textbox>\n <p class=\"field-hint\">The route to navigate to when clicked.</p>\n </div>\n }\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 16px 0;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .switch-label {\n font-weight: 400 !important;\n margin-left: 8px;\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .form-section {\n padding: 16px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .form-section h4 {\n margin: 0 0 16px 0;\n font-size: 0.95rem;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .required {\n color: var(--kendo-color-error, #dc3545);\n }\n `]\n})\nexport class ServiceHealthConfigDialogComponent implements OnInit {\n @Input() initialServiceType?: ServiceCallDataSource['serviceType'];\n @Input() initialCustomEndpoint?: string;\n @Input() initialShowPulse?: boolean;\n @Input() initialNavigateOnClick?: boolean;\n @Input() initialDetailRoute?: string;\n\n @Output() save = new EventEmitter<ServiceHealthConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n serviceTypeOptions: ServiceTypeOption[] = [\n { value: 'identity', label: 'Identity Service' },\n { value: 'asset-repository', label: 'Asset Repository' },\n { value: 'bot', label: 'Bot Service' },\n { value: 'communication-controller', label: 'Communication Controller' },\n { value: 'mesh-adapter', label: 'Mesh Adapter' },\n { value: 'custom', label: 'Custom Endpoint' }\n ];\n\n form = {\n serviceType: 'identity' as ServiceCallDataSource['serviceType'],\n customEndpoint: '',\n showPulse: true,\n navigateOnClick: false,\n detailRoute: ''\n };\n\n get isValid(): boolean {\n if (!this.form.serviceType) return false;\n if (this.form.serviceType === 'custom' && !this.form.customEndpoint?.trim()) return false;\n if (this.form.navigateOnClick && !this.form.detailRoute?.trim()) return false;\n return true;\n }\n\n ngOnInit(): void {\n this.form.serviceType = this.initialServiceType ?? 'identity';\n this.form.customEndpoint = this.initialCustomEndpoint ?? '';\n this.form.showPulse = this.initialShowPulse ?? true;\n this.form.navigateOnClick = this.initialNavigateOnClick ?? false;\n this.form.detailRoute = this.initialDetailRoute ?? '';\n }\n\n onServiceTypeChange(serviceType: ServiceCallDataSource['serviceType']): void {\n this.form.serviceType = serviceType;\n if (serviceType !== 'custom') {\n this.form.customEndpoint = '';\n }\n }\n\n onSave(): void {\n this.save.emit({\n ckTypeId: '',\n serviceType: this.form.serviceType,\n customEndpoint: this.form.serviceType === 'custom' ? this.form.customEndpoint : undefined,\n showPulse: this.form.showPulse,\n navigateOnClick: this.form.navigateOnClick,\n detailRoute: this.form.navigateOnClick ? this.form.detailRoute : undefined\n });\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n","import {\n Component,\n Input,\n OnInit,\n OnChanges,\n SimpleChanges,\n inject,\n signal,\n computed\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n WidgetGroupConfig,\n KpiWidgetConfig,\n GaugeWidgetConfig,\n EntityCardWidgetConfig,\n AnyWidgetConfig,\n StaticDataSource,\n RuntimeEntityData\n} from '../../models/meshboard.models';\nimport { MeshBoardDataService, RepeaterDataItem } from '../../services/meshboard-data.service';\nimport { MeshBoardVariableService } from '../../services/meshboard-variable.service';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { DashboardWidget } from '../widget.interface';\nimport { KpiWidgetComponent } from '../kpi-widget/kpi-widget.component';\nimport { GaugeWidgetComponent } from '../gauge-widget/gauge-widget.component';\nimport { EntityCardWidgetComponent } from '../entity-card-widget/entity-card-widget.component';\nimport { WidgetNotConfiguredComponent } from '../../components/widget-not-configured/widget-not-configured.component';\n\n/**\n * Widget Group Component\n *\n * Renders a collection of child widgets based on data from a repeater query.\n * Acts as a container that executes a query and dynamically creates child widgets\n * for each row/entity returned.\n *\n * Example use case: Query returns 5 machines → 5 KPI widgets show each machine's status.\n */\n@Component({\n selector: 'mm-widget-group',\n standalone: true,\n imports: [\n CommonModule,\n KpiWidgetComponent,\n GaugeWidgetComponent,\n EntityCardWidgetComponent,\n WidgetNotConfiguredComponent\n ],\n templateUrl: './widget-group.component.html',\n styleUrl: './widget-group.component.scss'\n})\nexport class WidgetGroupComponent implements DashboardWidget<WidgetGroupConfig, RepeaterDataItem[]>, OnInit, OnChanges {\n private readonly dataService = inject(MeshBoardDataService);\n private readonly variableService = inject(MeshBoardVariableService);\n private readonly stateService = inject(MeshBoardStateService);\n\n @Input() config!: WidgetGroupConfig;\n\n // Widget state signals\n private readonly _isLoading = signal(false);\n private readonly _data = signal<RepeaterDataItem[] | null>(null);\n private readonly _error = signal<string | null>(null);\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly data = this._data.asReadonly();\n readonly error = this._error.asReadonly();\n\n /**\n * Computed: Check if widget is not configured (needs data source setup).\n */\n readonly isNotConfigured = computed(() => {\n const dataSource = this.config?.dataSource;\n if (!dataSource) return true;\n if (dataSource.type !== 'repeaterQuery') return true;\n return !dataSource.queryRtId && !dataSource.ckTypeId;\n });\n\n /**\n * Computed: Generate child widget configs from data items\n */\n readonly childConfigs = computed(() => {\n const items = this._data();\n if (!items || items.length === 0) return [];\n\n return items.map((item, index) => this.createChildConfig(item, index));\n });\n\n /**\n * Computed: CSS grid template columns based on layout configuration\n */\n readonly gridTemplateColumns = computed(() => {\n const layout = this.config?.layout ?? 'grid';\n const columns = this.config?.gridColumns ?? 4;\n const minWidth = this.config?.minChildWidth ?? 150;\n\n switch (layout) {\n case 'horizontal':\n return 'repeat(auto-fit, minmax(' + minWidth + 'px, 1fr))';\n case 'vertical':\n return '1fr';\n case 'grid':\n default:\n return `repeat(${columns}, 1fr)`;\n }\n });\n\n /**\n * Computed: Layout CSS class\n */\n readonly layoutClass = computed(() => {\n return `layout-${this.config?.layout ?? 'grid'}`;\n });\n\n /**\n * Computed: Gap style\n */\n readonly gapStyle = computed(() => {\n const gap = this.config?.gap ?? 8;\n return `${gap}px`;\n });\n\n ngOnInit(): void {\n this.loadData();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadData();\n }\n }\n\n refresh(): void {\n this.loadData();\n }\n\n private async loadData(): Promise<void> {\n const dataSource = this.config?.dataSource;\n\n // Validate configuration and set appropriate error messages\n if (!dataSource) {\n this._error.set('No data source configured');\n return;\n }\n\n if (dataSource.type !== 'repeaterQuery') {\n this._error.set('Invalid data source type for Widget Group');\n return;\n }\n\n if (!dataSource.queryRtId && !dataSource.ckTypeId) {\n this._error.set('No query or CK type configured');\n return;\n }\n\n this._isLoading.set(true);\n this._error.set(null);\n\n try {\n const items = await this.dataService.fetchRepeaterData(dataSource);\n this._data.set(items);\n\n if (items.length === 0) {\n // Not an error, just no data - will show empty message\n }\n } catch (err) {\n console.error('Error loading Widget Group data:', err);\n this._error.set('Failed to load data');\n } finally {\n this._isLoading.set(false);\n }\n }\n\n /**\n * Creates a child widget configuration from a data item.\n * Applies the template configuration and maps attributes.\n */\n private createChildConfig(item: RepeaterDataItem, index: number): AnyWidgetConfig {\n const template = this.config.childTemplate;\n const widgetType = template.widgetType;\n\n // Generate unique ID for the child widget\n const childId = `${this.config.id}-child-${index}`;\n\n // Resolve title template\n const title = this.resolveTemplate(template.titleTemplate, item) || `Item ${index + 1}`;\n\n // Base config shared by all widget types\n const baseConfig = {\n id: childId,\n title,\n col: 1,\n row: 1,\n colSpan: 1,\n rowSpan: 1,\n configurable: false\n };\n\n switch (widgetType) {\n case 'kpi':\n return this.createKpiChildConfig(baseConfig, item, template);\n case 'gauge':\n return this.createGaugeChildConfig(baseConfig, item, template);\n case 'entityCard':\n return this.createEntityCardChildConfig(baseConfig, item, template);\n default:\n // Fallback to KPI\n return this.createKpiChildConfig(baseConfig, item, template);\n }\n }\n\n /**\n * Creates a KPI widget config for a child widget.\n */\n private createKpiChildConfig(\n baseConfig: { id: string; title: string; col: number; row: number; colSpan: number; rowSpan: number; configurable: boolean },\n item: RepeaterDataItem,\n template: WidgetGroupConfig['childTemplate']\n ): KpiWidgetConfig {\n const staticConfig = template.staticConfig as Partial<KpiWidgetConfig> | undefined;\n const valueAttribute = template.attributeMappings.valueAttribute ?? 'value';\n\n // Create a static data source with the item's data as RuntimeEntityData\n const dataSource: StaticDataSource = {\n type: 'static',\n data: this.convertToRuntimeEntityData(item)\n };\n\n return {\n ...baseConfig,\n type: 'kpi',\n dataSource,\n valueAttribute,\n labelAttribute: template.attributeMappings.labelAttribute,\n prefix: staticConfig?.prefix,\n suffix: staticConfig?.suffix,\n trend: staticConfig?.trend,\n icon: staticConfig?.icon\n };\n }\n\n /**\n * Creates a Gauge widget config for a child widget.\n */\n private createGaugeChildConfig(\n baseConfig: { id: string; title: string; col: number; row: number; colSpan: number; rowSpan: number; configurable: boolean },\n item: RepeaterDataItem,\n template: WidgetGroupConfig['childTemplate']\n ): GaugeWidgetConfig {\n const staticConfig = template.staticConfig as Partial<GaugeWidgetConfig> | undefined;\n const valueAttribute = template.attributeMappings.valueAttribute ?? 'value';\n\n // Create a static data source with the item's data as RuntimeEntityData\n const dataSource: StaticDataSource = {\n type: 'static',\n data: this.convertToRuntimeEntityData(item)\n };\n\n return {\n ...baseConfig,\n type: 'gauge',\n dataSource,\n gaugeType: staticConfig?.gaugeType ?? 'arc',\n valueAttribute,\n labelAttribute: template.attributeMappings.labelAttribute,\n min: staticConfig?.min ?? 0,\n max: staticConfig?.max ?? 100,\n ranges: staticConfig?.ranges,\n showLabel: staticConfig?.showLabel ?? true,\n prefix: staticConfig?.prefix,\n suffix: staticConfig?.suffix,\n reverse: staticConfig?.reverse\n };\n }\n\n /**\n * Creates an Entity Card widget config for a child widget.\n */\n private createEntityCardChildConfig(\n baseConfig: { id: string; title: string; col: number; row: number; colSpan: number; rowSpan: number; configurable: boolean },\n item: RepeaterDataItem,\n template: WidgetGroupConfig['childTemplate']\n ): EntityCardWidgetConfig {\n const staticConfig = template.staticConfig as Partial<EntityCardWidgetConfig> | undefined;\n\n // For EntityCard, we can use a static data source with the entity data\n const dataSource: StaticDataSource = {\n type: 'static',\n data: this.convertToRuntimeEntityData(item)\n };\n\n return {\n ...baseConfig,\n type: 'entityCard',\n dataSource,\n showHeader: staticConfig?.showHeader ?? true,\n showAttributes: staticConfig?.showAttributes ?? true,\n attributeFilter: staticConfig?.attributeFilter,\n headerColor: staticConfig?.headerColor\n };\n }\n\n /**\n * Converts a RepeaterDataItem to RuntimeEntityData format.\n */\n private convertToRuntimeEntityData(item: RepeaterDataItem): RuntimeEntityData {\n const attributes = Array.from(item.attributes.entries()).map(([key, value]) => ({\n attributeName: key,\n value\n }));\n\n return {\n rtId: item.rtId,\n ckTypeId: item.ckTypeId,\n rtWellKnownName: item.rtWellKnownName,\n attributes,\n associations: []\n };\n }\n\n /**\n * Resolves a template string with variable substitution.\n * Supports $rtWellKnownName, $rtId, $ckTypeId, and $attributeName syntax.\n */\n private resolveTemplate(template: string | undefined, item: RepeaterDataItem): string {\n if (!template) return '';\n\n let resolved = template;\n\n // Replace built-in variables\n resolved = resolved.replace(/\\$rtWellKnownName/g, item.rtWellKnownName ?? '');\n resolved = resolved.replace(/\\$rtId/g, item.rtId);\n resolved = resolved.replace(/\\$ckTypeId/g, item.ckTypeId);\n\n // Replace attribute references ($attributeName or ${attributeName})\n resolved = resolved.replace(/\\$\\{?([a-zA-Z_][a-zA-Z0-9_]*)\\}?/g, (match, attrName) => {\n // Skip built-in variables already handled\n if (['rtWellKnownName', 'rtId', 'ckTypeId'].includes(attrName)) {\n return match.startsWith('${') ? '' : match;\n }\n\n const value = item.attributes.get(attrName);\n return value !== undefined ? String(value) : '';\n });\n\n return resolved.trim();\n }\n}\n","<div class=\"widget-group\" [class]=\"layoutClass()\">\n @if (isNotConfigured()) {\n <mm-widget-not-configured></mm-widget-not-configured>\n } @else if (isLoading()) {\n <div class=\"loading-state\">\n <span class=\"loading-spinner\"></span>\n <span class=\"loading-text\">Loading...</span>\n </div>\n } @else if (error()) {\n <div class=\"error-state\">\n <span class=\"error-icon\">!</span>\n <span class=\"error-message\">{{ error() }}</span>\n </div>\n } @else if (childConfigs().length === 0) {\n <div class=\"empty-state\">\n <span class=\"empty-message\">{{ config.emptyMessage || 'No data available' }}</span>\n </div>\n } @else {\n <div\n class=\"widget-group-grid\"\n [style.grid-template-columns]=\"gridTemplateColumns()\"\n [style.gap]=\"gapStyle()\">\n @for (childConfig of childConfigs(); track childConfig.id) {\n <div class=\"widget-group-item\">\n <div class=\"widget-group-item-header\">\n <span class=\"widget-group-item-title\">{{ childConfig.title }}</span>\n </div>\n <div class=\"widget-group-item-content\">\n @switch (config.childTemplate.widgetType) {\n @case ('kpi') {\n <mm-kpi-widget [config]=\"$any(childConfig)\"></mm-kpi-widget>\n }\n @case ('gauge') {\n <mm-gauge-widget [config]=\"$any(childConfig)\"></mm-gauge-widget>\n }\n @case ('entityCard') {\n <mm-entity-card-widget [config]=\"$any(childConfig)\"></mm-entity-card-widget>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n</div>\n","import { Component, Input, Output, EventEmitter, OnInit, inject, signal, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { CkTypeSelectorInputComponent, FieldFilterEditorComponent, FieldFilterItem, FilterVariable } from '@meshmakers/octo-ui';\nimport { CkTypeSelectorItem, CkTypeSelectorService, FieldFilterOperatorsDto, AttributeSelectorService, AttributeItem, FieldFilterDto, GetCkTypeAvailableQueryColumnsDtoGQL } from '@meshmakers/octo-services';\nimport { ExecuteRuntimeQueryDtoGQL } from '../../graphQL/executeRuntimeQuery';\nimport { firstValueFrom } from 'rxjs';\nimport {\n GroupChildWidgetType,\n WidgetGroupLayout,\n WidgetGroupChildTemplate,\n WidgetFilterConfig,\n GaugeType\n} from '../../models/meshboard.models';\nimport { WidgetConfigResult } from '../../services/widget-registry.service';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { PersistentQueryItem, QueryColumnItem } from '../../utils/runtime-entity-data-sources';\nimport { QuerySelectorComponent } from '../../components/query-selector/query-selector.component';\n\n/**\n * Data source type selection\n */\ntype WidgetGroupDataSourceMode = 'persistentQuery' | 'ckType';\n\n/**\n * Configuration result from the Widget Group dialog\n */\nexport interface WidgetGroupConfigResult extends WidgetConfigResult {\n /** Required by WidgetConfigResult - empty string for query mode, actual type for ckType mode */\n ckTypeId: string;\n dataSourceMode: WidgetGroupDataSourceMode;\n // Query mode\n queryRtId?: string;\n queryName?: string;\n // CK Type mode filters\n filters?: FieldFilterDto[];\n // Common\n maxItems?: number;\n // Child template\n childTemplate: WidgetGroupChildTemplate;\n // Layout\n layout: WidgetGroupLayout;\n gridColumns?: number;\n minChildWidth?: number;\n gap?: number;\n emptyMessage?: string;\n}\n\n/**\n * Configuration dialog for Widget Group widgets.\n * Allows configuring data source, child widget template, and layout options.\n */\n@Component({\n selector: 'mm-widget-group-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n DropDownsModule,\n CkTypeSelectorInputComponent,\n FieldFilterEditorComponent,\n QuerySelectorComponent\n ],\n template: `\n <kendo-dialog\n title=\"Widget Group Configuration\"\n [minWidth]=\"550\"\n [width]=\"700\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\" [class.loading]=\"isLoadingInitial\">\n @if (isLoadingInitial) {\n <div class=\"loading-indicator\">Loading...</div>\n }\n\n <!-- ============================================================ -->\n <!-- TAB 1: Data Source -->\n <!-- ============================================================ -->\n <div class=\"form-section\">\n <h4>Data Source</h4>\n\n <!-- Data Source Mode Selection -->\n <div class=\"form-field\">\n <label>Source Type</label>\n <div class=\"mode-toggle\">\n <button\n kendoButton\n [fillMode]=\"dataSourceMode === 'persistentQuery' ? 'solid' : 'outline'\"\n [themeColor]=\"dataSourceMode === 'persistentQuery' ? 'primary' : 'base'\"\n (click)=\"onDataSourceModeChange('persistentQuery')\">\n Query\n </button>\n <button\n kendoButton\n [fillMode]=\"dataSourceMode === 'ckType' ? 'solid' : 'outline'\"\n [themeColor]=\"dataSourceMode === 'ckType' ? 'primary' : 'base'\"\n (click)=\"onDataSourceModeChange('ckType')\">\n Runtime Entities\n </button>\n </div>\n </div>\n\n <!-- Query Selection -->\n @if (dataSourceMode === 'persistentQuery') {\n <div class=\"form-field\">\n <label>Query <span class=\"required\">*</span></label>\n <mm-query-selector\n #querySelector\n [(ngModel)]=\"selectedPersistentQuery\"\n (querySelected)=\"onQuerySelected($event)\"\n placeholder=\"Select a Query...\"\n hint=\"The query results will be used to render child widgets.\">\n </mm-query-selector>\n </div>\n }\n\n <!-- Runtime Entities Selection -->\n @if (dataSourceMode === 'ckType') {\n <div class=\"form-field\">\n <label>Runtime Entities <span class=\"required\">*</span></label>\n <mm-ck-type-selector-input\n placeholder=\"Select Runtime Entities...\"\n [minSearchLength]=\"2\"\n dialogTitle=\"Select Runtime Entities\"\n [ngModel]=\"selectedCkType\"\n (ckTypeSelected)=\"onCkTypeSelected($event)\"\n (ckTypeCleared)=\"onCkTypeCleared()\">\n </mm-ck-type-selector-input>\n <p class=\"field-hint\">Entities of this type will be used to render child widgets.</p>\n </div>\n\n <!-- Filters for CK Type mode -->\n @if (selectedCkType && filterAttributes.length > 0) {\n <div class=\"form-field\">\n <label>Filters</label>\n <mm-field-filter-editor\n [availableAttributes]=\"filterAttributes\"\n [filters]=\"filters\"\n [enableVariables]=\"filterVariables.length > 0\"\n [availableVariables]=\"filterVariables\"\n (filtersChange)=\"onFiltersChange($event)\">\n </mm-field-filter-editor>\n </div>\n }\n }\n\n <!-- Max Items -->\n <div class=\"form-field\">\n <label>Max Items</label>\n <kendo-numerictextbox\n [(ngModel)]=\"form.maxItems\"\n [min]=\"1\"\n [max]=\"100\"\n [step]=\"5\"\n [decimals]=\"0\"\n format=\"n0\">\n </kendo-numerictextbox>\n <p class=\"field-hint\">Maximum number of child widgets to render (1-100).</p>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- TAB 2: Child Widget Template -->\n <!-- ============================================================ -->\n <div class=\"form-section\">\n <h4>Child Widget</h4>\n\n <!-- Widget Type Selection -->\n <div class=\"form-field\">\n <label>Widget Type <span class=\"required\">*</span></label>\n <kendo-dropdownlist\n [data]=\"childWidgetTypeOptions\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.childWidgetType\">\n </kendo-dropdownlist>\n </div>\n\n <!-- Title Template -->\n <div class=\"form-field\">\n <label>Title Template</label>\n <kendo-textbox\n [(ngModel)]=\"form.titleTemplate\"\n placeholder=\"e.g., $rtWellKnownName Status\">\n </kendo-textbox>\n <p class=\"field-hint\">\n Use $rtWellKnownName, $rtId, or $attributeName for dynamic values.\n </p>\n </div>\n\n <!-- Value Attribute (for KPI/Gauge) -->\n @if (form.childWidgetType === 'kpi' || form.childWidgetType === 'gauge') {\n <div class=\"form-field\">\n <label>Value Attribute <span class=\"required\">*</span></label>\n @if (!isLoadingColumns && availableColumns.length > 0) {\n <kendo-combobox\n [data]=\"filteredColumns()\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.valueAttribute\"\n [filterable]=\"true\"\n (filterChange)=\"onColumnFilter($event)\"\n placeholder=\"Select value attribute...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"column-item\">\n <span class=\"column-path\">{{ dataItem.attributePath }}</span>\n <span class=\"column-type\">{{ dataItem.attributeValueType }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n } @else if (isLoadingColumns) {\n <kendo-textbox [disabled]=\"true\" placeholder=\"Loading attributes...\"></kendo-textbox>\n } @else {\n <kendo-textbox\n [(ngModel)]=\"form.valueAttribute\"\n placeholder=\"Enter attribute path...\">\n </kendo-textbox>\n }\n <p class=\"field-hint\">The attribute to display as the widget value.</p>\n </div>\n }\n\n <!-- Gauge-specific options -->\n @if (form.childWidgetType === 'gauge') {\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label>Gauge Type</label>\n <kendo-dropdownlist\n [data]=\"gaugeTypeOptions\"\n textField=\"label\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.gaugeType\">\n </kendo-dropdownlist>\n </div>\n <div class=\"form-field flex-1\">\n <label>Min</label>\n <kendo-numerictextbox\n [(ngModel)]=\"form.gaugeMin\"\n [decimals]=\"0\"\n format=\"n0\">\n </kendo-numerictextbox>\n </div>\n <div class=\"form-field flex-1\">\n <label>Max</label>\n <kendo-numerictextbox\n [(ngModel)]=\"form.gaugeMax\"\n [decimals]=\"0\"\n format=\"n0\">\n </kendo-numerictextbox>\n </div>\n </div>\n }\n\n <!-- KPI-specific options -->\n @if (form.childWidgetType === 'kpi') {\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label>Prefix</label>\n <kendo-textbox\n [(ngModel)]=\"form.prefix\"\n placeholder=\"e.g., $\">\n </kendo-textbox>\n </div>\n <div class=\"form-field flex-1\">\n <label>Suffix</label>\n <kendo-textbox\n [(ngModel)]=\"form.suffix\"\n placeholder=\"e.g., %\">\n </kendo-textbox>\n </div>\n </div>\n }\n </div>\n\n <!-- ============================================================ -->\n <!-- TAB 3: Layout Options -->\n <!-- ============================================================ -->\n <div class=\"form-section\">\n <h4>Layout</h4>\n\n <!-- Layout Type -->\n <div class=\"form-field\">\n <label>Layout Type</label>\n <div class=\"mode-toggle\">\n <button\n kendoButton\n [fillMode]=\"form.layout === 'grid' ? 'solid' : 'outline'\"\n [themeColor]=\"form.layout === 'grid' ? 'primary' : 'base'\"\n (click)=\"form.layout = 'grid'\">\n Grid\n </button>\n <button\n kendoButton\n [fillMode]=\"form.layout === 'horizontal' ? 'solid' : 'outline'\"\n [themeColor]=\"form.layout === 'horizontal' ? 'primary' : 'base'\"\n (click)=\"form.layout = 'horizontal'\">\n Horizontal\n </button>\n <button\n kendoButton\n [fillMode]=\"form.layout === 'vertical' ? 'solid' : 'outline'\"\n [themeColor]=\"form.layout === 'vertical' ? 'primary' : 'base'\"\n (click)=\"form.layout = 'vertical'\">\n Vertical\n </button>\n </div>\n </div>\n\n @if (form.layout === 'grid') {\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label>Grid Columns</label>\n <kendo-numerictextbox\n [(ngModel)]=\"form.gridColumns\"\n [min]=\"1\"\n [max]=\"12\"\n [step]=\"1\"\n [decimals]=\"0\"\n format=\"n0\">\n </kendo-numerictextbox>\n </div>\n <div class=\"form-field flex-1\">\n <label>Gap (px)</label>\n <kendo-numerictextbox\n [(ngModel)]=\"form.gap\"\n [min]=\"0\"\n [max]=\"32\"\n [step]=\"4\"\n [decimals]=\"0\"\n format=\"n0\">\n </kendo-numerictextbox>\n </div>\n </div>\n }\n\n @if (form.layout === 'horizontal') {\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label>Min Child Width (px)</label>\n <kendo-numerictextbox\n [(ngModel)]=\"form.minChildWidth\"\n [min]=\"50\"\n [max]=\"500\"\n [step]=\"25\"\n [decimals]=\"0\"\n format=\"n0\">\n </kendo-numerictextbox>\n </div>\n <div class=\"form-field flex-1\">\n <label>Gap (px)</label>\n <kendo-numerictextbox\n [(ngModel)]=\"form.gap\"\n [min]=\"0\"\n [max]=\"32\"\n [step]=\"4\"\n [decimals]=\"0\"\n format=\"n0\">\n </kendo-numerictextbox>\n </div>\n </div>\n }\n\n <!-- Empty Message -->\n <div class=\"form-field\">\n <label>Empty Message</label>\n <kendo-textbox\n [(ngModel)]=\"form.emptyMessage\"\n placeholder=\"No data available\">\n </kendo-textbox>\n <p class=\"field-hint\">Message shown when no items are returned.</p>\n </div>\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 16px 0;\n position: relative;\n max-height: calc(80vh - 120px);\n overflow-y: auto;\n }\n\n .config-form.loading {\n opacity: 0.7;\n pointer-events: none;\n }\n\n .loading-indicator {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n text-align: center;\n padding: 8px;\n color: var(--kendo-color-primary, #0d6efd);\n font-style: italic;\n }\n\n .form-section {\n padding: 16px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .form-section h4 {\n margin: 0 0 16px 0;\n font-size: 0.95rem;\n color: var(--kendo-color-primary, #0d6efd);\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 12px;\n }\n\n .form-field:last-child {\n margin-bottom: 0;\n }\n\n .form-field.flex-1 {\n flex: 1;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .form-row {\n display: flex;\n gap: 16px;\n }\n\n .mode-toggle {\n display: flex;\n gap: 8px;\n }\n\n .mode-toggle button {\n flex: 1;\n }\n\n .required {\n color: var(--kendo-color-error, #dc3545);\n }\n\n .query-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .query-name {\n font-weight: 500;\n }\n\n .query-description {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .column-item {\n display: flex;\n justify-content: space-between;\n gap: 16px;\n }\n\n .column-path {\n font-weight: 500;\n }\n\n .column-type {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n `]\n})\nexport class WidgetGroupConfigDialogComponent implements OnInit {\n private readonly ckTypeSelectorService = inject(CkTypeSelectorService);\n private readonly attributeSelectorService = inject(AttributeSelectorService);\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n private readonly getCkTypeAvailableQueryColumnsGQL = inject(GetCkTypeAvailableQueryColumnsDtoGQL);\n private readonly meshBoardStateService = inject(MeshBoardStateService);\n\n @ViewChild('querySelector') querySelector?: QuerySelectorComponent;\n\n // Initial values for editing\n @Input() initialDataSourceMode?: WidgetGroupDataSourceMode;\n @Input() initialQueryRtId?: string;\n @Input() initialQueryName?: string;\n @Input() initialCkTypeId?: string;\n @Input() initialFilters?: WidgetFilterConfig[];\n @Input() initialMaxItems?: number;\n @Input() initialChildTemplate?: WidgetGroupChildTemplate;\n @Input() initialLayout?: WidgetGroupLayout;\n @Input() initialGridColumns?: number;\n @Input() initialMinChildWidth?: number;\n @Input() initialGap?: number;\n @Input() initialEmptyMessage?: string;\n\n @Output() save = new EventEmitter<WidgetGroupConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n // Data source mode\n dataSourceMode: WidgetGroupDataSourceMode = 'persistentQuery';\n\n // Query mode state\n selectedPersistentQuery: PersistentQueryItem | null = null;\n\n // CK Type mode state\n selectedCkType: CkTypeSelectorItem | null = null;\n\n // Attributes/Columns\n availableColumns: QueryColumnItem[] = [];\n isLoadingColumns = false;\n private columnFilter = '';\n\n // Filter state\n filters: FieldFilterItem[] = [];\n filterAttributes: AttributeItem[] = [];\n filterVariables: FilterVariable[] = [];\n\n isLoadingInitial = false;\n\n // Form state\n form = {\n maxItems: 20,\n childWidgetType: 'kpi' as GroupChildWidgetType,\n titleTemplate: '$rtWellKnownName',\n valueAttribute: '',\n prefix: '',\n suffix: '',\n gaugeType: 'arc' as GaugeType,\n gaugeMin: 0,\n gaugeMax: 100,\n layout: 'grid' as WidgetGroupLayout,\n gridColumns: 4,\n minChildWidth: 150,\n gap: 8,\n emptyMessage: ''\n };\n\n // Options\n childWidgetTypeOptions = [\n { value: 'kpi' as GroupChildWidgetType, label: 'KPI' },\n { value: 'gauge' as GroupChildWidgetType, label: 'Gauge' },\n { value: 'entityCard' as GroupChildWidgetType, label: 'Entity Card' }\n ];\n\n gaugeTypeOptions = [\n { value: 'arc' as GaugeType, label: 'Arc' },\n { value: 'circular' as GaugeType, label: 'Circular' },\n { value: 'linear' as GaugeType, label: 'Linear' },\n { value: 'radial' as GaugeType, label: 'Radial' }\n ];\n\n /**\n * Computed: Filtered columns based on search\n */\n filteredColumns = signal<QueryColumnItem[]>([]);\n\n get isValid(): boolean {\n // Data source validation\n if (this.dataSourceMode === 'persistentQuery' && !this.selectedPersistentQuery) {\n return false;\n }\n if (this.dataSourceMode === 'ckType' && !this.selectedCkType) {\n return false;\n }\n\n // Child widget validation\n if (this.form.childWidgetType === 'kpi' || this.form.childWidgetType === 'gauge') {\n if (!this.form.valueAttribute?.trim()) {\n return false;\n }\n }\n\n return true;\n }\n\n async ngOnInit(): Promise<void> {\n // Initialize filter variables from MeshBoard state\n this.filterVariables = this.meshBoardStateService.getVariables().map(v => ({\n name: v.name,\n label: v.label || v.name,\n type: v.type\n }));\n\n // Initialize form with initial values\n this.dataSourceMode = this.initialDataSourceMode ?? 'persistentQuery';\n this.form.maxItems = this.initialMaxItems ?? 20;\n this.form.layout = this.initialLayout ?? 'grid';\n this.form.gridColumns = this.initialGridColumns ?? 4;\n this.form.minChildWidth = this.initialMinChildWidth ?? 150;\n this.form.gap = this.initialGap ?? 8;\n this.form.emptyMessage = this.initialEmptyMessage ?? '';\n\n // Initialize child template\n if (this.initialChildTemplate) {\n this.form.childWidgetType = this.initialChildTemplate.widgetType;\n this.form.titleTemplate = this.initialChildTemplate.titleTemplate ?? '$rtWellKnownName';\n this.form.valueAttribute = this.initialChildTemplate.attributeMappings.valueAttribute ?? '';\n\n // Extract static config values\n const staticConfig = this.initialChildTemplate.staticConfig;\n if (staticConfig) {\n if ('prefix' in staticConfig) this.form.prefix = staticConfig.prefix ?? '';\n if ('suffix' in staticConfig) this.form.suffix = staticConfig.suffix ?? '';\n if ('gaugeType' in staticConfig) this.form.gaugeType = staticConfig.gaugeType ?? 'arc';\n if ('min' in staticConfig) this.form.gaugeMin = staticConfig.min ?? 0;\n if ('max' in staticConfig) this.form.gaugeMax = staticConfig.max ?? 100;\n }\n }\n\n // Initialize filters\n if (this.initialFilters && this.initialFilters.length > 0) {\n this.filters = this.initialFilters.map((f, index) => ({\n id: index + 1,\n attributePath: f.attributePath,\n operator: f.operator as FieldFilterOperatorsDto,\n comparisonValue: f.comparisonValue\n }));\n }\n\n // Load data based on mode\n if (this.dataSourceMode === 'persistentQuery' && this.initialQueryRtId) {\n // Use setTimeout to wait for ViewChild to be available\n this.isLoadingInitial = true;\n setTimeout(async () => {\n if (this.querySelector) {\n const query = await this.querySelector.selectByRtId(this.initialQueryRtId!);\n if (query) {\n this.selectedPersistentQuery = query;\n await this.loadQueryColumns(query.rtId);\n }\n }\n this.isLoadingInitial = false;\n }, 100);\n } else if (this.initialCkTypeId) {\n await this.loadInitialCkTypeValues();\n }\n }\n\n // ============================================================================\n // Data Source Mode\n // ============================================================================\n\n onDataSourceModeChange(mode: WidgetGroupDataSourceMode): void {\n this.dataSourceMode = mode;\n this.availableColumns = [];\n this.filteredColumns.set([]);\n }\n\n // ============================================================================\n // Query Methods\n // ============================================================================\n\n async onQuerySelected(query: PersistentQueryItem | null): Promise<void> {\n this.selectedPersistentQuery = query;\n this.availableColumns = [];\n this.filteredColumns.set([]);\n\n if (query) {\n await this.loadQueryColumns(query.rtId);\n }\n }\n\n private async loadQueryColumns(queryRtId: string): Promise<void> {\n this.isLoadingColumns = true;\n\n try {\n const result = await firstValueFrom(this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: queryRtId,\n first: 1\n }\n }));\n\n const queryItems = result.data?.runtime?.runtimeQuery?.items ?? [];\n if (queryItems.length > 0 && queryItems[0]) {\n const queryResult = queryItems[0];\n const columns = queryResult.columns ?? [];\n\n this.availableColumns = columns\n .filter((c): c is NonNullable<typeof c> => c !== null)\n .map(c => ({\n attributePath: c.attributePath?.replace(/\\./g, '_') ?? '',\n attributeValueType: c.attributeValueType ?? ''\n }));\n\n this.filteredColumns.set(this.availableColumns);\n }\n } catch (error) {\n console.error('Error loading query columns:', error);\n this.availableColumns = [];\n this.filteredColumns.set([]);\n } finally {\n this.isLoadingColumns = false;\n }\n }\n\n // ============================================================================\n // CK Type Methods\n // ============================================================================\n\n private async loadInitialCkTypeValues(): Promise<void> {\n if (!this.initialCkTypeId) return;\n\n this.isLoadingInitial = true;\n\n try {\n const ckType = await firstValueFrom(\n this.ckTypeSelectorService.getCkTypeByRtCkTypeId(this.initialCkTypeId)\n );\n\n if (ckType) {\n this.onCkTypeSelected(ckType);\n }\n } catch (error) {\n console.error('Error loading initial CK type values:', error);\n } finally {\n this.isLoadingInitial = false;\n }\n }\n\n onCkTypeSelected(ckType: CkTypeSelectorItem): void {\n this.selectedCkType = ckType;\n this.loadCkTypeAttributes(ckType.rtCkTypeId);\n }\n\n onCkTypeCleared(): void {\n this.selectedCkType = null;\n this.availableColumns = [];\n this.filteredColumns.set([]);\n this.filterAttributes = [];\n this.filters = [];\n }\n\n private async loadCkTypeAttributes(ckTypeId: string): Promise<void> {\n this.isLoadingColumns = true;\n\n try {\n const result = await firstValueFrom(this.getCkTypeAvailableQueryColumnsGQL.fetch({\n variables: { rtCkId: ckTypeId, first: 1000 }\n }));\n\n const columns = result.data?.constructionKit?.types?.items?.[0]?.availableQueryColumns?.items || [];\n const mappedColumns = columns\n .filter((c): c is NonNullable<typeof c> => c !== null)\n .map(c => ({\n attributePath: c.attributePath || '',\n attributeValueType: c.attributeValueType\n }));\n\n this.availableColumns = mappedColumns;\n this.filteredColumns.set(mappedColumns);\n this.filterAttributes = mappedColumns;\n } catch (error) {\n console.error('Error loading CK type attributes:', error);\n this.availableColumns = [];\n this.filteredColumns.set([]);\n this.filterAttributes = [];\n } finally {\n this.isLoadingColumns = false;\n }\n }\n\n // ============================================================================\n // Column Filter\n // ============================================================================\n\n onColumnFilter(filter: string): void {\n this.columnFilter = filter;\n const filterLower = filter.toLowerCase();\n const filtered = this.availableColumns.filter(col =>\n col.attributePath.toLowerCase().includes(filterLower)\n );\n this.filteredColumns.set(filtered);\n }\n\n // ============================================================================\n // Filter Methods\n // ============================================================================\n\n onFiltersChange(updatedFilters: FieldFilterItem[]): void {\n this.filters = updatedFilters;\n }\n\n // ============================================================================\n // Save/Cancel\n // ============================================================================\n\n onSave(): void {\n // Build child template\n const childTemplate: WidgetGroupChildTemplate = {\n widgetType: this.form.childWidgetType,\n titleTemplate: this.form.titleTemplate || undefined,\n attributeMappings: {\n valueAttribute: this.form.valueAttribute || undefined\n },\n staticConfig: this.buildStaticConfig()\n };\n\n // Convert filters to DTO format\n const filtersDto: FieldFilterDto[] | undefined = this.filters.length > 0\n ? this.filters.map(f => ({\n attributePath: f.attributePath,\n operator: f.operator,\n comparisonValue: f.comparisonValue\n }))\n : undefined;\n\n const result: WidgetGroupConfigResult = {\n ckTypeId: this.dataSourceMode === 'ckType' ? (this.selectedCkType?.rtCkTypeId ?? '') : '',\n dataSourceMode: this.dataSourceMode,\n queryRtId: this.dataSourceMode === 'persistentQuery' ? this.selectedPersistentQuery?.rtId : undefined,\n queryName: this.dataSourceMode === 'persistentQuery' ? this.selectedPersistentQuery?.name : undefined,\n filters: this.dataSourceMode === 'ckType' ? filtersDto : undefined,\n maxItems: this.form.maxItems,\n childTemplate,\n layout: this.form.layout,\n gridColumns: this.form.layout === 'grid' ? this.form.gridColumns : undefined,\n minChildWidth: this.form.layout === 'horizontal' ? this.form.minChildWidth : undefined,\n gap: this.form.gap,\n emptyMessage: this.form.emptyMessage || undefined\n };\n\n this.save.emit(result);\n }\n\n private buildStaticConfig(): Partial<any> {\n switch (this.form.childWidgetType) {\n case 'kpi':\n return {\n prefix: this.form.prefix || undefined,\n suffix: this.form.suffix || undefined\n };\n case 'gauge':\n return {\n gaugeType: this.form.gaugeType,\n min: this.form.gaugeMin,\n max: this.form.gaugeMax\n };\n case 'entityCard':\n return {\n showHeader: true,\n showAttributes: true\n };\n default:\n return {};\n }\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n","import { Component, Input, OnInit, OnChanges, SimpleChanges, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MarkdownModule } from 'ngx-markdown';\nimport { MarkdownWidgetConfig } from '../../models/meshboard.models';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { MeshBoardVariableService } from '../../services/meshboard-variable.service';\nimport { DashboardWidget } from '../widget.interface';\nimport { WidgetNotConfiguredComponent } from '../../components/widget-not-configured/widget-not-configured.component';\n\n@Component({\n selector: 'mm-markdown-widget',\n standalone: true,\n imports: [CommonModule, MarkdownModule, WidgetNotConfiguredComponent],\n templateUrl: './markdown-widget.component.html',\n styleUrl: './markdown-widget.component.scss'\n})\nexport class MarkdownWidgetComponent implements DashboardWidget<MarkdownWidgetConfig, string>, OnInit, OnChanges {\n private readonly stateService = inject(MeshBoardStateService);\n private readonly variableService = inject(MeshBoardVariableService);\n\n @Input() config!: MarkdownWidgetConfig;\n\n // Widget state signals\n private readonly _isLoading = signal(false);\n private readonly _data = signal<string | null>(null);\n private readonly _error = signal<string | null>(null);\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly data = this._data.asReadonly();\n readonly error = this._error.asReadonly();\n\n /**\n * Check if widget has content configured.\n * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.\n */\n isNotConfigured(): boolean {\n return !this.config?.content || this.config.content.trim() === '';\n }\n\n /**\n * Resolved markdown content with variables interpolated.\n */\n readonly resolvedContent = computed(() => {\n const content = this.config?.content ?? '';\n if (!content || !this.config?.resolveVariables) {\n return content;\n }\n const variables = this.stateService.getVariables();\n return this.variableService.resolveVariables(content, variables);\n });\n\n /**\n * Style object for custom padding and alignment.\n */\n readonly containerStyle = computed(() => ({\n padding: this.config?.padding ?? '16px',\n textAlign: this.config?.textAlign ?? 'left'\n }));\n\n ngOnInit(): void {\n this._data.set(this.config?.content ?? '');\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this._data.set(this.config?.content ?? '');\n }\n }\n\n refresh(): void {\n // Markdown is static content, just re-resolve variables\n this._data.set(this.config?.content ?? '');\n }\n}\n","<div class=\"markdown-widget\"\n [class.loading]=\"isLoading()\"\n [class.error]=\"error()\"\n [ngStyle]=\"containerStyle()\">\n @if (isNotConfigured()) {\n <mm-widget-not-configured\n message=\"No markdown content configured.\">\n </mm-widget-not-configured>\n } @else {\n <div class=\"markdown-content lcars-prose\">\n <markdown [data]=\"resolvedContent()\"></markdown>\n </div>\n }\n</div>\n","import { Component, Input, Output, OnInit, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { MarkdownModule } from 'ngx-markdown';\nimport { Subject } from 'rxjs';\nimport { WidgetConfigResult } from '../../services/widget-registry.service';\nimport { MarkdownTextAlign } from '../../models/meshboard.models';\n\n/**\n * Result from the Markdown config dialog.\n */\nexport interface MarkdownConfigResult extends WidgetConfigResult {\n content: string;\n resolveVariables: boolean;\n padding?: string;\n textAlign?: MarkdownTextAlign;\n}\n\n@Component({\n selector: 'mm-markdown-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogModule,\n ButtonsModule,\n InputsModule,\n MarkdownModule\n ],\n template: `\n <kendo-dialog\n title=\"Markdown Widget Configuration\"\n [minWidth]=\"600\"\n [width]=\"800\"\n [height]=\"600\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\">\n <!-- Preview Toggle -->\n <div class=\"mode-toggle\">\n <button kendoButton\n [fillMode]=\"showPreview() ? 'outline' : 'solid'\"\n [themeColor]=\"showPreview() ? 'base' : 'primary'\"\n (click)=\"showPreview.set(false)\">\n Edit\n </button>\n <button kendoButton\n [fillMode]=\"showPreview() ? 'solid' : 'outline'\"\n [themeColor]=\"showPreview() ? 'primary' : 'base'\"\n (click)=\"showPreview.set(true)\">\n Preview\n </button>\n </div>\n\n <!-- Editor / Preview Area -->\n <div class=\"editor-area\">\n @if (!showPreview()) {\n <textarea\n class=\"markdown-editor\"\n [(ngModel)]=\"content\"\n placeholder=\"Enter markdown content here...\n\n# Heading 1\n## Heading 2\n\n**Bold text** and *italic text*\n\n- List item 1\n- List item 2\n\n[Link text](https://example.com)\n\n> Blockquote\n\n\\`\\`\\`\nCode block\n\\`\\`\\`\n\nVariables: $variableName or \\${variableName}\">\n </textarea>\n } @else {\n <div class=\"markdown-preview lcars-prose\">\n <markdown [data]=\"content\"></markdown>\n </div>\n }\n </div>\n\n <!-- Options -->\n <div class=\"form-section\">\n <div class=\"form-row\">\n <div class=\"form-field\">\n <label>\n <input type=\"checkbox\" kendoCheckBox [(ngModel)]=\"resolveVariables\" />\n Resolve MeshBoard Variables\n </label>\n <p class=\"field-hint\">\n Replace $variableName with MeshBoard variable values.\n </p>\n </div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-field\">\n <label>Text Alignment</label>\n <kendo-buttongroup selection=\"single\">\n <button kendoButton\n [selected]=\"textAlign === 'left'\"\n (click)=\"textAlign = 'left'\">Left</button>\n <button kendoButton\n [selected]=\"textAlign === 'center'\"\n (click)=\"textAlign = 'center'\">Center</button>\n <button kendoButton\n [selected]=\"textAlign === 'right'\"\n (click)=\"textAlign = 'right'\">Right</button>\n </kendo-buttongroup>\n </div>\n\n <div class=\"form-field\">\n <label>Padding</label>\n <kendo-textbox\n [(ngModel)]=\"padding\"\n placeholder=\"16px\">\n </kendo-textbox>\n </div>\n </div>\n </div>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button kendoButton themeColor=\"primary\" (click)=\"onSave()\">Save</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n height: 100%;\n }\n\n .mode-toggle {\n display: flex;\n gap: 8px;\n }\n\n .editor-area {\n flex: 1;\n min-height: 300px;\n display: flex;\n flex-direction: column;\n }\n\n .markdown-editor {\n flex: 1;\n width: 100%;\n font-family: 'Roboto Mono', monospace;\n font-size: 0.9rem;\n padding: 12px;\n border: 1px solid rgba(100, 206, 185, 0.3);\n border-radius: 4px;\n resize: none;\n background: #1f2e40;\n color: #c8d0d8;\n }\n\n .markdown-editor::placeholder {\n color: #6b7a8c;\n }\n\n .markdown-preview {\n flex: 1;\n padding: 12px;\n border: 1px solid rgba(100, 206, 185, 0.3);\n border-radius: 4px;\n overflow: auto;\n background: #1f2e40;\n }\n\n .form-section {\n padding: 12px;\n background: #394555;\n border: 1px solid rgba(100, 206, 185, 0.2);\n border-radius: 4px;\n }\n\n .form-row {\n display: flex;\n gap: 16px;\n align-items: flex-start;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .form-field label {\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 8px;\n color: #c8d0d8;\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: #9292a6;\n }\n\n /* LCARS-themed prose styles for preview */\n .lcars-prose {\n color: #c8d0d8;\n line-height: 1.6;\n\n h1, h2, h3, h4, h5, h6 {\n color: #64ceb9;\n font-weight: 600;\n margin-top: 1em;\n margin-bottom: 0.5em;\n }\n\n h1 { font-size: 1.5rem; }\n h2 { font-size: 1.25rem; }\n h3 { font-size: 1.1rem; }\n\n p { margin-bottom: 0.75em; }\n\n a { color: #00a8dc; }\n\n code {\n background: rgba(100, 206, 185, 0.1);\n color: #64ceb9;\n padding: 0.2em 0.4em;\n border-radius: 4px;\n }\n\n pre {\n background: #394555;\n color: #c8d0d8;\n padding: 1em;\n border-radius: 8px;\n overflow-x: auto;\n }\n\n pre code {\n background: transparent;\n color: #c8d0d8;\n }\n\n blockquote {\n border-left: 4px solid #6c4da8;\n background: rgba(108, 77, 168, 0.1);\n padding: 0.75em 1em;\n margin: 1em 0;\n border-radius: 0 8px 8px 0;\n }\n\n strong, b {\n color: #ffffff;\n font-weight: 600;\n }\n\n em, i {\n color: #00a8dc;\n }\n }\n `]\n})\nexport class MarkdownConfigDialogComponent implements OnInit {\n @Input() initialContent?: string;\n @Input() initialResolveVariables?: boolean;\n @Input() initialPadding?: string;\n @Input() initialTextAlign?: MarkdownTextAlign;\n\n @Output() save = new Subject<MarkdownConfigResult>();\n @Output() cancelled = new Subject<void>();\n\n readonly showPreview = signal(false);\n\n content = '';\n resolveVariables = true;\n padding = '16px';\n textAlign: MarkdownTextAlign = 'left';\n\n ngOnInit(): void {\n this.content = this.initialContent ?? '';\n this.resolveVariables = this.initialResolveVariables ?? true;\n this.padding = this.initialPadding ?? '16px';\n this.textAlign = this.initialTextAlign ?? 'left';\n }\n\n onSave(): void {\n this.save.next({\n ckTypeId: '', // Not used for static content\n content: this.content,\n resolveVariables: this.resolveVariables,\n padding: this.padding || undefined,\n textAlign: this.textAlign\n });\n }\n\n onCancel(): void {\n this.cancelled.next();\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport {\n ProcessDiagramConfig,\n ProcessDiagramRuntimeState,\n ProcessElement,\n ProcessConnection,\n ElementRuntimeData,\n ConnectionRuntimeData,\n ProcessDataBinding,\n Threshold,\n GetProcessDiagramDtoGQL,\n GetProcessDiagramsDtoGQL,\n CreateProcessDiagramDtoGQL,\n UpdateProcessDiagramDtoGQL\n} from '@meshmakers/octo-process-diagrams';\nimport { FieldFilterDto } from '@meshmakers/octo-services';\nimport { MeshBoardDataService } from '../../../services/meshboard-data.service';\nimport { MeshBoardVariableService } from '../../../services/meshboard-variable.service';\nimport { MeshBoardStateService } from '../../../services/meshboard-state.service';\nimport { ExecuteRuntimeQueryDtoGQL, ExecuteRuntimeQueryQueryDto } from '../../../graphQL/executeRuntimeQuery';\nimport { RuntimeEntityData, WidgetFilterConfig } from '../../../models/meshboard.models';\nimport { ProcessWidgetConfig } from '../process-widget-config.model';\n\n/**\n * Process Data Service\n *\n * Handles data loading and transformation for the Process Widget.\n *\n * Responsibilities:\n * - Load process diagram configurations from backend\n * - Fetch runtime data for elements based on their data bindings\n * - Apply value transformations (thresholds, percentages, mappings)\n * - Manage refresh cycles\n *\n * Phase 1: Static data + one-time entity loading\n * Future: GraphQL subscriptions for real-time updates\n *\n * @example\n * ```typescript\n * const diagram = await dataService.loadDiagram('diagram-rtId');\n * const state = await dataService.loadRuntimeData(diagram);\n * ```\n */\n/**\n * Summary item for process diagram list\n */\nexport interface ProcessDiagramSummary {\n rtId: string;\n name: string;\n description?: string | null;\n version: string;\n canvasWidth: number;\n canvasHeight: number;\n}\n\n/**\n * Query result row from a persistent query\n */\nexport interface QueryResultRow {\n rtId?: string;\n ckTypeId?: string;\n cells: Map<string, unknown>;\n}\n\n/**\n * Result of a persistent query execution\n */\nexport interface QueryResultData {\n columns: { attributePath: string; attributeValueType?: string }[];\n rows: QueryResultRow[];\n totalCount: number;\n}\n\n/**\n * Result of data binding for the Process Widget\n */\nexport interface BoundDataResult {\n /** Type of data binding that produced this result */\n type: 'entity' | 'query';\n\n /** Single entity data (when type is 'entity' and bindingRtId was specified) */\n entity?: RuntimeEntityData;\n\n /** Query result data (when type is 'query') */\n queryResult?: QueryResultData;\n\n /** Error message if data loading failed */\n error?: string;\n\n /** Timestamp of the data load */\n loadedAt: Date;\n}\n\n@Injectable()\nexport class ProcessDataService {\n\n private readonly dataService = inject(MeshBoardDataService);\n private readonly variableService = inject(MeshBoardVariableService);\n private readonly stateService = inject(MeshBoardStateService);\n private readonly getProcessDiagramGQL = inject(GetProcessDiagramDtoGQL);\n private readonly getProcessDiagramsGQL = inject(GetProcessDiagramsDtoGQL);\n private readonly createProcessDiagramGQL = inject(CreateProcessDiagramDtoGQL);\n private readonly updateProcessDiagramGQL = inject(UpdateProcessDiagramDtoGQL);\n private readonly executeRuntimeQueryGQL = inject(ExecuteRuntimeQueryDtoGQL);\n\n /**\n * Loads a list of available process diagrams from the backend\n *\n * @param searchText - Optional search text to filter diagrams\n * @returns List of process diagram summaries\n */\n async loadDiagramList(searchText?: string): Promise<ProcessDiagramSummary[]> {\n try {\n const result = await firstValueFrom(this.getProcessDiagramsGQL.fetch({\n first: 100,\n searchFilter: searchText ? { searchTerm: searchText, language: 'de' } : undefined\n } as any));\n\n const items = result.data?.runtime?.systemUIProcessDiagram?.items || [];\n return items\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .map(item => ({\n rtId: item.rtId,\n name: item.name,\n description: item.description,\n version: item.version,\n canvasWidth: item.canvasWidth,\n canvasHeight: item.canvasHeight\n }));\n } catch (error) {\n console.error('Error loading process diagrams:', error);\n return [];\n }\n }\n\n /**\n * Loads a process diagram configuration from the backend\n *\n * @param rtId - The runtime ID of the process diagram\n * @returns The process diagram configuration\n */\n async loadDiagram(rtId: string): Promise<ProcessDiagramConfig> {\n const result = await firstValueFrom(this.getProcessDiagramGQL.fetch({ variables: { rtId } }));\n\n const item = result.data?.runtime?.systemUIProcessDiagram?.items?.[0];\n if (!item) {\n throw new Error(`Process diagram not found: ${rtId}`);\n }\n\n // Parse JSON fields\n const elements = this.parseJsonField<ProcessElement[]>(item.elements, []);\n const itemWithExtensions = item as unknown as {\n primitives?: string;\n symbolInstances?: string;\n transformProperties?: string;\n propertyBindings?: string;\n animations?: string;\n };\n const primitives = itemWithExtensions.primitives\n ? this.parseJsonField(itemWithExtensions.primitives, [])\n : undefined;\n const symbolInstances = itemWithExtensions.symbolInstances\n ? this.parseJsonField(itemWithExtensions.symbolInstances, [])\n : undefined;\n const connections = this.parseJsonField<ProcessConnection[]>(item.connections, []);\n const variables = item.variables ? this.parseJsonField(item.variables, []) : undefined;\n\n // Parse diagram-level property fields\n const transformProperties = itemWithExtensions.transformProperties\n ? this.parseJsonField(itemWithExtensions.transformProperties, [])\n : undefined;\n const propertyBindings = itemWithExtensions.propertyBindings\n ? this.parseJsonField(itemWithExtensions.propertyBindings, [])\n : undefined;\n const animations = itemWithExtensions.animations\n ? this.parseJsonField(itemWithExtensions.animations, [])\n : undefined;\n\n return {\n id: item.rtId,\n name: item.name,\n description: item.description ?? undefined,\n version: item.version,\n canvas: {\n width: item.canvasWidth,\n height: item.canvasHeight,\n backgroundColor: item.canvasBackgroundColor ?? undefined\n },\n elements,\n primitives,\n symbolInstances,\n connections,\n variables,\n transformProperties,\n propertyBindings,\n animations,\n refreshInterval: item.refreshInterval ?? undefined\n };\n }\n\n /**\n * Creates a new process diagram in the backend\n *\n * @param diagram - The process diagram configuration to create\n * @returns The created diagram with its new rtId\n */\n async createDiagram(diagram: ProcessDiagramConfig): Promise<ProcessDiagramConfig> {\n const input = this.toInputDto(diagram);\n\n const result = await firstValueFrom(this.createProcessDiagramGQL.mutate({\n variables: { entities: [input] }\n }));\n\n const created = result.data?.runtime?.systemUIProcessDiagrams?.create?.[0];\n if (!created) {\n throw new Error('Failed to create process diagram');\n }\n\n return {\n ...diagram,\n id: created.rtId\n };\n }\n\n /**\n * Updates an existing process diagram in the backend\n *\n * @param diagram - The process diagram configuration to update\n * @returns The updated diagram\n */\n async updateDiagram(diagram: ProcessDiagramConfig): Promise<ProcessDiagramConfig> {\n if (!diagram.id) {\n throw new Error('Cannot update diagram without rtId');\n }\n\n const input = {\n rtId: diagram.id,\n item: this.toInputDto(diagram)\n };\n\n const result = await firstValueFrom(this.updateProcessDiagramGQL.mutate({\n variables: { entities: [input] }\n }));\n\n const updated = result.data?.runtime?.systemUIProcessDiagrams?.update?.[0];\n if (!updated) {\n throw new Error('Failed to update process diagram');\n }\n\n return diagram;\n }\n\n /**\n * Saves a process diagram (creates new or updates existing)\n *\n * @param diagram - The process diagram configuration to save\n * @param isNew - Whether this is a new diagram (default: false)\n * @returns The saved diagram\n */\n async saveDiagram(diagram: ProcessDiagramConfig, isNew = false): Promise<ProcessDiagramConfig> {\n if (isNew || !diagram.id) {\n return this.createDiagram(diagram);\n }\n return this.updateDiagram(diagram);\n }\n\n /**\n * Converts a ProcessDiagramConfig to the GraphQL input DTO format\n */\n private toInputDto(diagram: ProcessDiagramConfig): {\n name: string;\n description?: string;\n version: string;\n canvasWidth: number;\n canvasHeight: number;\n canvasBackgroundColor?: string;\n elements: string;\n primitives?: string;\n symbolInstances?: string;\n connections: string;\n variables?: string;\n refreshInterval?: number;\n } {\n // Debug: Log primitives being saved\n if (diagram.primitives && diagram.primitives.length > 0) {\n console.log('[ProcessDataService] Saving primitives:', diagram.primitives.length, 'items');\n console.log('[ProcessDataService] Primitive types:', diagram.primitives.map(p => p.type));\n }\n\n const primitivesJson = diagram.primitives && diagram.primitives.length > 0\n ? JSON.stringify(diagram.primitives)\n : undefined;\n\n return {\n name: diagram.name,\n description: diagram.description,\n version: diagram.version,\n canvasWidth: diagram.canvas.width,\n canvasHeight: diagram.canvas.height,\n canvasBackgroundColor: diagram.canvas.backgroundColor,\n elements: JSON.stringify(diagram.elements),\n primitives: primitivesJson,\n symbolInstances: diagram.symbolInstances ? JSON.stringify(diagram.symbolInstances) : undefined,\n connections: JSON.stringify(diagram.connections),\n variables: diagram.variables ? JSON.stringify(diagram.variables) : undefined,\n refreshInterval: diagram.refreshInterval\n };\n }\n\n /**\n * Parses a JSON string field with error handling\n */\n private parseJsonField<T>(json: string, defaultValue: T): T {\n try {\n return JSON.parse(json) as T;\n } catch (error) {\n console.error('Error parsing JSON field:', error);\n return defaultValue;\n }\n }\n\n /**\n * Loads runtime data for all elements and connections in a diagram\n *\n * @param diagram - The process diagram configuration\n * @returns Runtime state with element and connection data\n */\n async loadRuntimeData(diagram: ProcessDiagramConfig): Promise<ProcessDiagramRuntimeState> {\n const state: ProcessDiagramRuntimeState = {\n elements: new Map(),\n connections: new Map(),\n isLoading: false,\n lastRefresh: new Date()\n };\n\n // Load data for all elements with data bindings\n for (const element of diagram.elements) {\n if (element.dataBinding) {\n const data = await this.loadElementData(element);\n state.elements.set(element.id, data);\n }\n }\n\n // Load data for connections with data-driven animations\n for (const connection of diagram.connections) {\n if (connection.animation?.dataBinding) {\n const data = await this.loadConnectionData(connection);\n state.connections.set(connection.id, data);\n }\n }\n\n return state;\n }\n\n /**\n * Loads data for a single element\n */\n private async loadElementData(element: ProcessElement): Promise<ElementRuntimeData> {\n const binding = element.dataBinding!;\n const now = new Date();\n\n try {\n const value = await this.fetchValue(binding);\n const displayValue = this.formatDisplayValue(value, binding);\n const computedColor = this.computeColorFromThresholds(value, binding);\n\n return {\n elementId: element.id,\n value,\n displayValue,\n computedColor,\n animationActive: this.shouldAnimationBeActive(value, binding),\n lastUpdated: now\n };\n } catch (error) {\n console.error(`Error loading data for element ${element.id}:`, error);\n return {\n elementId: element.id,\n value: undefined,\n displayValue: '--',\n lastUpdated: now,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n }\n\n /**\n * Loads data for a connection\n */\n private async loadConnectionData(connection: ProcessConnection): Promise<ConnectionRuntimeData> {\n const binding = connection.animation?.dataBinding;\n const now = new Date();\n\n if (!binding) {\n return {\n connectionId: connection.id,\n flowActive: connection.animation?.activeWhen === 'always',\n lastUpdated: now\n };\n }\n\n try {\n const value = await this.fetchValue(binding);\n const flowActive = this.shouldAnimationBeActive(value, binding);\n const flowRate = typeof value === 'number' ? value : undefined;\n\n return {\n connectionId: connection.id,\n flowActive,\n flowRate,\n lastUpdated: now\n };\n } catch (error) {\n console.error(`Error loading data for connection ${connection.id}:`, error);\n return {\n connectionId: connection.id,\n flowActive: false,\n lastUpdated: now,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n }\n\n /**\n * Fetches a value based on the data binding configuration\n */\n private async fetchValue(binding: ProcessDataBinding): Promise<unknown> {\n switch (binding.sourceType) {\n case 'static':\n return binding.sourceConfig.staticValue;\n\n case 'runtimeEntity':\n return this.fetchRuntimeEntityValue(binding);\n\n case 'persistentQuery':\n return this.fetchPersistentQueryValue(binding);\n\n default:\n throw new Error(`Unsupported data source type: ${binding.sourceType}`);\n }\n }\n\n /**\n * Fetches a value from a runtime entity\n */\n private async fetchRuntimeEntityValue(binding: ProcessDataBinding): Promise<unknown> {\n const { ckTypeId, rtId } = binding.sourceConfig;\n\n if (!ckTypeId || !rtId) {\n throw new Error('Runtime entity binding requires ckTypeId and rtId');\n }\n\n // Resolve variables in rtId (e.g., ${selectedTank})\n const resolvedRtId = this.resolveVariables(rtId);\n\n // Use MeshBoardDataService to fetch entity\n const entity = await firstValueFrom(\n this.dataService.fetchEntityWithAssociations(resolvedRtId, ckTypeId)\n );\n\n if (!entity) {\n throw new Error(`Entity not found: ${resolvedRtId}`);\n }\n\n // Extract attribute value\n return this.extractAttributeValue(entity, binding.attributePath);\n }\n\n /**\n * Fetches a value from a persistent query\n */\n private async fetchPersistentQueryValue(binding: ProcessDataBinding): Promise<unknown> {\n const { queryRtId } = binding.sourceConfig;\n\n if (!queryRtId) {\n throw new Error('Persistent query binding requires queryRtId');\n }\n\n // TODO: Implement persistent query execution\n // For now, return undefined\n console.warn('Persistent query data source not yet implemented');\n return undefined;\n }\n\n /**\n * Resolves variable references in a string\n * Supports ${variableName} syntax\n */\n private resolveVariables(input: string): string {\n const variables = this.stateService.getVariables();\n return this.variableService.resolveVariables(input, variables);\n }\n\n /**\n * Extracts an attribute value from an entity by path\n * Supports nested paths like \"properties.temperature\"\n */\n private extractAttributeValue(entity: { attributes?: { attributeName: string; value: unknown }[] }, path: string): unknown {\n if (!entity.attributes) return undefined;\n\n // Handle nested paths\n const parts = path.split('.');\n\n // First, try to find a direct attribute match\n const attr = entity.attributes.find(a => a.attributeName === path);\n if (attr) return attr.value;\n\n // Try to find by first part and navigate\n if (parts.length > 1) {\n const rootAttr = entity.attributes.find(a => a.attributeName === parts[0]);\n if (rootAttr && typeof rootAttr.value === 'object' && rootAttr.value !== null) {\n let value: unknown = rootAttr.value;\n for (let i = 1; i < parts.length; i++) {\n if (typeof value === 'object' && value !== null && parts[i] in (value as Record<string, unknown>)) {\n value = (value as Record<string, unknown>)[parts[i]];\n } else {\n return undefined;\n }\n }\n return value;\n }\n }\n\n return undefined;\n }\n\n /**\n * Formats a value for display based on transform configuration\n */\n private formatDisplayValue(value: unknown, binding: ProcessDataBinding): string {\n if (value === undefined || value === null) {\n return '--';\n }\n\n const transform = binding.transform;\n if (!transform) {\n return String(value);\n }\n\n const prefix = transform.prefix ?? '';\n const suffix = transform.suffix ?? '';\n const decimals = transform.decimals ?? 0;\n\n if (typeof value === 'number') {\n let displayValue = value;\n\n // Apply percentage transformation\n if (transform.type === 'percentage' && transform.min !== undefined && transform.max !== undefined) {\n const range = transform.max - transform.min;\n displayValue = ((value - transform.min) / range) * 100;\n }\n\n return `${prefix}${displayValue.toFixed(decimals)}${suffix}`;\n }\n\n // Check for value mappings\n if (transform.mappings) {\n const mapping = transform.mappings.find(m => m.input === value);\n if (mapping) {\n return `${prefix}${mapping.output}${suffix}`;\n }\n }\n\n return `${prefix}${value}${suffix}`;\n }\n\n /**\n * Computes color based on threshold configuration\n */\n private computeColorFromThresholds(value: unknown, binding: ProcessDataBinding): string | undefined {\n const thresholds = binding.transform?.thresholds;\n if (!thresholds || thresholds.length === 0) {\n return undefined;\n }\n\n if (typeof value !== 'number') {\n return undefined;\n }\n\n // Sort thresholds by value\n const sortedThresholds = [...thresholds].sort((a, b) => a.value - b.value);\n\n // Find the applicable threshold\n let applicableThreshold: Threshold | undefined;\n for (const threshold of sortedThresholds) {\n if (value >= threshold.value) {\n applicableThreshold = threshold;\n } else {\n break;\n }\n }\n\n return applicableThreshold?.color;\n }\n\n /**\n * Determines if animation should be active based on value\n */\n private shouldAnimationBeActive(value: unknown, _binding: ProcessDataBinding): boolean {\n // No activeWhen condition means always active\n // This is handled at a higher level for connections\n\n if (value === undefined || value === null) {\n return false;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'number') {\n return value > 0;\n }\n\n if (typeof value === 'string') {\n const lowerValue = value.toLowerCase();\n return lowerValue === 'true' || lowerValue === 'on' || lowerValue === 'active' || lowerValue === 'running';\n }\n\n return false;\n }\n\n // ============================================================================\n // Widget Data Binding Methods\n // ============================================================================\n\n /**\n * Loads bound data based on widget configuration.\n * Supports both runtimeEntity and persistentQuery data binding modes.\n *\n * @param config - The process widget configuration with data binding settings\n * @returns BoundDataResult containing the loaded data, or null if no binding configured\n */\n async loadBoundData(config: ProcessWidgetConfig): Promise<BoundDataResult | null> {\n if (!config.dataBindingMode || config.dataBindingMode === 'none') {\n return null;\n }\n\n try {\n if (config.dataBindingMode === 'runtimeEntity') {\n return await this.loadBoundRuntimeEntityData(config);\n }\n\n if (config.dataBindingMode === 'persistentQuery') {\n return await this.loadBoundQueryData(config);\n }\n\n return null;\n } catch (error) {\n console.error('[ProcessDataService] Error loading bound data:', error);\n return {\n type: config.dataBindingMode === 'runtimeEntity' ? 'entity' : 'query',\n error: error instanceof Error ? error.message : 'Unknown error',\n loadedAt: new Date()\n };\n }\n }\n\n /**\n * Loads data from a runtime entity binding\n */\n private async loadBoundRuntimeEntityData(config: ProcessWidgetConfig): Promise<BoundDataResult> {\n const { bindingCkTypeId, bindingRtId } = config;\n\n if (!bindingCkTypeId) {\n throw new Error('Runtime entity binding requires a CK Type ID');\n }\n\n if (!bindingRtId) {\n throw new Error('Runtime entity binding requires a Runtime ID');\n }\n\n // Resolve variables in rtId (e.g., ${selectedEntity})\n const resolvedRtId = this.resolveVariables(bindingRtId);\n\n // Fetch the entity\n const entity = await firstValueFrom(\n this.dataService.fetchEntityWithAssociations(resolvedRtId, bindingCkTypeId)\n );\n\n if (!entity) {\n throw new Error(`Entity not found: ${resolvedRtId}`);\n }\n\n return {\n type: 'entity',\n entity,\n loadedAt: new Date()\n };\n }\n\n /**\n * Loads data from a persistent query binding\n */\n private async loadBoundQueryData(config: ProcessWidgetConfig): Promise<BoundDataResult> {\n const { bindingQueryRtId, bindingFilters } = config;\n\n if (!bindingQueryRtId) {\n throw new Error('Persistent query binding requires a Query rtId');\n }\n\n // Convert widget filters to GraphQL format with variable resolution\n const fieldFilters = this.convertFiltersToDto(bindingFilters);\n\n // Execute the query\n const result = await firstValueFrom(\n this.executeRuntimeQueryGQL.fetch({\n variables: {\n rtId: bindingQueryRtId,\n first: 1000, // Reasonable limit for process diagram data\n fieldFilter: fieldFilters\n }\n })\n );\n\n // Parse the query result\n const queryData = result.data?.runtime?.runtimeQuery?.items?.[0];\n if (!queryData) {\n throw new Error(`Query not found or returned no data: ${bindingQueryRtId}`);\n }\n\n // Map the result to our format\n const queryResult = this.mapQueryResult(queryData);\n\n return {\n type: 'query',\n queryResult,\n loadedAt: new Date()\n };\n }\n\n /**\n * Maps GraphQL query result to QueryResultData format\n */\n private mapQueryResult(queryData: NonNullable<NonNullable<NonNullable<ExecuteRuntimeQueryQueryDto['runtime']>['runtimeQuery']>['items']>[0]): QueryResultData {\n const columns = queryData.columns.map(col => ({\n attributePath: col.attributePath ?? '',\n attributeValueType: col.attributeValueType ?? undefined\n }));\n\n const rows: QueryResultRow[] = (queryData.rows?.items ?? []).map(row => {\n const cells = new Map<string, unknown>();\n\n for (const cell of row?.cells?.items ?? []) {\n if (cell?.attributePath) {\n cells.set(cell.attributePath, cell.value);\n }\n }\n\n // Handle different row types\n const typedRow = row as { rtId?: string; ckTypeId?: string };\n\n return {\n rtId: typedRow.rtId ?? undefined,\n ckTypeId: typedRow.ckTypeId ?? undefined,\n cells\n };\n });\n\n return {\n columns,\n rows,\n totalCount: queryData.rows?.totalCount ?? 0\n };\n }\n\n /**\n * Converts widget filter configuration to GraphQL FieldFilterDto format.\n * Resolves MeshBoard variables in filter values before conversion.\n */\n private convertFiltersToDto(filters?: WidgetFilterConfig[]): FieldFilterDto[] | undefined {\n const variables = this.stateService.getVariables();\n return this.variableService.convertToFieldFilterDto(filters, variables);\n }\n}\n","import {\n Component,\n Input,\n OnInit,\n OnChanges,\n SimpleChanges,\n inject,\n signal,\n computed,\n ElementRef,\n ViewChild\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { DashboardWidget } from '../widget.interface';\nimport { ProcessWidgetConfig } from './process-widget-config.model';\nimport { ProcessDataService, BoundDataResult } from './services/process-data.service';\nimport type {\n ProcessDiagramConfig,\n ProcessDiagramRuntimeState,\n ProcessElement,\n ProcessConnection,\n ElementRuntimeData,\n TankElementConfig,\n SiloElementConfig,\n VesselElementConfig,\n ValveElementConfig,\n PumpElementConfig,\n MotorElementConfig,\n LabelElementConfig,\n ImageElementConfig,\n ShapeElementConfig,\n CustomSvgElementConfig,\n StatusLightElementConfig,\n DigitalDisplayElementConfig,\n ProcessGaugeElementConfig,\n PrimitiveBase,\n SymbolInstance,\n SymbolDefinition,\n PropertyBinding,\n TransformProperty,\n StyleClass,\n PrimitiveStyle,\n AttributeAnimation\n} from '@meshmakers/octo-process-diagrams';\nimport {\n SymbolLibraryService,\n ExpressionEvaluatorService,\n renderAnimations,\n AnimationRenderContext,\n renderFlowParticles,\n getFlowParticlesAnimation\n} from '@meshmakers/octo-process-diagrams';\nimport { DiagramPropertyMapping } from './process-widget-config.model';\nimport { RuntimeEntityData } from '../../models/meshboard.models';\nimport { QueryResultData } from './services/process-data.service';\n\n/**\n * Process Widget Component\n *\n * Renders industrial process visualizations (HMI-style diagrams) with:\n * - SVG-based rendering for scalability\n * - Real-time data binding to OctoMesh entities\n * - Flow animations on connections\n * - Threshold-based color changes\n * - Support for custom SVG elements\n *\n * Phase 1 Implementation:\n * - Basic element rendering (Tank, Valve, Pump, Label, CustomSvg)\n * - Static data loading (one-time fetch)\n * - Simple flow animations\n *\n * Future phases will add:\n * - Real-time updates via GraphQL subscriptions\n * - Interactive elements\n * - Process Designer integration\n *\n * @example\n * ```html\n * <mm-process-widget [config]=\"widgetConfig\"></mm-process-widget>\n * ```\n */\n@Component({\n selector: 'mm-process-widget',\n standalone: true,\n imports: [CommonModule],\n providers: [ProcessDataService, ExpressionEvaluatorService],\n template: `\n <div class=\"process-widget\"\n [class.loading]=\"isLoading()\"\n [class.error]=\"error()\"\n #containerRef>\n @if (isLoading()) {\n <div class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <span>Loading process diagram...</span>\n </div>\n } @else if (error()) {\n <div class=\"error-container\">\n <span class=\"error-icon\">⚠</span>\n <span class=\"error-message\">{{ error() }}</span>\n </div>\n } @else if (diagramConfig()) {\n <div class=\"diagram-container\"\n [style.width.px]=\"diagramConfig()!.canvas.width\"\n [style.height.px]=\"diagramConfig()!.canvas.height\"\n [class.fit-to-bounds]=\"config.fitToBounds !== false\">\n <svg\n [attr.viewBox]=\"viewBox()\"\n [attr.width]=\"svgWidth()\"\n [attr.height]=\"svgHeight()\"\n preserveAspectRatio=\"xMidYMid meet\"\n class=\"process-svg\">\n\n <!-- Definitions (gradients, patterns, filters) -->\n <defs>\n <!-- Tank gradient -->\n <linearGradient id=\"tankGradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" style=\"stop-color:#e0e0e0;stop-opacity:1\" />\n <stop offset=\"50%\" style=\"stop-color:#f5f5f5;stop-opacity:1\" />\n <stop offset=\"100%\" style=\"stop-color:#e0e0e0;stop-opacity:1\" />\n </linearGradient>\n\n <!-- Liquid gradient -->\n <linearGradient id=\"liquidGradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" style=\"stop-color:#1976d2;stop-opacity:0.9\" />\n <stop offset=\"50%\" style=\"stop-color:#42a5f5;stop-opacity:0.9\" />\n <stop offset=\"100%\" style=\"stop-color:#1976d2;stop-opacity:0.9\" />\n </linearGradient>\n\n <!-- Flow animation pattern -->\n <pattern id=\"flowPattern\" x=\"0\" y=\"0\" width=\"20\" height=\"10\" patternUnits=\"userSpaceOnUse\">\n <circle cx=\"5\" cy=\"5\" r=\"3\" fill=\"#42a5f5\">\n <animate attributeName=\"cx\" from=\"-5\" to=\"25\" dur=\"1s\" repeatCount=\"indefinite\"/>\n </circle>\n </pattern>\n\n <!-- Glow filter for status lights -->\n <filter id=\"glowFilter\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\n <feGaussianBlur stdDeviation=\"3\" result=\"blur\"/>\n <feMerge>\n <feMergeNode in=\"blur\"/>\n <feMergeNode in=\"SourceGraphic\"/>\n </feMerge>\n </filter>\n </defs>\n\n <!-- Background - uses CSS class for theming support -->\n <rect\n class=\"canvas-background\"\n x=\"0\" y=\"0\"\n [attr.width]=\"diagramConfig()!.canvas.width\"\n [attr.height]=\"diagramConfig()!.canvas.height\"/>\n\n <!-- Connections (rendered first, below elements) -->\n @for (connection of diagramConfig()!.connections; track connection.id) {\n <g class=\"connection\" [attr.data-id]=\"connection.id\">\n @if (getConnectionPath(connection); as pathData) {\n <!-- Connection line -->\n <path\n [attr.d]=\"pathData\"\n [attr.stroke]=\"connection.style.strokeColor\"\n [attr.stroke-width]=\"connection.style.strokeWidth\"\n [attr.stroke-dasharray]=\"connection.style.strokeDash?.join(',') ?? 'none'\"\n [attr.stroke-linecap]=\"connection.style.lineCap ?? 'round'\"\n fill=\"none\"\n class=\"connection-line\"/>\n\n <!-- Flow animation overlay -->\n @if (connection.animation?.enabled && isConnectionFlowActive(connection)) {\n <path\n [attr.d]=\"pathData\"\n stroke=\"url(#flowPattern)\"\n [attr.stroke-width]=\"connection.style.strokeWidth + 2\"\n fill=\"none\"\n class=\"connection-flow\"\n [style.animation-duration]=\"getFlowAnimationDuration(connection)\"/>\n }\n }\n </g>\n }\n\n <!-- Elements -->\n @for (element of diagramConfig()!.elements; track element.id) {\n <g class=\"element\"\n [attr.data-id]=\"element.id\"\n [attr.data-type]=\"element.type\"\n [attr.transform]=\"getElementTransform(element)\"\n [class.interactive]=\"element.interactive\">\n\n @switch (element.type) {\n @case ('tank') {\n <g class=\"tank-element\">\n @if (asTank(element); as tank) {\n <!-- Tank body -->\n <rect\n x=\"0\" y=\"0\"\n [attr.width]=\"tank.size.width\"\n [attr.height]=\"tank.size.height\"\n [attr.rx]=\"tank.config.shape === 'cylindrical' ? 10 : 0\"\n fill=\"url(#tankGradient)\"\n [attr.stroke]=\"tank.style?.strokeColor ?? '#666'\"\n [attr.stroke-width]=\"tank.style?.strokeWidth ?? 2\"/>\n\n <!-- Fill level -->\n @if (tank.config.showLevel) {\n <rect\n x=\"2\"\n [attr.y]=\"getTankFillY(tank)\"\n [attr.width]=\"tank.size.width - 4\"\n [attr.height]=\"getTankFillHeight(tank)\"\n [attr.rx]=\"tank.config.shape === 'cylindrical' ? 8 : 0\"\n [attr.fill]=\"getElementColor(tank)\"\n class=\"tank-fill\"/>\n }\n\n <!-- Percentage label -->\n @if (tank.config.showPercentage) {\n <text\n [attr.x]=\"tank.size.width / 2\"\n [attr.y]=\"tank.size.height / 2\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n class=\"tank-label\"\n fill=\"#333\"\n font-size=\"14\"\n font-weight=\"bold\">\n {{ getElementDisplayValue(tank) }}\n </text>\n }\n }\n </g>\n }\n\n @case ('valve') {\n <g class=\"valve-element\">\n @if (asValve(element); as valve) {\n <!-- Valve body (bowtie shape) -->\n <polygon\n [attr.points]=\"getValvePoints(valve)\"\n [attr.fill]=\"getElementColor(valve)\"\n [attr.stroke]=\"valve.style?.strokeColor ?? '#333'\"\n [attr.stroke-width]=\"valve.style?.strokeWidth ?? 2\"/>\n\n <!-- Valve state label -->\n @if (valve.config.showState) {\n <text\n [attr.x]=\"valve.size.width / 2\"\n [attr.y]=\"valve.size.height + 15\"\n text-anchor=\"middle\"\n class=\"valve-label\"\n fill=\"#333\"\n font-size=\"10\">\n {{ getElementDisplayValue(valve) }}\n </text>\n }\n }\n </g>\n }\n\n @case ('pump') {\n <g class=\"pump-element\">\n @if (asPump(element); as pump) {\n <!-- Pump circle -->\n <circle\n [attr.cx]=\"pump.size.width / 2\"\n [attr.cy]=\"pump.size.height / 2\"\n [attr.r]=\"Math.min(pump.size.width, pump.size.height) / 2 - 2\"\n [attr.fill]=\"getElementColor(pump)\"\n [attr.stroke]=\"pump.style?.strokeColor ?? '#333'\"\n [attr.stroke-width]=\"pump.style?.strokeWidth ?? 2\"/>\n\n <!-- Pump impeller (rotating) -->\n <g [attr.transform]=\"'translate(' + pump.size.width/2 + ',' + pump.size.height/2 + ')'\"\n [class.rotating]=\"isPumpRunning(pump)\">\n <line x1=\"-15\" y1=\"0\" x2=\"15\" y2=\"0\" stroke=\"#333\" stroke-width=\"3\"/>\n <line x1=\"0\" y1=\"-15\" x2=\"0\" y2=\"15\" stroke=\"#333\" stroke-width=\"3\"/>\n <line x1=\"-10\" y1=\"-10\" x2=\"10\" y2=\"10\" stroke=\"#333\" stroke-width=\"2\"/>\n <line x1=\"10\" y1=\"-10\" x2=\"-10\" y2=\"10\" stroke=\"#333\" stroke-width=\"2\"/>\n </g>\n\n <!-- State label -->\n @if (pump.config.showState) {\n <text\n [attr.x]=\"pump.size.width / 2\"\n [attr.y]=\"pump.size.height + 15\"\n text-anchor=\"middle\"\n class=\"pump-label\"\n fill=\"#333\"\n font-size=\"10\">\n {{ getElementDisplayValue(pump) }}\n </text>\n }\n }\n </g>\n }\n\n @case ('statusLight') {\n <g class=\"status-light-element\">\n @if (asStatusLight(element); as light) {\n @if (light.config.shape === 'circle') {\n <circle\n [attr.cx]=\"light.size.width / 2\"\n [attr.cy]=\"light.size.height / 2\"\n [attr.r]=\"Math.min(light.size.width, light.size.height) / 2 - 2\"\n [attr.fill]=\"getElementColor(light)\"\n [attr.stroke]=\"light.style?.strokeColor ?? '#333'\"\n [attr.stroke-width]=\"light.style?.strokeWidth ?? 1\"\n [attr.filter]=\"isStatusLightOn(light) && light.config.showGlow ? 'url(#glowFilter)' : 'none'\"\n [class.blinking]=\"isStatusLightOn(light) && light.config.blinkWhenOn\"/>\n } @else {\n <rect\n x=\"2\" y=\"2\"\n [attr.width]=\"light.size.width - 4\"\n [attr.height]=\"light.size.height - 4\"\n [attr.rx]=\"light.config.shape === 'square' ? 2 : 0\"\n [attr.fill]=\"getElementColor(light)\"\n [attr.stroke]=\"light.style?.strokeColor ?? '#333'\"\n [attr.stroke-width]=\"light.style?.strokeWidth ?? 1\"\n [attr.filter]=\"isStatusLightOn(light) && light.config.showGlow ? 'url(#glowFilter)' : 'none'\"\n [class.blinking]=\"isStatusLightOn(light) && light.config.blinkWhenOn\"/>\n }\n }\n </g>\n }\n\n @case ('digitalDisplay') {\n <g class=\"digital-display-element\">\n @if (asDigitalDisplay(element); as display) {\n <!-- Display background -->\n <rect\n x=\"0\" y=\"0\"\n [attr.width]=\"display.size.width\"\n [attr.height]=\"display.size.height\"\n [attr.fill]=\"display.config.backgroundColor ?? '#1a1a1a'\"\n [attr.stroke]=\"display.style?.strokeColor ?? '#333'\"\n [attr.stroke-width]=\"display.style?.strokeWidth ?? 1\"\n rx=\"3\"/>\n\n <!-- Display value -->\n <text\n [attr.x]=\"display.size.width / 2\"\n [attr.y]=\"display.size.height / 2\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n class=\"digital-display-value\"\n [attr.fill]=\"display.config.textStyle?.color ?? '#00ff00'\"\n [attr.font-size]=\"display.config.textStyle?.fontSize ?? 16\"\n font-family=\"monospace\">\n {{ getElementDisplayValue(display) }}\n </text>\n }\n </g>\n }\n\n @case ('label') {\n <g class=\"label-element\">\n @if (asLabel(element); as label) {\n @if (label.config.backgroundColor || label.config.showBorder) {\n <rect\n x=\"0\" y=\"0\"\n [attr.width]=\"label.size.width\"\n [attr.height]=\"label.size.height\"\n [attr.fill]=\"label.config.backgroundColor ?? 'transparent'\"\n [attr.stroke]=\"label.config.showBorder ? (label.style?.strokeColor ?? '#999') : 'none'\"\n [attr.stroke-width]=\"label.style?.strokeWidth ?? 1\"\n rx=\"2\"/>\n }\n <text\n [attr.x]=\"getLabelX(label)\"\n [attr.y]=\"label.size.height / 2\"\n [attr.text-anchor]=\"label.config.textStyle?.textAlign ?? 'left'\"\n dominant-baseline=\"middle\"\n [attr.fill]=\"label.config.textStyle?.color ?? '#333'\"\n [attr.font-size]=\"label.config.textStyle?.fontSize ?? 14\"\n [attr.font-weight]=\"label.config.textStyle?.fontWeight ?? 'normal'\">\n {{ getElementDisplayValue(label) || label.config.text }}\n </text>\n }\n </g>\n }\n\n @case ('customSvg') {\n <g class=\"custom-svg-element\"\n [innerHTML]=\"getCustomSvgContent(element)\">\n </g>\n }\n\n @case ('silo') {\n <g class=\"silo-element\">\n @if (asSilo(element); as silo) {\n <!-- Silo body (cylindrical with conical bottom) -->\n <path\n [attr.d]=\"getSiloPath(silo)\"\n fill=\"url(#tankGradient)\"\n [attr.stroke]=\"silo.style?.strokeColor ?? '#666'\"\n [attr.stroke-width]=\"silo.style?.strokeWidth ?? 2\"/>\n\n <!-- Fill level -->\n @if (silo.config.showLevel) {\n <clipPath [attr.id]=\"'silo-clip-' + silo.id\">\n <path [attr.d]=\"getSiloPath(silo)\"/>\n </clipPath>\n <rect\n x=\"2\"\n [attr.y]=\"getSiloFillY(silo)\"\n [attr.width]=\"silo.size.width - 4\"\n [attr.height]=\"getSiloFillHeight(silo)\"\n [attr.fill]=\"getElementColor(silo)\"\n [attr.clip-path]=\"'url(#silo-clip-' + silo.id + ')'\"\n class=\"silo-fill\"/>\n }\n\n <!-- Percentage label -->\n @if (silo.config.showPercentage) {\n <text\n [attr.x]=\"silo.size.width / 2\"\n [attr.y]=\"silo.size.height * 0.4\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n class=\"silo-label\"\n fill=\"#333\"\n font-size=\"14\"\n font-weight=\"bold\">\n {{ getElementDisplayValue(silo) }}\n </text>\n }\n }\n </g>\n }\n\n @case ('vessel') {\n <g class=\"vessel-element\">\n @if (asVessel(element); as vessel) {\n <!-- Vessel body with rounded top -->\n <path\n [attr.d]=\"getVesselPath(vessel)\"\n fill=\"url(#tankGradient)\"\n [attr.stroke]=\"vessel.style?.strokeColor ?? '#666'\"\n [attr.stroke-width]=\"vessel.style?.strokeWidth ?? 2\"/>\n\n <!-- Fill level -->\n @if (vessel.config.showLevel) {\n <clipPath [attr.id]=\"'vessel-clip-' + vessel.id\">\n <path [attr.d]=\"getVesselPath(vessel)\"/>\n </clipPath>\n <rect\n x=\"2\"\n [attr.y]=\"getVesselFillY(vessel)\"\n [attr.width]=\"vessel.size.width - 4\"\n [attr.height]=\"getVesselFillHeight(vessel)\"\n [attr.fill]=\"getElementColor(vessel)\"\n [attr.clip-path]=\"'url(#vessel-clip-' + vessel.id + ')'\"\n class=\"vessel-fill\"/>\n }\n\n <!-- Percentage label -->\n @if (vessel.config.showPercentage) {\n <text\n [attr.x]=\"vessel.size.width / 2\"\n [attr.y]=\"vessel.size.height / 2\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n fill=\"#333\"\n font-size=\"14\"\n font-weight=\"bold\">\n {{ getElementDisplayValue(vessel) }}\n </text>\n }\n }\n </g>\n }\n\n @case ('motor') {\n <g class=\"motor-element\">\n @if (asMotor(element); as motor) {\n <!-- Motor body (rectangle with rounded corners) -->\n <rect\n x=\"0\" y=\"0\"\n [attr.width]=\"motor.size.width\"\n [attr.height]=\"motor.size.height\"\n rx=\"4\"\n [attr.fill]=\"getElementColor(motor)\"\n [attr.stroke]=\"motor.style?.strokeColor ?? '#333'\"\n [attr.stroke-width]=\"motor.style?.strokeWidth ?? 2\"/>\n\n <!-- Motor shaft indicator -->\n <circle\n [attr.cx]=\"motor.size.width / 2\"\n [attr.cy]=\"motor.size.height / 2\"\n [attr.r]=\"Math.min(motor.size.width, motor.size.height) / 4\"\n fill=\"#fff\"\n stroke=\"#333\"\n stroke-width=\"1\"/>\n\n <!-- Rotating element -->\n <g [attr.transform]=\"'translate(' + motor.size.width/2 + ',' + motor.size.height/2 + ')'\"\n [class.rotating]=\"isMotorRunning(motor)\">\n <line x1=\"-10\" y1=\"0\" x2=\"10\" y2=\"0\" stroke=\"#333\" stroke-width=\"2\"/>\n <line x1=\"0\" y1=\"-10\" x2=\"0\" y2=\"10\" stroke=\"#333\" stroke-width=\"2\"/>\n </g>\n\n <!-- M label -->\n <text\n [attr.x]=\"motor.size.width - 12\"\n [attr.y]=\"12\"\n text-anchor=\"middle\"\n font-size=\"10\"\n font-weight=\"bold\"\n fill=\"#333\">M</text>\n\n <!-- State label -->\n @if (motor.config.showState) {\n <text\n [attr.x]=\"motor.size.width / 2\"\n [attr.y]=\"motor.size.height + 15\"\n text-anchor=\"middle\"\n fill=\"#333\"\n font-size=\"10\">\n {{ getElementDisplayValue(motor) }}\n </text>\n }\n }\n </g>\n }\n\n @case ('image') {\n <g class=\"image-element\">\n @if (asImage(element); as img) {\n <image\n x=\"0\" y=\"0\"\n [attr.width]=\"img.size.width\"\n [attr.height]=\"img.size.height\"\n [attr.href]=\"img.config.src\"\n [attr.preserveAspectRatio]=\"getImagePreserveAspectRatio(img)\"/>\n }\n </g>\n }\n\n @case ('shape') {\n <g class=\"shape-element\">\n @if (asShape(element); as shape) {\n @switch (shape.config.shapeType) {\n @case ('rectangle') {\n <rect\n x=\"0\" y=\"0\"\n [attr.width]=\"shape.size.width\"\n [attr.height]=\"shape.size.height\"\n [attr.rx]=\"shape.config.borderRadius ?? 0\"\n [attr.fill]=\"shape.style?.fillColor ?? '#e0e0e0'\"\n [attr.stroke]=\"shape.style?.strokeColor ?? '#666'\"\n [attr.stroke-width]=\"shape.style?.strokeWidth ?? 1\"/>\n }\n @case ('circle') {\n <circle\n [attr.cx]=\"shape.size.width / 2\"\n [attr.cy]=\"shape.size.height / 2\"\n [attr.r]=\"Math.min(shape.size.width, shape.size.height) / 2\"\n [attr.fill]=\"shape.style?.fillColor ?? '#e0e0e0'\"\n [attr.stroke]=\"shape.style?.strokeColor ?? '#666'\"\n [attr.stroke-width]=\"shape.style?.strokeWidth ?? 1\"/>\n }\n @case ('ellipse') {\n <ellipse\n [attr.cx]=\"shape.size.width / 2\"\n [attr.cy]=\"shape.size.height / 2\"\n [attr.rx]=\"shape.size.width / 2\"\n [attr.ry]=\"shape.size.height / 2\"\n [attr.fill]=\"shape.style?.fillColor ?? '#e0e0e0'\"\n [attr.stroke]=\"shape.style?.strokeColor ?? '#666'\"\n [attr.stroke-width]=\"shape.style?.strokeWidth ?? 1\"/>\n }\n @case ('polygon') {\n <polygon\n [attr.points]=\"shape.config.points\"\n [attr.fill]=\"shape.style?.fillColor ?? '#e0e0e0'\"\n [attr.stroke]=\"shape.style?.strokeColor ?? '#666'\"\n [attr.stroke-width]=\"shape.style?.strokeWidth ?? 1\"/>\n }\n @case ('line') {\n <line\n [attr.x1]=\"shape.config.lineStart?.x ?? 0\"\n [attr.y1]=\"shape.config.lineStart?.y ?? 0\"\n [attr.x2]=\"shape.config.lineEnd?.x ?? shape.size.width\"\n [attr.y2]=\"shape.config.lineEnd?.y ?? shape.size.height\"\n [attr.stroke]=\"shape.style?.strokeColor ?? '#666'\"\n [attr.stroke-width]=\"shape.style?.strokeWidth ?? 2\"/>\n }\n }\n }\n </g>\n }\n\n @case ('gauge') {\n <g class=\"gauge-element\">\n @if (asGauge(element); as gauge) {\n @if (gauge.config.gaugeType === 'arc' || gauge.config.gaugeType === 'semicircle') {\n <!-- Arc/Semicircle gauge background -->\n <path\n [attr.d]=\"getGaugeArcPath(gauge, false)\"\n fill=\"none\"\n [attr.stroke]=\"gauge.style?.strokeColor ?? '#e0e0e0'\"\n [attr.stroke-width]=\"8\"\n stroke-linecap=\"round\"/>\n\n <!-- Arc/Semicircle gauge value -->\n <path\n [attr.d]=\"getGaugeArcPath(gauge, true)\"\n fill=\"none\"\n [attr.stroke]=\"getElementColor(gauge)\"\n [attr.stroke-width]=\"8\"\n stroke-linecap=\"round\"/>\n\n <!-- Value text -->\n @if (gauge.config.showValue) {\n <text\n [attr.x]=\"gauge.size.width / 2\"\n [attr.y]=\"gauge.config.gaugeType === 'semicircle' ? gauge.size.height - 10 : gauge.size.height / 2\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-size=\"14\"\n font-weight=\"bold\"\n fill=\"#333\">\n {{ getElementDisplayValue(gauge) }}\n </text>\n }\n } @else {\n <!-- Linear gauge background -->\n <rect\n x=\"0\" y=\"0\"\n [attr.width]=\"gauge.size.width\"\n [attr.height]=\"gauge.size.height\"\n rx=\"4\"\n [attr.fill]=\"gauge.style?.fillColor ?? '#e0e0e0'\"\n [attr.stroke]=\"gauge.style?.strokeColor ?? '#999'\"\n stroke-width=\"1\"/>\n\n <!-- Linear gauge fill -->\n <rect\n x=\"2\" y=\"2\"\n [attr.width]=\"getLinearGaugeFillWidth(gauge)\"\n [attr.height]=\"gauge.size.height - 4\"\n rx=\"2\"\n [attr.fill]=\"getElementColor(gauge)\"/>\n\n <!-- Value text -->\n @if (gauge.config.showValue) {\n <text\n [attr.x]=\"gauge.size.width / 2\"\n [attr.y]=\"gauge.size.height / 2\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-size=\"12\"\n font-weight=\"bold\"\n fill=\"#333\">\n {{ getElementDisplayValue(gauge) }}\n </text>\n }\n }\n }\n </g>\n }\n\n @default {\n <!-- Placeholder for unsupported element types -->\n <rect\n x=\"0\" y=\"0\"\n [attr.width]=\"$any(element).size.width\"\n [attr.height]=\"$any(element).size.height\"\n fill=\"#f0f0f0\"\n stroke=\"#ccc\"\n stroke-width=\"1\"\n stroke-dasharray=\"5,5\"/>\n <text\n [attr.x]=\"$any(element).size.width / 2\"\n [attr.y]=\"$any(element).size.height / 2\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n fill=\"#999\"\n font-size=\"10\">\n {{ $any(element).type }}\n </text>\n }\n }\n </g>\n }\n\n <!-- Primitives (from Process Designer, with bindings applied) -->\n @for (primitive of boundPrimitives(); track primitive.id) {\n @if (primitive.visible !== false) {\n <g class=\"primitive\"\n [attr.data-id]=\"primitive.id\"\n [attr.data-type]=\"primitive.type\"\n [attr.transform]=\"getPrimitiveTransform(primitive)\">\n <!-- Animation elements (injected via innerHTML) -->\n <g class=\"animations\" [innerHTML]=\"getPrimitiveAnimationHtml(primitive)\"></g>\n <!-- Shape content -->\n @switch (primitive.type) {\n @case ('rectangle') {\n <rect\n x=\"0\" y=\"0\"\n [attr.width]=\"$any(primitive).config.width\"\n [attr.height]=\"$any(primitive).config.height\"\n [attr.rx]=\"$any(primitive).config.cornerRadius ?? 0\"\n [attr.fill]=\"primitive.style?.fill?.color ?? 'none'\"\n [attr.fill-opacity]=\"primitive.style?.fill?.opacity ?? 1\"\n [attr.stroke]=\"primitive.style?.stroke?.color ?? 'none'\"\n [attr.stroke-width]=\"primitive.style?.stroke?.width ?? 0\"\n [attr.stroke-opacity]=\"primitive.style?.stroke?.opacity ?? 1\"\n [attr.stroke-dasharray]=\"getStrokeDashArray(primitive.style?.stroke?.dashArray)\"/>\n }\n @case ('ellipse') {\n <ellipse\n cx=\"0\" cy=\"0\"\n [attr.rx]=\"$any(primitive).config.radiusX ?? $any(primitive).config.rx ?? 50\"\n [attr.ry]=\"$any(primitive).config.radiusY ?? $any(primitive).config.ry ?? 50\"\n [attr.fill]=\"primitive.style?.fill?.color ?? 'none'\"\n [attr.fill-opacity]=\"primitive.style?.fill?.opacity ?? 1\"\n [attr.stroke]=\"primitive.style?.stroke?.color ?? 'none'\"\n [attr.stroke-width]=\"primitive.style?.stroke?.width ?? 0\"\n [attr.stroke-opacity]=\"primitive.style?.stroke?.opacity ?? 1\"\n [attr.stroke-dasharray]=\"getStrokeDashArray(primitive.style?.stroke?.dashArray)\"/>\n }\n @case ('line') {\n <line\n [attr.x1]=\"$any(primitive).config.start.x\"\n [attr.y1]=\"$any(primitive).config.start.y\"\n [attr.x2]=\"$any(primitive).config.end.x\"\n [attr.y2]=\"$any(primitive).config.end.y\"\n [attr.stroke]=\"primitive.style?.stroke?.color ?? 'none'\"\n [attr.stroke-width]=\"primitive.style?.stroke?.width ?? 1\"\n [attr.stroke-opacity]=\"primitive.style?.stroke?.opacity ?? 1\"\n [attr.stroke-dasharray]=\"getEffectiveStrokeDashArray(primitive)\"\n [attr.marker-start]=\"$any(primitive).config.startMarker ? 'url(#' + $any(primitive).config.startMarker + ')' : null\"\n [attr.marker-end]=\"$any(primitive).config.endMarker ? 'url(#' + $any(primitive).config.endMarker + ')' : null\"/>\n }\n @case ('polyline') {\n <polyline\n [attr.points]=\"getPolylinePoints($any(primitive))\"\n [attr.fill]=\"primitive.style?.fill?.color ?? 'none'\"\n [attr.fill-opacity]=\"primitive.style?.fill?.opacity ?? 1\"\n [attr.stroke]=\"primitive.style?.stroke?.color ?? 'none'\"\n [attr.stroke-width]=\"primitive.style?.stroke?.width ?? 1\"\n [attr.stroke-opacity]=\"primitive.style?.stroke?.opacity ?? 1\"\n [attr.stroke-dasharray]=\"getEffectiveStrokeDashArray(primitive)\"/>\n }\n @case ('polygon') {\n <polygon\n [attr.points]=\"getPolygonPoints($any(primitive))\"\n [attr.fill]=\"primitive.style?.fill?.color ?? 'none'\"\n [attr.fill-opacity]=\"primitive.style?.fill?.opacity ?? 1\"\n [attr.stroke]=\"primitive.style?.stroke?.color ?? 'none'\"\n [attr.stroke-width]=\"primitive.style?.stroke?.width ?? 1\"\n [attr.stroke-opacity]=\"primitive.style?.stroke?.opacity ?? 1\"\n [attr.stroke-dasharray]=\"getStrokeDashArray(primitive.style?.stroke?.dashArray)\"/>\n }\n @case ('path') {\n <path\n [attr.d]=\"$any(primitive).config.d\"\n [attr.fill]=\"primitive.style?.fill?.color ?? 'none'\"\n [attr.fill-opacity]=\"primitive.style?.fill?.opacity ?? 1\"\n [attr.stroke]=\"primitive.style?.stroke?.color ?? 'none'\"\n [attr.stroke-width]=\"primitive.style?.stroke?.width ?? 1\"\n [attr.stroke-opacity]=\"primitive.style?.stroke?.opacity ?? 1\"\n [attr.stroke-dasharray]=\"getEffectiveStrokeDashArray(primitive)\"/>\n }\n @case ('text') {\n <text\n [attr.x]=\"0\"\n [attr.y]=\"0\"\n [attr.font-family]=\"$any(primitive).config.textStyle?.fontFamily ?? 'sans-serif'\"\n [attr.font-size]=\"$any(primitive).config.textStyle?.fontSize ?? 14\"\n [attr.font-weight]=\"$any(primitive).config.textStyle?.fontWeight ?? 'normal'\"\n [attr.fill]=\"$any(primitive).config.textStyle?.color ?? primitive.style?.fill?.color ?? '#000'\"\n [attr.fill-opacity]=\"primitive.style?.fill?.opacity ?? 1\"\n [attr.text-anchor]=\"$any(primitive).config.textStyle?.textAnchor ?? 'start'\"\n [attr.dominant-baseline]=\"$any(primitive).config.textStyle?.dominantBaseline ?? 'hanging'\">\n {{ $any(primitive).config.content }}\n </text>\n }\n @case ('group') {\n <!-- Group just renders children, no visual itself unless styled -->\n @if (primitive.style?.fill?.color || primitive.style?.stroke?.color) {\n @let groupBounds = getGroupBounds(primitive);\n <rect\n [attr.x]=\"groupBounds.x - primitive.position.x\"\n [attr.y]=\"groupBounds.y - primitive.position.y\"\n [attr.width]=\"groupBounds.width\"\n [attr.height]=\"groupBounds.height\"\n [attr.fill]=\"primitive.style?.fill?.color ?? 'none'\"\n [attr.fill-opacity]=\"primitive.style?.fill?.opacity ?? 1\"\n [attr.stroke]=\"primitive.style?.stroke?.color ?? 'none'\"\n [attr.stroke-width]=\"primitive.style?.stroke?.width ?? 0\"\n [attr.stroke-opacity]=\"primitive.style?.stroke?.opacity ?? 1\"/>\n }\n }\n @case ('image') {\n <image\n x=\"0\" y=\"0\"\n [attr.width]=\"$any(primitive).config.width\"\n [attr.height]=\"$any(primitive).config.height\"\n [attr.href]=\"$any(primitive).config.src\"\n preserveAspectRatio=\"xMidYMid meet\"/>\n }\n }\n </g>\n }\n }\n\n <!-- Symbol Instances (from Process Designer) -->\n @for (symbolInstance of diagramConfig()!.symbolInstances ?? []; track symbolInstance.id) {\n @let styleClasses = getSymbolDefinition(symbolInstance)?.styleClasses;\n <g class=\"symbol-instance\"\n [attr.data-id]=\"symbolInstance.id\"\n [attr.transform]=\"getSymbolTransform(symbolInstance)\">\n <!-- Render symbol primitives with bindings applied (top-level only) -->\n @for (primitive of getTopLevelSymbolPrimitives(symbolInstance); track primitive.id) {\n @if (primitive.visible !== false) {\n @if (isGroup(primitive)) {\n <!-- Group: wrapper with ID for animation targeting, contains children -->\n <g [attr.id]=\"getSymbolShapeId(symbolInstance, primitive)\"\n [attr.transform]=\"getPrimitiveTransform(primitive)\">\n <!-- Animation elements for the group -->\n <g class=\"animations\" [innerHTML]=\"getSymbolPrimitiveAnimationHtml(primitive, symbolInstance)\"></g>\n <!-- Group children (coordinates adjusted relative to group position) -->\n @for (child of getGroupChildPrimitives(symbolInstance, primitive); track child.id) {\n @if (child.visible !== false) {\n <g [attr.transform]=\"getGroupChildTransform(child, primitive)\">\n <g class=\"animations\" [innerHTML]=\"getSymbolPrimitiveAnimationHtml(child, symbolInstance)\"></g>\n @switch (child.type) {\n @case ('rectangle') {\n @if (hasFillLevel(child)) {\n <!-- Rectangle with fillLevel in group -->\n <g [innerHTML]=\"getRectangleWithFillLevelHtml(child, symbolInstance, styleClasses)\"></g>\n } @else {\n <rect\n [attr.id]=\"getSymbolShapeId(symbolInstance, child)\"\n x=\"0\" y=\"0\"\n [attr.width]=\"$any(child).config.width\"\n [attr.height]=\"$any(child).config.height\"\n [attr.rx]=\"$any(child).config.cornerRadius ?? 0\"\n [attr.fill]=\"getFillColor(child, styleClasses)\"\n [attr.fill-opacity]=\"getFillOpacity(child, styleClasses)\"\n [attr.stroke]=\"getStrokeColor(child, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(child, styleClasses, 0)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(child, styleClasses)\"\n [attr.stroke-dasharray]=\"getStrokeDashArray(child.style?.stroke?.dashArray)\"/>\n }\n }\n @case ('ellipse') {\n <ellipse\n [attr.id]=\"getSymbolShapeId(symbolInstance, child)\"\n cx=\"0\" cy=\"0\"\n [attr.rx]=\"$any(child).config.radiusX ?? $any(child).config.rx ?? 50\"\n [attr.ry]=\"$any(child).config.radiusY ?? $any(child).config.ry ?? 50\"\n [attr.fill]=\"getFillColor(child, styleClasses)\"\n [attr.fill-opacity]=\"getFillOpacity(child, styleClasses)\"\n [attr.stroke]=\"getStrokeColor(child, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(child, styleClasses, 0)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(child, styleClasses)\"\n [attr.stroke-dasharray]=\"getStrokeDashArray(child.style?.stroke?.dashArray)\"/>\n }\n @case ('line') {\n @let lineCoords = getGroupChildLineCoords(child, primitive);\n <line\n [attr.id]=\"getSymbolShapeId(symbolInstance, child)\"\n [attr.x1]=\"lineCoords.x1\"\n [attr.y1]=\"lineCoords.y1\"\n [attr.x2]=\"lineCoords.x2\"\n [attr.y2]=\"lineCoords.y2\"\n [attr.stroke]=\"getStrokeColor(child, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(child, styleClasses)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(child, styleClasses)\"\n [attr.stroke-dasharray]=\"getEffectiveStrokeDashArray(child)\"/>\n <!-- Flow particles for line in group -->\n @if (hasFlowParticles(child)) {\n <g class=\"flow-particles\" [innerHTML]=\"getFlowParticlesHtml(child, symbolInstance)\"></g>\n }\n }\n @case ('polyline') {\n <polyline\n [attr.id]=\"getSymbolShapeId(symbolInstance, child)\"\n [attr.points]=\"getGroupChildPoints(child, primitive)\"\n [attr.fill]=\"getFillColor(child, styleClasses)\"\n [attr.fill-opacity]=\"getFillOpacity(child, styleClasses)\"\n [attr.stroke]=\"getStrokeColor(child, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(child, styleClasses)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(child, styleClasses)\"\n [attr.stroke-dasharray]=\"getEffectiveStrokeDashArray(child)\"/>\n <!-- Flow particles for polyline in group -->\n @if (hasFlowParticles(child)) {\n <g class=\"flow-particles\" [innerHTML]=\"getFlowParticlesHtml(child, symbolInstance)\"></g>\n }\n }\n @case ('polygon') {\n <polygon\n [attr.id]=\"getSymbolShapeId(symbolInstance, child)\"\n [attr.points]=\"getGroupChildPoints(child, primitive)\"\n [attr.fill]=\"getFillColor(child, styleClasses)\"\n [attr.fill-opacity]=\"getFillOpacity(child, styleClasses)\"\n [attr.stroke]=\"getStrokeColor(child, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(child, styleClasses)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(child, styleClasses)\"\n [attr.stroke-dasharray]=\"getStrokeDashArray(child.style?.stroke?.dashArray)\"/>\n }\n @case ('path') {\n <path\n [attr.id]=\"getSymbolShapeId(symbolInstance, child)\"\n [attr.d]=\"$any(child).config.d\"\n [attr.fill]=\"getFillColor(child, styleClasses)\"\n [attr.fill-opacity]=\"getFillOpacity(child, styleClasses)\"\n [attr.stroke]=\"getStrokeColor(child, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(child, styleClasses)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(child, styleClasses)\"\n [attr.stroke-dasharray]=\"getEffectiveStrokeDashArray(child)\"/>\n <!-- Flow particles for path in group -->\n @if (hasFlowParticles(child)) {\n <g class=\"flow-particles\" [innerHTML]=\"getFlowParticlesHtml(child, symbolInstance)\"></g>\n }\n }\n @case ('text') {\n <text\n [attr.id]=\"getSymbolShapeId(symbolInstance, child)\"\n [attr.x]=\"0\"\n [attr.y]=\"0\"\n [attr.font-family]=\"$any(child).config.textStyle?.fontFamily ?? 'sans-serif'\"\n [attr.font-size]=\"$any(child).config.textStyle?.fontSize ?? 14\"\n [attr.font-weight]=\"$any(child).config.textStyle?.fontWeight ?? 'normal'\"\n [attr.fill]=\"$any(child).config.textStyle?.color ?? getFillColor(child, styleClasses, '#000')\"\n [attr.fill-opacity]=\"getFillOpacity(child, styleClasses)\"\n [attr.text-anchor]=\"$any(child).config.textStyle?.textAnchor ?? 'start'\"\n [attr.dominant-baseline]=\"$any(child).config.textStyle?.dominantBaseline ?? 'hanging'\">\n {{ $any(child).config.content }}\n </text>\n }\n @case ('image') {\n <image\n [attr.id]=\"getSymbolShapeId(symbolInstance, child)\"\n x=\"0\" y=\"0\"\n [attr.width]=\"$any(child).config.width\"\n [attr.height]=\"$any(child).config.height\"\n [attr.href]=\"$any(child).config.src\"\n preserveAspectRatio=\"xMidYMid meet\"/>\n }\n }\n </g>\n }\n }\n </g>\n } @else {\n <!-- Non-group primitive -->\n <g [attr.transform]=\"getPrimitiveTransform(primitive)\">\n <!-- Animation elements -->\n <g class=\"animations\" [innerHTML]=\"getSymbolPrimitiveAnimationHtml(primitive, symbolInstance)\"></g>\n <!-- Shape content (with ID for animation targeting via href) -->\n @switch (primitive.type) {\n @case ('rectangle') {\n @if (hasFillLevel(primitive)) {\n <!-- Rectangle with fillLevel - use clip-path for tank visualization -->\n <g [innerHTML]=\"getRectangleWithFillLevelHtml(primitive, symbolInstance, styleClasses)\"></g>\n } @else {\n <rect\n [attr.id]=\"getSymbolShapeId(symbolInstance, primitive)\"\n x=\"0\" y=\"0\"\n [attr.width]=\"$any(primitive).config.width\"\n [attr.height]=\"$any(primitive).config.height\"\n [attr.rx]=\"$any(primitive).config.cornerRadius ?? 0\"\n [attr.fill]=\"getFillColor(primitive, styleClasses)\"\n [attr.fill-opacity]=\"getFillOpacity(primitive, styleClasses)\"\n [attr.stroke]=\"getStrokeColor(primitive, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(primitive, styleClasses, 0)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(primitive, styleClasses)\"\n [attr.stroke-dasharray]=\"getStrokeDashArray(primitive.style?.stroke?.dashArray)\"/>\n }\n }\n @case ('ellipse') {\n <ellipse\n [attr.id]=\"getSymbolShapeId(symbolInstance, primitive)\"\n cx=\"0\" cy=\"0\"\n [attr.rx]=\"$any(primitive).config.radiusX ?? $any(primitive).config.rx ?? 50\"\n [attr.ry]=\"$any(primitive).config.radiusY ?? $any(primitive).config.ry ?? 50\"\n [attr.fill]=\"getFillColor(primitive, styleClasses)\"\n [attr.fill-opacity]=\"getFillOpacity(primitive, styleClasses)\"\n [attr.stroke]=\"getStrokeColor(primitive, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(primitive, styleClasses, 0)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(primitive, styleClasses)\"\n [attr.stroke-dasharray]=\"getStrokeDashArray(primitive.style?.stroke?.dashArray)\"/>\n }\n @case ('line') {\n <line\n [attr.id]=\"getSymbolShapeId(symbolInstance, primitive)\"\n [attr.x1]=\"$any(primitive).config.start.x\"\n [attr.y1]=\"$any(primitive).config.start.y\"\n [attr.x2]=\"$any(primitive).config.end.x\"\n [attr.y2]=\"$any(primitive).config.end.y\"\n [attr.stroke]=\"getStrokeColor(primitive, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(primitive, styleClasses)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(primitive, styleClasses)\"\n [attr.stroke-dasharray]=\"getEffectiveStrokeDashArray(primitive)\"/>\n <!-- Flow particles for line -->\n @if (hasFlowParticles(primitive)) {\n <g class=\"flow-particles\" [innerHTML]=\"getFlowParticlesHtml(primitive, symbolInstance)\"></g>\n }\n }\n @case ('polyline') {\n <polyline\n [attr.id]=\"getSymbolShapeId(symbolInstance, primitive)\"\n [attr.points]=\"getPolylinePoints($any(primitive))\"\n [attr.fill]=\"getFillColor(primitive, styleClasses)\"\n [attr.fill-opacity]=\"getFillOpacity(primitive, styleClasses)\"\n [attr.stroke]=\"getStrokeColor(primitive, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(primitive, styleClasses)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(primitive, styleClasses)\"\n [attr.stroke-dasharray]=\"getEffectiveStrokeDashArray(primitive)\"/>\n <!-- Flow particles for polyline -->\n @if (hasFlowParticles(primitive)) {\n <g class=\"flow-particles\" [innerHTML]=\"getFlowParticlesHtml(primitive, symbolInstance)\"></g>\n }\n }\n @case ('polygon') {\n <polygon\n [attr.id]=\"getSymbolShapeId(symbolInstance, primitive)\"\n [attr.points]=\"getPolygonPoints($any(primitive))\"\n [attr.fill]=\"getFillColor(primitive, styleClasses)\"\n [attr.fill-opacity]=\"getFillOpacity(primitive, styleClasses)\"\n [attr.stroke]=\"getStrokeColor(primitive, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(primitive, styleClasses)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(primitive, styleClasses)\"\n [attr.stroke-dasharray]=\"getStrokeDashArray(primitive.style?.stroke?.dashArray)\"/>\n }\n @case ('path') {\n <path\n [attr.id]=\"getSymbolShapeId(symbolInstance, primitive)\"\n [attr.d]=\"$any(primitive).config.d\"\n [attr.fill]=\"getFillColor(primitive, styleClasses)\"\n [attr.fill-opacity]=\"getFillOpacity(primitive, styleClasses)\"\n [attr.stroke]=\"getStrokeColor(primitive, styleClasses)\"\n [attr.stroke-width]=\"getStrokeWidth(primitive, styleClasses)\"\n [attr.stroke-opacity]=\"getStrokeOpacity(primitive, styleClasses)\"\n [attr.stroke-dasharray]=\"getEffectiveStrokeDashArray(primitive)\"/>\n <!-- Flow particles for path -->\n @if (hasFlowParticles(primitive)) {\n <g class=\"flow-particles\" [innerHTML]=\"getFlowParticlesHtml(primitive, symbolInstance)\"></g>\n }\n }\n @case ('text') {\n <text\n [attr.id]=\"getSymbolShapeId(symbolInstance, primitive)\"\n [attr.x]=\"0\"\n [attr.y]=\"0\"\n [attr.font-family]=\"$any(primitive).config.textStyle?.fontFamily ?? 'sans-serif'\"\n [attr.font-size]=\"$any(primitive).config.textStyle?.fontSize ?? 14\"\n [attr.font-weight]=\"$any(primitive).config.textStyle?.fontWeight ?? 'normal'\"\n [attr.fill]=\"$any(primitive).config.textStyle?.color ?? getFillColor(primitive, styleClasses, '#000')\"\n [attr.fill-opacity]=\"getFillOpacity(primitive, styleClasses)\"\n [attr.text-anchor]=\"$any(primitive).config.textStyle?.textAnchor ?? 'start'\"\n [attr.dominant-baseline]=\"$any(primitive).config.textStyle?.dominantBaseline ?? 'hanging'\">\n {{ $any(primitive).config.content }}\n </text>\n }\n @case ('image') {\n <image\n [attr.id]=\"getSymbolShapeId(symbolInstance, primitive)\"\n x=\"0\" y=\"0\"\n [attr.width]=\"$any(primitive).config.width\"\n [attr.height]=\"$any(primitive).config.height\"\n [attr.href]=\"$any(primitive).config.src\"\n preserveAspectRatio=\"xMidYMid meet\"/>\n }\n }\n </g>\n }\n }\n }\n </g>\n }\n </svg>\n </div>\n } @else {\n <div class=\"no-config\">\n <span>No process diagram configured</span>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .process-widget {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n overflow: hidden;\n background-color: var(--process-bg, #fafafa);\n }\n\n .loading-overlay {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n color: var(--kendo-color-subtle, #666);\n }\n\n .loading-spinner {\n width: 40px;\n height: 40px;\n border: 3px solid #e0e0e0;\n border-top-color: var(--kendo-color-primary, #1976d2);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .error-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n color: var(--kendo-color-error, #d32f2f);\n }\n\n .error-icon {\n font-size: 2rem;\n }\n\n .error-message {\n font-size: 0.875rem;\n text-align: center;\n }\n\n .no-config {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--kendo-color-subtle, #999);\n font-style: italic;\n }\n\n .diagram-container {\n position: relative;\n overflow: hidden;\n }\n\n .diagram-container.fit-to-bounds {\n width: 100% !important;\n height: 100% !important;\n }\n\n .process-svg {\n display: block;\n }\n\n .diagram-container.fit-to-bounds .process-svg {\n width: 100%;\n height: 100%;\n }\n\n /* Canvas background - themeable via CSS variable */\n .canvas-background {\n fill: var(--process-canvas-bg, #fafafa);\n }\n\n /* Element styles */\n .element {\n cursor: default;\n }\n\n .element.interactive {\n cursor: pointer;\n }\n\n .element.interactive:hover {\n filter: brightness(1.1);\n }\n\n .tank-fill {\n transition: height 0.5s ease-out, y 0.5s ease-out;\n }\n\n .tank-label {\n pointer-events: none;\n user-select: none;\n }\n\n /* Pump rotation animation */\n .pump-element .rotating {\n animation: rotate 1s linear infinite;\n transform-origin: center;\n }\n\n @keyframes rotate {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n /* Status light blinking */\n .blinking {\n animation: blink 1s ease-in-out infinite;\n }\n\n @keyframes blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.3; }\n }\n\n /* Connection flow animation */\n .connection-flow {\n animation: flow 2s linear infinite;\n }\n\n @keyframes flow {\n from { stroke-dashoffset: 0; }\n to { stroke-dashoffset: -40; }\n }\n\n /* Digital display */\n .digital-display-value {\n font-family: 'Courier New', monospace;\n letter-spacing: 2px;\n }\n `]\n})\nexport class ProcessWidgetComponent implements DashboardWidget<ProcessWidgetConfig>, OnInit, OnChanges {\n\n @Input() config!: ProcessWidgetConfig;\n\n @ViewChild('containerRef') containerRef!: ElementRef<HTMLDivElement>;\n\n private readonly dataService = inject(ProcessDataService);\n private readonly symbolLibraryService = inject(SymbolLibraryService);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly expressionEvaluator = inject(ExpressionEvaluatorService);\n\n // Math reference for template\n protected readonly Math = Math;\n\n // State signals\n private readonly _isLoading = signal(false);\n private readonly _error = signal<string | null>(null);\n private readonly _diagramConfig = signal<ProcessDiagramConfig | null>(null);\n private readonly _runtimeState = signal<ProcessDiagramRuntimeState | null>(null);\n private readonly _symbolDefinitions = signal<Map<string, SymbolDefinition>>(new Map());\n private readonly _boundData = signal<BoundDataResult | null>(null);\n\n readonly isLoading = this._isLoading.asReadonly();\n readonly error = this._error.asReadonly();\n readonly diagramConfig = this._diagramConfig.asReadonly();\n readonly data = computed(() => this._runtimeState());\n\n /**\n * Bound data from widget data binding configuration.\n * Contains entity or query data that can be used for dynamic values in the diagram.\n */\n readonly boundData = this._boundData.asReadonly();\n\n // Computed SVG properties\n readonly viewBox = computed(() => {\n const diagram = this._diagramConfig();\n if (!diagram) return '0 0 800 600';\n return `0 0 ${diagram.canvas.width} ${diagram.canvas.height}`;\n });\n\n readonly svgWidth = computed(() => {\n if (this.config.fitToBounds !== false) return '100%';\n return this._diagramConfig()?.canvas.width ?? 800;\n });\n\n readonly svgHeight = computed(() => {\n if (this.config.fitToBounds !== false) return '100%';\n return this._diagramConfig()?.canvas.height ?? 600;\n });\n\n /**\n * Computed animation enabled states.\n * Evaluates animation bindings to determine which animations should be active.\n */\n readonly animationEnabledStates = computed<Record<string, boolean>>(() => {\n const states: Record<string, boolean> = {};\n const diagram = this._diagramConfig();\n const boundData = this._boundData();\n\n if (!diagram?.propertyBindings || diagram.propertyBindings.length === 0) {\n return states;\n }\n\n // Filter bindings that control animations\n const animationBindings = diagram.propertyBindings.filter(\n b => b.effectType === 'animation.enabled' && b.animationId\n );\n\n if (animationBindings.length === 0) {\n return states;\n }\n\n // Build property values from bound data\n const propertyValues = boundData\n ? this.buildPropertyValuesFromBoundData(\n diagram.transformProperties ?? [],\n this.config.propertyMappings ?? [],\n boundData\n )\n : {};\n\n // Evaluate each animation binding\n for (const binding of animationBindings) {\n const propertyValue = propertyValues[binding.propertyId];\n\n // Build expression context\n const context: Record<string, number | string | boolean> = {};\n if (typeof propertyValue === 'number' || typeof propertyValue === 'string' || typeof propertyValue === 'boolean') {\n context['value'] = propertyValue;\n } else {\n context['value'] = 0;\n }\n\n // Evaluate expression to determine if animation is enabled\n const result = this.expressionEvaluator.evaluate(binding.expression, context);\n const key = binding.targetId ? `${binding.targetId}:${binding.animationId}` : binding.animationId!;\n states[key] = result.success && Boolean(result.value);\n }\n\n return states;\n });\n\n /**\n * Primitives with runtime bindings applied.\n * Uses property values built from bound data and the diagram's propertyBindings.\n */\n readonly boundPrimitives = computed<PrimitiveBase[]>(() => {\n const diagram = this._diagramConfig();\n const boundData = this._boundData();\n\n if (!diagram?.primitives) {\n return [];\n }\n\n // If no bindings or no bound data, return original primitives\n if (!diagram.propertyBindings || diagram.propertyBindings.length === 0 || !boundData) {\n return diagram.primitives;\n }\n\n // Build property values from bound data using mappings\n const propertyValues = this.buildPropertyValuesFromBoundData(\n diagram.transformProperties ?? [],\n this.config.propertyMappings ?? [],\n boundData\n );\n\n // Apply bindings to primitives\n return this.applyBindingsToPrimitives(\n diagram.primitives,\n diagram.propertyBindings,\n propertyValues\n );\n });\n\n ngOnInit(): void {\n this.loadDiagram();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadDiagram();\n }\n }\n\n refresh(): void {\n this.loadDiagram();\n }\n\n /**\n * Loads the process diagram configuration and data\n */\n private async loadDiagram(): Promise<void> {\n this._isLoading.set(true);\n this._error.set(null);\n this._boundData.set(null);\n\n try {\n // Check for inline config first\n if (this.config.inlineConfig) {\n this._diagramConfig.set(this.config.inlineConfig);\n await this.loadSymbolDefinitions(this.config.inlineConfig);\n await this.loadRuntimeData();\n await this.loadBoundData();\n return;\n }\n\n // Load from backend by rtId\n if (this.config.processDiagramRtId) {\n const diagram = await this.dataService.loadDiagram(this.config.processDiagramRtId);\n this._diagramConfig.set(diagram);\n await this.loadSymbolDefinitions(diagram);\n await this.loadRuntimeData();\n await this.loadBoundData();\n return;\n }\n\n // No configuration\n this._error.set('No process diagram configured');\n } catch (err) {\n console.error('Error loading process diagram:', err);\n this._error.set('Failed to load process diagram');\n } finally {\n this._isLoading.set(false);\n }\n }\n\n /**\n * Loads bound data based on widget data binding configuration\n */\n private async loadBoundData(): Promise<void> {\n // Only load if data binding is configured\n if (!this.config.dataBindingMode || this.config.dataBindingMode === 'none') {\n return;\n }\n\n try {\n const boundData = await this.dataService.loadBoundData(this.config);\n this._boundData.set(boundData);\n } catch (err) {\n console.error('Error loading bound data:', err);\n // Don't set error - diagram still displays, just without bound data\n }\n }\n\n /**\n * Loads symbol definitions for all symbol instances in the diagram\n */\n private async loadSymbolDefinitions(diagram: ProcessDiagramConfig): Promise<void> {\n const symbolInstances = diagram.symbolInstances ?? [];\n if (symbolInstances.length === 0) {\n return;\n }\n\n // Collect unique symbol rtIds\n const symbolRtIds = new Set<string>();\n for (const instance of symbolInstances) {\n if (instance.symbolRtId) {\n symbolRtIds.add(instance.symbolRtId);\n }\n }\n\n if (symbolRtIds.size === 0) {\n return;\n }\n\n // Load each symbol definition\n const definitions = new Map<string, SymbolDefinition>();\n for (const rtId of symbolRtIds) {\n try {\n const definition = await this.symbolLibraryService.loadSymbol(rtId);\n definitions.set(rtId, definition);\n\n // Also load nested symbol definitions recursively\n await this.loadNestedSymbolDefinitions(definition, definitions);\n } catch (error) {\n console.warn(`Failed to load symbol definition ${rtId}:`, error);\n }\n }\n\n this._symbolDefinitions.set(definitions);\n }\n\n /**\n * Recursively load symbol definitions for nested symbol instances.\n */\n private async loadNestedSymbolDefinitions(\n symbolDef: SymbolDefinition,\n cache: Map<string, SymbolDefinition>\n ): Promise<void> {\n const nestedInstances = symbolDef.symbolInstances ?? [];\n\n for (const nestedInst of nestedInstances) {\n // Skip if already loaded\n if (cache.has(nestedInst.symbolRtId)) {\n continue;\n }\n\n try {\n const nestedDef = await this.symbolLibraryService.loadSymbol(nestedInst.symbolRtId);\n cache.set(nestedInst.symbolRtId, nestedDef);\n\n // Recursively load nested symbols\n await this.loadNestedSymbolDefinitions(nestedDef, cache);\n } catch (error) {\n console.warn(`Failed to load nested symbol ${nestedInst.symbolRtId}:`, error);\n }\n }\n }\n\n /**\n * Loads runtime data for all elements\n */\n private async loadRuntimeData(): Promise<void> {\n const diagram = this._diagramConfig();\n if (!diagram) return;\n\n try {\n const state = await this.dataService.loadRuntimeData(diagram);\n this._runtimeState.set(state);\n } catch (err) {\n console.error('Error loading runtime data:', err);\n // Don't set error - diagram still displays, just without data\n }\n }\n\n // ============================================================================\n // Type Guards\n // ============================================================================\n\n protected asTank(element: ProcessElement): TankElementConfig | null {\n return element.type === 'tank' ? element as TankElementConfig : null;\n }\n\n protected asValve(element: ProcessElement): ValveElementConfig | null {\n return element.type === 'valve' ? element as ValveElementConfig : null;\n }\n\n protected asPump(element: ProcessElement): PumpElementConfig | null {\n return element.type === 'pump' ? element as PumpElementConfig : null;\n }\n\n protected asStatusLight(element: ProcessElement): StatusLightElementConfig | null {\n return element.type === 'statusLight' ? element as StatusLightElementConfig : null;\n }\n\n protected asDigitalDisplay(element: ProcessElement): DigitalDisplayElementConfig | null {\n return element.type === 'digitalDisplay' ? element as DigitalDisplayElementConfig : null;\n }\n\n protected asLabel(element: ProcessElement): LabelElementConfig | null {\n return element.type === 'label' ? element as LabelElementConfig : null;\n }\n\n protected asCustomSvg(element: ProcessElement): CustomSvgElementConfig | null {\n return element.type === 'customSvg' ? element as CustomSvgElementConfig : null;\n }\n\n protected asSilo(element: ProcessElement): SiloElementConfig | null {\n return element.type === 'silo' ? element as SiloElementConfig : null;\n }\n\n protected asVessel(element: ProcessElement): VesselElementConfig | null {\n return element.type === 'vessel' ? element as VesselElementConfig : null;\n }\n\n protected asMotor(element: ProcessElement): MotorElementConfig | null {\n return element.type === 'motor' ? element as MotorElementConfig : null;\n }\n\n protected asImage(element: ProcessElement): ImageElementConfig | null {\n return element.type === 'image' ? element as ImageElementConfig : null;\n }\n\n protected asShape(element: ProcessElement): ShapeElementConfig | null {\n return element.type === 'shape' ? element as ShapeElementConfig : null;\n }\n\n protected asGauge(element: ProcessElement): ProcessGaugeElementConfig | null {\n return element.type === 'gauge' ? element as ProcessGaugeElementConfig : null;\n }\n\n // ============================================================================\n // Element Rendering Helpers\n // ============================================================================\n\n protected getElementTransform(element: ProcessElement): string {\n let transform = `translate(${element.position.x}, ${element.position.y})`;\n if (element.rotation) {\n const cx = element.size.width / 2;\n const cy = element.size.height / 2;\n transform += ` rotate(${element.rotation}, ${cx}, ${cy})`;\n }\n return transform;\n }\n\n protected getElementColor(element: ProcessElement): string {\n const runtimeData = this.getElementRuntimeData(element.id);\n\n // Check for computed color from thresholds\n if (runtimeData?.computedColor) {\n return runtimeData.computedColor;\n }\n\n // Default colors based on element type and state\n switch (element.type) {\n case 'tank': {\n const tank = element as TankElementConfig;\n return tank.config.fillColor ?? '#42a5f5';\n }\n case 'silo': {\n const silo = element as SiloElementConfig;\n return silo.config.fillColor ?? '#42a5f5';\n }\n case 'vessel': {\n const vessel = element as VesselElementConfig;\n return vessel.config.fillColor ?? '#42a5f5';\n }\n case 'valve': {\n const valve = element as ValveElementConfig;\n const isOpen = this.getElementValue(element);\n if (isOpen === true || isOpen === 'open' || isOpen === 'OPEN') {\n return valve.config.openColor ?? '#4caf50';\n }\n return valve.config.closedColor ?? '#f44336';\n }\n case 'pump': {\n const pump = element as PumpElementConfig;\n const isRunning = this.isPumpRunning(pump);\n if (isRunning) {\n return pump.config.runningColor ?? '#4caf50';\n }\n return pump.config.stoppedColor ?? '#9e9e9e';\n }\n case 'motor': {\n const motor = element as MotorElementConfig;\n const isRunning = this.isMotorRunning(motor);\n if (isRunning) {\n return motor.config.runningColor ?? '#4caf50';\n }\n return motor.config.stoppedColor ?? '#9e9e9e';\n }\n case 'statusLight': {\n const light = element as StatusLightElementConfig;\n const isOn = this.isStatusLightOn(light);\n if (isOn) {\n return light.config.onColor ?? '#4caf50';\n }\n return light.config.offColor ?? '#9e9e9e';\n }\n case 'gauge': {\n const gauge = element as ProcessGaugeElementConfig;\n return gauge.config.valueColor ?? '#1976d2';\n }\n default:\n return element.style?.fillColor ?? '#e0e0e0';\n }\n }\n\n protected getElementDisplayValue(element: ProcessElement): string {\n const runtimeData = this.getElementRuntimeData(element.id);\n if (runtimeData?.displayValue) {\n return runtimeData.displayValue;\n }\n\n // Format based on element type\n const value = this.getElementValue(element);\n if (value === undefined || value === null) {\n return '--';\n }\n\n const transform = element.dataBinding?.transform;\n if (transform) {\n const prefix = transform.prefix ?? '';\n const suffix = transform.suffix ?? '';\n const decimals = transform.decimals ?? 0;\n\n if (typeof value === 'number') {\n return `${prefix}${value.toFixed(decimals)}${suffix}`;\n }\n return `${prefix}${value}${suffix}`;\n }\n\n return String(value);\n }\n\n protected getElementValue(element: ProcessElement): unknown {\n const runtimeData = this.getElementRuntimeData(element.id);\n return runtimeData?.value;\n }\n\n protected getElementRuntimeData(elementId: string): ElementRuntimeData | undefined {\n return this._runtimeState()?.elements.get(elementId);\n }\n\n // ============================================================================\n // Tank Helpers\n // ============================================================================\n\n protected getTankFillHeight(tank: TankElementConfig): number {\n const value = this.getElementValue(tank);\n if (typeof value !== 'number') return 0;\n\n const transform = tank.dataBinding?.transform;\n const max = transform?.max ?? 100;\n const percentage = Math.min(100, Math.max(0, (value / max) * 100));\n\n return ((tank.size.height - 4) * percentage) / 100;\n }\n\n protected getTankFillY(tank: TankElementConfig): number {\n const fillHeight = this.getTankFillHeight(tank);\n return tank.size.height - fillHeight - 2;\n }\n\n // ============================================================================\n // Valve Helpers\n // ============================================================================\n\n protected getValvePoints(valve: ValveElementConfig): string {\n const w = valve.size.width;\n const h = valve.size.height;\n // Bowtie shape\n return `0,0 ${w/2},${h/2} 0,${h} ${w},${h} ${w/2},${h/2} ${w},0`;\n }\n\n // ============================================================================\n // Pump Helpers\n // ============================================================================\n\n protected isPumpRunning(pump: PumpElementConfig): boolean {\n const value = this.getElementValue(pump);\n return value === true || value === 'running' || value === 'RUNNING' || value === 'on' || value === 'ON' || (typeof value === 'number' && value > 0);\n }\n\n // ============================================================================\n // Status Light Helpers\n // ============================================================================\n\n protected isStatusLightOn(light: StatusLightElementConfig): boolean {\n const value = this.getElementValue(light);\n return value === true || value === 1 || value === 'on' || value === 'ON' || value === 'true';\n }\n\n // ============================================================================\n // Label Helpers\n // ============================================================================\n\n protected getLabelX(label: LabelElementConfig): number {\n const align = label.config.textStyle?.textAlign ?? 'left';\n const padding = label.config.padding ?? 4;\n\n switch (align) {\n case 'center': return label.size.width / 2;\n case 'right': return label.size.width - padding;\n default: return padding;\n }\n }\n\n // ============================================================================\n // Custom SVG Helpers\n // ============================================================================\n\n protected getCustomSvgContent(element: ProcessElement): string {\n const customSvg = this.asCustomSvg(element);\n if (!customSvg) return '';\n\n // Return the SVG content (sanitization should be handled by Angular)\n return customSvg.config.svgContent;\n }\n\n // ============================================================================\n // Silo Helpers\n // ============================================================================\n\n /**\n * Creates SVG path for a silo (cylindrical body with conical bottom)\n */\n protected getSiloPath(silo: SiloElementConfig): string {\n const w = silo.size.width;\n const h = silo.size.height;\n const coneHeight = h * (silo.config.coneAngle ?? 30) / 90;\n const bodyHeight = h - coneHeight;\n const cornerRadius = 5;\n\n // Path: rounded top rectangle + cone bottom\n return `\n M ${cornerRadius},0\n L ${w - cornerRadius},0\n Q ${w},0 ${w},${cornerRadius}\n L ${w},${bodyHeight}\n L ${w / 2},${h}\n L 0,${bodyHeight}\n L 0,${cornerRadius}\n Q 0,0 ${cornerRadius},0\n Z\n `;\n }\n\n protected getSiloFillHeight(silo: SiloElementConfig): number {\n const value = this.getElementValue(silo);\n if (typeof value !== 'number') return 0;\n\n const transform = silo.dataBinding?.transform;\n const max = transform?.max ?? 100;\n const percentage = Math.min(100, Math.max(0, (value / max) * 100));\n\n return ((silo.size.height - 4) * percentage) / 100;\n }\n\n protected getSiloFillY(silo: SiloElementConfig): number {\n const fillHeight = this.getSiloFillHeight(silo);\n return silo.size.height - fillHeight - 2;\n }\n\n // ============================================================================\n // Vessel Helpers\n // ============================================================================\n\n /**\n * Creates SVG path for a vessel (rounded top options: dome, elliptical, flat)\n */\n protected getVesselPath(vessel: VesselElementConfig): string {\n const w = vessel.size.width;\n const h = vessel.size.height;\n const shape = vessel.config.shape ?? 'round';\n\n if (shape === 'flat') {\n // Simple rounded rectangle\n return `\n M 5,0\n L ${w - 5},0\n Q ${w},0 ${w},5\n L ${w},${h - 5}\n Q ${w},${h} ${w - 5},${h}\n L 5,${h}\n Q 0,${h} 0,${h - 5}\n L 0,5\n Q 0,0 5,0\n Z\n `;\n }\n\n // round or dished - both have curved top\n const domeHeight = shape === 'round' ? h * 0.2 : h * 0.15;\n\n // Path with dome/elliptical top\n return `\n M 0,${domeHeight}\n Q 0,0 ${w / 2},0\n Q ${w},0 ${w},${domeHeight}\n L ${w},${h - 5}\n Q ${w},${h} ${w - 5},${h}\n L 5,${h}\n Q 0,${h} 0,${h - 5}\n Z\n `;\n }\n\n protected getVesselFillHeight(vessel: VesselElementConfig): number {\n const value = this.getElementValue(vessel);\n if (typeof value !== 'number') return 0;\n\n const transform = vessel.dataBinding?.transform;\n const max = transform?.max ?? 100;\n const percentage = Math.min(100, Math.max(0, (value / max) * 100));\n\n return ((vessel.size.height - 4) * percentage) / 100;\n }\n\n protected getVesselFillY(vessel: VesselElementConfig): number {\n const fillHeight = this.getVesselFillHeight(vessel);\n return vessel.size.height - fillHeight - 2;\n }\n\n // ============================================================================\n // Motor Helpers\n // ============================================================================\n\n protected isMotorRunning(motor: MotorElementConfig): boolean {\n const value = this.getElementValue(motor);\n return value === true || value === 'running' || value === 'RUNNING' || value === 'on' || value === 'ON' || (typeof value === 'number' && value > 0);\n }\n\n // ============================================================================\n // Image Helpers\n // ============================================================================\n\n protected getImagePreserveAspectRatio(img: ImageElementConfig): string {\n const objectFit = img.config.objectFit ?? 'contain';\n const preserveAspectRatio = img.config.preserveAspectRatio ?? true;\n\n // Default alignment is center\n const align = 'xMidYMid';\n\n if (!preserveAspectRatio) {\n return 'none';\n }\n\n switch (objectFit) {\n case 'contain': return `${align} meet`;\n case 'cover': return `${align} slice`;\n case 'fill': return 'none';\n case 'none': return align;\n default: return `${align} meet`;\n }\n }\n\n // ============================================================================\n // Gauge Helpers\n // ============================================================================\n\n /**\n * Creates SVG arc path for arc/semicircle gauge\n */\n protected getGaugeArcPath(gauge: ProcessGaugeElementConfig, isValuePath: boolean): string {\n const w = gauge.size.width;\n const h = gauge.size.height;\n const cx = w / 2;\n const cy = gauge.config.gaugeType === 'semicircle' ? h : h / 2;\n const radius = Math.min(w, h) / 2 - 8;\n\n const startAngle = gauge.config.gaugeType === 'semicircle' ? 180 : 135;\n const totalAngle = gauge.config.gaugeType === 'semicircle' ? 180 : 270;\n\n let sweepAngle = totalAngle;\n\n if (isValuePath) {\n const value = this.getElementValue(gauge);\n if (typeof value !== 'number') return '';\n\n const transform = gauge.dataBinding?.transform;\n const min = transform?.min ?? gauge.config.min ?? 0;\n const max = transform?.max ?? gauge.config.max ?? 100;\n const percentage = Math.min(100, Math.max(0, ((value - min) / (max - min)) * 100));\n sweepAngle = (totalAngle * percentage) / 100;\n }\n\n const startRad = (startAngle * Math.PI) / 180;\n const endRad = ((startAngle - sweepAngle) * Math.PI) / 180;\n\n const x1 = cx + radius * Math.cos(startRad);\n const y1 = cy - radius * Math.sin(startRad);\n const x2 = cx + radius * Math.cos(endRad);\n const y2 = cy - radius * Math.sin(endRad);\n\n const largeArc = sweepAngle > 180 ? 1 : 0;\n\n return `M ${x1},${y1} A ${radius},${radius} 0 ${largeArc} 1 ${x2},${y2}`;\n }\n\n /**\n * Calculates fill width for linear gauge\n */\n protected getLinearGaugeFillWidth(gauge: ProcessGaugeElementConfig): number {\n const value = this.getElementValue(gauge);\n if (typeof value !== 'number') return 0;\n\n const transform = gauge.dataBinding?.transform;\n const min = transform?.min ?? gauge.config.min ?? 0;\n const max = transform?.max ?? gauge.config.max ?? 100;\n const percentage = Math.min(100, Math.max(0, ((value - min) / (max - min)) * 100));\n\n return ((gauge.size.width - 4) * percentage) / 100;\n }\n\n // ============================================================================\n // Connection Helpers\n // ============================================================================\n\n protected getConnectionPath(connection: ProcessConnection): string {\n const diagram = this._diagramConfig();\n if (!diagram) return '';\n\n const fromElement = diagram.elements.find(e => e.id === connection.from.elementId);\n const toElement = diagram.elements.find(e => e.id === connection.to.elementId);\n\n if (!fromElement || !toElement) return '';\n\n const fromPoint = this.getPortPosition(fromElement, connection.from.port);\n const toPoint = this.getPortPosition(toElement, connection.to.port);\n\n // Simple line or path through intermediate points\n if (connection.pathPoints && connection.pathPoints.length > 0) {\n const points = [fromPoint, ...connection.pathPoints, toPoint];\n return `M ${points.map(p => `${p.x},${p.y}`).join(' L ')}`;\n }\n\n // Direct line\n return `M ${fromPoint.x},${fromPoint.y} L ${toPoint.x},${toPoint.y}`;\n }\n\n protected getPortPosition(element: ProcessElement, port: string): { x: number; y: number } {\n const x = element.position.x;\n const y = element.position.y;\n const w = element.size.width;\n const h = element.size.height;\n\n switch (port) {\n case 'top': return { x: x + w/2, y: y };\n case 'bottom': return { x: x + w/2, y: y + h };\n case 'left': return { x: x, y: y + h/2 };\n case 'right': return { x: x + w, y: y + h/2 };\n case 'center':\n default: return { x: x + w/2, y: y + h/2 };\n }\n }\n\n protected isConnectionFlowActive(connection: ProcessConnection): boolean {\n if (!connection.animation?.enabled) return false;\n\n const activeWhen = connection.animation.activeWhen ?? 'always';\n if (activeWhen === 'always') return true;\n\n const runtimeData = this._runtimeState()?.connections.get(connection.id);\n return runtimeData?.flowActive ?? false;\n }\n\n protected getFlowAnimationDuration(connection: ProcessConnection): string {\n const speed = connection.animation?.speed ?? 1;\n const duration = 2 / speed;\n return `${duration}s`;\n }\n\n // ============================================================================\n // Primitive Helpers (for Process Designer diagrams)\n // ============================================================================\n\n /**\n * Gets the transform string for a primitive\n */\n protected getPrimitiveTransform(primitive: PrimitiveBase): string {\n let transform = `translate(${primitive.position.x}, ${primitive.position.y})`;\n if ((primitive as any).rotation) {\n transform += ` rotate(${(primitive as any).rotation})`;\n }\n return transform;\n }\n\n /**\n * Gets the transform string for a symbol instance\n */\n protected getSymbolTransform(symbolInstance: SymbolInstance): string {\n const pos = symbolInstance.position;\n let transform = `translate(${pos.x}, ${pos.y})`;\n const scale = symbolInstance.scale as { x?: number; y?: number } | number | undefined;\n if (scale) {\n if (typeof scale === 'number') {\n if (scale !== 1) {\n transform += ` scale(${scale})`;\n }\n } else if (scale.x !== undefined || scale.y !== undefined) {\n const sx = scale.x ?? 1;\n const sy = scale.y ?? 1;\n if (sx !== 1 || sy !== 1) {\n transform += ` scale(${sx}, ${sy})`;\n }\n }\n }\n return transform;\n }\n\n /**\n * Gets primitives for a symbol instance from its definition,\n * with bindings applied if available.\n */\n protected getSymbolPrimitives(symbolInstance: SymbolInstance): PrimitiveBase[] {\n // Look up the definition in the cache using symbolRtId\n const definitions = this._symbolDefinitions();\n const definition = definitions.get(symbolInstance.symbolRtId);\n\n if (!definition?.primitives) {\n return [];\n }\n\n // Get property values for this symbol instance\n const propertyValues = this.getSymbolInstancePropertyValues(symbolInstance, definition);\n\n // If there are bindings, apply them\n let primitives: PrimitiveBase[];\n if (definition.propertyBindings && definition.propertyBindings.length > 0) {\n primitives = this.applyBindingsToPrimitives(\n definition.primitives,\n definition.propertyBindings,\n propertyValues\n );\n } else {\n primitives = [...definition.primitives];\n }\n\n // Add primitives from nested symbol instances (recursively)\n const nestedInstances = definition.symbolInstances ?? [];\n for (const nestedInst of nestedInstances) {\n const nestedPrimitives = this.getNestedSymbolPrimitives(nestedInst, definition, propertyValues);\n primitives.push(...nestedPrimitives);\n }\n\n return primitives;\n }\n\n /**\n * Gets primitives for a nested symbol instance, with position offset applied.\n */\n private getNestedSymbolPrimitives(\n nestedInst: SymbolInstance,\n parentDef: SymbolDefinition,\n parentPropertyValues: Record<string, unknown>\n ): PrimitiveBase[] {\n const definitions = this._symbolDefinitions();\n const nestedDef = definitions.get(nestedInst.symbolRtId);\n\n if (!nestedDef?.primitives) {\n return [];\n }\n\n // Calculate property values for the nested instance using \"Pass to child property\" bindings\n const nestedPropertyValues = this.calculateNestedPropertyValues(\n parentDef,\n nestedInst,\n parentPropertyValues\n );\n\n // Apply bindings to nested primitives\n let nestedPrimitives: PrimitiveBase[];\n if (nestedDef.propertyBindings && nestedDef.propertyBindings.length > 0) {\n nestedPrimitives = this.applyBindingsToPrimitives(\n nestedDef.primitives,\n nestedDef.propertyBindings,\n nestedPropertyValues\n );\n } else {\n nestedPrimitives = [...nestedDef.primitives];\n }\n\n // Offset positions by nested instance position\n const offsetX = nestedInst.position?.x ?? 0;\n const offsetY = nestedInst.position?.y ?? 0;\n\n const offsetPrimitives = nestedPrimitives.map(prim => ({\n ...prim,\n position: {\n x: (prim.position?.x ?? 0) + offsetX,\n y: (prim.position?.y ?? 0) + offsetY\n }\n }));\n\n // Recursively handle nested instances within the nested symbol\n const deepNestedInstances = nestedDef.symbolInstances ?? [];\n for (const deepNestedInst of deepNestedInstances) {\n const deepPrimitives = this.getNestedSymbolPrimitives(deepNestedInst, nestedDef, nestedPropertyValues);\n // Apply the parent offset to deep nested primitives\n const deepOffsetPrimitives = deepPrimitives.map(prim => ({\n ...prim,\n position: {\n x: (prim.position?.x ?? 0) + offsetX,\n y: (prim.position?.y ?? 0) + offsetY\n }\n }));\n offsetPrimitives.push(...deepOffsetPrimitives);\n }\n\n return offsetPrimitives;\n }\n\n /**\n * Calculate property values for a nested symbol instance based on \"Pass to child property\" bindings.\n */\n private calculateNestedPropertyValues(\n parentDef: SymbolDefinition,\n nestedInst: SymbolInstance,\n parentPropertyValues: Record<string, unknown>\n ): Record<string, unknown> {\n const nestedPropertyValues: Record<string, unknown> = {};\n\n // Get default values from nested symbol definition\n const definitions = this._symbolDefinitions();\n const nestedDef = definitions.get(nestedInst.symbolRtId);\n if (nestedDef?.transformProperties) {\n for (const prop of nestedDef.transformProperties) {\n nestedPropertyValues[prop.id] = prop.defaultValue;\n }\n }\n\n // Apply property values from nested instance\n if (nestedInst.propertyValues) {\n Object.assign(nestedPropertyValues, nestedInst.propertyValues);\n }\n\n // Apply \"Pass to child property\" bindings from parent\n const passThroughBindings = parentDef.propertyBindings?.filter(\n b => b.effectType === 'property' &&\n b.targetType === 'symbolInstance' &&\n b.targetId === nestedInst.id\n ) ?? [];\n\n for (const binding of passThroughBindings) {\n const sourceValue = parentPropertyValues[binding.propertyId];\n if (sourceValue !== undefined && binding.targetPropertyId) {\n // Evaluate expression if present\n if (binding.expression) {\n const context: Record<string, number | string | boolean> = {};\n if (typeof sourceValue === 'number' || typeof sourceValue === 'string' || typeof sourceValue === 'boolean') {\n context['value'] = sourceValue;\n }\n const result = this.expressionEvaluator.evaluate(binding.expression, context);\n nestedPropertyValues[binding.targetPropertyId] = result.success ? result.value : sourceValue;\n } else {\n nestedPropertyValues[binding.targetPropertyId] = sourceValue;\n }\n }\n }\n\n return nestedPropertyValues;\n }\n\n /**\n * Gets the symbol definition for a symbol instance.\n */\n protected getSymbolDefinition(symbolInstance: SymbolInstance): SymbolDefinition | undefined {\n const definitions = this._symbolDefinitions();\n return definitions.get(symbolInstance.symbolRtId);\n }\n\n /**\n * Resolves the effective style for a primitive, checking styleClassId first,\n * then falling back to inline style.\n */\n protected resolveStyle(primitive: PrimitiveBase, styleClasses?: StyleClass[]): PrimitiveStyle {\n let classStyle: PrimitiveStyle = {};\n\n // Check for style class reference\n if ((primitive as any).styleClassId && styleClasses) {\n const styleClass = styleClasses.find(c => c.id === (primitive as any).styleClassId);\n if (styleClass) {\n classStyle = styleClass.style;\n }\n }\n\n // Merge with inline style (inline overrides class)\n return {\n fill: { ...classStyle.fill, ...primitive.style?.fill },\n stroke: { ...classStyle.stroke, ...primitive.style?.stroke },\n opacity: primitive.style?.opacity ?? classStyle.opacity\n };\n }\n\n /**\n * Gets fill color for a primitive, resolving style class if needed.\n */\n protected getFillColor(primitive: PrimitiveBase, styleClasses?: StyleClass[], defaultColor = 'none'): string {\n const style = this.resolveStyle(primitive, styleClasses);\n return style.fill?.color || defaultColor;\n }\n\n /**\n * Gets fill opacity for a primitive, resolving style class if needed.\n */\n protected getFillOpacity(primitive: PrimitiveBase, styleClasses?: StyleClass[], defaultOpacity = 1): number {\n const style = this.resolveStyle(primitive, styleClasses);\n return style.fill?.opacity ?? defaultOpacity;\n }\n\n /**\n * Gets stroke color for a primitive, resolving style class if needed.\n */\n protected getStrokeColor(primitive: PrimitiveBase, styleClasses?: StyleClass[], defaultColor = 'none'): string {\n const style = this.resolveStyle(primitive, styleClasses);\n return style.stroke?.color || defaultColor;\n }\n\n /**\n * Gets stroke width for a primitive, resolving style class if needed.\n */\n protected getStrokeWidth(primitive: PrimitiveBase, styleClasses?: StyleClass[], defaultWidth = 1): number {\n const style = this.resolveStyle(primitive, styleClasses);\n return style.stroke?.width ?? defaultWidth;\n }\n\n /**\n * Gets stroke opacity for a primitive, resolving style class if needed.\n */\n protected getStrokeOpacity(primitive: PrimitiveBase, styleClasses?: StyleClass[], defaultOpacity = 1): number {\n const style = this.resolveStyle(primitive, styleClasses);\n return style.stroke?.opacity ?? defaultOpacity;\n }\n\n /**\n * Gets property values for a symbol instance.\n * Combines default values with any values passed from parent bindings.\n */\n private getSymbolInstancePropertyValues(\n symbolInstance: SymbolInstance,\n definition: SymbolDefinition\n ): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n\n // Initialize with default values from transform properties\n for (const prop of definition.transformProperties ?? []) {\n values[prop.id] = prop.defaultValue;\n }\n\n // Override with values from parent diagram bindings (via 'property' effect type)\n const diagram = this._diagramConfig();\n const boundData = this._boundData();\n\n if (diagram?.propertyBindings && boundData) {\n // Get parent property values\n const parentPropertyValues = this.buildPropertyValuesFromBoundData(\n diagram.transformProperties ?? [],\n this.config.propertyMappings ?? [],\n boundData\n );\n\n // Find bindings that pass values to this symbol instance\n const propertyBindings = diagram.propertyBindings.filter(\n b => b.targetType === 'symbolInstance' &&\n b.targetId === symbolInstance.id &&\n b.effectType === 'property' &&\n b.targetPropertyId\n );\n\n for (const binding of propertyBindings) {\n const parentValue = parentPropertyValues[binding.propertyId];\n if (parentValue === undefined) {\n continue;\n }\n\n // Build context and evaluate expression\n const context: Record<string, number | string | boolean> = {};\n if (typeof parentValue === 'number' || typeof parentValue === 'string' || typeof parentValue === 'boolean') {\n context['value'] = parentValue;\n }\n\n const result = this.expressionEvaluator.evaluate(binding.expression, context);\n if (result.success && binding.targetPropertyId) {\n values[binding.targetPropertyId] = result.value;\n }\n }\n }\n\n return values;\n }\n\n /**\n * Renders animation SVG content for a primitive.\n * Returns SafeHtml for use with innerHTML binding.\n */\n protected getPrimitiveAnimationHtml(primitive: PrimitiveBase): SafeHtml {\n if (!primitive.animations || primitive.animations.length === 0) {\n return '';\n }\n\n const bounds = this.getPrimitiveBounds(primitive);\n const animationStates = this.animationEnabledStates();\n const hasBindings = Object.keys(animationStates).length > 0;\n\n const context: AnimationRenderContext = {\n bounds: {\n x: 0, // Animations are relative to primitive's local coordinate system\n y: 0,\n width: bounds.width,\n height: bounds.height\n },\n animationsEnabled: true,\n propertyValues: {},\n // Use preview mode only if there are NO animation bindings\n previewMode: !hasBindings,\n primitiveId: primitive.id,\n animationEnabledStates: hasBindings ? animationStates : undefined\n };\n\n const svg = renderAnimations(primitive.animations, context);\n return this.sanitizer.bypassSecurityTrustHtml(svg);\n }\n\n /**\n * Gets animation enabled states for a symbol instance.\n */\n private getSymbolAnimationStates(symbolInstance: SymbolInstance): Record<string, boolean> {\n const states: Record<string, boolean> = {};\n const definitions = this._symbolDefinitions();\n const definition = definitions.get(symbolInstance.symbolRtId);\n\n if (!definition?.propertyBindings) {\n return states;\n }\n\n // Get property values for this symbol\n const propertyValues = this.getSymbolInstancePropertyValues(symbolInstance, definition);\n\n // Filter animation bindings\n const animationBindings = definition.propertyBindings.filter(\n b => b.effectType === 'animation.enabled' && b.animationId\n );\n\n for (const binding of animationBindings) {\n const propertyValue = propertyValues[binding.propertyId];\n\n const context: Record<string, number | string | boolean> = {};\n if (typeof propertyValue === 'number' || typeof propertyValue === 'string' || typeof propertyValue === 'boolean') {\n context['value'] = propertyValue;\n } else {\n context['value'] = 0;\n }\n\n const result = this.expressionEvaluator.evaluate(binding.expression, context);\n const key = binding.targetId ? `${binding.targetId}:${binding.animationId}` : binding.animationId!;\n states[key] = result.success && Boolean(result.value);\n }\n\n return states;\n }\n\n /**\n * Renders animation SVG content for a symbol instance primitive.\n * Returns SafeHtml for use with innerHTML binding.\n */\n protected getSymbolPrimitiveAnimationHtml(primitive: PrimitiveBase, symbolInstance: SymbolInstance): SafeHtml {\n if (!primitive.animations || primitive.animations.length === 0) {\n return '';\n }\n\n const bounds = this.getPrimitiveBounds(primitive);\n const animationStates = this.getSymbolAnimationStates(symbolInstance);\n const hasBindings = Object.keys(animationStates).length > 0;\n\n // Generate unique target ID for shape element (used by animations to target via href)\n const targetElementId = `shape-${symbolInstance.id}-${primitive.id}`;\n\n const context: AnimationRenderContext = {\n bounds: {\n x: 0,\n y: 0,\n width: bounds.width,\n height: bounds.height\n },\n animationsEnabled: true,\n propertyValues: {},\n previewMode: !hasBindings,\n primitiveId: primitive.id,\n animationEnabledStates: hasBindings ? animationStates : undefined,\n targetElementId\n };\n\n const svg = renderAnimations(primitive.animations, context);\n return this.sanitizer.bypassSecurityTrustHtml(svg);\n }\n\n /**\n * Renders flow particles animation for line-based primitives.\n * Returns SafeHtml for use with innerHTML binding.\n */\n protected getFlowParticlesHtml(primitive: PrimitiveBase, symbolInstance: SymbolInstance): SafeHtml {\n if (!primitive.animations || primitive.animations.length === 0) {\n return '';\n }\n\n const flowParticles = getFlowParticlesAnimation(primitive.animations);\n if (!flowParticles) {\n return '';\n }\n\n // Check if animation is enabled\n const animationStates = this.getSymbolAnimationStates(symbolInstance);\n const hasBindings = Object.keys(animationStates).length > 0;\n const key = `${primitive.id}:${flowParticles.definition.id}`;\n const isEnabled = hasBindings ? (animationStates[key] ?? animationStates[flowParticles.definition.id] ?? true) : true;\n\n // Build path data based on primitive type\n let pathData = '';\n const config = (primitive as any).config;\n\n switch (primitive.type) {\n case 'line':\n pathData = `M ${config.start.x},${config.start.y} L ${config.end.x},${config.end.y}`;\n break;\n\n case 'polyline':\n if (config.points && config.points.length > 0) {\n const points = config.points as { x: number; y: number }[];\n pathData = 'M ' + points.map((p: { x: number; y: number }) =>\n `${p.x + (primitive.position?.x ?? 0)},${p.y + (primitive.position?.y ?? 0)}`\n ).join(' L ');\n }\n break;\n\n case 'path':\n pathData = config.d || '';\n break;\n\n default:\n return '';\n }\n\n if (!pathData) {\n return '';\n }\n\n // Get stroke color for particles\n const stroke = primitive.style?.stroke?.color || '#00ff00';\n\n const svg = renderFlowParticles(flowParticles.animation, pathData, stroke, isEnabled);\n return this.sanitizer.bypassSecurityTrustHtml(svg);\n }\n\n /**\n * Checks if a primitive has a flow particles animation.\n */\n protected hasFlowParticles(primitive: PrimitiveBase): boolean {\n if (!primitive.animations || primitive.animations.length === 0) {\n return false;\n }\n return getFlowParticlesAnimation(primitive.animations) !== null;\n }\n\n /**\n * Checks if a primitive has a fillLevel set (for tank/battery visualization).\n */\n protected hasFillLevel(primitive: PrimitiveBase): boolean {\n const config = (primitive as any).config;\n return config?.fillLevel !== undefined && config.fillLevel >= 0 && config.fillLevel <= 1;\n }\n\n /**\n * Renders a rectangle with fillLevel clip-path for tank/battery visualization.\n */\n protected getRectangleWithFillLevelHtml(\n primitive: PrimitiveBase,\n symbolInstance: SymbolInstance,\n styleClasses?: StyleClass[]\n ): SafeHtml {\n const config = (primitive as any).config;\n const fillLevel = config.fillLevel ?? 0;\n const width = config.width ?? 100;\n const height = config.height ?? 100;\n const cornerRadius = config.cornerRadius ?? 0;\n\n const clipId = `fill-clip-${symbolInstance.id}-${primitive.id}`;\n const shapeId = this.getSymbolShapeId(symbolInstance, primitive);\n\n // Calculate clip rect (fillLevel 0 = empty, 1 = full)\n // Clip from bottom, so clipY starts from (1 - fillLevel) * height\n const clipY = height * (1 - fillLevel);\n const clipHeight = height * fillLevel;\n\n const fill = this.getFillColor(primitive, styleClasses);\n const fillOpacity = this.getFillOpacity(primitive, styleClasses);\n const stroke = this.getStrokeColor(primitive, styleClasses);\n const strokeWidth = this.getStrokeWidth(primitive, styleClasses, 0);\n const strokeOpacity = this.getStrokeOpacity(primitive, styleClasses);\n const strokeDashArray = this.getStrokeDashArray(primitive.style?.stroke?.dashArray);\n\n const svg = `\n <defs>\n <clipPath id=\"${clipId}\">\n <rect x=\"0\" y=\"${clipY}\" width=\"${width}\" height=\"${clipHeight}\"/>\n </clipPath>\n </defs>\n <rect\n id=\"${shapeId}\"\n x=\"0\" y=\"0\"\n width=\"${width}\" height=\"${height}\"\n rx=\"${cornerRadius}\"\n fill=\"${fill}\"\n fill-opacity=\"${fillOpacity}\"\n stroke=\"${stroke}\"\n stroke-width=\"${strokeWidth}\"\n stroke-opacity=\"${strokeOpacity}\"\n ${strokeDashArray ? `stroke-dasharray=\"${strokeDashArray}\"` : ''}\n clip-path=\"url(#${clipId})\"/>\n `;\n\n return this.sanitizer.bypassSecurityTrustHtml(svg);\n }\n\n /**\n * Gets the unique ID for a shape element within a symbol instance.\n * Used to target the shape via href in animations.\n */\n protected getSymbolShapeId(symbolInstance: SymbolInstance, primitive: PrimitiveBase): string {\n return `shape-${symbolInstance.id}-${primitive.id}`;\n }\n\n /**\n * Gets top-level primitives for a symbol (excludes children of groups).\n */\n protected getTopLevelSymbolPrimitives(symbolInstance: SymbolInstance): PrimitiveBase[] {\n const allPrimitives = this.getSymbolPrimitives(symbolInstance);\n\n // Collect all child IDs from groups\n const childIds = new Set<string>();\n for (const prim of allPrimitives) {\n if (prim.type === 'group') {\n const groupConfig = (prim as any).config;\n if (groupConfig?.childIds) {\n for (const childId of groupConfig.childIds) {\n childIds.add(childId);\n }\n }\n }\n }\n\n // Return only primitives that are not children of a group\n return allPrimitives.filter(p => !childIds.has(p.id));\n }\n\n /**\n * Gets children of a group primitive from the symbol's primitives.\n */\n protected getGroupChildPrimitives(symbolInstance: SymbolInstance, groupPrimitive: PrimitiveBase): PrimitiveBase[] {\n const allPrimitives = this.getSymbolPrimitives(symbolInstance);\n const groupConfig = (groupPrimitive as any).config;\n const childIds = groupConfig?.childIds ?? [];\n\n // Return primitives that match the childIds, preserving order\n const childMap = new Map<string, PrimitiveBase>();\n for (const prim of allPrimitives) {\n if (childIds.includes(prim.id)) {\n childMap.set(prim.id, prim);\n }\n }\n\n // Return in the order specified by childIds\n return childIds\n .map((id: string) => childMap.get(id))\n .filter((p: PrimitiveBase | undefined): p is PrimitiveBase => p !== undefined);\n }\n\n /**\n * Checks if a primitive is a group.\n */\n protected isGroup(primitive: PrimitiveBase): boolean {\n return primitive.type === 'group';\n }\n\n /**\n * Gets line coordinates adjusted for group offset.\n * When a line is inside a group, its absolute coordinates need to be\n * converted to coordinates relative to the group's position.\n */\n protected getGroupChildLineCoords(child: PrimitiveBase, groupPrimitive: PrimitiveBase): { x1: number; y1: number; x2: number; y2: number } {\n const config = (child as any).config;\n const groupPos = groupPrimitive.position;\n return {\n x1: config.start.x - groupPos.x,\n y1: config.start.y - groupPos.y,\n x2: config.end.x - groupPos.x,\n y2: config.end.y - groupPos.y\n };\n }\n\n /**\n * Gets polygon/polyline points adjusted for group offset.\n */\n protected getGroupChildPoints(child: PrimitiveBase, groupPrimitive: PrimitiveBase): string {\n const config = (child as any).config;\n const groupPos = groupPrimitive.position;\n const childPos = child.position;\n const points = config?.points ?? [];\n return points.map((p: { x: number; y: number }) =>\n `${p.x + childPos.x - groupPos.x},${p.y + childPos.y - groupPos.y}`\n ).join(' ');\n }\n\n /**\n * Gets the transform for a child element inside a group.\n * Adjusts the position relative to the group's position.\n *\n * For coordinate-based primitives (line, polyline, polygon), coordinates\n * are adjusted directly via getGroupChildLineCoords/getGroupChildPoints,\n * so no additional wrapper transform is needed.\n */\n protected getGroupChildTransform(child: PrimitiveBase, groupPrimitive: PrimitiveBase): string {\n // For primitives that use config coordinates (line, polyline, polygon),\n // we adjust the coordinates directly, so no wrapper transform needed\n if (child.type === 'line' || child.type === 'polyline' || child.type === 'polygon') {\n return '';\n }\n\n // For position-based primitives (rectangle, ellipse, text, image, path, group)\n const groupPos = groupPrimitive.position;\n const childPos = child.position;\n const relX = childPos.x - groupPos.x;\n const relY = childPos.y - groupPos.y;\n return `translate(${relX}, ${relY})`;\n }\n\n /**\n * Converts polyline points array to SVG points string\n */\n protected getPolylinePoints(primitive: { config: { points: { x: number; y: number }[] } }): string {\n const points = primitive.config?.points ?? [];\n return points.map(p => `${p.x},${p.y}`).join(' ');\n }\n\n /**\n * Converts polygon points array to SVG points string\n */\n protected getPolygonPoints(primitive: { config: { points: { x: number; y: number }[] } }): string {\n const points = primitive.config?.points ?? [];\n return points.map(p => `${p.x},${p.y}`).join(' ');\n }\n\n /**\n * Gets stroke dash array string for SVG\n */\n protected getStrokeDashArray(dashArray: number[] | undefined): string {\n if (!dashArray || dashArray.length === 0) {\n return '';\n }\n return dashArray.join(' ');\n }\n\n /**\n * Check if a primitive has a stroke-dashoffset animation (flow animation)\n */\n protected hasStrokeDashOffsetAnimation(primitive: PrimitiveBase): boolean {\n if (!primitive.animations || primitive.animations.length === 0) {\n return false;\n }\n return primitive.animations.some(def =>\n def.animation.type === 'animate' &&\n (def.animation as AttributeAnimation).attributeName === 'stroke-dashoffset'\n );\n }\n\n /**\n * Gets effective stroke dash array for primitives, considering flow animations.\n * For stroke-dashoffset animations to work, the element needs a stroke-dasharray.\n * If none is configured but a flow animation exists, use a default pattern.\n */\n protected getEffectiveStrokeDashArray(primitive: PrimitiveBase): string {\n const configuredDashArray = this.getStrokeDashArray(primitive.style?.stroke?.dashArray);\n\n // If dashArray is already configured, use it\n if (configuredDashArray) {\n return configuredDashArray;\n }\n\n // If no dashArray but has stroke-dashoffset animation, use default pattern\n if (this.hasStrokeDashOffsetAnimation(primitive)) {\n return '10 5';\n }\n\n return '';\n }\n\n /**\n * Calculate bounding box for a group primitive based on its children\n */\n protected getGroupBounds(prim: PrimitiveBase): { x: number; y: number; width: number; height: number } {\n const children = (prim as any).config?.children as PrimitiveBase[] | undefined;\n if (!children || children.length === 0) {\n return { x: prim.position.x, y: prim.position.y, width: 100, height: 100 };\n }\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n\n for (const child of children) {\n const childBounds = this.getPrimitiveBounds(child);\n minX = Math.min(minX, childBounds.x);\n minY = Math.min(minY, childBounds.y);\n maxX = Math.max(maxX, childBounds.x + childBounds.width);\n maxY = Math.max(maxY, childBounds.y + childBounds.height);\n }\n\n if (minX === Infinity) {\n return { x: prim.position.x, y: prim.position.y, width: 100, height: 100 };\n }\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n }\n\n /**\n * Get bounds for a primitive\n */\n protected getPrimitiveBounds(prim: PrimitiveBase): { x: number; y: number; width: number; height: number } {\n const pos = prim.position;\n const config = (prim as any).config;\n\n switch (prim.type) {\n case 'rectangle':\n return { x: pos.x, y: pos.y, width: config.width ?? 100, height: config.height ?? 100 };\n case 'ellipse':\n return { x: pos.x, y: pos.y, width: (config.rx ?? 50) * 2, height: (config.ry ?? 50) * 2 };\n case 'line': {\n const lineMinX = Math.min(config.start?.x ?? 0, config.end?.x ?? 0);\n const lineMaxX = Math.max(config.start?.x ?? 0, config.end?.x ?? 0);\n const lineMinY = Math.min(config.start?.y ?? 0, config.end?.y ?? 0);\n const lineMaxY = Math.max(config.start?.y ?? 0, config.end?.y ?? 0);\n return { x: pos.x + lineMinX, y: pos.y + lineMinY, width: lineMaxX - lineMinX || 1, height: lineMaxY - lineMinY || 1 };\n }\n case 'text':\n return { x: pos.x, y: pos.y, width: config.width ?? 100, height: config.fontSize ?? 14 };\n case 'group':\n return this.getGroupBounds(prim);\n default:\n return { x: pos.x, y: pos.y, width: 50, height: 50 };\n }\n }\n\n // ============================================================================\n // Runtime Binding Helpers\n // ============================================================================\n\n /**\n * Builds property values from bound data using the configured mappings.\n * Maps diagram exposed properties to values from entity attributes or query columns.\n * Applies optional expressions for value transformation/normalization.\n */\n private buildPropertyValuesFromBoundData(\n transformProperties: TransformProperty[],\n mappings: DiagramPropertyMapping[],\n boundData: BoundDataResult\n ): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n\n // Initialize with default values from transform properties\n for (const prop of transformProperties) {\n values[prop.id] = prop.defaultValue;\n }\n\n // Apply mappings\n for (const mapping of mappings) {\n const prop = transformProperties.find(p => p.id === mapping.propertyId);\n if (!prop) continue;\n\n let rawValue: unknown = undefined;\n\n if (mapping.sourceType === 'attribute' && boundData.type === 'entity' && boundData.entity) {\n // Extract value from entity attribute\n rawValue = this.extractAttributeValue(boundData.entity, mapping.sourcePath);\n } else if (mapping.sourceType === 'column' && boundData.type === 'query' && boundData.queryResult) {\n // Extract value from query result (first row)\n rawValue = this.extractQueryColumnValue(boundData.queryResult, mapping.sourcePath);\n }\n\n if (rawValue !== undefined) {\n let finalValue: unknown = rawValue;\n\n // Apply expression transformation if defined\n if (mapping.expression && mapping.expression.trim()) {\n try {\n // Build expression context with 'value' as the input\n const context: Record<string, number | string | boolean> = {\n value: this.toPrimitiveValue(rawValue)\n };\n\n // Evaluate expression\n const result = this.expressionEvaluator.evaluate(mapping.expression, context);\n if (result.success) {\n finalValue = result.value;\n } else {\n console.warn(`[ProcessWidget] Expression evaluation failed for ${mapping.propertyId}:`, result.error);\n }\n } catch (err) {\n console.warn(`[ProcessWidget] Expression error for ${mapping.propertyId}:`, err);\n }\n }\n\n // Convert to expected type\n values[mapping.propertyId] = this.coerceToType(finalValue, prop.type);\n }\n }\n\n return values;\n }\n\n /**\n * Converts an unknown value to a primitive type for expression evaluation.\n */\n private toPrimitiveValue(value: unknown): number | string | boolean {\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n // Try to parse as number if it looks numeric\n const parsed = parseFloat(value);\n return isNaN(parsed) ? value : parsed;\n }\n if (typeof value === 'boolean') return value;\n if (value === null || value === undefined) return 0;\n return String(value);\n }\n\n /**\n * Extracts a value from an entity's attributes by path.\n * Supports nested paths like \"properties.temperature\"\n */\n private extractAttributeValue(entity: RuntimeEntityData, path: string): unknown {\n if (!entity.attributes) return undefined;\n\n // First try direct match\n const directMatch = entity.attributes.find(a => a.attributeName === path);\n if (directMatch) return directMatch.value;\n\n // Try nested path\n const parts = path.split('.');\n const rootAttr = entity.attributes.find(a => a.attributeName === parts[0]);\n if (!rootAttr) return undefined;\n\n let value: unknown = rootAttr.value;\n for (let i = 1; i < parts.length; i++) {\n if (typeof value === 'object' && value !== null && parts[i] in (value as Record<string, unknown>)) {\n value = (value as Record<string, unknown>)[parts[i]];\n } else {\n return undefined;\n }\n }\n\n return value;\n }\n\n /**\n * Extracts a column value from query results (first row).\n */\n private extractQueryColumnValue(queryResult: QueryResultData, columnName: string): unknown {\n if (!queryResult.rows || queryResult.rows.length === 0) return undefined;\n\n const firstRow = queryResult.rows[0];\n // Try both the column name and sanitized version (dots -> underscores)\n const value = firstRow.cells.get(columnName) ?? firstRow.cells.get(columnName.replace(/\\./g, '_'));\n return value;\n }\n\n /**\n * Coerces a value to the expected type.\n */\n private coerceToType(value: unknown, type: string): unknown {\n switch (type) {\n case 'number':\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n const parsed = parseFloat(value);\n return isNaN(parsed) ? 0 : parsed;\n }\n return 0;\n\n case 'boolean':\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value.toLowerCase() === 'true';\n if (typeof value === 'number') return value !== 0;\n return false;\n\n case 'string':\n return String(value ?? '');\n\n default:\n return value;\n }\n }\n\n /**\n * Applies property bindings to primitives.\n * Creates clones of primitives with binding effects applied.\n */\n private applyBindingsToPrimitives(\n primitives: PrimitiveBase[],\n bindings: PropertyBinding[],\n propertyValues: Record<string, unknown>\n ): PrimitiveBase[] {\n return primitives.map(primitive => {\n // Find bindings for this primitive\n const primitiveBindings = bindings.filter(\n b => b.targetType === 'primitive' && b.targetId === primitive.id\n );\n\n if (primitiveBindings.length === 0) {\n return primitive;\n }\n\n // Clone the primitive to apply bindings\n let modified = this.clonePrimitive(primitive);\n\n for (const binding of primitiveBindings) {\n const propertyValue = propertyValues[binding.propertyId];\n if (propertyValue === undefined) continue;\n\n // Build expression context\n const context: Record<string, number | string | boolean> = {};\n if (typeof propertyValue === 'number' || typeof propertyValue === 'string' || typeof propertyValue === 'boolean') {\n context['value'] = propertyValue;\n }\n\n // Evaluate expression\n const result = this.expressionEvaluator.evaluate(\n binding.expression,\n context\n );\n\n // Apply the effect if evaluation succeeded\n if (result.success && result.value !== undefined) {\n modified = this.applyBindingEffect(modified, binding.effectType, result.value);\n }\n }\n\n return modified;\n });\n }\n\n /**\n * Creates a deep clone of a primitive.\n */\n private clonePrimitive(primitive: PrimitiveBase): PrimitiveBase {\n return JSON.parse(JSON.stringify(primitive));\n }\n\n /**\n * Applies a binding effect to a primitive.\n */\n private applyBindingEffect(\n primitive: PrimitiveBase,\n effectType: string,\n value: unknown\n ): PrimitiveBase {\n const p = primitive as any;\n\n switch (effectType) {\n case 'transform.rotation':\n p.rotation = typeof value === 'number' ? value : 0;\n break;\n\n case 'transform.offsetX':\n if (typeof value === 'number') {\n p.position = { ...p.position, x: p.position.x + value };\n }\n break;\n\n case 'transform.offsetY':\n if (typeof value === 'number') {\n p.position = { ...p.position, y: p.position.y + value };\n }\n break;\n\n case 'transform.scale':\n if (typeof value === 'number') {\n p.scale = value;\n }\n break;\n\n case 'style.fill.color':\n if (!p.style) p.style = {};\n if (!p.style.fill) p.style.fill = {};\n p.style.fill.color = String(value);\n break;\n\n case 'style.fill.opacity':\n if (!p.style) p.style = {};\n if (!p.style.fill) p.style.fill = {};\n p.style.fill.opacity = typeof value === 'number' ? value : 1;\n break;\n\n case 'style.stroke.color':\n if (!p.style) p.style = {};\n if (!p.style.stroke) p.style.stroke = {};\n p.style.stroke.color = String(value);\n break;\n\n case 'style.stroke.opacity':\n if (!p.style) p.style = {};\n if (!p.style.stroke) p.style.stroke = {};\n p.style.stroke.opacity = typeof value === 'number' ? value : 1;\n break;\n\n case 'style.opacity':\n if (!p.style) p.style = {};\n p.style.opacity = typeof value === 'number' ? value : 1;\n break;\n\n case 'visible':\n p.visible = Boolean(value);\n break;\n\n case 'fillLevel':\n // fillLevel is stored in config for rendering\n if (!p.config) p.config = {};\n p.config.fillLevel = typeof value === 'number' ? Math.max(0, Math.min(1, value)) : 0;\n break;\n\n case 'dimension.width':\n if (!p.config) p.config = {};\n if (typeof value === 'number') {\n p.config.width = value;\n }\n break;\n\n case 'dimension.height':\n if (!p.config) p.config = {};\n if (typeof value === 'number') {\n p.config.height = value;\n }\n break;\n }\n\n return primitive;\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogsModule } from '@progress/kendo-angular-dialog';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\nimport { LayoutModule } from '@progress/kendo-angular-layout';\nimport { CkTypeSelectorInputComponent, FieldFilterEditorComponent, FieldFilterItem, FilterVariable } from '@meshmakers/octo-ui';\nimport {\n CkTypeSelectorItem,\n FieldFilterOperatorsDto,\n AttributeSelectorService,\n AttributeItem,\n GetCkTypeAvailableQueryColumnsDtoGQL\n} from '@meshmakers/octo-services';\nimport {\n EntitySelectInputComponent,\n EntitySelectDialogDataSource,\n DialogFetchOptions,\n DialogFetchResult,\n ColumnDefinition\n} from '@meshmakers/shared-ui';\nimport { EntitySelectDataSource, EntitySelectResult } from '@meshmakers/shared-services';\nimport { WidgetConfigResult } from '../../services/widget-registry.service';\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { GetEntitiesByCkTypeDtoGQL } from '../../graphQL/getEntitiesByCkType';\nimport { GetSystemPersistentQueriesDtoGQL } from '../../graphQL/getSystemPersistentQueries';\nimport type { ProcessDiagramConfig, TransformProperty } from '@meshmakers/octo-process-diagrams';\nimport { ProcessDataService, ProcessDiagramSummary } from './services/process-data.service';\nimport { ProcessDataBindingMode, DiagramPropertyMapping } from './process-widget-config.model';\nimport { WidgetFilterConfig } from '../../models/meshboard.models';\nimport { firstValueFrom, Observable, from, map } from 'rxjs';\n\n/**\n * Diagram source type\n */\nexport type DiagramSourceType = 'stored' | 'none';\n\n/**\n * Represents a runtime entity for selection\n */\nexport interface RuntimeEntityItem {\n rtId: string;\n ckTypeId: string;\n rtWellKnownName?: string;\n displayName: string;\n}\n\n/**\n * Persistent query item for selection\n */\nexport interface PersistentQueryItem {\n rtId: string;\n name: string;\n description?: string | null;\n queryCkTypeId?: string | null;\n}\n\n/**\n * Configuration result from the Process Widget dialog\n */\nexport interface ProcessConfigResult extends WidgetConfigResult {\n diagramSource: DiagramSourceType;\n processDiagramRtId?: string;\n inlineConfig?: ProcessDiagramConfig;\n fitToBounds: boolean;\n allowZoom: boolean;\n allowPan: boolean;\n showToolbar: boolean;\n initialZoom: number;\n // Data binding fields\n dataBindingMode?: ProcessDataBindingMode;\n bindingCkTypeId?: string;\n bindingRtId?: string;\n bindingQueryRtId?: string;\n bindingQueryName?: string;\n bindingFilters?: WidgetFilterConfig[];\n // Property mappings\n propertyMappings?: DiagramPropertyMapping[];\n}\n\n/**\n * Data source for entity autocomplete - filters by ckTypeId\n */\nclass RuntimeEntitySelectDataSource implements EntitySelectDataSource<RuntimeEntityItem> {\n constructor(\n private getEntitiesByCkTypeGQL: GetEntitiesByCkTypeDtoGQL,\n private ckTypeId: string\n ) {}\n\n async onFilter(filter: string, take?: number): Promise<EntitySelectResult<RuntimeEntityItem>> {\n const result = await firstValueFrom(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId: this.ckTypeId,\n first: take ?? 10,\n fieldFilters: filter ? [\n { attributePath: 'rtId', operator: FieldFilterOperatorsDto.LikeDto, comparisonValue: filter }\n ] : undefined\n }\n })\n );\n\n const items = (result.data?.runtime?.runtimeEntities?.items ?? [])\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .map(item => ({\n rtId: item.rtId,\n ckTypeId: item.ckTypeId,\n rtWellKnownName: item.rtWellKnownName ?? undefined,\n displayName: item.rtWellKnownName || item.rtId\n }));\n\n return {\n totalCount: result.data?.runtime?.runtimeEntities?.totalCount ?? 0,\n items\n };\n }\n\n onDisplayEntity(entity: RuntimeEntityItem): string {\n return entity.displayName;\n }\n\n getIdEntity(entity: RuntimeEntityItem): string {\n return entity.rtId;\n }\n}\n\n/**\n * Dialog data source for entity selection grid\n */\nclass RuntimeEntityDialogDataSource implements EntitySelectDialogDataSource<RuntimeEntityItem> {\n constructor(\n private getEntitiesByCkTypeGQL: GetEntitiesByCkTypeDtoGQL,\n private ckTypeId: string\n ) {}\n\n getColumns(): ColumnDefinition[] {\n return [\n { field: 'rtId', displayName: 'RT-ID' },\n { field: 'rtWellKnownName', displayName: 'Name' },\n { field: 'ckTypeId', displayName: 'CK Type' }\n ];\n }\n\n fetchData(options: DialogFetchOptions): Observable<DialogFetchResult<RuntimeEntityItem>> {\n // Build field filters for text search\n const fieldFilters: { attributePath: string; operator: FieldFilterOperatorsDto; comparisonValue: string }[] = [];\n if (options.textSearch && options.textSearch.trim()) {\n fieldFilters.push({\n attributePath: 'rtId',\n operator: FieldFilterOperatorsDto.LikeDto,\n comparisonValue: options.textSearch.trim()\n });\n }\n\n return from(\n this.getEntitiesByCkTypeGQL.fetch({\n variables: {\n ckTypeId: this.ckTypeId,\n first: options.take,\n after: options.skip > 0 ? btoa(`arrayconnection:${options.skip - 1}`) : undefined,\n fieldFilters: fieldFilters.length > 0 ? fieldFilters : undefined\n }\n })\n ).pipe(\n map(result => {\n const items = (result.data?.runtime?.runtimeEntities?.items ?? [])\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .map(item => ({\n rtId: item.rtId,\n ckTypeId: item.ckTypeId,\n rtWellKnownName: item.rtWellKnownName ?? undefined,\n displayName: item.rtWellKnownName || item.rtId\n }));\n\n return {\n data: items,\n totalCount: result.data?.runtime?.runtimeEntities?.totalCount ?? 0\n };\n })\n );\n }\n\n onDisplayEntity(entity: RuntimeEntityItem): string {\n return entity.displayName;\n }\n\n getIdEntity(entity: RuntimeEntityItem): string {\n return entity.rtId;\n }\n}\n\n/**\n * Configuration dialog for Process Widget.\n * Allows selecting a stored diagram, display options, and data binding.\n */\n@Component({\n selector: 'mm-process-config-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogsModule,\n ButtonsModule,\n InputsModule,\n DropDownsModule,\n LayoutModule,\n CkTypeSelectorInputComponent,\n EntitySelectInputComponent,\n FieldFilterEditorComponent\n ],\n providers: [ProcessDataService],\n template: `\n <kendo-dialog\n title=\"Process Diagram Configuration\"\n [minWidth]=\"550\"\n [width]=\"680\"\n (close)=\"onCancel()\">\n\n <div class=\"config-form\">\n <kendo-tabstrip [animate]=\"false\">\n <!-- Tab 1: Diagram -->\n <kendo-tabstrip-tab [title]=\"'Diagram'\" [selected]=\"true\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\" [class.loading]=\"isLoadingDiagrams\">\n @if (isLoadingDiagrams) {\n <div class=\"loading-indicator\">Loading diagrams...</div>\n }\n\n <div class=\"form-field\">\n <label>Process Diagram <span class=\"required\">*</span></label>\n <kendo-combobox\n [data]=\"storedDiagrams\"\n [textField]=\"'name'\"\n [valueField]=\"'rtId'\"\n [valuePrimitive]=\"false\"\n [(ngModel)]=\"selectedDiagram\"\n [filterable]=\"true\"\n (filterChange)=\"onDiagramFilterChange($event)\"\n (valueChange)=\"onDiagramSelected($event)\"\n [loading]=\"isLoadingDiagrams\"\n placeholder=\"Select a diagram...\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"diagram-item\">\n <span class=\"diagram-name\">{{ dataItem.name }}</span>\n <span class=\"diagram-size\">{{ dataItem.canvasWidth }}x{{ dataItem.canvasHeight }}</span>\n </div>\n </ng-template>\n </kendo-combobox>\n @if (storedDiagrams.length === 0 && !isLoadingDiagrams) {\n <p class=\"field-hint warning\">No diagrams found. Create diagrams using the Process Designer.</p>\n }\n </div>\n\n <!-- Preview Section -->\n @if (selectedDiagram) {\n <div class=\"preview-section\">\n <div class=\"preview-info\">\n <div class=\"preview-item\">\n <span class=\"preview-label\">Name:</span>\n <span class=\"preview-value\">{{ selectedDiagram.name }}</span>\n </div>\n <div class=\"preview-item\">\n <span class=\"preview-label\">Canvas Size:</span>\n <span class=\"preview-value\">{{ selectedDiagram.canvasWidth }}x{{ selectedDiagram.canvasHeight }}</span>\n </div>\n <div class=\"preview-item\">\n <span class=\"preview-label\">Version:</span>\n <span class=\"preview-value\">{{ selectedDiagram.version }}</span>\n </div>\n @if (diagramExposedProperties.length > 0) {\n <div class=\"preview-item\">\n <span class=\"preview-label\">Exposed Properties:</span>\n <span class=\"preview-value\">{{ diagramExposedProperties.length }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Tab 2: Data Binding -->\n <kendo-tabstrip-tab [title]=\"'Data Binding'\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <p class=\"section-hint\">Bind the diagram to runtime data for dynamic values.</p>\n\n <!-- Data Binding Mode Toggle -->\n <div class=\"form-field\">\n <label>Binding Mode</label>\n <div class=\"mode-toggle\">\n <button\n kendoButton\n [fillMode]=\"dataBindingMode === 'none' ? 'solid' : 'outline'\"\n [themeColor]=\"dataBindingMode === 'none' ? 'primary' : 'base'\"\n (click)=\"onDataBindingModeChange('none')\">\n None\n </button>\n <button\n kendoButton\n [fillMode]=\"dataBindingMode === 'runtimeEntity' ? 'solid' : 'outline'\"\n [themeColor]=\"dataBindingMode === 'runtimeEntity' ? 'primary' : 'base'\"\n (click)=\"onDataBindingModeChange('runtimeEntity')\">\n Runtime Entity\n </button>\n <button\n kendoButton\n [fillMode]=\"dataBindingMode === 'persistentQuery' ? 'solid' : 'outline'\"\n [themeColor]=\"dataBindingMode === 'persistentQuery' ? 'primary' : 'base'\"\n (click)=\"onDataBindingModeChange('persistentQuery')\">\n Query\n </button>\n </div>\n </div>\n\n <!-- Runtime Entity Data Binding -->\n @if (dataBindingMode === 'runtimeEntity') {\n <!-- CK Type Selection -->\n <div class=\"form-field\">\n <label>CK Type <span class=\"required\">*</span></label>\n <mm-ck-type-selector-input\n placeholder=\"Select a CK Type...\"\n [minSearchLength]=\"2\"\n dialogTitle=\"Select CK Type\"\n [ngModel]=\"selectedCkType\"\n (ckTypeSelected)=\"onCkTypeSelected($event)\"\n (ckTypeCleared)=\"onCkTypeCleared()\">\n </mm-ck-type-selector-input>\n </div>\n\n <!-- Entity Selection -->\n <div class=\"form-field\" [class.disabled]=\"!selectedCkType\">\n <label>Entity <span class=\"required\">*</span></label>\n @if (selectedCkType && entityDataSource) {\n <mm-entity-select-input\n [dataSource]=\"entityDataSource\"\n [dialogDataSource]=\"entityDialogDataSource\"\n placeholder=\"Search for an entity...\"\n dialogTitle=\"Select Entity\"\n [minSearchLength]=\"1\"\n [ngModel]=\"selectedEntity\"\n (entitySelected)=\"onEntitySelected($event)\"\n (entityCleared)=\"onEntityCleared()\">\n </mm-entity-select-input>\n } @else {\n <kendo-textbox\n [disabled]=\"true\"\n placeholder=\"First select a CK Type...\">\n </kendo-textbox>\n }\n </div>\n }\n\n <!-- Persistent Query Data Binding -->\n @if (dataBindingMode === 'persistentQuery') {\n <!-- Query Selection -->\n <div class=\"form-field\">\n <label>Persistent Query <span class=\"required\">*</span></label>\n <kendo-combobox\n [data]=\"persistentQueries\"\n [textField]=\"'name'\"\n [valueField]=\"'rtId'\"\n [valuePrimitive]=\"false\"\n [(ngModel)]=\"selectedPersistentQuery\"\n [filterable]=\"true\"\n (filterChange)=\"onQueryFilterChange($event)\"\n (valueChange)=\"onQuerySelected($event)\"\n placeholder=\"Select a Persistent Query...\"\n [loading]=\"isLoadingQueries\">\n <ng-template kendoComboBoxItemTemplate let-dataItem>\n <div class=\"query-item\">\n <span class=\"query-name\">{{ dataItem.name }}</span>\n @if (dataItem.description) {\n <span class=\"query-description\">{{ dataItem.description }}</span>\n }\n </div>\n </ng-template>\n </kendo-combobox>\n @if (persistentQueries.length === 0 && !isLoadingQueries) {\n <p class=\"field-hint warning\">No queries found.</p>\n }\n </div>\n }\n\n <!-- Filters Section -->\n @if (dataBindingMode !== 'none' && filterAttributes.length > 0) {\n <div class=\"form-field\">\n <label>Filters (Optional)</label>\n <mm-field-filter-editor\n [availableAttributes]=\"filterAttributes\"\n [filters]=\"filters\"\n [enableVariables]=\"filterVariables.length > 0\"\n [availableVariables]=\"filterVariables\"\n (filtersChange)=\"onFiltersChange($event)\">\n </mm-field-filter-editor>\n </div>\n }\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Tab 3: Property Mappings -->\n <kendo-tabstrip-tab [title]=\"'Mappings'\" [disabled]=\"dataBindingMode === 'none' || diagramExposedProperties.length === 0\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n @if (diagramExposedProperties.length === 0) {\n <p class=\"empty-hint\">No exposed properties in this diagram.</p>\n } @else if (isLoadingDiagramConfig) {\n <div class=\"loading-hint\">Loading diagram properties...</div>\n } @else {\n <p class=\"section-hint\">Map diagram exposed properties to data source fields.</p>\n <div class=\"property-mappings-table\">\n <div class=\"mapping-header\">\n <span class=\"col-property\">Property</span>\n <span class=\"col-type\">Type</span>\n <span class=\"col-source\">Source</span>\n <span class=\"col-path\">Field</span>\n <span class=\"col-expression\">Expression</span>\n </div>\n @for (prop of diagramExposedProperties; track prop.id) {\n <div class=\"mapping-row\">\n <span class=\"col-property\" [title]=\"prop.name\">{{ prop.name }}</span>\n <span class=\"col-type type-badge\">{{ prop.type }}</span>\n <kendo-dropdownlist\n class=\"col-source\"\n [data]=\"sourceTypeOptions\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [value]=\"getMappingSourceType(prop.id)\"\n (valueChange)=\"onMappingSourceTypeChange(prop.id, $event)\">\n </kendo-dropdownlist>\n @if (getMappingSourceType(prop.id) === 'attribute' && filterAttributes.length > 0) {\n <kendo-combobox\n class=\"col-path\"\n [data]=\"filterAttributes\"\n [textField]=\"'attributePath'\"\n [valueField]=\"'attributePath'\"\n [valuePrimitive]=\"true\"\n [value]=\"getMappingSourcePath(prop.id)\"\n [filterable]=\"true\"\n (valueChange)=\"onMappingSourcePathChange(prop.id, $event)\"\n placeholder=\"Select...\">\n </kendo-combobox>\n } @else {\n <kendo-textbox\n class=\"col-path\"\n [value]=\"getMappingSourcePath(prop.id)\"\n (valueChange)=\"onMappingSourcePathChange(prop.id, $event)\"\n [placeholder]=\"getMappingSourceType(prop.id) === 'column' ? 'Column...' : 'Attribute...'\">\n </kendo-textbox>\n }\n <kendo-textbox\n class=\"col-expression\"\n [value]=\"getMappingExpression(prop.id)\"\n (valueChange)=\"onMappingExpressionChange(prop.id, $event)\"\n placeholder=\"value\">\n </kendo-textbox>\n </div>\n }\n </div>\n <p class=\"field-hint expression-help\">\n <code>value</code> = raw value. Examples: <code>value / 100</code>, <code>lerp(value, 0, 4096, 0, 100)</code>\n </p>\n }\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n\n <!-- Tab 4: Display Options -->\n <kendo-tabstrip-tab [title]=\"'Display'\">\n <ng-template kendoTabContent>\n <div class=\"tab-content\">\n <div class=\"form-row\">\n <div class=\"form-field checkbox-field\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"form.fitToBounds\" kendoCheckBox />\n Fit to Bounds\n </label>\n <p class=\"field-hint\">Scale diagram to fit widget size.</p>\n </div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-field checkbox-field\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"form.allowZoom\" kendoCheckBox />\n Allow Zoom\n </label>\n </div>\n\n <div class=\"form-field checkbox-field\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"form.allowPan\" kendoCheckBox />\n Allow Pan\n </label>\n </div>\n </div>\n\n <div class=\"form-field checkbox-field\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"form.showToolbar\" kendoCheckBox />\n Show Toolbar\n </label>\n <p class=\"field-hint\">Display zoom controls and other tools.</p>\n </div>\n\n @if (form.allowZoom || !form.fitToBounds) {\n <div class=\"form-field\">\n <label>Initial Zoom</label>\n <kendo-dropdownlist\n [data]=\"zoomLevels\"\n [textField]=\"'label'\"\n [valueField]=\"'value'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"form.initialZoom\">\n </kendo-dropdownlist>\n </div>\n }\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n </kendo-tabstrip>\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n [disabled]=\"!isValid\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n `,\n styles: [`\n .config-form {\n padding: 8px 0;\n }\n\n .tab-content {\n padding: 16px;\n min-height: 200px;\n position: relative;\n }\n\n .tab-content.loading {\n opacity: 0.7;\n pointer-events: none;\n }\n\n .loading-indicator {\n position: absolute;\n top: 8px;\n left: 0;\n right: 0;\n text-align: center;\n padding: 8px;\n color: var(--kendo-color-primary, #0d6efd);\n font-style: italic;\n }\n\n .section-hint {\n margin: 0 0 16px 0;\n font-size: 0.85rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .empty-hint {\n text-align: center;\n padding: 24px;\n color: var(--kendo-color-subtle, #6c757d);\n font-style: italic;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 16px;\n }\n\n .form-field:last-child {\n margin-bottom: 0;\n }\n\n .form-field.disabled {\n opacity: 0.6;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .required {\n color: var(--kendo-color-error, #dc3545);\n }\n\n .field-hint {\n margin: 0;\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .field-hint.warning {\n color: var(--kendo-color-warning, #ffc107);\n }\n\n .form-row {\n display: flex;\n gap: 24px;\n margin-bottom: 12px;\n }\n\n .form-row:last-child {\n margin-bottom: 0;\n }\n\n .mode-toggle {\n display: flex;\n gap: 8px;\n }\n\n .checkbox-field {\n flex-direction: row;\n align-items: flex-start;\n }\n\n .checkbox-field label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-weight: normal;\n }\n\n .checkbox-field .field-hint {\n margin-top: 4px;\n margin-left: 28px;\n }\n\n .preview-section {\n margin-top: 16px;\n padding: 12px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n }\n\n .preview-info {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .preview-item {\n display: flex;\n justify-content: space-between;\n padding: 6px 10px;\n background: var(--kendo-color-surface, #ffffff);\n border-radius: 4px;\n }\n\n .preview-label {\n font-weight: 500;\n font-size: 0.85rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .preview-value {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n\n .diagram-item {\n display: flex;\n justify-content: space-between;\n gap: 16px;\n }\n\n .diagram-name {\n font-weight: 500;\n }\n\n .diagram-size {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .query-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .query-name {\n font-weight: 500;\n }\n\n .query-description {\n font-size: 0.8rem;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n /* Property Mappings Table */\n .property-mappings-table {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .mapping-header {\n display: grid;\n grid-template-columns: minmax(80px, 1fr) 55px 85px minmax(80px, 1fr) minmax(90px, 1.2fr);\n gap: 6px;\n padding: 6px 10px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border-radius: 4px;\n font-weight: 600;\n font-size: 0.7rem;\n color: var(--kendo-color-subtle, #6c757d);\n text-transform: uppercase;\n }\n\n .mapping-row {\n display: grid;\n grid-template-columns: minmax(80px, 1fr) 55px 85px minmax(80px, 1fr) minmax(90px, 1.2fr);\n gap: 6px;\n padding: 6px 10px;\n background: var(--kendo-color-surface, #ffffff);\n border: 1px solid var(--kendo-color-border, #dee2e6);\n border-radius: 4px;\n align-items: center;\n }\n\n .col-property {\n font-weight: 500;\n font-size: 0.85rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .col-type.type-badge {\n font-size: 0.65rem;\n padding: 2px 4px;\n background: var(--kendo-color-surface-alt, #f8f9fa);\n border-radius: 10px;\n text-align: center;\n text-transform: uppercase;\n color: var(--kendo-color-subtle, #6c757d);\n }\n\n .col-expression kendo-textbox {\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 0.8rem;\n }\n\n .expression-help {\n margin-top: 12px;\n }\n\n .expression-help code {\n background: var(--kendo-color-surface-alt, #f8f9fa);\n padding: 1px 4px;\n border-radius: 3px;\n font-size: 0.75rem;\n }\n\n .loading-hint {\n font-style: italic;\n color: var(--kendo-color-subtle, #6c757d);\n padding: 8px;\n text-align: center;\n }\n\n /* TabStrip styling */\n :host ::ng-deep kendo-tabstrip {\n border: none;\n }\n\n :host ::ng-deep .k-tabstrip-items-wrapper {\n border-bottom: 1px solid var(--kendo-color-border, #dee2e6);\n }\n\n :host ::ng-deep .k-tabstrip-content {\n border: none;\n padding: 0;\n }\n `]\n})\nexport class ProcessConfigDialogComponent implements OnInit {\n private readonly processDataService = inject(ProcessDataService);\n private readonly getEntitiesByCkTypeGQL = inject(GetEntitiesByCkTypeDtoGQL);\n private readonly getSystemPersistentQueriesGQL = inject(GetSystemPersistentQueriesDtoGQL);\n private readonly attributeSelectorService = inject(AttributeSelectorService);\n private readonly getCkTypeAvailableQueryColumnsGQL = inject(GetCkTypeAvailableQueryColumnsDtoGQL);\n private readonly stateService = inject(MeshBoardStateService);\n\n // Initial values for editing - Diagram\n @Input() initialProcessDiagramRtId?: string;\n @Input() initialFitToBounds?: boolean;\n @Input() initialAllowZoom?: boolean;\n @Input() initialAllowPan?: boolean;\n @Input() initialShowToolbar?: boolean;\n @Input() initialInitialZoom?: number;\n\n // Initial values for editing - Data Binding\n @Input() initialDataBindingMode?: ProcessDataBindingMode;\n @Input() initialBindingCkTypeId?: string;\n @Input() initialBindingRtId?: string;\n @Input() initialBindingQueryRtId?: string;\n @Input() initialBindingQueryName?: string;\n @Input() initialBindingFilters?: WidgetFilterConfig[];\n @Input() initialPropertyMappings?: DiagramPropertyMapping[];\n\n @Output() save = new EventEmitter<ProcessConfigResult>();\n @Output() cancelled = new EventEmitter<void>();\n\n // State - Diagram\n isLoadingDiagrams = false;\n storedDiagrams: ProcessDiagramSummary[] = [];\n selectedDiagram: ProcessDiagramSummary | null = null;\n\n // State - Data Binding\n dataBindingMode: ProcessDataBindingMode = 'none';\n\n // State - Runtime Entity Binding\n selectedCkType: CkTypeSelectorItem | null = null;\n selectedEntity: RuntimeEntityItem | null = null;\n entityDataSource: RuntimeEntitySelectDataSource | undefined;\n entityDialogDataSource: RuntimeEntityDialogDataSource | undefined;\n\n // State - Persistent Query Binding\n persistentQueries: PersistentQueryItem[] = [];\n selectedPersistentQuery: PersistentQueryItem | null = null;\n isLoadingQueries = false;\n\n // State - Filters\n filters: FieldFilterItem[] = [];\n filterAttributes: AttributeItem[] = [];\n filterVariables: FilterVariable[] = [];\n\n // State - Attributes loading\n private readonly _isLoadingAttributes = signal(false);\n readonly isLoadingAttributes = this._isLoadingAttributes.asReadonly;\n\n // State - Diagram exposed properties and mappings\n diagramExposedProperties: TransformProperty[] = [];\n propertyMappings: DiagramPropertyMapping[] = [];\n isLoadingDiagramConfig = false;\n\n // Zoom level options\n zoomLevels = [\n { value: 0.25, label: '25%' },\n { value: 0.5, label: '50%' },\n { value: 0.75, label: '75%' },\n { value: 1, label: '100%' },\n { value: 1.25, label: '125%' },\n { value: 1.5, label: '150%' },\n { value: 2, label: '200%' }\n ];\n\n // Source type options for property mappings\n sourceTypeOptions: { value: 'attribute' | 'column'; label: string }[] = [\n { value: 'attribute', label: 'Attribute' },\n { value: 'column', label: 'Column' }\n ];\n\n // Form state\n form = {\n fitToBounds: true,\n allowZoom: false,\n allowPan: false,\n showToolbar: false,\n initialZoom: 1\n };\n\n get isValid(): boolean {\n // Diagram is always required\n if (!this.selectedDiagram) {\n return false;\n }\n\n // Validate data binding based on mode\n if (this.dataBindingMode === 'runtimeEntity') {\n return !!this.selectedCkType && !!this.selectedEntity;\n }\n\n if (this.dataBindingMode === 'persistentQuery') {\n return !!this.selectedPersistentQuery;\n }\n\n return true;\n }\n\n async ngOnInit(): Promise<void> {\n // Initialize display options\n this.form.fitToBounds = this.initialFitToBounds ?? true;\n this.form.allowZoom = this.initialAllowZoom ?? false;\n this.form.allowPan = this.initialAllowPan ?? false;\n this.form.showToolbar = this.initialShowToolbar ?? false;\n this.form.initialZoom = this.initialInitialZoom ?? 1;\n\n // Initialize data binding mode\n this.dataBindingMode = this.initialDataBindingMode ?? 'none';\n\n // Initialize filter variables from MeshBoard\n this.initFilterVariables();\n\n // Load data in parallel\n const loadPromises: Promise<void>[] = [\n this.loadStoredDiagrams(),\n this.loadPersistentQueries()\n ];\n\n await Promise.all(loadPromises);\n\n // Initialize property mappings from initial values\n if (this.initialPropertyMappings && this.initialPropertyMappings.length > 0) {\n this.propertyMappings = [...this.initialPropertyMappings];\n }\n\n // Pre-select initial diagram and load its exposed properties\n if (this.initialProcessDiagramRtId) {\n this.selectedDiagram = this.storedDiagrams.find(\n d => d.rtId === this.initialProcessDiagramRtId\n ) ?? null;\n\n // Load the diagram's exposed properties\n if (this.selectedDiagram) {\n await this.loadDiagramExposedProperties(this.selectedDiagram.rtId);\n }\n }\n\n // Pre-select initial data binding values\n if (this.initialDataBindingMode === 'runtimeEntity' && this.initialBindingCkTypeId) {\n await this.initRuntimeEntityBinding();\n } else if (this.initialDataBindingMode === 'persistentQuery' && this.initialBindingQueryRtId) {\n await this.initPersistentQueryBinding();\n }\n\n // Initialize filters\n if (this.initialBindingFilters && this.initialBindingFilters.length > 0) {\n this.filters = this.initialBindingFilters.map((f, index) => ({\n id: index + 1,\n attributePath: f.attributePath,\n operator: f.operator as FieldFilterOperatorsDto,\n comparisonValue: f.comparisonValue\n }));\n }\n }\n\n // ===========================================================================\n // Diagram Selection\n // ===========================================================================\n\n async onDiagramFilterChange(filter: string): Promise<void> {\n await this.loadStoredDiagrams(filter);\n }\n\n private async loadStoredDiagrams(searchText?: string): Promise<void> {\n this.isLoadingDiagrams = true;\n try {\n this.storedDiagrams = await this.processDataService.loadDiagramList(searchText);\n } finally {\n this.isLoadingDiagrams = false;\n }\n }\n\n async onDiagramSelected(diagram: ProcessDiagramSummary | null): Promise<void> {\n this.selectedDiagram = diagram;\n this.diagramExposedProperties = [];\n\n if (!diagram) {\n return;\n }\n\n await this.loadDiagramExposedProperties(diagram.rtId);\n }\n\n private async loadDiagramExposedProperties(diagramRtId: string): Promise<void> {\n this.isLoadingDiagramConfig = true;\n try {\n const fullDiagram = await this.processDataService.loadDiagram(diagramRtId);\n if (fullDiagram?.transformProperties) {\n this.diagramExposedProperties = fullDiagram.transformProperties;\n }\n } catch (error) {\n console.error('Error loading diagram config:', error);\n } finally {\n this.isLoadingDiagramConfig = false;\n }\n }\n\n // ===========================================================================\n // Property Mappings\n // ===========================================================================\n\n getMappingSourceType(propertyId: string): 'attribute' | 'column' {\n const mapping = this.propertyMappings.find(m => m.propertyId === propertyId);\n return mapping?.sourceType ?? 'attribute';\n }\n\n getMappingSourcePath(propertyId: string): string {\n const mapping = this.propertyMappings.find(m => m.propertyId === propertyId);\n return mapping?.sourcePath ?? '';\n }\n\n getMappingExpression(propertyId: string): string {\n const mapping = this.propertyMappings.find(m => m.propertyId === propertyId);\n return mapping?.expression ?? '';\n }\n\n onMappingSourceTypeChange(propertyId: string, sourceType: 'attribute' | 'column'): void {\n const existingIndex = this.propertyMappings.findIndex(m => m.propertyId === propertyId);\n if (existingIndex >= 0) {\n // Update existing mapping\n this.propertyMappings = [\n ...this.propertyMappings.slice(0, existingIndex),\n { ...this.propertyMappings[existingIndex], sourceType, sourcePath: '' },\n ...this.propertyMappings.slice(existingIndex + 1)\n ];\n } else {\n // Create new mapping\n this.propertyMappings = [\n ...this.propertyMappings,\n { propertyId, sourceType, sourcePath: '' }\n ];\n }\n }\n\n onMappingSourcePathChange(propertyId: string, sourcePath: string): void {\n const existingIndex = this.propertyMappings.findIndex(m => m.propertyId === propertyId);\n if (existingIndex >= 0) {\n // Update existing mapping\n this.propertyMappings = [\n ...this.propertyMappings.slice(0, existingIndex),\n { ...this.propertyMappings[existingIndex], sourcePath },\n ...this.propertyMappings.slice(existingIndex + 1)\n ];\n } else {\n // Create new mapping with default source type\n this.propertyMappings = [\n ...this.propertyMappings,\n { propertyId, sourceType: 'attribute', sourcePath }\n ];\n }\n }\n\n onMappingExpressionChange(propertyId: string, expression: string): void {\n const existingIndex = this.propertyMappings.findIndex(m => m.propertyId === propertyId);\n if (existingIndex >= 0) {\n // Update existing mapping\n this.propertyMappings = [\n ...this.propertyMappings.slice(0, existingIndex),\n { ...this.propertyMappings[existingIndex], expression: expression || undefined },\n ...this.propertyMappings.slice(existingIndex + 1)\n ];\n } else {\n // Create new mapping with defaults\n this.propertyMappings = [\n ...this.propertyMappings,\n { propertyId, sourceType: 'attribute', sourcePath: '', expression: expression || undefined }\n ];\n }\n }\n\n // ===========================================================================\n // Data Binding Mode\n // ===========================================================================\n\n onDataBindingModeChange(mode: ProcessDataBindingMode): void {\n this.dataBindingMode = mode;\n\n // Reset selections when changing mode\n if (mode !== 'runtimeEntity') {\n this.selectedCkType = null;\n this.selectedEntity = null;\n this.entityDataSource = undefined;\n this.entityDialogDataSource = undefined;\n }\n\n if (mode !== 'persistentQuery') {\n this.selectedPersistentQuery = null;\n }\n\n // Reset filters when changing mode\n this.filters = [];\n this.filterAttributes = [];\n }\n\n // ===========================================================================\n // Runtime Entity Binding\n // ===========================================================================\n\n private async initRuntimeEntityBinding(): Promise<void> {\n // Create a mock CkTypeSelectorItem for initial value\n // The full CkTypeSelectorItem has more properties, but we only need rtCkTypeId for our use\n this.selectedCkType = {\n rtCkTypeId: this.initialBindingCkTypeId!,\n displayName: this.initialBindingCkTypeId!.split('/').pop() ?? this.initialBindingCkTypeId!,\n fullName: this.initialBindingCkTypeId!,\n isAbstract: false,\n isFinal: false\n } as CkTypeSelectorItem;\n\n // Set up data sources\n this.entityDataSource = new RuntimeEntitySelectDataSource(\n this.getEntitiesByCkTypeGQL,\n this.initialBindingCkTypeId!\n );\n this.entityDialogDataSource = new RuntimeEntityDialogDataSource(\n this.getEntitiesByCkTypeGQL,\n this.initialBindingCkTypeId!\n );\n\n // Load attributes for filters\n await this.loadAttributesForCkType(this.initialBindingCkTypeId!);\n\n // Pre-select entity if provided\n if (this.initialBindingRtId) {\n // Create a mock entity item - the actual display name will be updated when the combobox loads\n this.selectedEntity = {\n rtId: this.initialBindingRtId,\n ckTypeId: this.initialBindingCkTypeId!,\n displayName: this.initialBindingRtId\n };\n }\n }\n\n onCkTypeSelected(ckType: CkTypeSelectorItem): void {\n this.selectedCkType = ckType;\n this.selectedEntity = null;\n\n // Create data sources for entity selection\n this.entityDataSource = new RuntimeEntitySelectDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n this.entityDialogDataSource = new RuntimeEntityDialogDataSource(\n this.getEntitiesByCkTypeGQL,\n ckType.rtCkTypeId\n );\n\n // Load attributes for filters\n this.loadAttributesForCkType(ckType.rtCkTypeId);\n }\n\n onCkTypeCleared(): void {\n this.selectedCkType = null;\n this.selectedEntity = null;\n this.entityDataSource = undefined;\n this.entityDialogDataSource = undefined;\n this.filterAttributes = [];\n }\n\n onEntitySelected(entity: RuntimeEntityItem): void {\n this.selectedEntity = entity;\n }\n\n onEntityCleared(): void {\n this.selectedEntity = null;\n }\n\n // ===========================================================================\n // Persistent Query Binding\n // ===========================================================================\n\n private async initPersistentQueryBinding(): Promise<void> {\n // Pre-select query\n this.selectedPersistentQuery = this.persistentQueries.find(\n q => q.rtId === this.initialBindingQueryRtId\n ) ?? null;\n\n // If query has associated CK type, load attributes\n if (this.selectedPersistentQuery?.queryCkTypeId) {\n await this.loadAttributesForCkType(this.selectedPersistentQuery.queryCkTypeId);\n }\n }\n\n async onQueryFilterChange(filter: string): Promise<void> {\n await this.loadPersistentQueries(filter);\n }\n\n onQuerySelected(query: PersistentQueryItem | null): void {\n this.selectedPersistentQuery = query;\n\n // Load attributes if query has associated CK type\n if (query?.queryCkTypeId) {\n this.loadAttributesForCkType(query.queryCkTypeId);\n } else {\n this.filterAttributes = [];\n }\n }\n\n private async loadPersistentQueries(searchText?: string): Promise<void> {\n this.isLoadingQueries = true;\n try {\n const result = await firstValueFrom(\n this.getSystemPersistentQueriesGQL.fetch({\n first: 100,\n searchFilter: searchText ? { searchTerm: searchText, language: 'de' } : undefined\n } as any)\n );\n\n this.persistentQueries = (result.data?.runtime?.systemPersistentQuery?.items ?? [])\n .filter((item): item is NonNullable<typeof item> => item !== null)\n .map(item => ({\n rtId: item.rtId,\n name: item.name,\n description: item.description,\n queryCkTypeId: item.queryCkTypeId\n }));\n } finally {\n this.isLoadingQueries = false;\n }\n }\n\n // ===========================================================================\n // Filters\n // ===========================================================================\n\n private initFilterVariables(): void {\n const meshBoardVariables = this.stateService.getVariables();\n this.filterVariables = meshBoardVariables.map(v => ({\n name: v.name,\n displayName: v.name,\n value: v.value\n }));\n }\n\n private async loadAttributesForCkType(ckTypeId: string): Promise<void> {\n this._isLoadingAttributes.set(true);\n try {\n const result = await firstValueFrom(\n this.getCkTypeAvailableQueryColumnsGQL.fetch({\n variables: { rtCkId: ckTypeId, first: 1000 }\n })\n );\n\n const columns = result.data?.constructionKit?.types?.items?.[0]?.availableQueryColumns?.items ?? [];\n this.filterAttributes = columns\n .filter((attr): attr is NonNullable<typeof attr> => attr !== null)\n .map(attr => ({\n attributePath: attr.attributePath ?? '',\n attributeValueType: attr.attributeValueType ?? 'String'\n }));\n } catch (error) {\n console.error('Error loading attributes:', error);\n this.filterAttributes = [];\n } finally {\n this._isLoadingAttributes.set(false);\n }\n }\n\n onFiltersChange(filters: FieldFilterItem[]): void {\n this.filters = filters;\n }\n\n // ===========================================================================\n // Save / Cancel\n // ===========================================================================\n\n onSave(): void {\n const result: ProcessConfigResult = {\n ckTypeId: '',\n rtId: '',\n diagramSource: this.selectedDiagram ? 'stored' : 'none',\n fitToBounds: this.form.fitToBounds,\n allowZoom: this.form.allowZoom,\n allowPan: this.form.allowPan,\n showToolbar: this.form.showToolbar,\n initialZoom: this.form.initialZoom,\n dataBindingMode: this.dataBindingMode\n };\n\n // Diagram\n if (this.selectedDiagram) {\n result.processDiagramRtId = this.selectedDiagram.rtId;\n }\n\n // Data binding - Runtime Entity\n if (this.dataBindingMode === 'runtimeEntity' && this.selectedCkType && this.selectedEntity) {\n result.bindingCkTypeId = this.selectedCkType.rtCkTypeId;\n result.bindingRtId = this.selectedEntity.rtId;\n }\n\n // Data binding - Persistent Query\n if (this.dataBindingMode === 'persistentQuery' && this.selectedPersistentQuery) {\n result.bindingQueryRtId = this.selectedPersistentQuery.rtId;\n result.bindingQueryName = this.selectedPersistentQuery.name;\n }\n\n // Filters\n if (this.filters.length > 0 && this.dataBindingMode !== 'none') {\n result.bindingFilters = this.filters.map(f => ({\n attributePath: f.attributePath,\n operator: f.operator,\n comparisonValue: f.comparisonValue\n }));\n }\n\n // Property mappings (only include mappings with a sourcePath set)\n if (this.propertyMappings.length > 0 && this.dataBindingMode !== 'none') {\n const validMappings = this.propertyMappings.filter(m => m.sourcePath && m.sourcePath.trim() !== '');\n if (validMappings.length > 0) {\n result.propertyMappings = validMappings;\n }\n }\n\n this.save.emit(result);\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n","/**\n * Process Widget Registration\n *\n * This file is separate from default-widget-registrations.ts to enable\n * lazy loading of the ProcessWidget and its dependencies (octo-process-diagrams).\n *\n * Usage:\n * - Import and call registerProcessWidget() only in routes/components that need it\n * - Or use provideProcessWidget() in app config for eager loading\n */\n\nimport { EnvironmentProviders, makeEnvironmentProviders, inject, provideAppInitializer } from '@angular/core';\nimport { WidgetRegistryService, BaseWidgetConfig, PersistedWidgetData, WidgetPersistenceData } from '../services/widget-registry.service';\nimport { ProcessWidgetConfig } from '../models/meshboard.models';\n\n// Process Widget Components (these pull in @meshmakers/octo-process-diagrams)\nimport { ProcessWidgetComponent } from '../widgets/process-widget/process-widget.component';\nimport { ProcessConfigDialogComponent, ProcessConfigResult } from '../widgets/process-widget/process-config-dialog.component';\n\n/**\n * Registers the Process Widget with the widget registry.\n *\n * Call this function to enable Process Diagram widgets in MeshBoard.\n * This is kept separate to allow lazy loading of the octo-process-diagrams dependency.\n *\n * @example\n * ```typescript\n * // In a lazy-loaded route or component\n * const registry = inject(WidgetRegistryService);\n * registerProcessWidget(registry);\n * ```\n */\nexport function registerProcessWidget(registry: WidgetRegistryService): void {\n // Helper to parse config JSON\n const parseConfig = (data: PersistedWidgetData): Record<string, unknown> => {\n try {\n return typeof data.config === 'string' ? JSON.parse(data.config) : (data.config ?? {});\n } catch {\n return {};\n }\n };\n\n // Process Widget\n // HMI-style process visualization with tanks, pipes, valves, pumps\n registry.registerWidget<ProcessWidgetConfig, ProcessConfigResult>({\n type: 'process',\n label: 'Process Diagram',\n component: ProcessWidgetComponent,\n configDialogComponent: ProcessConfigDialogComponent,\n defaultSize: { colSpan: 4, rowSpan: 3 },\n supportedDataSources: ['static'],\n\n getInitialConfig: (widget) => ({\n // Diagram selection\n initialProcessDiagramRtId: widget.processDiagramRtId,\n // Display options\n initialFitToBounds: widget.fitToBounds,\n initialAllowZoom: widget.allowZoom,\n initialAllowPan: widget.allowPan,\n initialShowToolbar: widget.showToolbar,\n initialInitialZoom: widget.initialZoom,\n // Data binding\n initialDataBindingMode: widget.dataBindingMode,\n initialBindingCkTypeId: widget.bindingCkTypeId,\n initialBindingRtId: widget.bindingRtId,\n initialBindingQueryRtId: widget.bindingQueryRtId,\n initialBindingQueryName: widget.bindingQueryName,\n initialBindingFilters: widget.bindingFilters,\n initialPropertyMappings: widget.propertyMappings\n }),\n\n applyConfigResult: (widget, result) => ({\n ...widget,\n // Diagram selection\n processDiagramRtId: result.processDiagramRtId,\n inlineConfig: result.inlineConfig,\n // Display options\n fitToBounds: result.fitToBounds,\n allowZoom: result.allowZoom,\n allowPan: result.allowPan,\n showToolbar: result.showToolbar,\n initialZoom: result.initialZoom,\n // Data binding\n dataBindingMode: result.dataBindingMode,\n bindingCkTypeId: result.bindingCkTypeId,\n bindingRtId: result.bindingRtId,\n bindingQueryRtId: result.bindingQueryRtId,\n bindingQueryName: result.bindingQueryName,\n bindingFilters: result.bindingFilters,\n propertyMappings: result.propertyMappings\n }),\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): ProcessWidgetConfig => ({\n ...base,\n type: 'process',\n colSpan: 4,\n rowSpan: 3,\n dataSource: {\n type: 'static',\n data: null\n },\n fitToBounds: true,\n allowZoom: false,\n allowPan: false,\n showToolbar: false,\n initialZoom: 1\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: ProcessWidgetConfig): WidgetPersistenceData => ({\n dataSourceType: 'static',\n config: {\n // Diagram selection\n processDiagramRtId: widget.processDiagramRtId,\n inlineConfig: widget.inlineConfig,\n // Display options\n fitToBounds: widget.fitToBounds,\n allowZoom: widget.allowZoom,\n allowPan: widget.allowPan,\n showToolbar: widget.showToolbar,\n initialZoom: widget.initialZoom,\n // Data binding\n dataBindingMode: widget.dataBindingMode,\n bindingCkTypeId: widget.bindingCkTypeId,\n bindingRtId: widget.bindingRtId,\n bindingQueryRtId: widget.bindingQueryRtId,\n bindingQueryName: widget.bindingQueryName,\n bindingFilters: widget.bindingFilters,\n propertyMappings: widget.propertyMappings\n }\n }),\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): ProcessWidgetConfig => {\n const config = parseConfig(data);\n return {\n ...base,\n rtId: data.rtId,\n type: 'process',\n dataSource: {\n type: 'static',\n data: null\n },\n // Diagram selection\n processDiagramRtId: config['processDiagramRtId'] as string | undefined,\n inlineConfig: config['inlineConfig'] as ProcessWidgetConfig['inlineConfig'],\n // Display options\n fitToBounds: (config['fitToBounds'] as boolean) ?? true,\n allowZoom: (config['allowZoom'] as boolean) ?? false,\n allowPan: (config['allowPan'] as boolean) ?? false,\n showToolbar: (config['showToolbar'] as boolean) ?? false,\n initialZoom: (config['initialZoom'] as number) ?? 1,\n // Data binding\n dataBindingMode: config['dataBindingMode'] as ProcessWidgetConfig['dataBindingMode'],\n bindingCkTypeId: config['bindingCkTypeId'] as string | undefined,\n bindingRtId: config['bindingRtId'] as string | undefined,\n bindingQueryRtId: config['bindingQueryRtId'] as string | undefined,\n bindingQueryName: config['bindingQueryName'] as string | undefined,\n bindingFilters: config['bindingFilters'] as ProcessWidgetConfig['bindingFilters'],\n propertyMappings: config['propertyMappings'] as ProcessWidgetConfig['propertyMappings']\n };\n }\n });\n}\n\n/**\n * Provides the Process Widget registration as an environment provider.\n *\n * Use this if you want to eagerly register the Process Widget at app startup.\n * For lazy loading, use registerProcessWidget() directly in the component/route instead.\n *\n * @example\n * ```typescript\n * // In app.config.ts (eager loading)\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideMeshBoard(),\n * provideProcessWidget() // Optional: only if you need ProcessWidget\n * ]\n * };\n * ```\n */\nexport function provideProcessWidget(): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideAppInitializer(() => {\n const registry = inject(WidgetRegistryService);\n registerProcessWidget(registry);\n })\n ]);\n}\n","import { EnvironmentProviders, makeEnvironmentProviders, inject, provideAppInitializer } from '@angular/core';\nimport { WidgetRegistryService, WidgetConfigResult, BaseWidgetConfig, PersistedWidgetData, WidgetPersistenceData } from '../services/widget-registry.service';\nimport {\n AnyWidgetConfig,\n RuntimeEntityDataSource,\n PersistentQueryDataSource,\n AggregationDataSource,\n ServiceCallDataSource,\n ConstructionKitQueryDataSource,\n RepeaterQueryDataSource,\n EntityCardWidgetConfig,\n KpiWidgetConfig,\n EntityWithAssociationsWidgetConfig,\n TableWidgetConfig,\n GaugeWidgetConfig,\n PieChartWidgetConfig,\n BarChartWidgetConfig,\n StatsGridWidgetConfig,\n StatusIndicatorWidgetConfig,\n ServiceHealthWidgetConfig,\n WidgetGroupConfig,\n MarkdownWidgetConfig,\n DataSource,\n WidgetFilterConfig\n} from '../models/meshboard.models';\n\n// Widget Components\nimport { EntityCardWidgetComponent } from '../widgets/entity-card-widget/entity-card-widget.component';\nimport { KpiWidgetComponent } from '../widgets/kpi-widget/kpi-widget.component';\nimport { EntityAssociationsWidgetComponent } from '../widgets/entity-associations-widget/entity-associations-widget.component';\nimport { TableWidgetComponent } from '../widgets/table-widget/table-widget.component';\nimport { GaugeWidgetComponent } from '../widgets/gauge-widget/gauge-widget.component';\nimport { PieChartWidgetComponent } from '../widgets/pie-chart-widget/pie-chart-widget.component';\nimport { BarChartWidgetComponent } from '../widgets/bar-chart-widget/bar-chart-widget.component';\nimport { StatsGridWidgetComponent } from '../widgets/stats-grid-widget/stats-grid-widget.component';\nimport { StatusIndicatorWidgetComponent } from '../widgets/status-indicator-widget/status-indicator-widget.component';\nimport { ServiceHealthWidgetComponent } from '../widgets/service-health-widget/service-health-widget.component';\nimport { WidgetGroupComponent } from '../widgets/widget-group/widget-group.component';\nimport { MarkdownWidgetComponent } from '../widgets/markdown-widget/markdown-widget.component';\n// Note: ProcessWidget registration moved to process-widget-registration.ts for lazy loading\n// Use provideProcessWidget() or registerProcessWidget() to enable Process Diagram widgets\n\n// Config Dialog Components\nimport { EntityCardConfigDialogComponent, EntityCardConfigResult } from '../widgets/entity-card-widget/entity-card-config-dialog.component';\nimport { KpiConfigDialogComponent, KpiConfigResult } from '../widgets/kpi-widget/kpi-config-dialog.component';\nimport { AssociationsConfigDialogComponent, AssociationsConfigResult } from '../widgets/entity-associations-widget/associations-config-dialog.component';\nimport { TableConfigDialogComponent, TableConfigResult } from '../widgets/table-widget/table-config-dialog.component';\nimport { GaugeConfigDialogComponent, GaugeConfigResult } from '../widgets/gauge-widget/gauge-config-dialog.component';\nimport { PieChartConfigDialogComponent, PieChartConfigResult } from '../widgets/pie-chart-widget/pie-chart-config-dialog.component';\nimport { BarChartConfigDialogComponent, BarChartConfigResult } from '../widgets/bar-chart-widget/bar-chart-config-dialog.component';\nimport { StatsGridConfigDialogComponent, StatsGridConfigResult } from '../widgets/stats-grid-widget/stats-grid-config-dialog.component';\nimport { StatusIndicatorConfigDialogComponent, StatusIndicatorConfigResult } from '../widgets/status-indicator-widget/status-indicator-config-dialog.component';\nimport { ServiceHealthConfigDialogComponent, ServiceHealthConfigResult } from '../widgets/service-health-widget/service-health-config-dialog.component';\nimport { WidgetGroupConfigDialogComponent, WidgetGroupConfigResult } from '../widgets/widget-group/widget-group-config-dialog.component';\nimport { MarkdownConfigDialogComponent, MarkdownConfigResult } from '../widgets/markdown-widget/markdown-config-dialog.component';\n\n/**\n * Helper to extract data source info from widget config\n */\nfunction getDataSourceInfo(widget: AnyWidgetConfig): { ckTypeId?: string; rtId?: string } {\n if (widget.dataSource.type === 'runtimeEntity') {\n return {\n ckTypeId: widget.dataSource.ckTypeId,\n rtId: widget.dataSource.rtId\n };\n }\n return {};\n}\n\n/**\n * Helper to create a RuntimeEntityDataSource\n */\nfunction createDataSource(result: WidgetConfigResult, includeAssociations = false): RuntimeEntityDataSource {\n return {\n type: 'runtimeEntity',\n ckTypeId: result.ckTypeId,\n rtId: result.rtId,\n includeAssociations\n };\n}\n\n// ========== SOLID: Persistence Helpers ==========\n\n/**\n * Parses the JSON config string from persisted data.\n */\nfunction parseConfig(data: PersistedWidgetData): Record<string, unknown> {\n return data.config ? JSON.parse(data.config) : {};\n}\n\n/**\n * Builds a DataSource from persisted data.\n * Maps 'systemQuery' from backend to 'persistentQuery' for frontend.\n */\nfunction buildDataSourceFromPersisted(data: PersistedWidgetData, config: Record<string, unknown>): DataSource {\n if (data.dataSourceType === 'systemQuery' || data.dataSourceType === 'persistentQuery') {\n return {\n type: 'persistentQuery',\n queryRtId: data.dataSourceRtId ?? (config['queryRtId'] as string) ?? '',\n queryName: config['queryName'] as string | undefined\n };\n }\n\n return {\n type: 'runtimeEntity',\n ckTypeId: data.dataSourceCkTypeId ?? undefined,\n rtId: data.dataSourceRtId ?? undefined\n };\n}\n\n/**\n * Creates a base RuntimeEntityDataSource from base config.\n */\nfunction createDefaultRuntimeDataSource(ckTypeId?: string): RuntimeEntityDataSource {\n return {\n type: 'runtimeEntity',\n ckTypeId\n };\n}\n\n/**\n * Creates a default PersistentQueryDataSource.\n */\nfunction createDefaultPersistentQueryDataSource(): PersistentQueryDataSource {\n return {\n type: 'persistentQuery',\n queryRtId: ''\n };\n}\n\n/**\n * Registers all built-in widget types with the registry.\n * Called during app initialization.\n */\nexport function registerDefaultWidgets(registry: WidgetRegistryService): void {\n // Entity Card Widget\n registry.registerWidget<EntityCardWidgetConfig, EntityCardConfigResult>({\n type: 'entityCard',\n label: 'Entity Card',\n component: EntityCardWidgetComponent,\n configDialogComponent: EntityCardConfigDialogComponent,\n defaultSize: { colSpan: 2, rowSpan: 2 },\n supportedDataSources: ['runtimeEntity'],\n getInitialConfig: (widget) => ({\n initialCkTypeId: getDataSourceInfo(widget).ckTypeId,\n initialRtId: getDataSourceInfo(widget).rtId\n }),\n applyConfigResult: (widget, result) => ({\n ...widget,\n dataSource: createDataSource(result, true)\n }),\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): EntityCardWidgetConfig => ({\n ...base,\n type: 'entityCard',\n rowSpan: 2,\n dataSource: createDefaultRuntimeDataSource(),\n showHeader: true,\n showAttributes: true\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: EntityCardWidgetConfig): WidgetPersistenceData => ({\n dataSourceType: 'runtimeEntity',\n dataSourceCkTypeId: widget.dataSource.type === 'runtimeEntity' ? widget.dataSource.ckTypeId : undefined,\n dataSourceRtId: widget.dataSource.type === 'runtimeEntity' ? widget.dataSource.rtId : undefined,\n config: {\n showHeader: widget.showHeader,\n showAttributes: widget.showAttributes,\n attributeFilter: widget.attributeFilter\n }\n }),\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): EntityCardWidgetConfig => {\n const config = parseConfig(data);\n return {\n ...base,\n rtId: data.rtId,\n type: 'entityCard',\n dataSource: {\n type: 'runtimeEntity',\n ckTypeId: data.dataSourceCkTypeId ?? undefined,\n rtId: data.dataSourceRtId ?? undefined\n },\n showHeader: (config['showHeader'] as boolean) ?? true,\n showAttributes: (config['showAttributes'] as boolean) ?? true,\n attributeFilter: config['attributeFilter'] as string[] | undefined\n };\n }\n });\n\n // KPI Widget\n registry.registerWidget<KpiWidgetConfig, KpiConfigResult>({\n type: 'kpi',\n label: 'KPI',\n component: KpiWidgetComponent,\n configDialogComponent: KpiConfigDialogComponent,\n defaultSize: { colSpan: 1, rowSpan: 1 },\n supportedDataSources: ['runtimeEntity', 'persistentQuery'],\n getInitialConfig: (widget) => {\n const kpiWidget = widget as KpiWidgetConfig;\n const isPersistentQuery = kpiWidget.dataSource.type === 'persistentQuery';\n\n return {\n // Runtime entity fields\n initialCkTypeId: getDataSourceInfo(widget).ckTypeId,\n initialRtId: getDataSourceInfo(widget).rtId,\n initialValueAttribute: kpiWidget.valueAttribute,\n initialLabelAttribute: kpiWidget.labelAttribute,\n // Persistent query fields\n initialDataSourceType: isPersistentQuery ? 'persistentQuery' : 'runtimeEntity',\n initialQueryRtId: isPersistentQuery ? (kpiWidget.dataSource as PersistentQueryDataSource).queryRtId : undefined,\n initialQueryName: isPersistentQuery ? (kpiWidget.dataSource as PersistentQueryDataSource).queryName : undefined,\n initialQueryMode: kpiWidget.queryMode,\n initialQueryValueField: kpiWidget.queryValueField,\n initialQueryCategoryField: kpiWidget.queryCategoryField,\n initialQueryCategoryValue: kpiWidget.queryCategoryValue,\n // Display options\n initialPrefix: kpiWidget.prefix,\n initialSuffix: kpiWidget.suffix,\n initialTrend: kpiWidget.trend,\n // Filters\n initialFilters: kpiWidget.filters\n };\n },\n applyConfigResult: (widget, result) => {\n // Convert filters from DTO to widget format\n const filters: WidgetFilterConfig[] | undefined = result.filters?.map(f => ({\n attributePath: f.attributePath,\n operator: String(f.operator),\n comparisonValue: f.comparisonValue\n }));\n\n if (result.dataSourceType === 'persistentQuery' && result.queryRtId) {\n // Create PersistentQueryDataSource\n const dataSource: PersistentQueryDataSource = {\n type: 'persistentQuery',\n queryRtId: result.queryRtId,\n queryName: result.queryName\n };\n\n return {\n ...widget,\n dataSource,\n valueAttribute: '', // Not used for persistent queries\n queryMode: result.queryMode,\n queryValueField: result.queryValueField,\n queryCategoryField: result.queryCategoryField,\n queryCategoryValue: result.queryCategoryValue,\n prefix: result.prefix,\n suffix: result.suffix,\n trend: result.trend,\n filters\n };\n } else {\n // Create RuntimeEntityDataSource (default behavior)\n return {\n ...widget,\n dataSource: createDataSource(result, false),\n valueAttribute: result.valueAttribute,\n labelAttribute: result.labelAttribute,\n queryMode: undefined,\n queryValueField: undefined,\n queryCategoryField: undefined,\n queryCategoryValue: undefined,\n prefix: result.prefix,\n suffix: result.suffix,\n trend: result.trend,\n filters\n };\n }\n },\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): KpiWidgetConfig => ({\n ...base,\n type: 'kpi',\n colSpan: 1,\n dataSource: createDefaultRuntimeDataSource(),\n valueAttribute: '_count',\n icon: 'chart'\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: KpiWidgetConfig): WidgetPersistenceData => {\n const isPersistentQuery = widget.dataSource.type === 'persistentQuery';\n return {\n dataSourceType: isPersistentQuery ? 'persistentQuery' : 'runtimeEntity',\n dataSourceCkTypeId: widget.dataSource.type === 'runtimeEntity' ? widget.dataSource.ckTypeId : undefined,\n dataSourceRtId: isPersistentQuery\n ? (widget.dataSource as PersistentQueryDataSource).queryRtId\n : (widget.dataSource.type === 'runtimeEntity' ? widget.dataSource.rtId : undefined),\n config: {\n valueAttribute: widget.valueAttribute,\n labelAttribute: widget.labelAttribute,\n prefix: widget.prefix,\n suffix: widget.suffix,\n icon: widget.icon,\n trend: widget.trend,\n queryMode: widget.queryMode,\n queryValueField: widget.queryValueField,\n queryCategoryField: widget.queryCategoryField,\n queryCategoryValue: widget.queryCategoryValue,\n filters: widget.filters,\n ...(isPersistentQuery && {\n queryName: (widget.dataSource as PersistentQueryDataSource).queryName,\n queryRtId: (widget.dataSource as PersistentQueryDataSource).queryRtId\n })\n }\n };\n },\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): KpiWidgetConfig => {\n const config = parseConfig(data);\n const dataSource = buildDataSourceFromPersisted(data, config);\n\n if (dataSource.type === 'persistentQuery') {\n return {\n ...base,\n rtId: data.rtId,\n type: 'kpi',\n dataSource,\n valueAttribute: (config['valueAttribute'] as string) ?? '',\n queryMode: config['queryMode'] as KpiWidgetConfig['queryMode'],\n queryValueField: config['queryValueField'] as string | undefined,\n queryCategoryField: config['queryCategoryField'] as string | undefined,\n queryCategoryValue: config['queryCategoryValue'] as string | undefined,\n prefix: config['prefix'] as string | undefined,\n suffix: config['suffix'] as string | undefined,\n icon: config['icon'] as string | undefined,\n trend: config['trend'] as KpiWidgetConfig['trend'],\n filters: config['filters'] as WidgetFilterConfig[] | undefined\n };\n }\n\n return {\n ...base,\n rtId: data.rtId,\n type: 'kpi',\n dataSource: dataSource as RuntimeEntityDataSource,\n valueAttribute: (config['valueAttribute'] as string) ?? '_count',\n labelAttribute: config['labelAttribute'] as string | undefined,\n prefix: config['prefix'] as string | undefined,\n suffix: config['suffix'] as string | undefined,\n icon: config['icon'] as string | undefined,\n trend: config['trend'] as KpiWidgetConfig['trend'],\n filters: config['filters'] as WidgetFilterConfig[] | undefined\n };\n }\n });\n\n // Entity with Associations Widget\n registry.registerWidget<EntityWithAssociationsWidgetConfig, AssociationsConfigResult>({\n type: 'entityWithAssociations',\n label: 'Entity with Associations',\n component: EntityAssociationsWidgetComponent,\n configDialogComponent: AssociationsConfigDialogComponent,\n defaultSize: { colSpan: 2, rowSpan: 1 },\n supportedDataSources: ['runtimeEntity'],\n getInitialConfig: (widget) => {\n const assocWidget = widget as EntityWithAssociationsWidgetConfig;\n return {\n initialCkTypeId: getDataSourceInfo(widget).ckTypeId,\n initialRtId: getDataSourceInfo(widget).rtId,\n initialShowIncoming: assocWidget.showIncoming,\n initialShowOutgoing: assocWidget.showOutgoing,\n initialRoleFilter: assocWidget.roleFilter,\n initialDisplayMode: assocWidget.displayMode\n };\n },\n applyConfigResult: (widget, result) => ({\n ...widget,\n dataSource: createDataSource(result, true),\n showIncoming: result.showIncoming,\n showOutgoing: result.showOutgoing,\n roleFilter: result.roleFilter,\n displayMode: result.displayMode\n }),\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): EntityWithAssociationsWidgetConfig => ({\n ...base,\n type: 'entityWithAssociations',\n dataSource: createDefaultRuntimeDataSource(),\n showIncoming: true,\n showOutgoing: true,\n maxAssociations: 5,\n roleFilter: [],\n displayMode: 'expandable'\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: EntityWithAssociationsWidgetConfig): WidgetPersistenceData => ({\n dataSourceType: 'runtimeEntity',\n dataSourceCkTypeId: widget.dataSource.type === 'runtimeEntity' ? widget.dataSource.ckTypeId : undefined,\n dataSourceRtId: widget.dataSource.type === 'runtimeEntity' ? widget.dataSource.rtId : undefined,\n config: {\n showIncoming: widget.showIncoming,\n showOutgoing: widget.showOutgoing,\n maxAssociations: widget.maxAssociations,\n roleFilter: widget.roleFilter,\n displayMode: widget.displayMode\n }\n }),\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): EntityWithAssociationsWidgetConfig => {\n const config = parseConfig(data);\n return {\n ...base,\n rtId: data.rtId,\n type: 'entityWithAssociations',\n dataSource: {\n type: 'runtimeEntity',\n ckTypeId: data.dataSourceCkTypeId ?? undefined,\n rtId: data.dataSourceRtId ?? undefined\n },\n showIncoming: (config['showIncoming'] as boolean) ?? true,\n showOutgoing: (config['showOutgoing'] as boolean) ?? true,\n maxAssociations: (config['maxAssociations'] as number) ?? 5,\n roleFilter: config['roleFilter'] as string[] | undefined,\n displayMode: config['displayMode'] as EntityWithAssociationsWidgetConfig['displayMode']\n };\n }\n });\n\n // Table Widget\n registry.registerWidget<TableWidgetConfig, TableConfigResult>({\n type: 'table',\n label: 'Table',\n component: TableWidgetComponent,\n configDialogComponent: TableConfigDialogComponent,\n defaultSize: { colSpan: 4, rowSpan: 1 },\n supportedDataSources: ['runtimeEntity', 'persistentQuery'],\n getInitialConfig: (widget) => {\n const tableWidget = widget as TableWidgetConfig;\n const dataSource = tableWidget.dataSource;\n\n // Determine data source type\n const isPersistentQuery = dataSource.type === 'persistentQuery';\n\n return {\n initialDataSourceType: isPersistentQuery ? 'persistentQuery' : 'runtimeEntity',\n initialCkTypeId: dataSource.type === 'runtimeEntity' ? dataSource.ckTypeId : undefined,\n initialColumns: tableWidget.columns,\n initialSorting: tableWidget.sorting,\n initialFilters: tableWidget.filters,\n initialPageSize: tableWidget.pageSize,\n initialSortable: tableWidget.sortable,\n initialQueryRtId: isPersistentQuery ? (dataSource as PersistentQueryDataSource).queryRtId : undefined,\n initialQueryName: isPersistentQuery ? (dataSource as PersistentQueryDataSource).queryName : undefined\n };\n },\n applyConfigResult: (widget, result) => {\n if (result.dataSourceType === 'persistentQuery' && result.queryRtId) {\n // Create PersistentQueryDataSource\n const dataSource: PersistentQueryDataSource = {\n type: 'persistentQuery',\n queryRtId: result.queryRtId,\n queryName: result.queryName\n };\n\n // Convert filters from DTO to widget format\n const filters = result.filters?.map(f => ({\n attributePath: f.attributePath,\n operator: String(f.operator),\n comparisonValue: f.comparisonValue\n }));\n\n return {\n ...widget,\n dataSource,\n columns: [], // Will be derived from query at runtime\n sorting: [],\n filters,\n pageSize: result.pageSize,\n sortable: result.sortable\n };\n } else {\n // Create RuntimeEntityDataSource (default behavior)\n // Convert sorting to our model format (simple JSON-compatible types)\n const sorting = result.sorting.map(s => ({\n attributePath: s.attributePath,\n sortOrder: String(s.sortOrder)\n }));\n\n // Convert filters to our model format (simple JSON-compatible types)\n const filters = result.filters.map(f => ({\n attributePath: f.attributePath,\n operator: String(f.operator),\n comparisonValue: f.comparisonValue\n }));\n\n return {\n ...widget,\n dataSource: createDataSource(result, false),\n columns: result.columns,\n sorting,\n filters,\n pageSize: result.pageSize,\n sortable: result.sortable\n };\n }\n },\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): TableWidgetConfig => ({\n ...base,\n type: 'table',\n colSpan: 4,\n dataSource: createDefaultRuntimeDataSource(),\n columns: [],\n sortable: true\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: TableWidgetConfig): WidgetPersistenceData => {\n const isPersistentQuery = widget.dataSource.type === 'persistentQuery';\n return {\n dataSourceType: isPersistentQuery ? 'persistentQuery' : 'runtimeEntity',\n dataSourceCkTypeId: widget.dataSource.type === 'runtimeEntity' ? widget.dataSource.ckTypeId : undefined,\n dataSourceRtId: isPersistentQuery\n ? (widget.dataSource as PersistentQueryDataSource).queryRtId\n : (widget.dataSource.type === 'runtimeEntity' ? widget.dataSource.rtId : undefined),\n config: {\n columns: widget.columns,\n sorting: widget.sorting,\n filters: widget.filters,\n pageSize: widget.pageSize,\n sortable: widget.sortable,\n ...(isPersistentQuery && {\n queryName: (widget.dataSource as PersistentQueryDataSource).queryName,\n queryRtId: (widget.dataSource as PersistentQueryDataSource).queryRtId\n })\n }\n };\n },\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): TableWidgetConfig => {\n const config = parseConfig(data);\n const dataSource = buildDataSourceFromPersisted(data, config);\n\n return {\n ...base,\n rtId: data.rtId,\n type: 'table',\n dataSource,\n columns: (config['columns'] as TableWidgetConfig['columns']) ?? [],\n sorting: config['sorting'] as TableWidgetConfig['sorting'],\n filters: config['filters'] as TableWidgetConfig['filters'],\n pageSize: config['pageSize'] as number | undefined,\n sortable: (config['sortable'] as boolean) ?? true\n };\n }\n });\n\n // Gauge Widget\n registry.registerWidget<GaugeWidgetConfig, GaugeConfigResult>({\n type: 'gauge',\n label: 'Gauge',\n component: GaugeWidgetComponent,\n configDialogComponent: GaugeConfigDialogComponent,\n defaultSize: { colSpan: 1, rowSpan: 1 },\n supportedDataSources: ['runtimeEntity', 'persistentQuery'],\n getInitialConfig: (widget) => {\n const gaugeWidget = widget as GaugeWidgetConfig;\n const isPersistentQuery = gaugeWidget.dataSource.type === 'persistentQuery';\n\n return {\n // Runtime entity fields\n initialCkTypeId: getDataSourceInfo(widget).ckTypeId,\n initialRtId: getDataSourceInfo(widget).rtId,\n initialValueAttribute: gaugeWidget.valueAttribute,\n initialLabelAttribute: gaugeWidget.labelAttribute,\n // Persistent query fields\n initialDataSourceType: isPersistentQuery ? 'persistentQuery' : 'runtimeEntity',\n initialQueryRtId: isPersistentQuery ? (gaugeWidget.dataSource as PersistentQueryDataSource).queryRtId : undefined,\n initialQueryName: isPersistentQuery ? (gaugeWidget.dataSource as PersistentQueryDataSource).queryName : undefined,\n initialQueryMode: gaugeWidget.queryMode,\n initialQueryValueField: gaugeWidget.queryValueField,\n initialQueryCategoryField: gaugeWidget.queryCategoryField,\n initialQueryCategoryValue: gaugeWidget.queryCategoryValue,\n // Gauge options\n initialGaugeType: gaugeWidget.gaugeType,\n initialMin: gaugeWidget.min,\n initialMax: gaugeWidget.max,\n initialRanges: gaugeWidget.ranges,\n initialShowLabel: gaugeWidget.showLabel,\n initialPrefix: gaugeWidget.prefix,\n initialSuffix: gaugeWidget.suffix,\n initialReverse: gaugeWidget.reverse,\n // Filters\n initialFilters: gaugeWidget.filters\n };\n },\n applyConfigResult: (widget, result) => {\n // Convert filters from DTO to widget format\n const filters: WidgetFilterConfig[] | undefined = result.filters?.map(f => ({\n attributePath: f.attributePath,\n operator: String(f.operator),\n comparisonValue: f.comparisonValue\n }));\n\n if (result.dataSourceType === 'persistentQuery' && result.queryRtId) {\n // Create PersistentQueryDataSource\n const dataSource: PersistentQueryDataSource = {\n type: 'persistentQuery',\n queryRtId: result.queryRtId,\n queryName: result.queryName\n };\n\n return {\n ...widget,\n dataSource,\n valueAttribute: '', // Not used for persistent queries\n queryMode: result.queryMode,\n queryValueField: result.queryValueField,\n queryCategoryField: result.queryCategoryField,\n queryCategoryValue: result.queryCategoryValue,\n gaugeType: result.gaugeType,\n min: result.min,\n max: result.max,\n ranges: result.ranges,\n showLabel: result.showLabel,\n prefix: result.prefix,\n suffix: result.suffix,\n reverse: result.reverse,\n filters\n };\n } else {\n // Create RuntimeEntityDataSource (default behavior)\n return {\n ...widget,\n dataSource: createDataSource(result, false),\n gaugeType: result.gaugeType,\n valueAttribute: result.valueAttribute,\n labelAttribute: result.labelAttribute,\n queryMode: undefined,\n queryValueField: undefined,\n queryCategoryField: undefined,\n queryCategoryValue: undefined,\n min: result.min,\n max: result.max,\n ranges: result.ranges,\n showLabel: result.showLabel,\n prefix: result.prefix,\n suffix: result.suffix,\n reverse: result.reverse,\n filters\n };\n }\n },\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): GaugeWidgetConfig => ({\n ...base,\n type: 'gauge',\n dataSource: createDefaultRuntimeDataSource(),\n gaugeType: 'arc',\n valueAttribute: '',\n min: 0,\n max: 100,\n showLabel: true\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: GaugeWidgetConfig): WidgetPersistenceData => {\n const isPersistentQuery = widget.dataSource.type === 'persistentQuery';\n return {\n dataSourceType: isPersistentQuery ? 'persistentQuery' : 'runtimeEntity',\n dataSourceCkTypeId: widget.dataSource.type === 'runtimeEntity' ? widget.dataSource.ckTypeId : undefined,\n dataSourceRtId: isPersistentQuery\n ? (widget.dataSource as PersistentQueryDataSource).queryRtId\n : (widget.dataSource.type === 'runtimeEntity' ? widget.dataSource.rtId : undefined),\n config: {\n gaugeType: widget.gaugeType,\n valueAttribute: widget.valueAttribute,\n labelAttribute: widget.labelAttribute,\n min: widget.min,\n max: widget.max,\n ranges: widget.ranges,\n showLabel: widget.showLabel,\n prefix: widget.prefix,\n suffix: widget.suffix,\n reverse: widget.reverse,\n queryMode: widget.queryMode,\n queryValueField: widget.queryValueField,\n queryCategoryField: widget.queryCategoryField,\n queryCategoryValue: widget.queryCategoryValue,\n filters: widget.filters,\n ...(isPersistentQuery && {\n queryName: (widget.dataSource as PersistentQueryDataSource).queryName,\n queryRtId: (widget.dataSource as PersistentQueryDataSource).queryRtId\n })\n }\n };\n },\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): GaugeWidgetConfig => {\n const config = parseConfig(data);\n const dataSource = buildDataSourceFromPersisted(data, config);\n\n if (dataSource.type === 'persistentQuery') {\n return {\n ...base,\n rtId: data.rtId,\n type: 'gauge',\n dataSource,\n gaugeType: (config['gaugeType'] as GaugeWidgetConfig['gaugeType']) ?? 'arc',\n valueAttribute: (config['valueAttribute'] as string) ?? '',\n queryMode: config['queryMode'] as GaugeWidgetConfig['queryMode'],\n queryValueField: config['queryValueField'] as string | undefined,\n queryCategoryField: config['queryCategoryField'] as string | undefined,\n queryCategoryValue: config['queryCategoryValue'] as string | undefined,\n min: (config['min'] as number) ?? 0,\n max: (config['max'] as number) ?? 100,\n ranges: config['ranges'] as GaugeWidgetConfig['ranges'],\n showLabel: (config['showLabel'] as boolean) ?? true,\n prefix: config['prefix'] as string | undefined,\n suffix: config['suffix'] as string | undefined,\n reverse: config['reverse'] as boolean | undefined,\n filters: config['filters'] as WidgetFilterConfig[] | undefined\n };\n }\n\n return {\n ...base,\n rtId: data.rtId,\n type: 'gauge',\n dataSource: dataSource as RuntimeEntityDataSource,\n gaugeType: (config['gaugeType'] as GaugeWidgetConfig['gaugeType']) ?? 'arc',\n valueAttribute: (config['valueAttribute'] as string) ?? '',\n labelAttribute: config['labelAttribute'] as string | undefined,\n min: (config['min'] as number) ?? 0,\n max: (config['max'] as number) ?? 100,\n ranges: config['ranges'] as GaugeWidgetConfig['ranges'],\n showLabel: (config['showLabel'] as boolean) ?? true,\n prefix: config['prefix'] as string | undefined,\n suffix: config['suffix'] as string | undefined,\n reverse: config['reverse'] as boolean | undefined,\n filters: config['filters'] as WidgetFilterConfig[] | undefined\n };\n }\n });\n\n // Pie Chart Widget\n registry.registerWidget<PieChartWidgetConfig, PieChartConfigResult>({\n type: 'pieChart',\n label: 'Pie Chart',\n component: PieChartWidgetComponent,\n configDialogComponent: PieChartConfigDialogComponent,\n defaultSize: { colSpan: 2, rowSpan: 2 },\n supportedDataSources: ['persistentQuery', 'constructionKitQuery'],\n getInitialConfig: (widget) => {\n const pieWidget = widget as PieChartWidgetConfig;\n const dataSource = pieWidget.dataSource;\n const isPersistentQuery = dataSource.type === 'persistentQuery';\n const isCkQuery = dataSource.type === 'constructionKitQuery';\n\n return {\n initialDataSourceType: dataSource.type,\n initialQueryRtId: isPersistentQuery ? (dataSource as PersistentQueryDataSource).queryRtId : undefined,\n initialQueryName: isPersistentQuery ? (dataSource as PersistentQueryDataSource).queryName : undefined,\n initialCkQueryTarget: isCkQuery ? (dataSource as ConstructionKitQueryDataSource).queryTarget : undefined,\n initialCkGroupBy: isCkQuery ? (dataSource as ConstructionKitQueryDataSource).groupBy : undefined,\n initialChartType: pieWidget.chartType,\n initialCategoryField: pieWidget.categoryField,\n initialValueField: pieWidget.valueField,\n initialShowLabels: pieWidget.showLabels,\n initialShowLegend: pieWidget.showLegend,\n initialLegendPosition: pieWidget.legendPosition,\n initialFilters: pieWidget.filters\n };\n },\n applyConfigResult: (widget, result) => {\n let dataSource: DataSource;\n\n // Convert filters from DTO to widget format\n const filters: WidgetFilterConfig[] | undefined = result.filters?.map(f => ({\n attributePath: f.attributePath,\n operator: String(f.operator),\n comparisonValue: f.comparisonValue\n }));\n\n if (result.dataSourceType === 'constructionKitQuery') {\n dataSource = {\n type: 'constructionKitQuery',\n queryTarget: result.ckQueryTarget ?? 'models',\n groupBy: result.ckGroupBy,\n categoryField: result.categoryField,\n valueField: result.valueField\n } as ConstructionKitQueryDataSource;\n } else {\n dataSource = {\n type: 'persistentQuery',\n queryRtId: result.queryRtId ?? '',\n queryName: result.queryName\n } as PersistentQueryDataSource;\n }\n\n return {\n ...widget,\n dataSource,\n chartType: result.chartType,\n categoryField: result.categoryField,\n valueField: result.valueField,\n showLabels: result.showLabels,\n showLegend: result.showLegend,\n legendPosition: result.legendPosition,\n filters\n };\n },\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): PieChartWidgetConfig => ({\n ...base,\n type: 'pieChart',\n colSpan: 2,\n rowSpan: 2,\n dataSource: createDefaultPersistentQueryDataSource(),\n chartType: 'pie',\n categoryField: '',\n valueField: '',\n showLabels: true,\n showLegend: true,\n legendPosition: 'right'\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: PieChartWidgetConfig): WidgetPersistenceData => {\n const dataSource = widget.dataSource;\n\n if (dataSource.type === 'constructionKitQuery') {\n const ckDataSource = dataSource as ConstructionKitQueryDataSource;\n return {\n dataSourceType: 'constructionKitQuery',\n config: {\n chartType: widget.chartType,\n categoryField: widget.categoryField,\n valueField: widget.valueField,\n showLabels: widget.showLabels,\n showLegend: widget.showLegend,\n legendPosition: widget.legendPosition,\n ckQueryTarget: ckDataSource.queryTarget,\n ckGroupBy: ckDataSource.groupBy,\n filters: widget.filters\n }\n };\n }\n\n // Default: persistentQuery\n return {\n dataSourceType: 'persistentQuery',\n dataSourceRtId: (dataSource as PersistentQueryDataSource).queryRtId,\n config: {\n chartType: widget.chartType,\n categoryField: widget.categoryField,\n valueField: widget.valueField,\n showLabels: widget.showLabels,\n showLegend: widget.showLegend,\n legendPosition: widget.legendPosition,\n queryName: (dataSource as PersistentQueryDataSource).queryName,\n queryRtId: (dataSource as PersistentQueryDataSource).queryRtId,\n filters: widget.filters\n }\n };\n },\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): PieChartWidgetConfig => {\n const config = parseConfig(data);\n\n // Handle constructionKitQuery data source\n if (data.dataSourceType === 'constructionKitQuery') {\n return {\n ...base,\n rtId: data.rtId,\n type: 'pieChart',\n dataSource: {\n type: 'constructionKitQuery',\n queryTarget: (config['ckQueryTarget'] as ConstructionKitQueryDataSource['queryTarget']) ?? 'models',\n groupBy: config['ckGroupBy'] as string | undefined\n },\n chartType: (config['chartType'] as PieChartWidgetConfig['chartType']) ?? 'pie',\n categoryField: (config['categoryField'] as string) ?? '',\n valueField: (config['valueField'] as string) ?? '',\n showLabels: (config['showLabels'] as boolean) ?? true,\n showLegend: (config['showLegend'] as boolean) ?? true,\n legendPosition: (config['legendPosition'] as PieChartWidgetConfig['legendPosition']) ?? 'right',\n filters: config['filters'] as WidgetFilterConfig[] | undefined\n };\n }\n\n // Default: persistentQuery\n const dataSource = buildDataSourceFromPersisted(data, config) as PersistentQueryDataSource;\n\n return {\n ...base,\n rtId: data.rtId,\n type: 'pieChart',\n dataSource,\n chartType: (config['chartType'] as PieChartWidgetConfig['chartType']) ?? 'pie',\n categoryField: (config['categoryField'] as string) ?? '',\n valueField: (config['valueField'] as string) ?? '',\n showLabels: (config['showLabels'] as boolean) ?? true,\n showLegend: (config['showLegend'] as boolean) ?? true,\n legendPosition: (config['legendPosition'] as PieChartWidgetConfig['legendPosition']) ?? 'right',\n filters: config['filters'] as WidgetFilterConfig[] | undefined\n };\n }\n });\n\n // Bar Chart Widget\n registry.registerWidget<BarChartWidgetConfig, BarChartConfigResult>({\n type: 'barChart',\n label: 'Bar Chart',\n component: BarChartWidgetComponent,\n configDialogComponent: BarChartConfigDialogComponent,\n defaultSize: { colSpan: 2, rowSpan: 2 },\n supportedDataSources: ['persistentQuery'],\n getInitialConfig: (widget) => {\n const barWidget = widget as BarChartWidgetConfig;\n const dataSource = barWidget.dataSource;\n const isPersistentQuery = dataSource.type === 'persistentQuery';\n\n return {\n initialQueryRtId: isPersistentQuery ? (dataSource as PersistentQueryDataSource).queryRtId : undefined,\n initialQueryName: isPersistentQuery ? (dataSource as PersistentQueryDataSource).queryName : undefined,\n initialChartType: barWidget.chartType,\n initialCategoryField: barWidget.categoryField,\n initialSeries: barWidget.series,\n initialSeriesGroupField: barWidget.seriesGroupField,\n initialValueField: barWidget.valueField,\n initialShowLegend: barWidget.showLegend,\n initialLegendPosition: barWidget.legendPosition,\n initialShowDataLabels: barWidget.showDataLabels,\n initialFilters: barWidget.filters\n };\n },\n applyConfigResult: (widget, result) => {\n const dataSource: PersistentQueryDataSource = {\n type: 'persistentQuery',\n queryRtId: result.queryRtId,\n queryName: result.queryName\n };\n\n // Convert filters from DTO to widget format\n const filters: WidgetFilterConfig[] | undefined = result.filters?.map(f => ({\n attributePath: f.attributePath,\n operator: String(f.operator),\n comparisonValue: f.comparisonValue\n }));\n\n return {\n ...widget,\n dataSource,\n chartType: result.chartType,\n categoryField: result.categoryField,\n series: result.series,\n seriesGroupField: result.seriesGroupField,\n valueField: result.valueField,\n showLegend: result.showLegend,\n legendPosition: result.legendPosition,\n showDataLabels: result.showDataLabels,\n filters\n } as BarChartWidgetConfig;\n },\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): BarChartWidgetConfig => ({\n ...base,\n type: 'barChart',\n colSpan: 2,\n rowSpan: 2,\n dataSource: createDefaultPersistentQueryDataSource(),\n chartType: 'column',\n categoryField: '',\n series: [],\n showLegend: true,\n legendPosition: 'right',\n showDataLabels: false\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: BarChartWidgetConfig): WidgetPersistenceData => ({\n dataSourceType: 'persistentQuery',\n dataSourceRtId: (widget.dataSource as PersistentQueryDataSource).queryRtId,\n config: {\n chartType: widget.chartType,\n categoryField: widget.categoryField,\n series: widget.series,\n seriesGroupField: widget.seriesGroupField,\n valueField: widget.valueField,\n showLegend: widget.showLegend,\n legendPosition: widget.legendPosition,\n showDataLabels: widget.showDataLabels,\n queryName: (widget.dataSource as PersistentQueryDataSource).queryName,\n queryRtId: (widget.dataSource as PersistentQueryDataSource).queryRtId,\n filters: widget.filters\n }\n }),\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): BarChartWidgetConfig => {\n const config = parseConfig(data);\n const dataSource = buildDataSourceFromPersisted(data, config) as PersistentQueryDataSource;\n\n return {\n ...base,\n rtId: data.rtId,\n type: 'barChart',\n dataSource,\n chartType: (config['chartType'] as BarChartWidgetConfig['chartType']) ?? 'column',\n categoryField: (config['categoryField'] as string) ?? '',\n series: (config['series'] as BarChartWidgetConfig['series']) ?? [],\n seriesGroupField: config['seriesGroupField'] as string | undefined,\n valueField: config['valueField'] as string | undefined,\n showLegend: (config['showLegend'] as boolean) ?? true,\n legendPosition: (config['legendPosition'] as BarChartWidgetConfig['legendPosition']) ?? 'right',\n showDataLabels: (config['showDataLabels'] as boolean) ?? false,\n filters: config['filters'] as WidgetFilterConfig[] | undefined\n };\n }\n });\n\n // Stats Grid Widget\n registry.registerWidget<StatsGridWidgetConfig, StatsGridConfigResult>({\n type: 'statsGrid',\n label: 'Stats Grid',\n component: StatsGridWidgetComponent,\n configDialogComponent: StatsGridConfigDialogComponent,\n defaultSize: { colSpan: 3, rowSpan: 1 },\n supportedDataSources: ['aggregation'],\n getInitialConfig: (widget) => {\n const statsWidget = widget as StatsGridWidgetConfig;\n const dataSource = statsWidget.dataSource as AggregationDataSource;\n return {\n initialStats: statsWidget.stats,\n initialQueries: dataSource?.queries ?? [],\n initialColumns: statsWidget.columns\n };\n },\n applyConfigResult: (widget, result) => ({\n ...widget,\n stats: result.stats,\n columns: result.columns,\n dataSource: {\n type: 'aggregation',\n queries: result.queries\n }\n }),\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): StatsGridWidgetConfig => ({\n ...base,\n type: 'statsGrid',\n colSpan: 3,\n dataSource: {\n type: 'aggregation',\n queries: []\n },\n stats: [],\n columns: 3\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: StatsGridWidgetConfig): WidgetPersistenceData => ({\n dataSourceType: 'aggregation',\n config: {\n stats: widget.stats,\n columns: widget.columns,\n queries: widget.dataSource.type === 'aggregation'\n ? (widget.dataSource as AggregationDataSource).queries\n : []\n }\n }),\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): StatsGridWidgetConfig => {\n const config = parseConfig(data);\n return {\n ...base,\n rtId: data.rtId,\n type: 'statsGrid',\n dataSource: {\n type: 'aggregation',\n queries: (config['queries'] as AggregationDataSource['queries']) ?? []\n },\n stats: (config['stats'] as StatsGridWidgetConfig['stats']) ?? [],\n columns: (config['columns'] as number) ?? 3\n };\n }\n });\n\n // Status Indicator Widget\n registry.registerWidget<StatusIndicatorWidgetConfig, StatusIndicatorConfigResult>({\n type: 'statusIndicator',\n label: 'Status Indicator',\n component: StatusIndicatorWidgetComponent,\n configDialogComponent: StatusIndicatorConfigDialogComponent,\n defaultSize: { colSpan: 1, rowSpan: 1 },\n supportedDataSources: ['serviceCall'],\n getInitialConfig: (widget) => {\n const statusWidget = widget as StatusIndicatorWidgetConfig;\n const dataSource = statusWidget.dataSource as ServiceCallDataSource;\n return {\n initialCallType: dataSource?.callType,\n initialModelName: dataSource?.modelName,\n initialServiceType: dataSource?.serviceType,\n initialTrueLabel: statusWidget.trueLabel,\n initialFalseLabel: statusWidget.falseLabel,\n initialTrueColor: statusWidget.trueColor,\n initialFalseColor: statusWidget.falseColor\n };\n },\n applyConfigResult: (widget, result) => ({\n ...widget,\n dataSource: {\n type: 'serviceCall',\n callType: result.callType,\n modelName: result.modelName,\n serviceType: result.serviceType\n },\n trueLabel: result.trueLabel,\n falseLabel: result.falseLabel,\n trueColor: result.trueColor,\n falseColor: result.falseColor\n }),\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): StatusIndicatorWidgetConfig => ({\n ...base,\n type: 'statusIndicator',\n colSpan: 1,\n dataSource: {\n type: 'serviceCall',\n callType: 'modelAvailable'\n },\n trueLabel: 'ENABLED',\n falseLabel: 'DISABLED'\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: StatusIndicatorWidgetConfig): WidgetPersistenceData => {\n const dataSource = widget.dataSource as ServiceCallDataSource;\n return {\n dataSourceType: 'serviceCall',\n config: {\n callType: dataSource.callType,\n modelName: dataSource.modelName,\n serviceType: dataSource.serviceType,\n customEndpoint: dataSource.customEndpoint,\n trueLabel: widget.trueLabel,\n falseLabel: widget.falseLabel,\n trueColor: widget.trueColor,\n falseColor: widget.falseColor\n }\n };\n },\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): StatusIndicatorWidgetConfig => {\n const config = parseConfig(data);\n return {\n ...base,\n rtId: data.rtId,\n type: 'statusIndicator',\n dataSource: {\n type: 'serviceCall',\n callType: (config['callType'] as ServiceCallDataSource['callType']) ?? 'modelAvailable',\n modelName: config['modelName'] as string | undefined,\n serviceType: config['serviceType'] as ServiceCallDataSource['serviceType'],\n customEndpoint: config['customEndpoint'] as string | undefined\n },\n trueLabel: config['trueLabel'] as string | undefined,\n falseLabel: config['falseLabel'] as string | undefined,\n trueColor: config['trueColor'] as string | undefined,\n falseColor: config['falseColor'] as string | undefined\n };\n }\n });\n\n // Service Health Widget\n registry.registerWidget<ServiceHealthWidgetConfig, ServiceHealthConfigResult>({\n type: 'serviceHealth',\n label: 'Service Health',\n component: ServiceHealthWidgetComponent,\n configDialogComponent: ServiceHealthConfigDialogComponent,\n defaultSize: { colSpan: 2, rowSpan: 1 },\n supportedDataSources: ['serviceCall'],\n getInitialConfig: (widget) => {\n const healthWidget = widget as ServiceHealthWidgetConfig;\n const dataSource = healthWidget.dataSource as ServiceCallDataSource;\n return {\n initialServiceType: dataSource?.serviceType,\n initialCustomEndpoint: dataSource?.customEndpoint,\n initialShowPulse: healthWidget.showPulse,\n initialNavigateOnClick: healthWidget.navigateOnClick,\n initialDetailRoute: healthWidget.detailRoute\n };\n },\n applyConfigResult: (widget, result) => ({\n ...widget,\n dataSource: {\n type: 'serviceCall',\n callType: 'healthCheck',\n serviceType: result.serviceType,\n customEndpoint: result.customEndpoint\n },\n showPulse: result.showPulse,\n navigateOnClick: result.navigateOnClick,\n detailRoute: result.detailRoute\n }),\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): ServiceHealthWidgetConfig => ({\n ...base,\n type: 'serviceHealth',\n colSpan: 2,\n dataSource: {\n type: 'serviceCall',\n callType: 'healthCheck',\n serviceType: 'identity'\n },\n showPulse: true,\n navigateOnClick: false\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: ServiceHealthWidgetConfig): WidgetPersistenceData => {\n const dataSource = widget.dataSource as ServiceCallDataSource;\n return {\n dataSourceType: 'serviceCall',\n config: {\n callType: dataSource.callType,\n serviceType: dataSource.serviceType,\n customEndpoint: dataSource.customEndpoint,\n navigateOnClick: widget.navigateOnClick,\n detailRoute: widget.detailRoute,\n showPulse: widget.showPulse\n }\n };\n },\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): ServiceHealthWidgetConfig => {\n const config = parseConfig(data);\n return {\n ...base,\n rtId: data.rtId,\n type: 'serviceHealth',\n dataSource: {\n type: 'serviceCall',\n callType: 'healthCheck',\n serviceType: (config['serviceType'] as ServiceCallDataSource['serviceType']) ?? 'identity',\n customEndpoint: config['customEndpoint'] as string | undefined\n },\n navigateOnClick: config['navigateOnClick'] as boolean | undefined,\n detailRoute: config['detailRoute'] as string | undefined,\n showPulse: (config['showPulse'] as boolean) ?? true\n };\n }\n });\n\n // Widget Group Widget\n registry.registerWidget<WidgetGroupConfig, WidgetGroupConfigResult>({\n type: 'widgetGroup',\n label: 'Widget Group',\n component: WidgetGroupComponent,\n configDialogComponent: WidgetGroupConfigDialogComponent,\n defaultSize: { colSpan: 4, rowSpan: 2 },\n supportedDataSources: ['repeaterQuery'],\n getInitialConfig: (widget) => {\n const groupWidget = widget as WidgetGroupConfig;\n const dataSource = groupWidget.dataSource;\n const hasQuery = dataSource.type === 'repeaterQuery' && dataSource.queryRtId;\n const hasCkType = dataSource.type === 'repeaterQuery' && dataSource.ckTypeId;\n\n return {\n initialDataSourceMode: hasQuery ? 'persistentQuery' : (hasCkType ? 'ckType' : 'persistentQuery'),\n initialQueryRtId: hasQuery ? dataSource.queryRtId : undefined,\n initialQueryName: hasQuery ? dataSource.queryName : undefined,\n initialCkTypeId: hasCkType ? dataSource.ckTypeId : undefined,\n initialFilters: hasCkType ? dataSource.filters : undefined,\n initialMaxItems: dataSource.type === 'repeaterQuery' ? dataSource.maxItems : undefined,\n initialChildTemplate: groupWidget.childTemplate,\n initialLayout: groupWidget.layout,\n initialGridColumns: groupWidget.gridColumns,\n initialMinChildWidth: groupWidget.minChildWidth,\n initialGap: groupWidget.gap,\n initialEmptyMessage: groupWidget.emptyMessage\n };\n },\n applyConfigResult: (widget, result) => {\n // Build the repeater data source\n const useCkType = result.dataSourceMode === 'ckType' && result.ckTypeId;\n const dataSource: RepeaterQueryDataSource = {\n type: 'repeaterQuery',\n queryRtId: result.dataSourceMode === 'persistentQuery' ? result.queryRtId : undefined,\n queryName: result.dataSourceMode === 'persistentQuery' ? result.queryName : undefined,\n ckTypeId: useCkType ? result.ckTypeId : undefined,\n filters: useCkType && result.filters ? result.filters.map(f => ({\n attributePath: f.attributePath,\n operator: String(f.operator),\n comparisonValue: f.comparisonValue\n })) : undefined,\n maxItems: result.maxItems\n };\n\n return {\n ...widget,\n dataSource,\n childTemplate: result.childTemplate,\n layout: result.layout,\n gridColumns: result.gridColumns,\n minChildWidth: result.minChildWidth,\n gap: result.gap,\n emptyMessage: result.emptyMessage\n };\n },\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): WidgetGroupConfig => ({\n ...base,\n type: 'widgetGroup',\n colSpan: 4,\n rowSpan: 2,\n dataSource: {\n type: 'repeaterQuery',\n maxItems: 20\n },\n childTemplate: {\n widgetType: 'kpi',\n titleTemplate: '$rtWellKnownName',\n attributeMappings: {\n valueAttribute: 'value'\n }\n },\n layout: 'grid',\n gridColumns: 4,\n gap: 8\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: WidgetGroupConfig): WidgetPersistenceData => {\n const dataSource = widget.dataSource as RepeaterQueryDataSource;\n const hasQuery = !!dataSource.queryRtId;\n\n return {\n dataSourceType: 'repeaterQuery',\n dataSourceRtId: hasQuery ? dataSource.queryRtId : undefined,\n dataSourceCkTypeId: !hasQuery ? dataSource.ckTypeId : undefined,\n config: {\n queryName: dataSource.queryName,\n maxItems: dataSource.maxItems,\n filters: dataSource.filters,\n childTemplate: widget.childTemplate,\n layout: widget.layout,\n gridColumns: widget.gridColumns,\n minChildWidth: widget.minChildWidth,\n gap: widget.gap,\n emptyMessage: widget.emptyMessage\n }\n };\n },\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): WidgetGroupConfig => {\n const config = parseConfig(data);\n const hasQuery = !!data.dataSourceRtId;\n\n const dataSource: RepeaterQueryDataSource = {\n type: 'repeaterQuery',\n queryRtId: hasQuery ? data.dataSourceRtId ?? undefined : undefined,\n queryName: hasQuery ? config['queryName'] as string | undefined : undefined,\n ckTypeId: !hasQuery ? data.dataSourceCkTypeId ?? undefined : undefined,\n filters: !hasQuery ? config['filters'] as WidgetFilterConfig[] | undefined : undefined,\n maxItems: config['maxItems'] as number | undefined\n };\n\n const childTemplate = config['childTemplate'] as WidgetGroupConfig['childTemplate'] ?? {\n widgetType: 'kpi',\n titleTemplate: '$rtWellKnownName',\n attributeMappings: { valueAttribute: 'value' }\n };\n\n return {\n ...base,\n rtId: data.rtId,\n type: 'widgetGroup',\n dataSource,\n childTemplate,\n layout: (config['layout'] as WidgetGroupConfig['layout']) ?? 'grid',\n gridColumns: config['gridColumns'] as number | undefined,\n minChildWidth: config['minChildWidth'] as number | undefined,\n gap: config['gap'] as number | undefined,\n emptyMessage: config['emptyMessage'] as string | undefined\n };\n }\n });\n\n // Markdown Widget\n registry.registerWidget<MarkdownWidgetConfig, MarkdownConfigResult>({\n type: 'markdown',\n label: 'Markdown',\n component: MarkdownWidgetComponent,\n configDialogComponent: MarkdownConfigDialogComponent,\n defaultSize: { colSpan: 2, rowSpan: 2 },\n supportedDataSources: ['static'],\n getInitialConfig: (widget) => {\n const mdWidget = widget as MarkdownWidgetConfig;\n return {\n initialContent: mdWidget.content,\n initialResolveVariables: mdWidget.resolveVariables,\n initialPadding: mdWidget.padding,\n initialTextAlign: mdWidget.textAlign\n };\n },\n applyConfigResult: (widget, result) => ({\n ...widget,\n content: result.content,\n resolveVariables: result.resolveVariables,\n padding: result.padding,\n textAlign: result.textAlign,\n dataSource: { type: 'static', data: result.content }\n }),\n\n // SOLID: Factory function\n createDefaultConfig: (base: BaseWidgetConfig): MarkdownWidgetConfig => ({\n ...base,\n type: 'markdown',\n colSpan: 2,\n rowSpan: 2,\n dataSource: { type: 'static', data: null },\n content: '',\n resolveVariables: true\n }),\n\n // SOLID: Serialization for persistence\n toPersistedConfig: (widget: MarkdownWidgetConfig): WidgetPersistenceData => ({\n dataSourceType: 'static',\n config: {\n content: widget.content,\n resolveVariables: widget.resolveVariables,\n padding: widget.padding,\n textAlign: widget.textAlign\n }\n }),\n\n // SOLID: Deserialization from persistence\n fromPersistedConfig: (data: PersistedWidgetData, base: BaseWidgetConfig): MarkdownWidgetConfig => {\n const config = parseConfig(data);\n return {\n ...base,\n rtId: data.rtId,\n type: 'markdown',\n dataSource: { type: 'static', data: config['content'] ?? '' },\n content: (config['content'] as string) ?? '',\n resolveVariables: (config['resolveVariables'] as boolean) ?? true,\n padding: config['padding'] as string | undefined,\n textAlign: config['textAlign'] as MarkdownWidgetConfig['textAlign']\n };\n }\n });\n\n // Note: Process Widget registration moved to process-widget-registration.ts\n // Use provideProcessWidget() or registerProcessWidget() to enable it\n}\n\n/**\n * Provides the widget registry with all built-in widgets registered.\n * Add this to your app's providers array.\n *\n * Usage:\n * ```typescript\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideDefaultWidgets()\n * ]\n * });\n * ```\n */\nexport function provideDefaultWidgets(): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideAppInitializer(() => {\n const registry = inject(WidgetRegistryService);\n registerDefaultWidgets(registry);\n })\n ]);\n}\n\n// ========== Main Provider Functions ==========\n\nimport { InjectionToken } from '@angular/core';\nimport { WidgetRegistration } from '../services/widget-registry.service';\n\n/**\n * Configuration options for MeshBoard\n */\nexport interface MeshBoardOptions {\n /** Whether to include default widgets (default: true) */\n includeDefaultWidgets?: boolean;\n /** Default grid columns (default: 6) */\n defaultColumns?: number;\n /** Default row height in pixels (default: 200) */\n defaultRowHeight?: number;\n /** Default gap between widgets in pixels (default: 16) */\n defaultGap?: number;\n}\n\n/**\n * Injection token for MeshBoard options\n */\nexport const MESHBOARD_OPTIONS = new InjectionToken<MeshBoardOptions>('MESHBOARD_OPTIONS');\n\n// Re-export from octo-services for convenience\nexport { TENANT_ID_PROVIDER } from '@meshmakers/octo-services';\nexport type { TenantIdProvider } from '@meshmakers/octo-services';\n\n// Import for alias\nimport { TENANT_ID_PROVIDER } from '@meshmakers/octo-services';\n\n/**\n * @deprecated Use TENANT_ID_PROVIDER from @meshmakers/octo-services instead\n */\nexport const MESHBOARD_TENANT_ID_PROVIDER = TENANT_ID_PROVIDER;\n\n/**\n * Main provider function for the MeshBoard library.\n * This is the recommended way to configure MeshBoard in your application.\n *\n * Usage:\n * ```typescript\n * // app.config.ts\n * import { provideMeshBoard } from '@meshmakers/octo-meshboard';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideMeshBoard(),\n * // or with options:\n * provideMeshBoard({ defaultColumns: 4 })\n * ]\n * };\n * ```\n */\nexport function provideMeshBoard(options?: MeshBoardOptions): EnvironmentProviders {\n const opts = { includeDefaultWidgets: true, ...options };\n\n const providers = [\n { provide: MESHBOARD_OPTIONS, useValue: opts }\n ];\n\n // Include default widgets unless explicitly disabled\n if (opts.includeDefaultWidgets !== false) {\n providers.push(\n provideAppInitializer(() => {\n const registry = inject(WidgetRegistryService);\n registerDefaultWidgets(registry);\n }) as never\n );\n }\n\n return makeEnvironmentProviders(providers);\n}\n\n/**\n * Provider function for registering custom widgets.\n * Use this to add your own widget types to MeshBoard.\n *\n * Usage:\n * ```typescript\n * // app.config.ts\n * import { provideMeshBoard, provideWidgetRegistrations } from '@meshmakers/octo-meshboard';\n * import { MyCustomWidget, MyCustomConfigDialog } from './widgets/my-custom-widget';\n *\n * const customWidgets: WidgetRegistration<any, any>[] = [\n * {\n * type: 'myCustom',\n * label: 'My Custom Widget',\n * component: MyCustomWidget,\n * configDialogComponent: MyCustomConfigDialog,\n * defaultSize: { colSpan: 2, rowSpan: 1 },\n * supportedDataSources: ['runtimeEntity'],\n * // ... other registration options\n * }\n * ];\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideMeshBoard(),\n * provideWidgetRegistrations(customWidgets)\n * ]\n * };\n * ```\n */\nexport function provideWidgetRegistrations(\n registrations: WidgetRegistration<any, any>[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideAppInitializer(() => {\n const registry = inject(WidgetRegistryService);\n for (const registration of registrations) {\n registry.registerWidget(registration);\n }\n })\n ]);\n}\n\n/**\n * Re-export WidgetRegistration type for convenience\n */\nexport type { WidgetRegistration } from '../services/widget-registry.service';\n","import { Component, Input, Output, EventEmitter, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { DropDownListModule } from '@progress/kendo-angular-dropdowns';\nimport { InputsModule, NumericTextBoxModule, TextBoxModule, CheckBoxModule } from '@progress/kendo-angular-inputs';\nimport { DatePickerModule, DateTimePickerModule } from '@progress/kendo-angular-dateinputs';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport { plusIcon, trashIcon } from '@progress/kendo-svg-icons';\nimport { MeshBoardVariable, MeshBoardVariableType } from '../../models/meshboard.models';\nimport { MeshBoardVariableService } from '../../services/meshboard-variable.service';\n\ninterface VariableTypeOption {\n value: MeshBoardVariableType;\n label: string;\n}\n\n/**\n * Component for editing MeshBoard variables.\n * Allows adding, editing, and removing variables with type-specific input controls.\n */\n@Component({\n selector: 'mm-variables-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ButtonModule,\n DropDownListModule,\n InputsModule,\n NumericTextBoxModule,\n TextBoxModule,\n CheckBoxModule,\n DatePickerModule,\n DateTimePickerModule,\n SVGIconModule\n ],\n templateUrl: './variables-editor.component.html',\n styleUrl: './variables-editor.component.scss'\n})\nexport class VariablesEditorComponent {\n private readonly variableService = inject(MeshBoardVariableService);\n\n @Input() variables: MeshBoardVariable[] = [];\n @Output() variablesChange = new EventEmitter<MeshBoardVariable[]>();\n\n protected readonly plusIcon = plusIcon;\n protected readonly trashIcon = trashIcon;\n\n protected readonly typeOptions: VariableTypeOption[] = [\n { value: 'string', label: 'String' },\n { value: 'number', label: 'Number' },\n { value: 'boolean', label: 'Boolean' },\n { value: 'date', label: 'Date' },\n { value: 'datetime', label: 'DateTime' }\n ];\n\n protected readonly booleanOptions = ['true', 'false'];\n\n // For tracking edit state of date values\n private dateValues = new Map<string, Date | null>();\n\n /**\n * Adds a new variable with default values.\n */\n addVariable(): void {\n const name = this.variableService.generateUniqueName('variable', this.variables);\n const newVariable = this.variableService.createDefaultVariable(name, 'string');\n\n this.variables = [...this.variables, newVariable];\n this.emitChange();\n }\n\n /**\n * Removes a variable at the given index.\n */\n removeVariable(index: number): void {\n this.variables = this.variables.filter((_, i) => i !== index);\n this.emitChange();\n }\n\n /**\n * Handles variable name change.\n */\n onNameChange(index: number, name: string): void {\n // Validate and sanitize name\n const sanitized = name.replace(/[^a-zA-Z0-9_]/g, '');\n this.variables = this.variables.map((v, i) =>\n i === index ? { ...v, name: sanitized } : v\n );\n this.emitChange();\n }\n\n /**\n * Handles variable type change.\n * Resets the value to the default for the new type.\n */\n onTypeChange(index: number, type: MeshBoardVariableType): void {\n const defaultVar = this.variableService.createDefaultVariable(\n this.variables[index].name,\n type\n );\n\n this.variables = this.variables.map((v, i) =>\n i === index ? { ...v, type, value: defaultVar.value, defaultValue: defaultVar.defaultValue } : v\n );\n this.emitChange();\n }\n\n /**\n * Handles string/text value change.\n */\n onValueChange(index: number, value: string): void {\n this.variables = this.variables.map((v, i) =>\n i === index ? { ...v, value } : v\n );\n this.emitChange();\n }\n\n /**\n * Handles number value change.\n */\n onNumberValueChange(index: number, value: number | null): void {\n const strValue = value !== null ? String(value) : '0';\n this.variables = this.variables.map((v, i) =>\n i === index ? { ...v, value: strValue } : v\n );\n this.emitChange();\n }\n\n /**\n * Handles date value change.\n */\n onDateValueChange(index: number, value: Date | null): void {\n const variable = this.variables[index];\n let strValue: string;\n\n if (value) {\n strValue = variable.type === 'datetime'\n ? value.toISOString()\n : value.toISOString().split('T')[0];\n } else {\n strValue = '';\n }\n\n this.variables = this.variables.map((v, i) =>\n i === index ? { ...v, value: strValue } : v\n );\n this.emitChange();\n }\n\n /**\n * Handles default value change.\n */\n onDefaultValueChange(index: number, defaultValue: string): void {\n this.variables = this.variables.map((v, i) =>\n i === index ? { ...v, defaultValue } : v\n );\n this.emitChange();\n }\n\n /**\n * Gets the numeric value for a variable.\n */\n getNumberValue(variable: MeshBoardVariable): number {\n return parseFloat(variable.value) || 0;\n }\n\n /**\n * Gets the Date value for a variable.\n */\n getDateValue(variable: MeshBoardVariable): Date | null {\n if (!variable.value) return null;\n const date = new Date(variable.value);\n return isNaN(date.getTime()) ? null : date;\n }\n\n /**\n * Gets the type option for a variable.\n */\n getTypeOption(variable: MeshBoardVariable): VariableTypeOption {\n return this.typeOptions.find(t => t.value === variable.type) ?? this.typeOptions[0];\n }\n\n /**\n * Validates a variable name.\n */\n isValidName(name: string): boolean {\n return this.variableService.isValidVariableName(name);\n }\n\n /**\n * Checks if a variable name is duplicate.\n */\n isDuplicateName(name: string, currentIndex: number): boolean {\n return this.variables.some((v, i) => i !== currentIndex && v.name === name);\n }\n\n /**\n * Tracks variables by index for ngFor.\n */\n trackByIndex(index: number): number {\n return index;\n }\n\n private emitChange(): void {\n this.variablesChange.emit([...this.variables]);\n }\n}\n","<div class=\"variables-editor\">\n <div class=\"variables-header\">\n <span class=\"section-title\">Variables</span>\n <button\n kendoButton\n (click)=\"addVariable()\"\n [svgIcon]=\"plusIcon\"\n fillMode=\"flat\"\n themeColor=\"primary\">\n Add Variable\n </button>\n </div>\n\n @if (variables.length > 0) {\n <div class=\"variables-list\">\n <div class=\"list-header\">\n <span class=\"col-name\">Name</span>\n <span class=\"col-type\">Type</span>\n <span class=\"col-value\">Value</span>\n <span class=\"col-default\">Default</span>\n <span class=\"col-actions\"></span>\n </div>\n\n @for (variable of variables; track trackByIndex($index); let i = $index) {\n <div class=\"variable-row\">\n <!-- Name -->\n <div class=\"col-name\">\n <kendo-textbox\n [value]=\"variable.name\"\n (valueChange)=\"onNameChange(i, $event)\"\n placeholder=\"variableName\"\n [style.width.%]=\"100\">\n </kendo-textbox>\n @if (!isValidName(variable.name)) {\n <span class=\"error-text\">Invalid name</span>\n }\n @if (isDuplicateName(variable.name, i)) {\n <span class=\"error-text\">Duplicate</span>\n }\n </div>\n\n <!-- Type -->\n <div class=\"col-type\">\n <kendo-dropdownlist\n [data]=\"typeOptions\"\n [value]=\"getTypeOption(variable)\"\n (valueChange)=\"onTypeChange(i, $event.value)\"\n textField=\"label\"\n valueField=\"value\"\n [style.width.%]=\"100\">\n </kendo-dropdownlist>\n </div>\n\n <!-- Value (type-specific) -->\n <div class=\"col-value\">\n @switch (variable.type) {\n @case ('number') {\n <kendo-numerictextbox\n [value]=\"getNumberValue(variable)\"\n (valueChange)=\"onNumberValueChange(i, $event)\"\n [style.width.%]=\"100\">\n </kendo-numerictextbox>\n }\n @case ('boolean') {\n <kendo-dropdownlist\n [data]=\"booleanOptions\"\n [value]=\"variable.value\"\n (valueChange)=\"onValueChange(i, $event)\"\n [style.width.%]=\"100\">\n </kendo-dropdownlist>\n }\n @case ('date') {\n <kendo-datepicker\n [value]=\"getDateValue(variable)\"\n (valueChange)=\"onDateValueChange(i, $event)\"\n [style.width.%]=\"100\">\n </kendo-datepicker>\n }\n @case ('datetime') {\n <kendo-datetimepicker\n [value]=\"getDateValue(variable)\"\n (valueChange)=\"onDateValueChange(i, $event)\"\n [style.width.%]=\"100\">\n </kendo-datetimepicker>\n }\n @default {\n <kendo-textbox\n [value]=\"variable.value\"\n (valueChange)=\"onValueChange(i, $event)\"\n placeholder=\"Value\"\n [style.width.%]=\"100\">\n </kendo-textbox>\n }\n }\n </div>\n\n <!-- Default Value -->\n <div class=\"col-default\">\n <kendo-textbox\n [value]=\"variable.defaultValue ?? ''\"\n (valueChange)=\"onDefaultValueChange(i, $event)\"\n placeholder=\"Default\"\n [style.width.%]=\"100\">\n </kendo-textbox>\n </div>\n\n <!-- Remove Button -->\n <div class=\"col-actions\">\n <button\n kendoButton\n (click)=\"removeVariable(i)\"\n [svgIcon]=\"trashIcon\"\n fillMode=\"flat\"\n themeColor=\"error\"\n title=\"Remove variable\">\n </button>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <p>No variables defined.</p>\n <p class=\"hint\">Click \"Add Variable\" to create one.</p>\n </div>\n }\n\n <div class=\"usage-hint\">\n <strong>Usage:</strong> Reference variables in filter values as <code>$variableName</code>\n </div>\n</div>\n","import { Component, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogRef, DialogModule } from '@progress/kendo-angular-dialog';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule, CheckBoxModule } from '@progress/kendo-angular-inputs';\nimport { LabelModule } from '@progress/kendo-angular-label';\nimport { FormFieldModule } from '@progress/kendo-angular-inputs';\nimport { MeshBoardVariable, MeshBoardTimeFilterConfig } from '../../models/meshboard.models';\nimport { VariablesEditorComponent } from '../../components/variables-editor/variables-editor.component';\n\n/**\n * Result returned when the dialog is closed with save action.\n */\nexport class MeshBoardSettingsResult {\n constructor(\n public name: string,\n public description: string,\n public columns: number,\n public rowHeight: number,\n public gap: number,\n public variables: MeshBoardVariable[],\n public timeFilter?: MeshBoardTimeFilterConfig,\n public rtWellKnownName?: string\n ) {}\n}\n\n/**\n * Dialog for editing MeshBoard settings.\n * Allows configuration of name, description, columns, rowHeight, and gap.\n */\n@Component({\n selector: 'mm-meshboard-settings-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ButtonModule,\n DialogModule,\n InputsModule,\n CheckBoxModule,\n LabelModule,\n FormFieldModule,\n VariablesEditorComponent\n ],\n templateUrl: './meshboard-settings-dialog.component.html',\n styleUrl: './meshboard-settings-dialog.component.scss'\n})\nexport class MeshBoardSettingsDialogComponent {\n private readonly dialogRef = inject(DialogRef);\n\n // Form fields\n name = '';\n description = '';\n rtWellKnownName = '';\n columns = 6;\n rowHeight = 200;\n gap = 16;\n variables: MeshBoardVariable[] = [];\n timeFilterEnabled = false;\n\n // Validation\n get isValid(): boolean {\n return (\n this.name.trim().length > 0 &&\n this.columns >= 1 && this.columns <= 12 &&\n this.rowHeight >= 100 && this.rowHeight <= 1000 &&\n this.gap >= 0 && this.gap <= 100\n );\n }\n\n /**\n * Sets the initial values for the form fields.\n */\n setInitialValues(settings: {\n name: string;\n description: string;\n rtWellKnownName?: string | null;\n columns: number;\n rowHeight: number;\n gap: number;\n variables?: MeshBoardVariable[];\n timeFilter?: MeshBoardTimeFilterConfig;\n }): void {\n this.name = settings.name;\n this.description = settings.description;\n this.rtWellKnownName = settings.rtWellKnownName ?? '';\n this.columns = settings.columns;\n this.rowHeight = settings.rowHeight;\n this.gap = settings.gap;\n this.variables = settings.variables ? [...settings.variables] : [];\n this.timeFilterEnabled = settings.timeFilter?.enabled ?? false;\n }\n\n /**\n * Saves the settings and closes the dialog.\n */\n save(): void {\n if (!this.isValid) {\n return;\n }\n\n const timeFilter: MeshBoardTimeFilterConfig = {\n enabled: this.timeFilterEnabled\n };\n\n const result = new MeshBoardSettingsResult(\n this.name.trim(),\n this.description.trim(),\n this.columns,\n this.rowHeight,\n this.gap,\n this.variables,\n timeFilter,\n this.rtWellKnownName.trim() || undefined\n );\n\n this.dialogRef.close(result);\n }\n\n /**\n * Cancels and closes the dialog.\n */\n cancel(): void {\n this.dialogRef.close();\n }\n}\n","<div class=\"meshboard-settings-dialog\">\n <form class=\"settings-form\">\n <!-- Name Field -->\n <kendo-formfield>\n <kendo-label [for]=\"nameInput\" text=\"Name *\"></kendo-label>\n <kendo-textbox\n #nameInput\n [(ngModel)]=\"name\"\n name=\"name\"\n placeholder=\"Enter MeshBoard name\"\n required>\n </kendo-textbox>\n @if (name.trim().length === 0) {\n <kendo-formerror>Name is required</kendo-formerror>\n }\n </kendo-formfield>\n\n <!-- Description Field -->\n <kendo-formfield>\n <kendo-label [for]=\"descriptionInput\" text=\"Description\"></kendo-label>\n <kendo-textarea\n #descriptionInput\n [(ngModel)]=\"description\"\n name=\"description\"\n placeholder=\"Enter MeshBoard description (optional)\"\n [rows]=\"3\">\n </kendo-textarea>\n </kendo-formfield>\n\n <!-- Well-Known Name Field -->\n <kendo-formfield>\n <kendo-label [for]=\"wellKnownNameInput\" text=\"Well-Known Name\"></kendo-label>\n <kendo-textbox\n #wellKnownNameInput\n [(ngModel)]=\"rtWellKnownName\"\n name=\"rtWellKnownName\"\n placeholder=\"e.g., cockpit, dashboard-main\">\n </kendo-textbox>\n <kendo-formhint>Unique identifier for routing. Use lowercase with hyphens (e.g., 'cockpit', 'sales-dashboard').</kendo-formhint>\n </kendo-formfield>\n\n <!-- Layout Settings -->\n <div class=\"section-title\">Layout Settings</div>\n\n <!-- Columns Field -->\n <kendo-formfield>\n <kendo-label [for]=\"columnsInput\" text=\"Columns *\"></kendo-label>\n <kendo-numerictextbox\n #columnsInput\n [(ngModel)]=\"columns\"\n name=\"columns\"\n [min]=\"1\"\n [max]=\"12\"\n [decimals]=\"0\"\n [format]=\"'n0'\"\n [spinners]=\"true\"\n required>\n </kendo-numerictextbox>\n <kendo-formhint>Number of columns in the grid (1-12)</kendo-formhint>\n @if (columns < 1 || columns > 12) {\n <kendo-formerror>Columns must be between 1 and 12</kendo-formerror>\n }\n </kendo-formfield>\n\n <!-- Row Height Field -->\n <kendo-formfield>\n <kendo-label [for]=\"rowHeightInput\" text=\"Row Height *\"></kendo-label>\n <kendo-numerictextbox\n #rowHeightInput\n [(ngModel)]=\"rowHeight\"\n name=\"rowHeight\"\n [min]=\"100\"\n [max]=\"1000\"\n [decimals]=\"0\"\n [format]=\"'n0'\"\n [spinners]=\"true\"\n required>\n </kendo-numerictextbox>\n <kendo-formhint>Height of each row in pixels (100-1000)</kendo-formhint>\n @if (rowHeight < 100 || rowHeight > 1000) {\n <kendo-formerror>Row height must be between 100 and 1000</kendo-formerror>\n }\n </kendo-formfield>\n\n <!-- Gap Field -->\n <kendo-formfield>\n <kendo-label [for]=\"gapInput\" text=\"Gap *\"></kendo-label>\n <kendo-numerictextbox\n #gapInput\n [(ngModel)]=\"gap\"\n name=\"gap\"\n [min]=\"0\"\n [max]=\"100\"\n [decimals]=\"0\"\n [format]=\"'n0'\"\n [spinners]=\"true\"\n required>\n </kendo-numerictextbox>\n <kendo-formhint>Space between widgets in pixels (0-100)</kendo-formhint>\n @if (gap < 0 || gap > 100) {\n <kendo-formerror>Gap must be between 0 and 100</kendo-formerror>\n }\n </kendo-formfield>\n\n <!-- Variables Section -->\n <mm-variables-editor\n [(variables)]=\"variables\">\n </mm-variables-editor>\n\n <!-- Time Filter Section -->\n <div class=\"section-title\">Time Filter</div>\n\n <kendo-formfield>\n <div class=\"checkbox-wrapper\">\n <input\n type=\"checkbox\"\n kendoCheckBox\n #timeFilterCheckbox\n [(ngModel)]=\"timeFilterEnabled\"\n name=\"timeFilterEnabled\"\n id=\"timeFilterEnabled\"/>\n <kendo-label\n [for]=\"timeFilterCheckbox\"\n text=\"Enable Time Filter\"\n class=\"checkbox-label\">\n </kendo-label>\n </div>\n <kendo-formhint>\n Shows a time range picker in the toolbar. Sets $timeRangeFrom and $timeRangeTo variables.\n </kendo-formhint>\n </kendo-formfield>\n </form>\n\n <!-- Dialog Actions -->\n <kendo-dialog-actions>\n <button kendoButton (click)=\"cancel()\" fillMode=\"flat\">\n Cancel\n </button>\n <button\n kendoButton\n (click)=\"save()\"\n [disabled]=\"!isValid\"\n themeColor=\"primary\">\n Save\n </button>\n </kendo-dialog-actions>\n</div>\n","import { Component, OnInit, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DialogRef, DialogModule } from '@progress/kendo-angular-dialog';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport {\n chartLineIcon,\n chartPieIcon,\n chartColumnStackedIcon,\n tableIcon,\n fileTxtIcon,\n shareIcon,\n heartIcon,\n chartDoughnutIcon,\n gridLayoutIcon,\n checkCircleIcon,\n copyIcon,\n SVGIcon\n} from '@progress/kendo-svg-icons';\n\nimport { WidgetRegistryService } from '../../services/widget-registry.service';\nimport { WidgetType } from '../../models/meshboard.models';\n\n/**\n * Widget type info for display in the dialog.\n */\ninterface WidgetTypeInfo {\n type: WidgetType;\n label: string;\n description: string;\n icon: SVGIcon;\n}\n\n/**\n * Dialog for selecting a widget type to add to the MeshBoard.\n */\n@Component({\n selector: 'mm-add-widget-dialog',\n standalone: true,\n imports: [\n CommonModule,\n ButtonModule,\n DialogModule,\n SVGIconModule\n ],\n templateUrl: './add-widget-dialog.component.html',\n styleUrl: './add-widget-dialog.component.scss'\n})\nexport class AddWidgetDialogComponent implements OnInit {\n private readonly dialogRef = inject(DialogRef);\n private readonly widgetRegistry = inject(WidgetRegistryService);\n\n // Icons\n protected readonly checkCircleIcon = checkCircleIcon;\n\n // State\n protected readonly widgetTypes = signal<WidgetTypeInfo[]>([]);\n protected readonly selectedType = signal<WidgetType | null>(null);\n\n ngOnInit(): void {\n // Load available widget types from registry\n const registeredWidgets = this.widgetRegistry.getRegisteredWidgets();\n\n const widgetTypeInfos: WidgetTypeInfo[] = registeredWidgets.map(widget => ({\n type: widget.type,\n label: widget.label,\n description: this.getWidgetDescription(widget.type),\n icon: this.getWidgetIcon(widget.type)\n }));\n\n this.widgetTypes.set(widgetTypeInfos);\n }\n\n /**\n * Gets the icon for a widget type.\n */\n private getWidgetIcon(type: WidgetType): SVGIcon {\n switch (type) {\n case 'entityCard':\n return fileTxtIcon;\n case 'entityWithAssociations':\n return shareIcon;\n case 'kpi':\n return heartIcon;\n case 'table':\n return tableIcon;\n case 'gauge':\n return chartDoughnutIcon;\n case 'pieChart':\n return chartPieIcon;\n case 'barChart':\n return chartColumnStackedIcon;\n case 'statsGrid':\n return gridLayoutIcon;\n case 'statusIndicator':\n return checkCircleIcon;\n case 'serviceHealth':\n return heartIcon;\n case 'widgetGroup':\n return copyIcon;\n case 'process':\n return chartLineIcon;\n default:\n return chartLineIcon;\n }\n }\n\n /**\n * Gets the description for a widget type.\n */\n private getWidgetDescription(type: WidgetType): string {\n switch (type) {\n case 'entityCard':\n return 'Display a single entity with its attributes in a card layout';\n case 'entityWithAssociations':\n return 'Display an entity with its associated relationships';\n case 'kpi':\n return 'Display a single key performance indicator or metric';\n case 'table':\n return 'Display multiple entities in a table with sorting and filtering';\n case 'gauge':\n return 'Visualize a numeric value as a gauge (arc, circular, linear, or radial)';\n case 'pieChart':\n return 'Display data distribution as a pie or donut chart';\n case 'barChart':\n return 'Display data as vertical or horizontal bars';\n case 'statsGrid':\n return 'Display multiple KPIs in a grid layout';\n case 'statusIndicator':\n return 'Display a boolean status with visual indicator';\n case 'serviceHealth':\n return 'Display service health status with pulse animation';\n case 'widgetGroup':\n return 'Display a repeating group of child widgets from a query or CK type';\n case 'process':\n return 'Display and interact with process diagrams and HMI graphics';\n default:\n return 'Widget for displaying data';\n }\n }\n\n /**\n * Selects a widget type.\n */\n selectType(type: WidgetType): void {\n this.selectedType.set(type);\n }\n\n /**\n * Checks if a widget type is selected.\n */\n isSelected(type: WidgetType): boolean {\n return this.selectedType() === type;\n }\n\n /**\n * Adds the selected widget and closes the dialog.\n */\n add(): void {\n const selected = this.selectedType();\n if (selected) {\n this.dialogRef.close({ widgetType: selected });\n }\n }\n\n /**\n * Cancels and closes the dialog.\n */\n cancel(): void {\n this.dialogRef.close();\n }\n}\n","<div class=\"add-widget-dialog\">\n <div class=\"dialog-content\">\n <p class=\"dialog-description\">\n Select a widget type to add to your MeshBoard:\n </p>\n\n <div class=\"widget-types-list\">\n <div class=\"list-header\">Available Widgets</div>\n\n @for (item of widgetTypes(); track item.type) {\n <div\n class=\"widget-type-item\"\n [class.selected]=\"isSelected(item.type)\"\n (click)=\"selectType(item.type)\">\n <div class=\"widget-icon\">\n <kendo-svg-icon [icon]=\"item.icon\" size=\"large\"></kendo-svg-icon>\n </div>\n <div class=\"widget-info\">\n <h4 class=\"widget-label\">{{ item.label }}</h4>\n <p class=\"widget-description\">{{ item.description }}</p>\n </div>\n @if (isSelected(item.type)) {\n <div class=\"selected-indicator\">\n <kendo-svg-icon [icon]=\"checkCircleIcon\" size=\"medium\"></kendo-svg-icon>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n <button kendoButton (click)=\"cancel()\" fillMode=\"flat\">\n Cancel\n </button>\n <button\n kendoButton\n (click)=\"add()\"\n [disabled]=\"!selectedType()\"\n themeColor=\"primary\">\n Add Widget\n </button>\n </div>\n</div>\n","import { Component, OnInit, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogRef, DialogService, DialogModule } from '@progress/kendo-angular-dialog';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport {\n plusIcon,\n trashIcon,\n pencilIcon,\n checkIcon,\n xIcon,\n gridLayoutIcon,\n downloadIcon,\n uploadIcon\n} from '@progress/kendo-svg-icons';\nimport { AssetRepoService, JobManagementService, TENANT_ID_PROVIDER, TenantIdProvider } from '@meshmakers/octo-services';\nimport { ImportStrategyDialogService } from '@meshmakers/shared-ui';\nimport { firstValueFrom } from 'rxjs';\n\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { PersistedMeshBoard } from '../../services/meshboard-persistence.service';\n\n/**\n * Dialog for managing multiple MeshBoards.\n * Provides actions to switch, create, rename, and delete MeshBoards.\n */\n@Component({\n selector: 'mm-meshboard-manager-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ButtonModule,\n DialogModule,\n InputsModule,\n SVGIconModule\n ],\n templateUrl: './meshboard-manager-dialog.component.html',\n styleUrl: './meshboard-manager-dialog.component.scss'\n})\nexport class MeshBoardManagerDialogComponent implements OnInit {\n private readonly dialogRef = inject(DialogRef);\n private readonly stateService = inject(MeshBoardStateService);\n private readonly dialogService = inject(DialogService);\n private readonly assetRepoService = inject(AssetRepoService);\n private readonly jobManagementService = inject(JobManagementService);\n private readonly importStrategyDialogService = inject(ImportStrategyDialogService);\n\n // Try to get provider from DI first\n private readonly injectedTenantIdProvider = inject(TENANT_ID_PROVIDER, { optional: true });\n\n // Property that can be set by parent when opening dialog dynamically\n public externalTenantIdProvider: TenantIdProvider | null = null;\n\n // Dashboard CK Type ID for export\n private readonly DASHBOARD_CK_TYPE_ID = 'System.UI/Dashboard';\n\n // Separator used in description to encode variables (same as in persistence service)\n private readonly VARIABLES_SEPARATOR = '\\n---MESHBOARD_VARIABLES---\\n';\n\n /**\n * Gets the tenant ID provider from either external property or DI.\n */\n private get tenantIdProvider(): TenantIdProvider | null {\n return this.externalTenantIdProvider ?? this.injectedTenantIdProvider;\n }\n\n // Icons\n protected readonly plusIcon = plusIcon;\n protected readonly trashIcon = trashIcon;\n protected readonly pencilIcon = pencilIcon;\n protected readonly checkIcon = checkIcon;\n protected readonly xIcon = xIcon;\n protected readonly gridLayoutIcon = gridLayoutIcon;\n protected readonly downloadIcon = downloadIcon;\n protected readonly uploadIcon = uploadIcon;\n\n // Export/Import state\n protected readonly isExporting = signal(false);\n protected readonly isImporting = signal(false);\n\n // State - use computed to ensure reactivity\n protected readonly meshBoards = computed(() => this.stateService.availableMeshBoards());\n protected readonly currentMeshBoardId = computed(() => this.stateService.persistedMeshBoardId());\n protected readonly isLoading = signal(false);\n\n // Editing state\n protected readonly editingId = signal<string | null>(null);\n protected readonly editingName = signal('');\n protected readonly editingDescription = signal('');\n\n // Create new state\n protected readonly isCreating = signal(false);\n protected readonly newName = signal('');\n protected readonly newDescription = signal('');\n\n // Computed\n protected readonly hasMeshBoards = computed(() => this.meshBoards().length > 0);\n\n async ngOnInit(): Promise<void> {\n await this.refresh();\n }\n\n /**\n * Refreshes the list of MeshBoards.\n */\n private async refresh(): Promise<void> {\n this.isLoading.set(true);\n try {\n await this.stateService.refreshMeshBoardList();\n } catch (err) {\n console.error('Error refreshing MeshBoard list:', err);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n /**\n * Checks if a MeshBoard is the currently active one.\n */\n isActive(meshBoard: PersistedMeshBoard): boolean {\n return meshBoard.rtId === this.currentMeshBoardId();\n }\n\n /**\n * Gets the display description for a MeshBoard.\n * Strips the encoded variables/timeFilter JSON from the raw description.\n */\n getDisplayDescription(meshBoard: PersistedMeshBoard): string {\n if (!meshBoard.description) {\n return '';\n }\n if (!meshBoard.description.includes(this.VARIABLES_SEPARATOR)) {\n return meshBoard.description;\n }\n return meshBoard.description.split(this.VARIABLES_SEPARATOR)[0];\n }\n\n /**\n * Checks if a MeshBoard is being edited.\n */\n isEditing(meshBoard: PersistedMeshBoard): boolean {\n return this.editingId() === meshBoard.rtId;\n }\n\n /**\n * Switches to a different MeshBoard.\n */\n async switchTo(meshBoard: PersistedMeshBoard): Promise<void> {\n if (this.isActive(meshBoard)) {\n return;\n }\n\n this.isLoading.set(true);\n try {\n await this.stateService.switchToMeshBoard(meshBoard.rtId);\n this.dialogRef.close();\n } catch (err) {\n console.error('Error switching MeshBoard:', err);\n this.isLoading.set(false);\n }\n }\n\n /**\n * Starts editing a MeshBoard.\n */\n startEdit(meshBoard: PersistedMeshBoard): void {\n this.editingId.set(meshBoard.rtId);\n this.editingName.set(meshBoard.name);\n // Use decoded description without the encoded variables/timeFilter\n this.editingDescription.set(this.getDisplayDescription(meshBoard));\n }\n\n /**\n * Cancels editing a MeshBoard.\n */\n cancelEdit(): void {\n this.editingId.set(null);\n this.editingName.set('');\n this.editingDescription.set('');\n }\n\n /**\n * Saves the edited MeshBoard.\n */\n async saveEdit(): Promise<void> {\n const id = this.editingId();\n if (!id || this.editingName().trim().length === 0) {\n return;\n }\n\n this.isLoading.set(true);\n try {\n await this.stateService.renameMeshBoard(\n id,\n this.editingName().trim(),\n this.editingDescription().trim()\n );\n this.cancelEdit();\n } catch (err) {\n console.error('Error renaming MeshBoard:', err);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n /**\n * Deletes a MeshBoard after confirmation.\n */\n async delete(meshBoard: PersistedMeshBoard): Promise<void> {\n const confirmed = await this.confirmDelete(meshBoard.name);\n if (!confirmed) {\n return;\n }\n\n this.isLoading.set(true);\n try {\n await this.stateService.deleteMeshBoard(meshBoard.rtId);\n } catch (err) {\n console.error('Error deleting MeshBoard:', err);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n /**\n * Shows a confirmation dialog before deleting.\n */\n private async confirmDelete(meshBoardName: string): Promise<boolean> {\n const dialogRef = this.dialogService.open({\n title: 'Confirm Delete',\n content: `Are you sure you want to delete \"${meshBoardName}\"? This action cannot be undone.`,\n actions: [\n { text: 'Cancel', fillMode: 'flat' },\n { text: 'Delete', themeColor: 'error', primary: true }\n ],\n width: 450\n });\n\n try {\n const result = await firstValueFrom(dialogRef.result);\n return result && typeof result === 'object' && 'text' in result && result.text === 'Delete';\n } catch {\n // Dialog was closed without action\n return false;\n }\n }\n\n /**\n * Starts creating a new MeshBoard.\n */\n startCreate(): void {\n this.isCreating.set(true);\n this.newName.set('');\n this.newDescription.set('');\n }\n\n /**\n * Cancels creating a new MeshBoard.\n */\n cancelCreate(): void {\n this.isCreating.set(false);\n this.newName.set('');\n this.newDescription.set('');\n }\n\n /**\n * Creates a new MeshBoard.\n */\n async create(): Promise<void> {\n if (this.newName().trim().length === 0) {\n return;\n }\n\n this.isLoading.set(true);\n try {\n await this.stateService.createNewMeshBoard(\n this.newName().trim(),\n this.newDescription().trim()\n );\n this.cancelCreate();\n // Close dialog and show the new MeshBoard\n this.dialogRef.close();\n } catch (err) {\n console.error('Error creating MeshBoard:', err);\n this.isLoading.set(false);\n }\n }\n\n /**\n * Closes the dialog.\n */\n close(): void {\n this.dialogRef.close();\n }\n\n /**\n * Checks if export is available (requires tenant provider).\n */\n get canExport(): boolean {\n return this.tenantIdProvider !== null;\n }\n\n /**\n * Exports a MeshBoard as a deep graph.\n */\n async exportMeshBoard(meshBoard: PersistedMeshBoard, event: Event): Promise<void> {\n event.stopPropagation();\n\n if (!this.tenantIdProvider) {\n console.error('Export not available: MESHBOARD_TENANT_ID_PROVIDER not configured');\n return;\n }\n\n const tenantId = await this.tenantIdProvider();\n if (!tenantId) {\n console.error('Export failed: Could not get tenant ID');\n return;\n }\n\n this.isExporting.set(true);\n try {\n // Start the export job\n const jobId = await this.assetRepoService.exportRtModelDeepGraph(\n tenantId,\n [meshBoard.rtId],\n this.DASHBOARD_CK_TYPE_ID\n );\n\n if (!jobId) {\n throw new Error('Failed to start export job');\n }\n\n // Wait for job to complete with progress dialog\n const success = await this.jobManagementService.waitForJob(\n jobId,\n 'Export MeshBoard',\n `Exporting \"${meshBoard.name}\"`\n );\n\n if (success) {\n // Download the result\n const fileName = `${meshBoard.name.replace(/[^a-zA-Z0-9]/g, '_')}_export.zip`;\n await this.jobManagementService.downloadJobResult(tenantId, jobId, fileName);\n }\n } catch (err) {\n console.error('Error exporting MeshBoard:', err);\n } finally {\n this.isExporting.set(false);\n }\n }\n\n /**\n * Triggers the file input for importing a MeshBoard.\n */\n triggerImport(): void {\n const fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.accept = '.zip';\n fileInput.onchange = async (event: Event) => {\n const target = event.target as HTMLInputElement;\n const file = target.files?.[0];\n if (file) {\n await this.importMeshBoard(file);\n }\n };\n fileInput.click();\n }\n\n /**\n * Imports a MeshBoard from a ZIP file.\n */\n async importMeshBoard(file: File): Promise<void> {\n if (!this.tenantIdProvider) {\n console.error('Import not available: MESHBOARD_TENANT_ID_PROVIDER not configured');\n return;\n }\n\n const tenantId = await this.tenantIdProvider();\n if (!tenantId) {\n console.error('Import failed: Could not get tenant ID');\n return;\n }\n\n const strategy = await this.importStrategyDialogService.showImportStrategyDialog('Import MeshBoard');\n if (strategy === null) return;\n\n this.isImporting.set(true);\n try {\n // Start the import job\n const jobId = await this.assetRepoService.importRtModel(tenantId, file, strategy);\n\n if (!jobId) {\n throw new Error('Failed to start import job');\n }\n\n // Wait for job to complete with progress dialog\n const success = await this.jobManagementService.waitForJob(\n jobId,\n 'Import MeshBoard',\n `Importing \"${file.name}\"`\n );\n\n if (success) {\n // Refresh the list to show the imported MeshBoard\n await this.refresh();\n }\n } catch (err) {\n console.error('Error importing MeshBoard:', err);\n } finally {\n this.isImporting.set(false);\n }\n }\n}\n","<div class=\"meshboard-manager-dialog\">\n <!-- Header with Create/Import Buttons -->\n <div class=\"dialog-header\">\n <p class=\"dialog-description\">Manage your MeshBoards</p>\n <div class=\"header-actions\">\n @if (canExport) {\n <button\n kendoButton\n [svgIcon]=\"uploadIcon\"\n (click)=\"triggerImport()\"\n [disabled]=\"isCreating() || isLoading() || isImporting()\"\n fillMode=\"outline\">\n Import\n </button>\n }\n <button\n kendoButton\n [svgIcon]=\"plusIcon\"\n (click)=\"startCreate()\"\n [disabled]=\"isCreating() || isLoading()\"\n themeColor=\"primary\">\n New MeshBoard\n </button>\n </div>\n </div>\n\n <!-- Create New MeshBoard Form -->\n @if (isCreating()) {\n <div class=\"create-form\">\n <h4 class=\"form-title\">Create New MeshBoard</h4>\n <div class=\"form-fields\">\n <kendo-textbox\n [(ngModel)]=\"newName\"\n placeholder=\"MeshBoard name\"\n [disabled]=\"isLoading()\">\n </kendo-textbox>\n <kendo-textarea\n [(ngModel)]=\"newDescription\"\n placeholder=\"Description (optional)\"\n [rows]=\"2\"\n [disabled]=\"isLoading()\">\n </kendo-textarea>\n </div>\n <div class=\"form-actions\">\n <button\n kendoButton\n [svgIcon]=\"xIcon\"\n (click)=\"cancelCreate()\"\n [disabled]=\"isLoading()\"\n fillMode=\"flat\"\n size=\"small\">\n Cancel\n </button>\n <button\n kendoButton\n [svgIcon]=\"checkIcon\"\n (click)=\"create()\"\n [disabled]=\"newName().trim().length === 0 || isLoading()\"\n themeColor=\"primary\"\n size=\"small\">\n Create\n </button>\n </div>\n </div>\n }\n\n <!-- MeshBoards List -->\n <div class=\"meshboards-list\">\n @if (isLoading()) {\n <div class=\"loading-state\">\n <span class=\"k-loading-text\">Loading...</span>\n </div>\n } @else if (hasMeshBoards()) {\n @for (item of meshBoards(); track item.rtId) {\n <div\n class=\"meshboard-item\"\n [class.active]=\"isActive(item)\"\n [class.editing]=\"isEditing(item)\">\n\n @if (!isEditing(item)) {\n <!-- Display Mode -->\n <div class=\"item-content\" (click)=\"switchTo(item)\">\n <div class=\"item-icon\">\n <kendo-svg-icon [icon]=\"gridLayoutIcon\" size=\"large\"></kendo-svg-icon>\n </div>\n <div class=\"item-info\">\n <h4 class=\"item-name\">\n {{ item.name }}\n @if (isActive(item)) {\n <span class=\"active-badge\">Active</span>\n }\n </h4>\n @if (getDisplayDescription(item)) {\n <p class=\"item-description\">{{ getDisplayDescription(item) }}</p>\n }\n </div>\n <div class=\"item-actions\">\n @if (canExport) {\n <button\n kendoButton\n [svgIcon]=\"downloadIcon\"\n (click)=\"exportMeshBoard(item, $event)\"\n [disabled]=\"isLoading() || isExporting()\"\n fillMode=\"flat\"\n size=\"small\"\n title=\"Export\">\n </button>\n }\n <button\n kendoButton\n [svgIcon]=\"pencilIcon\"\n (click)=\"startEdit(item); $event.stopPropagation()\"\n [disabled]=\"isLoading()\"\n fillMode=\"flat\"\n size=\"small\"\n title=\"Edit\">\n </button>\n <button\n kendoButton\n [svgIcon]=\"trashIcon\"\n (click)=\"delete(item); $event.stopPropagation()\"\n [disabled]=\"isLoading()\"\n fillMode=\"flat\"\n size=\"small\"\n themeColor=\"error\"\n title=\"Delete\">\n </button>\n </div>\n </div>\n } @else {\n <!-- Edit Mode -->\n <div class=\"item-edit\">\n <div class=\"edit-fields\">\n <kendo-textbox\n [(ngModel)]=\"editingName\"\n placeholder=\"MeshBoard name\"\n [disabled]=\"isLoading()\">\n </kendo-textbox>\n <kendo-textarea\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Description (optional)\"\n [rows]=\"2\"\n [disabled]=\"isLoading()\">\n </kendo-textarea>\n </div>\n <div class=\"edit-actions\">\n <button\n kendoButton\n [svgIcon]=\"xIcon\"\n (click)=\"cancelEdit()\"\n [disabled]=\"isLoading()\"\n fillMode=\"flat\"\n size=\"small\">\n Cancel\n </button>\n <button\n kendoButton\n [svgIcon]=\"checkIcon\"\n (click)=\"saveEdit()\"\n [disabled]=\"editingName().trim().length === 0 || isLoading()\"\n themeColor=\"primary\"\n size=\"small\">\n Save\n </button>\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <div class=\"empty-state\">\n <kendo-svg-icon [icon]=\"gridLayoutIcon\" size=\"xlarge\"></kendo-svg-icon>\n <h3>No MeshBoards</h3>\n <p>Create your first MeshBoard to get started.</p>\n </div>\n }\n </div>\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n <button kendoButton (click)=\"close()\" fillMode=\"flat\">\n Close\n </button>\n </div>\n</div>\n","import { Component, EventEmitter, Input, Output, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogModule } from '@progress/kendo-angular-dialog';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { MeshBoardGridService } from '../../services/meshboard-grid.service';\nimport { AnyWidgetConfig } from '../../models/meshboard.models';\n\nexport interface WidgetPositionUpdate {\n id: string;\n title: string;\n col: number;\n row: number;\n colSpan: number;\n rowSpan: number;\n}\n\n@Component({\n selector: 'mm-edit-widget-dialog',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DialogModule,\n InputsModule,\n ButtonsModule\n ],\n template: `\n <kendo-dialog\n title=\"Edit Widget\"\n [minWidth]=\"350\"\n [width]=\"400\"\n (close)=\"onCancel()\">\n\n <div class=\"edit-widget-form\">\n <div class=\"form-field\">\n <label for=\"editWidgetTitle\">Title</label>\n <kendo-textbox\n id=\"editWidgetTitle\"\n [(ngModel)]=\"form.title\"\n placeholder=\"Enter widget title\">\n </kendo-textbox>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-field\">\n <label for=\"editWidgetCol\">Column</label>\n <kendo-numerictextbox\n id=\"editWidgetCol\"\n [(value)]=\"form.col\"\n [min]=\"1\"\n [max]=\"maxColumns\"\n [decimals]=\"0\"\n [format]=\"'n0'\">\n </kendo-numerictextbox>\n </div>\n <div class=\"form-field\">\n <label for=\"editWidgetRow\">Row</label>\n <kendo-numerictextbox\n id=\"editWidgetRow\"\n [(value)]=\"form.row\"\n [min]=\"1\"\n [decimals]=\"0\"\n [format]=\"'n0'\">\n </kendo-numerictextbox>\n </div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-field\">\n <label for=\"editWidgetColSpan\">Width (columns)</label>\n <kendo-numerictextbox\n id=\"editWidgetColSpan\"\n [(value)]=\"form.colSpan\"\n [min]=\"1\"\n [max]=\"maxColumns\"\n [decimals]=\"0\"\n [format]=\"'n0'\">\n </kendo-numerictextbox>\n </div>\n <div class=\"form-field\">\n <label for=\"editWidgetRowSpan\">Height (rows)</label>\n <kendo-numerictextbox\n id=\"editWidgetRowSpan\"\n [(value)]=\"form.rowSpan\"\n [min]=\"1\"\n [decimals]=\"0\"\n [format]=\"'n0'\">\n </kendo-numerictextbox>\n </div>\n </div>\n\n @if (error) {\n <div class=\"form-error\">{{ error }}</div>\n }\n </div>\n\n <kendo-dialog-actions>\n <button kendoButton fillMode=\"flat\" (click)=\"onCancel()\">Cancel</button>\n <button\n kendoButton\n themeColor=\"primary\"\n (click)=\"onSave()\">\n Save\n </button>\n </kendo-dialog-actions>\n\n </kendo-dialog>\n `,\n styles: [`\n .edit-widget-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 8px 0;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n label {\n font-weight: 500;\n font-size: 0.875rem;\n color: var(--kendo-color-on-app-surface, #212529);\n }\n }\n\n .form-row {\n display: flex;\n gap: 16px;\n\n .form-field {\n flex: 1;\n }\n }\n\n .form-error {\n color: var(--kendo-color-error, #dc3545);\n font-size: 0.875rem;\n padding: 8px;\n background: var(--kendo-color-error-subtle, rgba(220, 53, 69, 0.1));\n border-radius: 4px;\n }\n `]\n})\nexport class EditWidgetDialogComponent implements OnInit {\n @Input() widget!: AnyWidgetConfig;\n @Input() widgets: AnyWidgetConfig[] = [];\n @Input() maxColumns = 6;\n @Input() gridService!: MeshBoardGridService;\n\n @Output() save = new EventEmitter<WidgetPositionUpdate>();\n @Output() cancelled = new EventEmitter<void>();\n\n form: WidgetPositionUpdate = {\n id: '',\n title: '',\n col: 1,\n row: 1,\n colSpan: 1,\n rowSpan: 1\n };\n\n error = '';\n\n ngOnInit(): void {\n // Copy widget data to form\n this.form = {\n id: this.widget.id,\n title: this.widget.title,\n col: this.widget.col,\n row: this.widget.row,\n colSpan: this.widget.colSpan,\n rowSpan: this.widget.rowSpan\n };\n }\n\n onSave(): void {\n // Validate: check for overlaps\n const wouldOverlap = this.gridService.wouldCauseOverlap(\n this.widgets,\n this.form.id,\n this.form.col,\n this.form.row,\n this.form.colSpan,\n this.form.rowSpan\n );\n\n if (wouldOverlap) {\n this.error = 'Position overlaps with another widget. Please choose a different position.';\n return;\n }\n\n // Validate: check bounds\n if (this.gridService.isOutOfBounds(this.form.col, this.form.colSpan, this.maxColumns)) {\n this.error = 'Widget extends beyond the grid. Reduce column or width.';\n return;\n }\n\n this.save.emit(this.form);\n }\n\n onCancel(): void {\n this.cancelled.emit();\n }\n}\n","import { Component, OnInit, inject, signal, computed, ViewContainerRef, Type, ComponentRef, OnDestroy, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router, ActivatedRoute, RouterModule } from '@angular/router';\nimport { TileLayoutModule } from '@progress/kendo-angular-layout';\nimport { ButtonModule } from '@progress/kendo-angular-buttons';\nimport { DialogService, DialogModule } from '@progress/kendo-angular-dialog';\nimport { firstValueFrom } from 'rxjs';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport {\n gearIcon,\n plusIcon,\n saveIcon,\n arrowRotateCwIcon,\n pencilIcon,\n xIcon,\n linkIcon,\n trashIcon,\n gridLayoutIcon\n} from '@progress/kendo-svg-icons';\n\nimport { MeshBoardStateService } from '../../services/meshboard-state.service';\nimport { EditModeStateService } from '../../services/edit-mode-state.service';\nimport { WidgetFactoryService } from '../../services/widget-factory.service';\nimport { WidgetRegistryService } from '../../services/widget-registry.service';\nimport { MeshBoardDataService } from '../../services/meshboard-data.service';\nimport { MeshBoardGridService } from '../../services/meshboard-grid.service';\nimport { AnyWidgetConfig, WidgetType, MeshBoardConfig, TimeRangeSelection } from '../../models/meshboard.models';\nimport { MeshBoardSettingsDialogComponent, MeshBoardSettingsResult } from '../../dialogs/meshboard-settings-dialog/meshboard-settings-dialog.component';\nimport { AddWidgetDialogComponent } from '../../dialogs/add-widget-dialog/add-widget-dialog.component';\nimport { MeshBoardManagerDialogComponent } from '../../dialogs/meshboard-manager-dialog/meshboard-manager-dialog.component';\nimport { EditWidgetDialogComponent, WidgetPositionUpdate } from '../../dialogs/edit-widget-dialog/edit-widget-dialog.component';\nimport { TENANT_ID_PROVIDER } from '@meshmakers/octo-services';\nimport {\n HasUnsavedChanges,\n HAS_UNSAVED_CHANGES,\n UnsavedChangesDirective,\n TimeRangePickerComponent,\n TimeRange,\n TimeRangeUtils,\n TimeRangeSelection as SharedTimeRangeSelection\n} from '@meshmakers/shared-ui';\n\n/**\n * Main container component that displays a MeshBoard with widgets in a grid layout.\n * Provides toolbar for settings, adding widgets, saving, and refreshing.\n */\n@Component({\n selector: 'mm-meshboard-view',\n standalone: true,\n imports: [\n CommonModule,\n RouterModule,\n TileLayoutModule,\n ButtonModule,\n DialogModule,\n SVGIconModule,\n EditWidgetDialogComponent,\n TimeRangePickerComponent\n ],\n hostDirectives: [UnsavedChangesDirective],\n providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: MeshBoardViewComponent }],\n templateUrl: './meshboard-view.component.html',\n styleUrl: './meshboard-view.component.scss'\n})\nexport class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedChanges {\n private readonly stateService = inject(MeshBoardStateService);\n private readonly editModeService = inject(EditModeStateService);\n private readonly widgetFactory = inject(WidgetFactoryService);\n private readonly widgetRegistry = inject(WidgetRegistryService);\n private readonly dataService = inject(MeshBoardDataService);\n private readonly dialogService = inject(DialogService);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n protected readonly gridService = inject(MeshBoardGridService);\n private readonly tenantIdProvider = inject(TENANT_ID_PROVIDER, { optional: true });\n\n // Track the last known rtId to avoid unnecessary navigation\n private lastNavigatedRtId: string | null = null;\n\n // Icons\n protected readonly gearIcon = gearIcon;\n protected readonly plusIcon = plusIcon;\n protected readonly saveIcon = saveIcon;\n protected readonly arrowRotateCwIcon = arrowRotateCwIcon;\n protected readonly pencilIcon = pencilIcon;\n protected readonly xIcon = xIcon;\n protected readonly linkIcon = linkIcon;\n protected readonly trashIcon = trashIcon;\n protected readonly gridLayoutIcon = gridLayoutIcon;\n\n // Edit widget dialog state\n protected showEditWidgetDialog = false;\n protected editingWidget: AnyWidgetConfig | null = null;\n\n // Config dialog state - using ComponentRef to create dialog dynamically\n private configDialogRef: ComponentRef<any> | null = null;\n\n // State signals\n protected readonly config = this.stateService.meshBoardConfig;\n protected readonly isEditMode = this.editModeService.isEditMode;\n protected readonly isSaving = this.editModeService.isSaving;\n protected readonly isLoading = this.stateService.isLoading;\n protected readonly isModelAvailable = this.stateService.isModelAvailable;\n\n // Local UI state\n private readonly _isInitialized = signal(false);\n protected readonly isInitialized = this._isInitialized.asReadonly();\n private readonly _notFoundError = signal<string | null>(null);\n protected readonly notFoundError = this._notFoundError.asReadonly();\n\n // Computed link to MeshBoard page with tenant\n protected readonly meshBoardPageLink = computed(() => {\n // Get tenant from route parameters (synchronously from snapshot)\n const tenantId = this.route.snapshot.paramMap.get('tenantId')\n || this.route.parent?.snapshot.paramMap.get('tenantId')\n || this.route.root.firstChild?.snapshot.paramMap.get('tenantId');\n return tenantId ? `/${tenantId}/ui/meshboards` : '/ui/meshboards';\n });\n\n // Computed\n protected readonly hasWidgets = computed(() => this.config().widgets.length > 0);\n protected readonly canSave = computed(() => this.isEditMode() && !this.isSaving());\n\n // Time Filter computed signals\n protected readonly isTimeFilterEnabled = computed(() => this.stateService.isTimeFilterEnabled());\n protected readonly timeFilterConfig = computed(() => this.stateService.getTimeFilterConfig());\n protected readonly initialTimeSelection = computed(() => {\n const selection = this.timeFilterConfig()?.selection;\n if (!selection) return undefined;\n // Convert our TimeRangeSelection to shared-ui TimeRangeSelection\n // Handle customFrom/customTo as Date objects\n return {\n ...selection,\n customFrom: selection.customFrom ? new Date(selection.customFrom) : undefined,\n customTo: selection.customTo ? new Date(selection.customTo) : undefined\n } as SharedTimeRangeSelection;\n });\n\n constructor() {\n // Effect to sync URL when dashboard changes\n effect(() => {\n const currentRtId = this.stateService.persistedMeshBoardId();\n if (currentRtId && currentRtId !== this.lastNavigatedRtId) {\n this.lastNavigatedRtId = currentRtId;\n this.updateUrlWithRtId(currentRtId);\n // Initialize time filter variables when switching to a different MeshBoard\n this.initializeTimeFilterVariables();\n }\n });\n }\n\n /**\n * Updates the URL to include the current MeshBoard rtId.\n */\n private updateUrlWithRtId(rtId: string): void {\n const currentUrl = this.router.url;\n\n // Check if we're already on a meshboard/:rtId route or just /meshboard\n if (currentUrl.includes('/meshboard/')) {\n // Replace the rtId in the URL\n const newUrl = currentUrl.replace(/\\/meshboard\\/[^/]+/, `/meshboard/${rtId}`);\n this.router.navigateByUrl(newUrl, { replaceUrl: true });\n } else if (currentUrl.endsWith('/meshboard')) {\n // Append the rtId\n this.router.navigateByUrl(`${currentUrl}/${rtId}`, { replaceUrl: true });\n }\n }\n\n async ngOnInit(): Promise<void> {\n // Reset edit mode state when entering the page to clear any lingering state from previous sessions\n this.editModeService.reset();\n\n try {\n // Get rtId from route parameter\n const rtIdFromRoute = this.route.snapshot.paramMap.get('rtId');\n // Get meshBoardWellKnownName from route data (for pre-configured routes)\n const wellKnownName = this.route.snapshot.data['meshBoardWellKnownName'] as string | undefined;\n\n if (rtIdFromRoute) {\n // Load specific MeshBoard from URL parameter\n this.lastNavigatedRtId = rtIdFromRoute;\n await this.loadMeshBoardById(rtIdFromRoute);\n } else if (wellKnownName) {\n // Load MeshBoard by well-known name from route data\n const widgets = await this.stateService.switchToMeshBoardByWellKnownName(wellKnownName);\n if (widgets) {\n await this.preloadWidgetData(widgets);\n } else {\n // Show error if MeshBoard with well-known name not found\n this._notFoundError.set(`MeshBoard '${wellKnownName}' not found. Please create a MeshBoard with this Well-Known Name.`);\n }\n } else {\n // Load initial MeshBoard (first available)\n const widgets = await this.stateService.loadInitialMeshBoard();\n await this.preloadWidgetData(widgets);\n }\n\n // Initialize time filter variables if enabled with stored selection\n this.initializeTimeFilterVariables();\n\n this._isInitialized.set(true);\n } catch (err) {\n console.error('Error initializing MeshBoard view:', err);\n this._isInitialized.set(true);\n }\n }\n\n /**\n * Loads a specific MeshBoard by its rtId.\n */\n private async loadMeshBoardById(rtId: string): Promise<void> {\n // First ensure model is available and get list of meshboards\n const widgets = await this.stateService.loadInitialMeshBoard();\n\n // Check if the requested MeshBoard exists\n const meshBoards = this.stateService.availableMeshBoards();\n const exists = meshBoards.some(mb => mb.rtId === rtId);\n\n if (exists) {\n // Switch to the requested MeshBoard\n const switchedWidgets = await this.stateService.switchToMeshBoard(rtId);\n await this.preloadWidgetData(switchedWidgets);\n } else {\n // MeshBoard not found - use whatever was loaded initially\n console.warn(`MeshBoard with rtId ${rtId} not found, using default`);\n await this.preloadWidgetData(widgets);\n }\n }\n\n ngOnDestroy(): void {\n this.closeConfigDialog();\n }\n\n /**\n * Preloads data for all widgets to improve initial rendering performance.\n */\n private async preloadWidgetData(widgets: AnyWidgetConfig[]): Promise<void> {\n const promises = widgets.map(widget => {\n if (widget.dataSource.type === 'runtimeEntity') {\n return this.dataService.fetchData(widget.dataSource).toPromise();\n }\n if (widget.dataSource.type === 'aggregation') {\n return this.dataService.fetchAggregations(widget.dataSource.queries);\n }\n if (widget.dataSource.type === 'constructionKitQuery') {\n return this.dataService.fetchCkQueryData(widget.dataSource);\n }\n return Promise.resolve(null);\n });\n\n await Promise.all(promises);\n }\n\n /**\n * Initializes time filter variables based on the stored selection.\n * Called after loading a MeshBoard to ensure time filter variables are set.\n */\n private initializeTimeFilterVariables(): void {\n const timeFilter = this.stateService.getTimeFilterConfig();\n if (!timeFilter?.enabled || !timeFilter.selection) {\n return;\n }\n\n // Convert stored selection to shared-ui format for TimeRangeUtils\n const sharedSelection: SharedTimeRangeSelection = {\n ...timeFilter.selection,\n customFrom: timeFilter.selection.customFrom ? new Date(timeFilter.selection.customFrom) : undefined,\n customTo: timeFilter.selection.customTo ? new Date(timeFilter.selection.customTo) : undefined\n };\n\n // Calculate the current time range from the selection\n const range = TimeRangeUtils.getTimeRangeFromSelection(sharedSelection);\n if (!range) {\n return;\n }\n\n // Convert to ISO strings and set the variables\n const rangeISO = TimeRangeUtils.toISO(range);\n this.stateService.setTimeFilterVariables(rangeISO.from, rangeISO.to);\n }\n\n /**\n * Gets the component type for a widget based on its type.\n */\n getWidgetComponentType(type: WidgetType): Type<unknown> | undefined {\n return this.widgetRegistry.getWidgetComponent(type);\n }\n\n /**\n * Toggles edit mode.\n */\n toggleEditMode(): void {\n const currentConfig = this.stateService.getConfig();\n this.editModeService.toggleEditMode(currentConfig);\n }\n\n /**\n * Cancels edit mode and restores original state.\n */\n cancelEdit(): void {\n const restored = this.editModeService.cancelEdit<MeshBoardConfig>();\n if (restored) {\n this.stateService.setConfig(restored);\n }\n }\n\n /**\n * Opens the settings dialog.\n */\n async openSettings(): Promise<void> {\n const dialogRef = this.dialogService.open({\n content: MeshBoardSettingsDialogComponent,\n title: 'MeshBoard Settings',\n width: 500,\n height: 600,\n maxHeight: '80vh'\n });\n\n const instance = dialogRef.content.instance as MeshBoardSettingsDialogComponent;\n const currentSettings = this.stateService.getCurrentSettings();\n instance.setInitialValues(currentSettings);\n\n try {\n // Use firstValueFrom to properly await the Observable\n const result = await firstValueFrom(dialogRef.result);\n\n if (result instanceof MeshBoardSettingsResult) {\n this.stateService.updateSettings(result);\n\n // Enter edit mode if not already in it\n if (!this.isEditMode()) {\n this.editModeService.enterEditMode(this.stateService.getConfig());\n }\n }\n } catch {\n // Dialog was closed without action\n }\n }\n\n /**\n * Opens the add widget dialog.\n */\n async openAddWidget(): Promise<void> {\n const dialogRef = this.dialogService.open({\n content: AddWidgetDialogComponent,\n title: 'Add Widget',\n width: 600\n });\n\n try {\n // Use firstValueFrom to properly await the Observable\n const result = await firstValueFrom(dialogRef.result);\n\n if (result && typeof result === 'object' && 'widgetType' in result) {\n const widgetType = result.widgetType as WidgetType;\n this.addWidget(widgetType);\n }\n } catch {\n // Dialog was closed without action\n }\n }\n\n /**\n * Opens the MeshBoard manager dialog.\n */\n async openManager(): Promise<void> {\n const dialogRef = this.dialogService.open({\n content: MeshBoardManagerDialogComponent,\n title: 'Manage MeshBoards',\n width: 700,\n height: 500\n });\n\n // Pass the tenantIdProvider to the dialog component instance\n const dialogInstance = dialogRef.content.instance as MeshBoardManagerDialogComponent;\n if (this.tenantIdProvider && dialogInstance) {\n dialogInstance.externalTenantIdProvider = this.tenantIdProvider;\n }\n }\n\n /**\n * Adds a widget to the MeshBoard.\n */\n private addWidget(type: WidgetType): void {\n const config = this.stateService.getConfig();\n const defaultSize = this.widgetRegistry.getDefaultSize(type);\n\n // Find a free position in the grid\n const position = this.findFreePosition(config.widgets, config.columns, defaultSize);\n\n const widget = this.widgetFactory.createWidget({\n type,\n title: `New ${type} Widget`,\n col: position.col,\n row: position.row,\n colSpan: defaultSize.colSpan,\n rowSpan: defaultSize.rowSpan\n });\n\n this.stateService.addWidget(widget);\n\n // Enter edit mode if not already in it\n if (!this.isEditMode()) {\n this.editModeService.enterEditMode(this.stateService.getConfig());\n }\n }\n\n /**\n * Finds a free position in the grid for a new widget.\n */\n private findFreePosition(\n widgets: AnyWidgetConfig[],\n columns: number,\n size: { colSpan: number; rowSpan: number }\n ): { col: number; row: number } {\n // Simple algorithm: find the first free slot\n let row = 1;\n let col = 1;\n\n while (this.isPositionOccupied(widgets, col, row, size.colSpan, size.rowSpan)) {\n col++;\n if (col + size.colSpan - 1 > columns) {\n col = 1;\n row++;\n }\n }\n\n return { col, row };\n }\n\n /**\n * Checks if a position is occupied by existing widgets.\n */\n private isPositionOccupied(\n widgets: AnyWidgetConfig[],\n col: number,\n row: number,\n colSpan: number,\n rowSpan: number\n ): boolean {\n return widgets.some(widget => {\n const widgetEndCol = widget.col + widget.colSpan - 1;\n const widgetEndRow = widget.row + widget.rowSpan - 1;\n const newEndCol = col + colSpan - 1;\n const newEndRow = row + rowSpan - 1;\n\n return (\n col <= widgetEndCol &&\n newEndCol >= widget.col &&\n row <= widgetEndRow &&\n newEndRow >= widget.row\n );\n });\n }\n\n /**\n * Saves the MeshBoard.\n */\n async save(): Promise<void> {\n this.editModeService.beginSave();\n\n try {\n await this.stateService.saveMeshBoard();\n this.editModeService.completeSave();\n } catch (err) {\n console.error('Error saving MeshBoard:', err);\n this.editModeService.failSave();\n }\n }\n\n /**\n * Refreshes all widget data.\n */\n refresh(): void {\n this.stateService.triggerRefresh();\n }\n\n // ============================================================================\n // Time Filter Event Handlers\n // ============================================================================\n\n /**\n * Handles time range change from the time range picker.\n * Triggers a refresh of all widgets to apply the new filter.\n */\n onTimeRangeChange(_range: TimeRange): void {\n // Trigger widget refresh when time range changes\n this.refresh();\n }\n\n /**\n * Handles time selection change from the time range picker.\n * Updates the time filter variables and persists the selection.\n */\n onTimeSelectionChange(sharedSelection: SharedTimeRangeSelection): void {\n // Convert shared-ui selection to our model\n const selection: TimeRangeSelection = {\n type: sharedSelection.type,\n year: sharedSelection.year,\n quarter: sharedSelection.quarter,\n month: sharedSelection.month,\n relativeValue: sharedSelection.relativeValue,\n relativeUnit: sharedSelection.relativeUnit,\n customFrom: sharedSelection.customFrom?.toISOString(),\n customTo: sharedSelection.customTo?.toISOString()\n };\n\n // Check if the selection has actually changed to prevent infinite loop\n // (TimeRangePicker emits selectionChange on init and when initialSelection changes)\n const currentSelection = this.stateService.getTimeFilterConfig()?.selection;\n if (currentSelection && this.isSelectionEqual(currentSelection, selection)) {\n return;\n }\n\n // Calculate the time range from the selection\n const range = TimeRangeUtils.getTimeRangeFromSelection(sharedSelection);\n if (!range) return;\n\n // Convert to ISO strings\n const rangeISO = TimeRangeUtils.toISO(range);\n\n // Update state with new selection and time range values\n this.stateService.updateTimeFilterSelection(selection, rangeISO.from, rangeISO.to);\n }\n\n /**\n * Compares two TimeRangeSelection objects for equality.\n */\n private isSelectionEqual(a: TimeRangeSelection, b: TimeRangeSelection): boolean {\n return (\n a.type === b.type &&\n a.year === b.year &&\n a.quarter === b.quarter &&\n a.month === b.month &&\n a.relativeValue === b.relativeValue &&\n a.relativeUnit === b.relativeUnit &&\n a.customFrom === b.customFrom &&\n a.customTo === b.customTo\n );\n }\n\n /**\n * Removes a widget from the MeshBoard.\n */\n removeWidget(widgetId: string): void {\n this.stateService.removeWidget(widgetId);\n\n // Enter edit mode if not already in it\n if (!this.isEditMode()) {\n this.editModeService.enterEditMode(this.stateService.getConfig());\n }\n }\n\n /**\n * Opens the configuration dialog for a widget.\n * Creates the dialog component dynamically using ViewContainerRef to avoid\n * double-wrapping with DialogService (config dialogs have their own kendo-dialog).\n */\n openWidgetConfig(widget: AnyWidgetConfig): void {\n const registration = this.widgetRegistry.getRegistration(widget.type);\n if (!registration?.configDialogComponent) {\n console.warn(`No config dialog for widget type: ${widget.type}`);\n return;\n }\n\n // Close any existing config dialog\n this.closeConfigDialog();\n\n const initialConfig = registration.getInitialConfig?.(widget) ?? {};\n\n // Create the component dynamically - it will render its own kendo-dialog\n this.configDialogRef = this.viewContainerRef.createComponent(registration.configDialogComponent);\n\n // Set inputs using the new setInput API\n Object.entries(initialConfig).forEach(([key, value]) => {\n this.configDialogRef!.setInput(key, value);\n });\n\n // Subscribe to outputs\n const instance = this.configDialogRef.instance;\n\n if (instance.save) {\n instance.save.subscribe((result: any) => {\n if (registration.applyConfigResult) {\n const updatedWidget = registration.applyConfigResult(widget, result);\n this.stateService.updateWidget(widget.id, () => updatedWidget);\n\n // Enter edit mode if not already in it\n if (!this.isEditMode()) {\n this.editModeService.enterEditMode(this.stateService.getConfig());\n }\n }\n this.closeConfigDialog();\n });\n }\n\n if (instance.cancelled) {\n instance.cancelled.subscribe(() => {\n this.closeConfigDialog();\n });\n }\n }\n\n /**\n * Closes the configuration dialog if open.\n */\n private closeConfigDialog(): void {\n if (this.configDialogRef) {\n this.configDialogRef.destroy();\n this.configDialogRef = null;\n }\n }\n\n /**\n * Handles TileLayout reorder events.\n */\n onReorder(event: { newIndex: number; oldIndex: number }): void {\n // TileLayout handles the DOM reordering, we just need to update our state\n const config = this.stateService.getConfig();\n const widgets = [...config.widgets];\n const [movedWidget] = widgets.splice(event.oldIndex, 1);\n widgets.splice(event.newIndex, 0, movedWidget);\n\n this.stateService.updateConfig(c => ({ ...c, widgets }));\n\n // Enter edit mode if not already in it\n if (!this.isEditMode()) {\n this.editModeService.enterEditMode(this.stateService.getConfig());\n }\n }\n\n /**\n * Handles TileLayout resize events.\n */\n onResize(event: any): void {\n // Extract the resized item from the event\n const item = event.item || event;\n\n // Find the widget in our config that matches this item\n const config = this.stateService.getConfig();\n const widgetIndex = config.widgets.findIndex(w =>\n w.col === item.col && w.row === item.row\n );\n\n if (widgetIndex !== -1) {\n const widget = config.widgets[widgetIndex];\n\n // Update the widget configuration with new size\n this.stateService.updateWidget(widget.id, w => ({\n ...w,\n col: item.col,\n row: item.row,\n colSpan: item.colSpan,\n rowSpan: item.rowSpan\n }));\n\n // Enter edit mode if not already in it\n if (!this.isEditMode()) {\n this.editModeService.enterEditMode(this.stateService.getConfig());\n }\n }\n }\n\n /**\n * Track by function for widget rendering.\n */\n trackByWidgetId(_index: number, widget: AnyWidgetConfig): string {\n return widget.id;\n }\n\n /**\n * Checks if a widget is unconfigured (needs data source setup).\n */\n isWidgetUnconfigured(widget: AnyWidgetConfig): boolean {\n const dataSource = (widget as any).dataSource;\n if (!dataSource) return true;\n\n if (dataSource.type === 'runtimeEntity') {\n return !dataSource.rtId && !dataSource.ckTypeId;\n }\n if (dataSource.type === 'persistentQuery') {\n return !dataSource.queryRtId;\n }\n if (dataSource.type === 'repeaterQuery') {\n // Widget Group needs either a query or a CK type\n return !dataSource.queryRtId && !dataSource.ckTypeId;\n }\n return false;\n }\n\n /**\n * Checks if a widget type supports configuration.\n */\n supportsConfiguration(widget: AnyWidgetConfig): boolean {\n const registration = this.widgetRegistry.getRegistration(widget.type);\n return !!registration?.configDialogComponent;\n }\n\n /**\n * Opens the edit widget dialog for position/size editing.\n */\n openEditWidgetDialog(widget: AnyWidgetConfig): void {\n this.editingWidget = widget;\n this.showEditWidgetDialog = true;\n }\n\n /**\n * Handles save from the edit widget dialog.\n */\n onEditWidgetSave(update: WidgetPositionUpdate): void {\n this.stateService.updateWidget(update.id, w => ({\n ...w,\n title: update.title,\n col: update.col,\n row: update.row,\n colSpan: update.colSpan,\n rowSpan: update.rowSpan\n }));\n\n this.closeEditWidgetDialog();\n\n // Enter edit mode if not already in it\n if (!this.isEditMode()) {\n this.editModeService.enterEditMode(this.stateService.getConfig());\n }\n }\n\n /**\n * Closes the edit widget dialog.\n */\n closeEditWidgetDialog(): void {\n this.showEditWidgetDialog = false;\n this.editingWidget = null;\n }\n\n // === HasUnsavedChanges interface implementation ===\n\n /**\n * Checks if there are unsaved changes in the MeshBoard.\n * Returns true if in edit mode with a snapshot (indicating changes).\n */\n hasUnsavedChanges(): boolean {\n return this.editModeService.hasUnsavedChanges();\n }\n\n /**\n * Saves the MeshBoard and returns true if successful.\n * This is called by the UnsavedChangesGuard when the user chooses to save.\n */\n async saveChanges(): Promise<boolean> {\n try {\n await this.save();\n return true;\n } catch {\n return false;\n }\n }\n}\n","<div class=\"meshboard-view\">\n @if (isLoading()) {\n <div class=\"loading-container\">\n <div class=\"k-loading-mask\">\n <span class=\"k-loading-text\">Loading MeshBoard...</span>\n <div class=\"k-loading-image\"></div>\n <div class=\"k-loading-color\"></div>\n </div>\n </div>\n } @else if (isModelAvailable() === false) {\n <div class=\"model-unavailable\">\n <div class=\"message-card\">\n <kendo-svg-icon [icon]=\"xIcon\" size=\"xlarge\"></kendo-svg-icon>\n <h2>MeshBoard Not Available</h2>\n <p>The MeshBoard feature requires the CK model 'System.UI' version 1.0.1 or higher.</p>\n <p>Please install the required model in your tenant to use this feature.</p>\n </div>\n </div>\n } @else if (notFoundError()) {\n <div class=\"model-unavailable\">\n <div class=\"message-card\">\n <kendo-svg-icon [icon]=\"xIcon\" size=\"xlarge\"></kendo-svg-icon>\n <h2>MeshBoard Not Found</h2>\n <p>{{ notFoundError() }}</p>\n <p>To create a MeshBoard with a Well-Known Name:</p>\n <ol>\n <li>Go to the <a [routerLink]=\"meshBoardPageLink()\">MeshBoard</a> page</li>\n <li>Open Settings</li>\n <li>Set the \"Well-Known Name\" field</li>\n <li>Save the MeshBoard</li>\n </ol>\n </div>\n </div>\n } @else if (isInitialized()) {\n <!-- Toolbar -->\n <div class=\"meshboard-toolbar\">\n <div class=\"toolbar-left\">\n <h2 class=\"meshboard-title\">{{ config().name }}</h2>\n @if (config().description) {\n <span class=\"meshboard-description\">{{ config().description }}</span>\n }\n </div>\n\n <!-- Time Filter (center) -->\n @if (isTimeFilterEnabled()) {\n <div class=\"toolbar-center\">\n <mm-time-range-picker\n [config]=\"timeFilterConfig()?.pickerConfig ?? {}\"\n [initialSelection]=\"initialTimeSelection()\"\n (rangeChange)=\"onTimeRangeChange($event)\"\n (selectionChange)=\"onTimeSelectionChange($event)\">\n </mm-time-range-picker>\n </div>\n }\n\n <div class=\"toolbar-right\">\n <!-- Manager Button (icon only) -->\n <button\n kendoButton\n [svgIcon]=\"gridLayoutIcon\"\n (click)=\"openManager()\"\n title=\"Manage MeshBoards\"\n fillMode=\"flat\">\n </button>\n\n <!-- Settings Button (icon only) -->\n <button\n kendoButton\n [svgIcon]=\"gearIcon\"\n (click)=\"openSettings()\"\n title=\"MeshBoard Settings\"\n fillMode=\"flat\">\n </button>\n\n <!-- Refresh Button (icon only) -->\n <button\n kendoButton\n [svgIcon]=\"arrowRotateCwIcon\"\n (click)=\"refresh()\"\n title=\"Refresh All Widgets\"\n fillMode=\"flat\">\n </button>\n\n <!-- Edit Mode Toggle (icon only) -->\n @if (!isEditMode()) {\n <button\n kendoButton\n [svgIcon]=\"pencilIcon\"\n (click)=\"toggleEditMode()\"\n title=\"Enter Edit Mode\"\n fillMode=\"flat\">\n </button>\n } @else {\n <button\n kendoButton\n [svgIcon]=\"xIcon\"\n (click)=\"cancelEdit()\"\n title=\"Cancel Edit Mode\"\n fillMode=\"flat\">\n </button>\n }\n\n <!-- Add Widget Button (with text) -->\n <button\n kendoButton\n [svgIcon]=\"plusIcon\"\n (click)=\"openAddWidget()\"\n title=\"Add Widget\"\n fillMode=\"flat\"\n themeColor=\"primary\">\n Add Widget\n </button>\n\n <!-- Save Button (with text) -->\n @if (canSave()) {\n <button\n kendoButton\n [svgIcon]=\"saveIcon\"\n (click)=\"save()\"\n [disabled]=\"isSaving()\"\n title=\"Save MeshBoard\"\n fillMode=\"solid\"\n themeColor=\"primary\">\n {{ isSaving() ? 'Saving...' : 'Save' }}\n </button>\n }\n </div>\n </div>\n\n <!-- MeshBoard Grid -->\n @if (hasWidgets()) {\n <kendo-tilelayout\n [columns]=\"config().columns\"\n [rowHeight]=\"config().rowHeight\"\n [gap]=\"config().gap\"\n [resizable]=\"isEditMode()\"\n [reorderable]=\"isEditMode()\"\n (reorder)=\"onReorder($event)\"\n (resize)=\"onResize($event)\">\n @for (widget of config().widgets; track trackByWidgetId($index, widget)) {\n <kendo-tilelayout-item\n [col]=\"widget.col\"\n [row]=\"widget.row\"\n [colSpan]=\"widget.colSpan\"\n [rowSpan]=\"widget.rowSpan\">\n <kendo-tilelayout-item-header>\n <div class=\"widget-header\" [class.unconfigured]=\"isWidgetUnconfigured(widget)\">\n <span class=\"widget-title\">{{ widget.title }}</span>\n @if (isWidgetUnconfigured(widget) && !isEditMode()) {\n <span class=\"unconfigured-badge\" title=\"Widget needs configuration\">!</span>\n }\n @if (isEditMode()) {\n <div class=\"widget-actions\">\n @if (supportsConfiguration(widget)) {\n <button\n kendoButton\n [svgIcon]=\"linkIcon\"\n (click)=\"openWidgetConfig(widget)\"\n fillMode=\"flat\"\n size=\"small\"\n class=\"config-widget-btn\"\n [class.needs-config]=\"isWidgetUnconfigured(widget)\"\n [title]=\"isWidgetUnconfigured(widget) ? 'Configure data source (required)' : 'Configure data source'\">\n </button>\n }\n <button\n kendoButton\n [svgIcon]=\"gearIcon\"\n (click)=\"openEditWidgetDialog(widget)\"\n fillMode=\"flat\"\n size=\"small\"\n class=\"edit-widget-btn\"\n title=\"Edit position\">\n </button>\n <button\n kendoButton\n [svgIcon]=\"trashIcon\"\n (click)=\"removeWidget(widget.id)\"\n fillMode=\"flat\"\n size=\"small\"\n class=\"remove-widget-btn\"\n title=\"Delete widget\">\n </button>\n </div>\n }\n </div>\n </kendo-tilelayout-item-header>\n <kendo-tilelayout-item-body>\n @if (getWidgetComponentType(widget.type); as componentType) {\n <ng-container *ngComponentOutlet=\"componentType; inputs: { config: widget }\"></ng-container>\n } @else {\n <div class=\"widget-error\">\n <p>Unknown widget type: {{ widget.type }}</p>\n </div>\n }\n </kendo-tilelayout-item-body>\n </kendo-tilelayout-item>\n }\n </kendo-tilelayout>\n } @else {\n <div class=\"empty-state\">\n <div class=\"empty-state-content\">\n <kendo-svg-icon [icon]=\"plusIcon\" size=\"xlarge\"></kendo-svg-icon>\n <h3>No Widgets</h3>\n <p>Get started by adding widgets to your MeshBoard.</p>\n <button\n kendoButton\n [svgIcon]=\"plusIcon\"\n (click)=\"openAddWidget()\"\n themeColor=\"primary\">\n Add Your First Widget\n </button>\n </div>\n </div>\n }\n\n <!-- Edit Widget Dialog -->\n @if (showEditWidgetDialog && editingWidget) {\n <mm-edit-widget-dialog\n [widget]=\"editingWidget\"\n [widgets]=\"config().widgets\"\n [maxColumns]=\"config().columns\"\n [gridService]=\"gridService\"\n (save)=\"onEditWidgetSave($event)\"\n (cancelled)=\"closeEditWidgetDialog()\">\n </mm-edit-widget-dialog>\n }\n }\n</div>\n","/*\n * Public API Surface of @meshmakers/octo-meshboard\n */\n\n// Models\nexport * from './lib/models/meshboard.models';\n\n// Widget Interface\nexport * from './lib/widgets/widget.interface';\n\n// Shared Utilities\nexport type {\n RuntimeEntityItem,\n PersistentQueryItem,\n QueryColumnItem,\n CategoryValueItem\n} from './lib/utils/runtime-entity-data-sources';\nexport {\n RuntimeEntitySelectDataSource,\n RuntimeEntityDialogDataSource\n} from './lib/utils/runtime-entity-data-sources';\n\n// Shared Components\nexport { QuerySelectorComponent } from './lib/components/query-selector/query-selector.component';\nexport { RuntimeEntitySelectorComponent } from './lib/components/runtime-entity-selector/runtime-entity-selector.component';\nexport type { RuntimeEntitySelectorValue } from './lib/components/runtime-entity-selector/runtime-entity-selector.component';\nexport { WidgetNotConfiguredComponent } from './lib/components/widget-not-configured/widget-not-configured.component';\n\n// Services\nexport * from './lib/services/meshboard-state.service';\nexport * from './lib/services/meshboard-data.service';\nexport * from './lib/services/meshboard-persistence.service';\nexport * from './lib/services/widget-registry.service';\nexport * from './lib/services/widget-factory.service';\nexport * from './lib/services/edit-mode-state.service';\nexport * from './lib/services/meshboard-grid.service';\n\n// Widget Components - Export components with explicit names to avoid duplicates\nexport { EntityCardWidgetComponent } from './lib/widgets/entity-card-widget/entity-card-widget.component';\nexport { EntityCardConfigDialogComponent } from './lib/widgets/entity-card-widget/entity-card-config-dialog.component';\nexport type { EntityCardConfigResult } from './lib/widgets/entity-card-widget/entity-card-config-dialog.component';\n\nexport { KpiWidgetComponent } from './lib/widgets/kpi-widget/kpi-widget.component';\nexport { KpiConfigDialogComponent } from './lib/widgets/kpi-widget/kpi-config-dialog.component';\nexport type { KpiConfigResult, KpiDataSourceType } from './lib/widgets/kpi-widget/kpi-config-dialog.component';\n\nexport { EntityAssociationsWidgetComponent } from './lib/widgets/entity-associations-widget/entity-associations-widget.component';\nexport { AssociationsConfigDialogComponent } from './lib/widgets/entity-associations-widget/associations-config-dialog.component';\nexport type { AssociationsConfigResult } from './lib/widgets/entity-associations-widget/associations-config-dialog.component';\nexport { EntityDetailDialogComponent } from './lib/widgets/entity-associations-widget/entity-detail-dialog.component';\n\nexport { TableWidgetComponent } from './lib/widgets/table-widget/table-widget.component';\nexport { TableConfigDialogComponent } from './lib/widgets/table-widget/table-config-dialog.component';\nexport type { TableConfigResult } from './lib/widgets/table-widget/table-config-dialog.component';\nexport { TableWidgetDataSourceDirective } from './lib/widgets/table-widget/table-widget-data-source.directive';\nexport type { QueryColumn } from './lib/widgets/table-widget/table-widget-data-source.directive';\n\nexport { GaugeWidgetComponent } from './lib/widgets/gauge-widget/gauge-widget.component';\nexport { GaugeConfigDialogComponent } from './lib/widgets/gauge-widget/gauge-config-dialog.component';\nexport type { GaugeConfigResult } from './lib/widgets/gauge-widget/gauge-config-dialog.component';\n\nexport { PieChartWidgetComponent } from './lib/widgets/pie-chart-widget/pie-chart-widget.component';\nexport { PieChartConfigDialogComponent } from './lib/widgets/pie-chart-widget/pie-chart-config-dialog.component';\nexport type { PieChartConfigResult } from './lib/widgets/pie-chart-widget/pie-chart-config-dialog.component';\n\nexport { BarChartWidgetComponent } from './lib/widgets/bar-chart-widget/bar-chart-widget.component';\nexport { BarChartConfigDialogComponent } from './lib/widgets/bar-chart-widget/bar-chart-config-dialog.component';\nexport type { BarChartConfigResult } from './lib/widgets/bar-chart-widget/bar-chart-config-dialog.component';\n\nexport { StatsGridWidgetComponent } from './lib/widgets/stats-grid-widget/stats-grid-widget.component';\nexport { StatsGridConfigDialogComponent } from './lib/widgets/stats-grid-widget/stats-grid-config-dialog.component';\nexport type { StatsGridConfigResult } from './lib/widgets/stats-grid-widget/stats-grid-config-dialog.component';\n\nexport { StatusIndicatorWidgetComponent } from './lib/widgets/status-indicator-widget/status-indicator-widget.component';\nexport { StatusIndicatorConfigDialogComponent } from './lib/widgets/status-indicator-widget/status-indicator-config-dialog.component';\nexport type { StatusIndicatorConfigResult } from './lib/widgets/status-indicator-widget/status-indicator-config-dialog.component';\n\nexport { ServiceHealthWidgetComponent } from './lib/widgets/service-health-widget/service-health-widget.component';\nexport { ServiceHealthConfigDialogComponent } from './lib/widgets/service-health-widget/service-health-config-dialog.component';\nexport type { ServiceHealthConfigResult } from './lib/widgets/service-health-widget/service-health-config-dialog.component';\n\nexport { WidgetGroupComponent } from './lib/widgets/widget-group/widget-group.component';\nexport { WidgetGroupConfigDialogComponent } from './lib/widgets/widget-group/widget-group-config-dialog.component';\nexport type { WidgetGroupConfigResult } from './lib/widgets/widget-group/widget-group-config-dialog.component';\n\nexport { MarkdownWidgetComponent } from './lib/widgets/markdown-widget/markdown-widget.component';\nexport { MarkdownConfigDialogComponent } from './lib/widgets/markdown-widget/markdown-config-dialog.component';\nexport type { MarkdownConfigResult } from './lib/widgets/markdown-widget/markdown-config-dialog.component';\n\n// Process Widget - Separate export for lazy loading of octo-process-diagrams\n// To use ProcessWidget in MeshBoard:\n// 1. Import provideProcessWidget from '@meshmakers/octo-meshboard'\n// 2. Add provideProcessWidget() to your app providers\n//\n// For process diagram data operations, use the GraphQL services directly from '@meshmakers/octo-process-diagrams'\n// ProcessDataService should be imported from there for lazy-loaded components\nexport { provideProcessWidget, registerProcessWidget } from './lib/registrations/process-widget-registration';\n\n// Provider Functions\nexport {\n provideDefaultWidgets,\n registerDefaultWidgets,\n provideMeshBoard,\n provideWidgetRegistrations,\n MESHBOARD_OPTIONS,\n TENANT_ID_PROVIDER,\n MESHBOARD_TENANT_ID_PROVIDER // @deprecated - use TENANT_ID_PROVIDER from @meshmakers/octo-services\n} from './lib/registrations/default-widget-registrations';\nexport type { MeshBoardOptions, WidgetRegistration, TenantIdProvider } from './lib/registrations/default-widget-registrations';\n\n// Container Components\nexport { MeshBoardViewComponent } from './lib/containers/meshboard-view/meshboard-view.component';\n\n// Dialogs\nexport { MeshBoardSettingsDialogComponent, MeshBoardSettingsResult } from './lib/dialogs/meshboard-settings-dialog/meshboard-settings-dialog.component';\nexport { AddWidgetDialogComponent } from './lib/dialogs/add-widget-dialog/add-widget-dialog.component';\nexport { MeshBoardManagerDialogComponent } from './lib/dialogs/meshboard-manager-dialog/meshboard-manager-dialog.component';\nexport { EditWidgetDialogComponent } from './lib/dialogs/edit-widget-dialog/edit-widget-dialog.component';\nexport type { WidgetPositionUpdate } from './lib/dialogs/edit-widget-dialog/edit-widget-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Apollo","i1","i2","RuntimeEntitySelectDataSource","RuntimeEntityDialogDataSource","map","catchError","i5","i6","i3","i4"],"mappings":"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"}
|