@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,4081 @@
1
+ import { ProcessWidgetSpecificConfig } from '@meshmakers/octo-process-diagrams';
2
+ import * as _angular_core from '@angular/core';
3
+ import { Signal, OnInit, EventEmitter, Type, OnChanges, SimpleChanges, OnDestroy, EnvironmentProviders, InjectionToken } from '@angular/core';
4
+ import { Observable, Subject } from 'rxjs';
5
+ import { EntitySelectDataSource, EntitySelectResult } from '@meshmakers/shared-services';
6
+ import * as i1 from '@meshmakers/shared-ui';
7
+ import { EntitySelectDialogDataSource, ColumnDefinition, DialogFetchOptions, DialogFetchResult, EntitySelectInputComponent, FetchDataOptions, FetchResultTyped, TableColumn as TableColumn$1, HasUnsavedChanges, TimeRangeSelection as TimeRangeSelection$1, TimeRange } from '@meshmakers/shared-ui';
8
+ import * as _meshmakers_octo_services from '@meshmakers/octo-services';
9
+ import { Exact, Scalars, InputMaybe, SearchFilterDto, FieldFilterDto, SortDto, CkTypeSelectorItem, AttributeItem, TenantIdProvider } from '@meshmakers/octo-services';
10
+ export { TENANT_ID_PROVIDER, TenantIdProvider } from '@meshmakers/octo-services';
11
+ import * as Apollo from 'apollo-angular';
12
+ import { ControlValueAccessor } from '@angular/forms';
13
+ import { CkTypeSelectorInputComponent, FieldFilterItem, FilterVariable, PropertyGridItem, PropertyGridConfig, OctoGraphQlDataSource, FieldFilterEditorComponent } from '@meshmakers/octo-ui';
14
+ import * as _meshmakers_octo_meshboard from '@meshmakers/octo-meshboard';
15
+ import * as _progress_kendo_svg_icons from '@progress/kendo-svg-icons';
16
+ import { SVGIcon } from '@progress/kendo-svg-icons';
17
+
18
+ /**
19
+ * Mapping from diagram exposed property to runtime data source
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * // Map 'level' property to entity attribute
24
+ * const mapping: DiagramPropertyMapping = {
25
+ * propertyId: 'level',
26
+ * sourceType: 'attribute',
27
+ * sourcePath: 'tankLevel'
28
+ * };
29
+ *
30
+ * // Map 'temperature' property to query column
31
+ * const mapping2: DiagramPropertyMapping = {
32
+ * propertyId: 'temperature',
33
+ * sourceType: 'column',
34
+ * sourcePath: 'current_temp'
35
+ * };
36
+ * ```
37
+ */
38
+ interface DiagramPropertyMapping {
39
+ /**
40
+ * The ID of the exposed property from the diagram's transformProperties
41
+ */
42
+ propertyId: string;
43
+ /**
44
+ * The source type for the property value
45
+ * - 'attribute': Value from entity attribute path
46
+ * - 'column': Value from query result column
47
+ */
48
+ sourceType: 'attribute' | 'column';
49
+ /**
50
+ * The path to the source value
51
+ * - For 'attribute': entity attribute path (e.g., 'tankLevel', 'sensors.temperature')
52
+ * - For 'column': query result column name (e.g., 'avg_temperature')
53
+ */
54
+ sourcePath: string;
55
+ /**
56
+ * Optional expression for value transformation/normalization.
57
+ * Uses expr-eval syntax with 'value' as the input variable.
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * // Pass through raw value
62
+ * expression: 'value'
63
+ *
64
+ * // Normalize 0-100 to 0-1
65
+ * expression: 'value / 100'
66
+ *
67
+ * // Clamp to range
68
+ * expression: 'clamp(value, 0, 100)'
69
+ *
70
+ * // Linear interpolation
71
+ * expression: 'lerp(value, 0, 4096, 0, 100)'
72
+ *
73
+ * // Boolean threshold
74
+ * expression: 'value > 50 ? 1 : 0'
75
+ * ```
76
+ */
77
+ expression?: string;
78
+ }
79
+ /**
80
+ * Data binding mode for Process Widget
81
+ * - 'none': No data binding (static diagram)
82
+ * - 'runtimeEntity': Bind to a runtime entity
83
+ * - 'persistentQuery': Bind to a persistent query
84
+ */
85
+ type ProcessDataBindingMode = 'none' | 'runtimeEntity' | 'persistentQuery';
86
+ /**
87
+ * Complete Process Widget configuration for MeshBoard integration
88
+ *
89
+ * Extends the base WidgetConfig with process-specific settings.
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * const widgetConfig: ProcessWidgetConfig = {
94
+ * id: 'widget-1',
95
+ * type: 'process',
96
+ * title: 'Water Treatment',
97
+ * col: 1,
98
+ * row: 1,
99
+ * colSpan: 4,
100
+ * rowSpan: 3,
101
+ * dataSource: { type: 'static', data: null },
102
+ * processDiagramRtId: '123-456-789',
103
+ * fitToBounds: true,
104
+ * dataBindingMode: 'runtimeEntity',
105
+ * bindingCkTypeId: 'System/Tank',
106
+ * bindingRtId: 'tank-001'
107
+ * };
108
+ * ```
109
+ */
110
+ interface ProcessWidgetConfig extends WidgetConfig, ProcessWidgetSpecificConfig {
111
+ type: 'process';
112
+ /**
113
+ * Data binding mode (optional, defaults to 'none')
114
+ */
115
+ dataBindingMode?: ProcessDataBindingMode;
116
+ /**
117
+ * CK Type ID for runtime entity binding
118
+ * Required when dataBindingMode is 'runtimeEntity'
119
+ */
120
+ bindingCkTypeId?: string;
121
+ /**
122
+ * Runtime ID of the entity to bind to
123
+ * Optional - if not set, query will return all entities of the type
124
+ */
125
+ bindingRtId?: string;
126
+ /**
127
+ * Runtime ID of the persistent query
128
+ * Required when dataBindingMode is 'persistentQuery'
129
+ */
130
+ bindingQueryRtId?: string;
131
+ /**
132
+ * Display name of the persistent query (for UI)
133
+ */
134
+ bindingQueryName?: string;
135
+ /**
136
+ * Field filters applied to the data binding query
137
+ * Works with both runtimeEntity and persistentQuery modes
138
+ */
139
+ bindingFilters?: WidgetFilterConfig[];
140
+ /**
141
+ * Mappings from diagram exposed properties to runtime data sources.
142
+ * Each mapping connects a diagram's transformProperty to either an
143
+ * entity attribute path or a query result column.
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * propertyMappings: [
148
+ * { propertyId: 'level', sourceType: 'attribute', sourcePath: 'tankLevel' },
149
+ * { propertyId: 'temp', sourceType: 'column', sourcePath: 'avg_temperature' }
150
+ * ]
151
+ * ```
152
+ */
153
+ propertyMappings?: DiagramPropertyMapping[];
154
+ }
155
+
156
+ /**
157
+ * MeshBoard Widget Models
158
+ * Defines the interfaces for MeshBoard widgets and their data sources
159
+ */
160
+ /**
161
+ * All supported data source types
162
+ */
163
+ type DataSourceType = 'runtimeEntity' | 'persistentQuery' | 'aggregation' | 'serviceCall' | 'constructionKitQuery' | 'static' | 'repeaterQuery';
164
+ /**
165
+ * Base interface for all data sources
166
+ */
167
+ interface WidgetDataSource {
168
+ type: DataSourceType;
169
+ }
170
+ /**
171
+ * Data source that fetches a single runtime entity by ID
172
+ */
173
+ interface RuntimeEntityDataSource extends WidgetDataSource {
174
+ type: 'runtimeEntity';
175
+ ckTypeId?: string;
176
+ rtId?: string;
177
+ attributePaths?: string[];
178
+ includeAssociations?: boolean;
179
+ }
180
+ /**
181
+ * Static data source for demo/testing
182
+ */
183
+ interface StaticDataSource extends WidgetDataSource {
184
+ type: 'static';
185
+ data: unknown;
186
+ }
187
+ /**
188
+ * Data source that executes a persistent query by its rtId
189
+ */
190
+ interface PersistentQueryDataSource extends WidgetDataSource {
191
+ type: 'persistentQuery';
192
+ /** The rtId of the persistent query to execute */
193
+ queryRtId: string;
194
+ /** Display name of the query (for UI) */
195
+ queryName?: string;
196
+ }
197
+ /**
198
+ * Aggregation types supported
199
+ */
200
+ type AggregationType = 'count' | 'sum' | 'avg' | 'min' | 'max';
201
+ /**
202
+ * Single aggregation query configuration
203
+ */
204
+ interface AggregationQuery {
205
+ /** Unique ID to reference this query result */
206
+ id: string;
207
+ /** The CK type to aggregate (e.g., 'ConstructionKit/CkType') */
208
+ ckTypeId: string;
209
+ /** Type of aggregation to perform */
210
+ aggregation: AggregationType;
211
+ /** Attribute to aggregate (required for sum/avg/min/max) */
212
+ attribute?: string;
213
+ /** Optional filter expression (deprecated, use filters instead) */
214
+ filter?: string;
215
+ /** Field filters for the aggregation query */
216
+ filters?: WidgetFilterConfig[];
217
+ }
218
+ /**
219
+ * Data source that performs aggregation queries (count, sum, avg, etc.)
220
+ */
221
+ interface AggregationDataSource extends WidgetDataSource {
222
+ type: 'aggregation';
223
+ queries: AggregationQuery[];
224
+ }
225
+ /**
226
+ * Service call types for status/health checks
227
+ */
228
+ type ServiceCallType = 'modelAvailable' | 'healthCheck';
229
+ /**
230
+ * Data source that calls a service for status information
231
+ */
232
+ interface ServiceCallDataSource extends WidgetDataSource {
233
+ type: 'serviceCall';
234
+ /** Type of service call */
235
+ callType: ServiceCallType;
236
+ /** Model name for 'modelAvailable' check */
237
+ modelName?: string;
238
+ /** Service type for 'healthCheck' */
239
+ serviceType?: 'identity' | 'asset-repository' | 'bot' | 'communication-controller' | 'mesh-adapter' | 'custom';
240
+ /** Custom endpoint URL for custom health checks */
241
+ customEndpoint?: string;
242
+ }
243
+ /**
244
+ * Construction Kit query targets
245
+ */
246
+ type CkQueryTarget = 'models' | 'types' | 'attributes' | 'associationRoles' | 'enums' | 'records';
247
+ /**
248
+ * Data source that queries Construction Kit data
249
+ * Supports grouping for chart widgets (e.g., models grouped by state)
250
+ */
251
+ interface ConstructionKitQueryDataSource extends WidgetDataSource {
252
+ type: 'constructionKitQuery';
253
+ /** What to query from Construction Kit */
254
+ queryTarget: CkQueryTarget;
255
+ /** Field to group results by (for charts) */
256
+ groupBy?: string;
257
+ /** Field to use as value (for aggregations) */
258
+ valueField?: string;
259
+ /** Field to use as category/label */
260
+ categoryField?: string;
261
+ }
262
+ /**
263
+ * Data source for repeating widgets (Widget Group).
264
+ * Fetches multiple items and renders a child widget for each.
265
+ * Supports two modes:
266
+ * 1. Query Mode: Execute a persistent query and get rows
267
+ * 2. Entity Mode: Load entities by CK type with optional filters
268
+ */
269
+ interface RepeaterQueryDataSource extends WidgetDataSource {
270
+ type: 'repeaterQuery';
271
+ /** Execute a persistent query by its rtId (Query Mode) */
272
+ queryRtId?: string;
273
+ /** Display name of the query (for UI) */
274
+ queryName?: string;
275
+ /** Load entities by CK type (Entity Mode) */
276
+ ckTypeId?: string;
277
+ /** Filters for Entity Mode */
278
+ filters?: WidgetFilterConfig[];
279
+ /** Maximum number of items to render (default: 50) */
280
+ maxItems?: number;
281
+ }
282
+ type DataSource = RuntimeEntityDataSource | StaticDataSource | PersistentQueryDataSource | AggregationDataSource | ServiceCallDataSource | ConstructionKitQueryDataSource | RepeaterQueryDataSource;
283
+ /**
284
+ * Supported widget types
285
+ */
286
+ type WidgetType = 'entityCard' | 'entityWithAssociations' | 'kpi' | 'table' | 'gauge' | 'pieChart' | 'barChart' | 'statsGrid' | 'statusIndicator' | 'serviceHealth' | 'process' | 'widgetGroup' | 'markdown';
287
+ /**
288
+ * Base widget configuration
289
+ */
290
+ interface WidgetConfig {
291
+ /** Local ID used for UI tracking (generated by WidgetFactoryService) */
292
+ id: string;
293
+ /** Backend-generated ID (rtId from GraphQL). Only set after persistence. */
294
+ rtId?: string;
295
+ type: WidgetType;
296
+ title: string;
297
+ dataSource: DataSource;
298
+ col: number;
299
+ row: number;
300
+ colSpan: number;
301
+ rowSpan: number;
302
+ /** Whether the widget supports data source configuration dialog */
303
+ configurable?: boolean;
304
+ }
305
+ /**
306
+ * Entity Card Widget - displays a single entity like a UML class diagram
307
+ */
308
+ interface EntityCardWidgetConfig extends WidgetConfig {
309
+ type: 'entityCard';
310
+ showHeader?: boolean;
311
+ showAttributes?: boolean;
312
+ attributeFilter?: string[];
313
+ headerColor?: string;
314
+ }
315
+ /**
316
+ * Entity with Associations Widget - displays entity with its relationships
317
+ */
318
+ interface EntityWithAssociationsWidgetConfig extends WidgetConfig {
319
+ type: 'entityWithAssociations';
320
+ showIncoming?: boolean;
321
+ showOutgoing?: boolean;
322
+ maxAssociations?: number;
323
+ /** List of role IDs to filter (empty = show all) */
324
+ roleFilter?: string[];
325
+ /** Display mode: 'expandable' shows groups that can be expanded */
326
+ displayMode?: 'count' | 'expandable';
327
+ }
328
+ /**
329
+ * KPI query mode for persistent queries
330
+ * - 'simpleCount': Use totalCount from simple query
331
+ * - 'aggregation': Single value from aggregation query (1 row, 1 column)
332
+ * - 'groupedAggregation': Value for a specific category from grouped aggregation
333
+ */
334
+ type KpiQueryMode = 'simpleCount' | 'aggregation' | 'groupedAggregation';
335
+ /**
336
+ * KPI/Statistics Widget - displays a single value with label
337
+ * Supports both runtime entity data sources and persistent queries
338
+ */
339
+ interface KpiWidgetConfig extends WidgetConfig {
340
+ type: 'kpi';
341
+ /** Attribute path for runtime entity data source */
342
+ valueAttribute: string;
343
+ labelAttribute?: string;
344
+ prefix?: string;
345
+ suffix?: string;
346
+ icon?: string;
347
+ trend?: 'up' | 'down' | 'neutral';
348
+ /** Query mode when using persistent query data source */
349
+ queryMode?: KpiQueryMode;
350
+ /** Value field for aggregation/grouped queries */
351
+ queryValueField?: string;
352
+ /** Category field for grouped aggregation queries */
353
+ queryCategoryField?: string;
354
+ /** Selected category value for grouped aggregation queries */
355
+ queryCategoryValue?: string;
356
+ /** Field filters for data source */
357
+ filters?: WidgetFilterConfig[];
358
+ }
359
+ /**
360
+ * Sorting configuration for table widget (JSON-compatible)
361
+ */
362
+ interface TableSortConfig {
363
+ attributePath: string;
364
+ sortOrder: string;
365
+ }
366
+ /**
367
+ * Filter configuration for widgets (JSON-compatible)
368
+ * Used by Table, KPI, Gauge, Pie Chart, Bar Chart widgets
369
+ */
370
+ interface WidgetFilterConfig {
371
+ attributePath: string;
372
+ operator: string;
373
+ comparisonValue: string;
374
+ }
375
+ /**
376
+ * @deprecated Use WidgetFilterConfig instead
377
+ */
378
+ type TableFilterConfig = WidgetFilterConfig;
379
+ /**
380
+ * Table Widget - displays multiple entities in a table
381
+ * Note: sorting and filters use simplified JSON-compatible types
382
+ */
383
+ interface TableWidgetConfig extends WidgetConfig {
384
+ type: 'table';
385
+ columns: TableColumn[];
386
+ sorting?: TableSortConfig[];
387
+ filters?: TableFilterConfig[];
388
+ pageSize?: number;
389
+ sortable?: boolean;
390
+ }
391
+ interface TableColumn {
392
+ field: string;
393
+ title: string;
394
+ width?: number;
395
+ }
396
+ /**
397
+ * Gauge types available
398
+ */
399
+ type GaugeType = 'arc' | 'circular' | 'linear' | 'radial';
400
+ /**
401
+ * Color range for gauge thresholds
402
+ */
403
+ interface GaugeRange {
404
+ from: number;
405
+ to: number;
406
+ color: string;
407
+ }
408
+ /**
409
+ * Gauge Widget - displays a numeric value as a gauge visualization
410
+ * Supports Arc, Circular, Linear, and Radial gauge types from Kendo UI
411
+ * Supports both runtime entity data sources and persistent queries
412
+ */
413
+ interface GaugeWidgetConfig extends WidgetConfig {
414
+ type: 'gauge';
415
+ /** The gauge visualization type */
416
+ gaugeType: GaugeType;
417
+ /** Attribute path to read the numeric value from (for runtime entity) */
418
+ valueAttribute: string;
419
+ /** Minimum value for the gauge scale */
420
+ min?: number;
421
+ /** Maximum value for the gauge scale */
422
+ max?: number;
423
+ /** Color ranges for thresholds (e.g., green/yellow/red zones) */
424
+ ranges?: GaugeRange[];
425
+ /** Show the value label on the gauge */
426
+ showLabel?: boolean;
427
+ /** Optional attribute for dynamic label */
428
+ labelAttribute?: string;
429
+ /** Prefix for value display (e.g., '$') */
430
+ prefix?: string;
431
+ /** Suffix for value display (e.g., '%', 'units') */
432
+ suffix?: string;
433
+ /** Reverse the gauge direction */
434
+ reverse?: boolean;
435
+ /** Query mode when using persistent query data source */
436
+ queryMode?: KpiQueryMode;
437
+ /** Value field for aggregation/grouped queries */
438
+ queryValueField?: string;
439
+ /** Category field for grouped aggregation queries */
440
+ queryCategoryField?: string;
441
+ /** Selected category value for grouped aggregation queries */
442
+ queryCategoryValue?: string;
443
+ /** Field filters for data source */
444
+ filters?: WidgetFilterConfig[];
445
+ }
446
+ /**
447
+ * Pie Chart types available
448
+ */
449
+ type PieChartType = 'pie' | 'donut';
450
+ /**
451
+ * Pie Chart Widget - displays data as a pie or donut chart
452
+ * Works especially well with grouped aggregation queries
453
+ */
454
+ interface PieChartWidgetConfig extends WidgetConfig {
455
+ type: 'pieChart';
456
+ /** The chart visualization type */
457
+ chartType: PieChartType;
458
+ /** Field used for category labels (e.g., 'legalEntityType') */
459
+ categoryField: string;
460
+ /** Field used for values (e.g., 'meterReading') */
461
+ valueField: string;
462
+ /** Show labels on chart segments */
463
+ showLabels?: boolean;
464
+ /** Show the chart legend */
465
+ showLegend?: boolean;
466
+ /** Position of the legend */
467
+ legendPosition?: 'top' | 'bottom' | 'left' | 'right';
468
+ /** Field filters for data source */
469
+ filters?: WidgetFilterConfig[];
470
+ }
471
+ /**
472
+ * Bar Chart types available
473
+ * - column: Vertical bars (standard column chart)
474
+ * - bar: Horizontal bars
475
+ * - stackedColumn: Stacked vertical bars
476
+ * - stackedBar: Stacked horizontal bars
477
+ * - stackedColumn100: 100% stacked vertical bars
478
+ * - stackedBar100: 100% stacked horizontal bars
479
+ */
480
+ type BarChartType = 'column' | 'bar' | 'stackedColumn' | 'stackedBar' | 'stackedColumn100' | 'stackedBar100';
481
+ /**
482
+ * Series configuration for bar chart
483
+ * Each series represents a set of values displayed as bars
484
+ */
485
+ interface BarChartSeries {
486
+ /** Value field from query results */
487
+ field: string;
488
+ /** Display name for legend (defaults to field name) */
489
+ name?: string;
490
+ /** Optional custom color for this series */
491
+ color?: string;
492
+ }
493
+ /**
494
+ * Bar Chart Widget - displays data as bar or column charts
495
+ * Supports multiple series for grouped/stacked visualization
496
+ * Works especially well with grouped aggregation queries
497
+ *
498
+ * Two modes are supported:
499
+ * 1. Static Series Mode: Define series[] with explicit field mappings
500
+ * 2. Dynamic Series Mode: Use seriesGroupField + valueField to auto-create series from data
501
+ */
502
+ interface BarChartWidgetConfig extends WidgetConfig {
503
+ type: 'barChart';
504
+ /** The chart visualization type */
505
+ chartType: BarChartType;
506
+ /** Field used for category labels (X-axis for column, Y-axis for bar) */
507
+ categoryField: string;
508
+ /** Series configuration - each series becomes a set of bars (Static Series Mode) */
509
+ series: BarChartSeries[];
510
+ /**
511
+ * Field used to group data into series (Dynamic Series Mode).
512
+ * When set, unique values of this field become separate series.
513
+ * Example: 'billingType' with values 'Credit'/'Debit' creates two series.
514
+ */
515
+ seriesGroupField?: string;
516
+ /**
517
+ * Value field when using seriesGroupField (Dynamic Series Mode).
518
+ * The numeric field to display for each category/series combination.
519
+ */
520
+ valueField?: string;
521
+ /** Show the chart legend */
522
+ showLegend?: boolean;
523
+ /** Position of the legend */
524
+ legendPosition?: 'top' | 'bottom' | 'left' | 'right';
525
+ /** Show data labels on bars */
526
+ showDataLabels?: boolean;
527
+ /** Field filters for data source */
528
+ filters?: WidgetFilterConfig[];
529
+ }
530
+ /**
531
+ * Color options for stat items
532
+ */
533
+ type StatColor = 'mint' | 'cyan' | 'violet' | 'toffee' | 'lilac' | 'bubblegum' | 'default';
534
+ /**
535
+ * Single stat item configuration
536
+ */
537
+ interface StatItem {
538
+ /** Display label */
539
+ label: string;
540
+ /** Reference to aggregation query ID */
541
+ queryId: string;
542
+ /** Color variant */
543
+ color?: StatColor;
544
+ /** Number format */
545
+ format?: 'number' | 'percent' | 'currency';
546
+ /** Prefix for display (e.g., '$') */
547
+ prefix?: string;
548
+ /** Suffix for display (e.g., '%') */
549
+ suffix?: string;
550
+ }
551
+ /**
552
+ * Stats Grid Widget - displays multiple KPIs in a grid layout
553
+ * Uses AggregationDataSource for data
554
+ */
555
+ interface StatsGridWidgetConfig extends WidgetConfig {
556
+ type: 'statsGrid';
557
+ /** Stat items to display */
558
+ stats: StatItem[];
559
+ /** Number of columns in the grid (default: 3) */
560
+ columns?: number;
561
+ }
562
+ /**
563
+ * Status Indicator Widget - displays a boolean status (ENABLED/DISABLED, etc.)
564
+ * Uses ServiceCallDataSource for data
565
+ */
566
+ interface StatusIndicatorWidgetConfig extends WidgetConfig {
567
+ type: 'statusIndicator';
568
+ /** Label to show when status is true */
569
+ trueLabel?: string;
570
+ /** Label to show when status is false */
571
+ falseLabel?: string;
572
+ /** Custom true color (CSS color) */
573
+ trueColor?: string;
574
+ /** Custom false color (CSS color) */
575
+ falseColor?: string;
576
+ }
577
+ /**
578
+ * Service Health Widget - displays health status with pulse animation
579
+ * Uses ServiceCallDataSource with callType: 'healthCheck'
580
+ */
581
+ interface ServiceHealthWidgetConfig extends WidgetConfig {
582
+ type: 'serviceHealth';
583
+ /** Enable click to navigate to detail page */
584
+ navigateOnClick?: boolean;
585
+ /** Route to navigate to (relative to current route) */
586
+ detailRoute?: string;
587
+ /** Show pulse animation when healthy */
588
+ showPulse?: boolean;
589
+ }
590
+ /**
591
+ * Supported child widget types for Widget Group
592
+ */
593
+ type GroupChildWidgetType = 'kpi' | 'gauge' | 'entityCard';
594
+ /**
595
+ * Layout options for Widget Group
596
+ */
597
+ type WidgetGroupLayout = 'grid' | 'horizontal' | 'vertical';
598
+ /**
599
+ * Attribute mapping configuration for child widgets.
600
+ * Maps data item attributes to child widget properties.
601
+ */
602
+ interface WidgetGroupAttributeMappings {
603
+ /** Attribute path for the value (KPI/Gauge) */
604
+ valueAttribute?: string;
605
+ /** Attribute path for dynamic label */
606
+ labelAttribute?: string;
607
+ /** Attribute path for status (StatusIndicator) */
608
+ statusAttribute?: string;
609
+ }
610
+ /**
611
+ * Template for child widgets in a Widget Group.
612
+ * Defines how each data item is rendered as a widget.
613
+ */
614
+ interface WidgetGroupChildTemplate {
615
+ /** The widget type to render for each item */
616
+ widgetType: GroupChildWidgetType;
617
+ /**
618
+ * Title template with variable substitution.
619
+ * Available variables: $rtWellKnownName, $rtId, $ckTypeId, and any attribute with $attributeName
620
+ */
621
+ titleTemplate?: string;
622
+ /** Maps data item attributes to widget properties */
623
+ attributeMappings: WidgetGroupAttributeMappings;
624
+ /** Static configuration merged into each child widget */
625
+ staticConfig?: Partial<KpiWidgetConfig | GaugeWidgetConfig | EntityCardWidgetConfig>;
626
+ }
627
+ /**
628
+ * Widget Group Widget - renders a widget for each item from a query or entity list.
629
+ * Acts as a container that executes a query and dynamically creates child widgets.
630
+ *
631
+ * Example use case: Query returns 5 machines → 5 KPI widgets show each machine's status.
632
+ *
633
+ * Uses RepeaterQueryDataSource for data:
634
+ * - Query Mode: Execute persistent query, render widget per row
635
+ * - Entity Mode: Load entities by CK type, render widget per entity
636
+ */
637
+ interface WidgetGroupConfig extends WidgetConfig {
638
+ type: 'widgetGroup';
639
+ /** The data source that provides items to repeat */
640
+ dataSource: RepeaterQueryDataSource;
641
+ /** Template defining how each item is rendered as a widget */
642
+ childTemplate: WidgetGroupChildTemplate;
643
+ /** Layout mode for child widgets */
644
+ layout: WidgetGroupLayout;
645
+ /** Number of columns for grid layout (default: 4) */
646
+ gridColumns?: number;
647
+ /** Minimum width for child widgets in pixels (default: 150) */
648
+ minChildWidth?: number;
649
+ /** Gap between child widgets in pixels (default: 8) */
650
+ gap?: number;
651
+ /** Message to show when no items are returned */
652
+ emptyMessage?: string;
653
+ }
654
+ /**
655
+ * Text alignment options for Markdown widget
656
+ */
657
+ type MarkdownTextAlign = 'left' | 'center' | 'right';
658
+ /**
659
+ * Markdown Widget - displays formatted markdown content
660
+ * Uses static data source since content is stored directly in config
661
+ */
662
+ interface MarkdownWidgetConfig extends WidgetConfig {
663
+ type: 'markdown';
664
+ /** The markdown content to display */
665
+ content: string;
666
+ /** Whether to resolve MeshBoard variables ($name or ${name}) in content */
667
+ resolveVariables?: boolean;
668
+ /** Custom padding (CSS value, default: 16px) */
669
+ padding?: string;
670
+ /** Text alignment (default: left) */
671
+ textAlign?: MarkdownTextAlign;
672
+ }
673
+
674
+ type AnyWidgetConfig = EntityCardWidgetConfig | EntityWithAssociationsWidgetConfig | KpiWidgetConfig | TableWidgetConfig | GaugeWidgetConfig | PieChartWidgetConfig | BarChartWidgetConfig | StatsGridWidgetConfig | StatusIndicatorWidgetConfig | ServiceHealthWidgetConfig | ProcessWidgetConfig | WidgetGroupConfig | MarkdownWidgetConfig;
675
+ /**
676
+ * Supported variable types
677
+ */
678
+ type MeshBoardVariableType = 'string' | 'number' | 'boolean' | 'date' | 'datetime';
679
+ /**
680
+ * Source of the variable value (extensible for future dynamic variables)
681
+ */
682
+ type MeshBoardVariableSource = 'static' | 'timeFilter';
683
+ /**
684
+ * MeshBoard variable definition
685
+ */
686
+ interface MeshBoardVariable {
687
+ /** Unique variable name (without $ prefix) */
688
+ name: string;
689
+ /** Display label for UI */
690
+ label?: string;
691
+ /** Variable description */
692
+ description?: string;
693
+ /** Data type */
694
+ type: MeshBoardVariableType;
695
+ /** Value source (extensible) */
696
+ source: MeshBoardVariableSource;
697
+ /** Current value (as string for serialization) */
698
+ value: string;
699
+ /** Default value if no value is set */
700
+ defaultValue?: string;
701
+ }
702
+ /**
703
+ * Supported time range types for the time filter
704
+ */
705
+ type TimeRangeType = 'year' | 'quarter' | 'month' | 'relative' | 'custom';
706
+ /**
707
+ * Time units for relative time ranges
708
+ */
709
+ type RelativeTimeUnit = 'hours' | 'days' | 'weeks' | 'months';
710
+ /**
711
+ * Quarter number (1-4)
712
+ */
713
+ type Quarter = 1 | 2 | 3 | 4;
714
+ /**
715
+ * Configuration for the time range picker component
716
+ */
717
+ interface TimeRangePickerConfig {
718
+ /** Available range types to show. Defaults to all. */
719
+ availableTypes?: TimeRangeType[];
720
+ /** Minimum selectable year. */
721
+ minYear?: number;
722
+ /** Maximum selectable year. */
723
+ maxYear?: number;
724
+ /** Default relative time value. */
725
+ defaultRelativeValue?: number;
726
+ /** Default relative time unit. */
727
+ defaultRelativeUnit?: RelativeTimeUnit;
728
+ /** Show time in custom date pickers. */
729
+ showTime?: boolean;
730
+ }
731
+ /**
732
+ * The current selection state of the time range picker (for persistence)
733
+ */
734
+ interface TimeRangeSelection {
735
+ type: TimeRangeType;
736
+ year?: number;
737
+ quarter?: Quarter;
738
+ month?: number;
739
+ relativeValue?: number;
740
+ relativeUnit?: RelativeTimeUnit;
741
+ customFrom?: string;
742
+ customTo?: string;
743
+ }
744
+ /**
745
+ * Time filter configuration for MeshBoard
746
+ */
747
+ interface MeshBoardTimeFilterConfig {
748
+ /** Whether the time filter is enabled */
749
+ enabled: boolean;
750
+ /** Configuration for the time range picker */
751
+ pickerConfig?: TimeRangePickerConfig;
752
+ /** Current selection (for persistence) */
753
+ selection?: TimeRangeSelection;
754
+ }
755
+ /**
756
+ * Complete MeshBoard configuration
757
+ */
758
+ interface MeshBoardConfig {
759
+ id: string;
760
+ name: string;
761
+ description?: string;
762
+ /** Well-known name for routing (e.g., 'cockpit', 'sales-dashboard') */
763
+ rtWellKnownName?: string | null;
764
+ columns: number;
765
+ rowHeight: number;
766
+ gap: number;
767
+ /** MeshBoard-level variables that can be used in widget filters */
768
+ variables?: MeshBoardVariable[];
769
+ /** Optional time filter configuration */
770
+ timeFilter?: MeshBoardTimeFilterConfig;
771
+ widgets: AnyWidgetConfig[];
772
+ }
773
+ /** @deprecated Use MeshBoardConfig instead */
774
+ type DashboardConfig = MeshBoardConfig;
775
+ interface EntityAttribute {
776
+ attributeName: string;
777
+ value: unknown;
778
+ }
779
+ interface EntityAssociation {
780
+ targetRtId: string;
781
+ targetCkTypeId: string;
782
+ originRtId: string;
783
+ originCkTypeId: string;
784
+ ckAssociationRoleId: string;
785
+ }
786
+ interface RuntimeEntityData {
787
+ rtId: string;
788
+ ckTypeId: string;
789
+ rtWellKnownName?: string;
790
+ rtCreationDateTime?: string;
791
+ rtChangedDateTime?: string;
792
+ attributes: EntityAttribute[];
793
+ associations: EntityAssociation[];
794
+ }
795
+
796
+ /**
797
+ * Base interface for all dashboard widgets.
798
+ * Each widget is a self-contained plugin that loads its own data.
799
+ */
800
+ interface DashboardWidget<TConfig extends AnyWidgetConfig = AnyWidgetConfig, TData = unknown> {
801
+ /**
802
+ * The widget configuration containing data source and display options.
803
+ */
804
+ config: TConfig;
805
+ /**
806
+ * Signal indicating if the widget is currently loading data.
807
+ */
808
+ readonly isLoading: Signal<boolean>;
809
+ /**
810
+ * Signal containing the loaded data, or null if not loaded yet.
811
+ */
812
+ readonly data: Signal<TData | null>;
813
+ /**
814
+ * Signal containing any error that occurred during data loading.
815
+ */
816
+ readonly error: Signal<string | null>;
817
+ /**
818
+ * Triggers a data reload.
819
+ */
820
+ refresh(): void;
821
+ }
822
+ /**
823
+ * Type for widgets that display a single entity.
824
+ */
825
+ type EntityWidget = DashboardWidget<AnyWidgetConfig, RuntimeEntityData>;
826
+ /**
827
+ * Type for widgets that display multiple entities.
828
+ */
829
+ type EntityListWidget = DashboardWidget<AnyWidgetConfig, RuntimeEntityData[]>;
830
+
831
+ type GetEntitiesByCkTypeQueryVariablesDto = Exact<{
832
+ ckTypeId: Scalars['String']['input'];
833
+ rtId?: InputMaybe<Scalars['OctoObjectId']['input']>;
834
+ after?: InputMaybe<Scalars['String']['input']>;
835
+ first?: InputMaybe<Scalars['Int']['input']>;
836
+ searchFilter?: InputMaybe<SearchFilterDto>;
837
+ fieldFilters?: InputMaybe<Array<InputMaybe<FieldFilterDto>> | InputMaybe<FieldFilterDto>>;
838
+ sort?: InputMaybe<Array<InputMaybe<SortDto>> | InputMaybe<SortDto>>;
839
+ }>;
840
+ type GetEntitiesByCkTypeQueryDto = {
841
+ __typename?: 'OctoQuery';
842
+ runtime?: {
843
+ __typename?: 'RuntimeModelQuery';
844
+ runtimeEntities?: {
845
+ __typename?: 'RtEntityGenericDtoConnection';
846
+ totalCount?: number | null;
847
+ items?: Array<{
848
+ __typename?: 'RtEntity';
849
+ rtId: any;
850
+ ckTypeId: any;
851
+ rtWellKnownName?: string | null;
852
+ rtCreationDateTime?: any | null;
853
+ rtChangedDateTime?: any | null;
854
+ attributes?: {
855
+ __typename?: 'RtEntityAttributeDtoConnection';
856
+ items?: Array<{
857
+ __typename?: 'RtEntityAttribute';
858
+ attributeName?: string | null;
859
+ value?: any | null;
860
+ } | null> | null;
861
+ } | null;
862
+ } | null> | null;
863
+ } | null;
864
+ } | null;
865
+ };
866
+ declare class GetEntitiesByCkTypeDtoGQL extends Apollo.Query<GetEntitiesByCkTypeQueryDto, GetEntitiesByCkTypeQueryVariablesDto> {
867
+ document: Apollo.TypedDocumentNode<unknown, unknown>;
868
+ constructor(apollo: Apollo.Apollo);
869
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GetEntitiesByCkTypeDtoGQL, never>;
870
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<GetEntitiesByCkTypeDtoGQL>;
871
+ }
872
+
873
+ /**
874
+ * Represents a runtime entity for selection in config dialogs
875
+ */
876
+ interface RuntimeEntityItem$1 {
877
+ rtId: string;
878
+ ckTypeId: string;
879
+ rtWellKnownName?: string;
880
+ displayName: string;
881
+ }
882
+ /**
883
+ * Persistent query item for selection in config dialogs
884
+ */
885
+ interface PersistentQueryItem {
886
+ rtId: string;
887
+ name: string;
888
+ description?: string | null;
889
+ queryCkTypeId?: string | null;
890
+ }
891
+ /**
892
+ * Column info derived from query execution
893
+ */
894
+ interface QueryColumnItem {
895
+ attributePath: string;
896
+ attributeValueType: string;
897
+ }
898
+ /**
899
+ * Category value item for grouped aggregation
900
+ */
901
+ interface CategoryValueItem {
902
+ value: string;
903
+ displayValue: string;
904
+ }
905
+ /**
906
+ * Data source for entity autocomplete input - filters entities by CK Type
907
+ */
908
+ declare class RuntimeEntitySelectDataSource$1 implements EntitySelectDataSource<RuntimeEntityItem$1> {
909
+ private getEntitiesByCkTypeGQL;
910
+ private ckTypeId;
911
+ constructor(getEntitiesByCkTypeGQL: GetEntitiesByCkTypeDtoGQL, ckTypeId: string);
912
+ onFilter(filter: string, take?: number): Promise<EntitySelectResult<RuntimeEntityItem$1>>;
913
+ onDisplayEntity(entity: RuntimeEntityItem$1): string;
914
+ getIdEntity(entity: RuntimeEntityItem$1): string;
915
+ }
916
+ /**
917
+ * Dialog data source for entity selection grid with pagination and search
918
+ */
919
+ declare class RuntimeEntityDialogDataSource$1 implements EntitySelectDialogDataSource<RuntimeEntityItem$1> {
920
+ private getEntitiesByCkTypeGQL;
921
+ private ckTypeId;
922
+ constructor(getEntitiesByCkTypeGQL: GetEntitiesByCkTypeDtoGQL, ckTypeId: string);
923
+ getColumns(): ColumnDefinition[];
924
+ fetchData(options: DialogFetchOptions): Observable<DialogFetchResult<RuntimeEntityItem$1>>;
925
+ onDisplayEntity(entity: RuntimeEntityItem$1): string;
926
+ getIdEntity(entity: RuntimeEntityItem$1): string;
927
+ }
928
+
929
+ /**
930
+ * Reusable component for selecting a persistent query.
931
+ * Provides a combobox with filtering and displays query name + description.
932
+ *
933
+ * Usage:
934
+ * ```html
935
+ * <mm-query-selector
936
+ * [(ngModel)]="selectedQuery"
937
+ * (querySelected)="onQuerySelected($event)"
938
+ * placeholder="Select a Query..."
939
+ * hint="Select a query to provide data for this widget.">
940
+ * </mm-query-selector>
941
+ * ```
942
+ */
943
+ declare class QuerySelectorComponent implements OnInit, ControlValueAccessor {
944
+ private readonly getSystemPersistentQueriesGQL;
945
+ /** Placeholder text for the combobox */
946
+ placeholder: string;
947
+ /** Hint text shown below the combobox */
948
+ hint?: string;
949
+ /** Whether the component is disabled */
950
+ disabled: boolean;
951
+ /** Whether to load queries automatically on init */
952
+ autoLoad: boolean;
953
+ /** Emitted when a query is selected */
954
+ querySelected: EventEmitter<PersistentQueryItem | null>;
955
+ /** Emitted when queries are loaded */
956
+ queriesLoaded: EventEmitter<PersistentQueryItem[]>;
957
+ queries: PersistentQueryItem[];
958
+ selectedQuery: PersistentQueryItem | null;
959
+ isLoading: boolean;
960
+ private onChange;
961
+ private onTouched;
962
+ ngOnInit(): void;
963
+ /**
964
+ * Loads persistent queries with optional search text filter
965
+ */
966
+ loadQueries(searchText?: string): Promise<void>;
967
+ /**
968
+ * Called when the combobox filter changes (user types)
969
+ */
970
+ onFilterChange(filter: string): void;
971
+ /**
972
+ * Called when a query is selected
973
+ */
974
+ onValueChange(query: PersistentQueryItem | null): void;
975
+ /**
976
+ * Sets the selected query by rtId (useful for loading existing config)
977
+ */
978
+ selectByRtId(rtId: string): Promise<PersistentQueryItem | null>;
979
+ writeValue(value: PersistentQueryItem | null): void;
980
+ registerOnChange(fn: (value: PersistentQueryItem | null) => void): void;
981
+ registerOnTouched(fn: () => void): void;
982
+ setDisabledState(isDisabled: boolean): void;
983
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<QuerySelectorComponent, never>;
984
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<QuerySelectorComponent, "mm-query-selector", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "hint": { "alias": "hint"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "autoLoad": { "alias": "autoLoad"; "required": false; }; }, { "querySelected": "querySelected"; "queriesLoaded": "queriesLoaded"; }, never, never, true, never>;
985
+ }
986
+
987
+ /**
988
+ * Value object for the runtime entity selector
989
+ */
990
+ interface RuntimeEntitySelectorValue {
991
+ ckTypeId: string;
992
+ rtCkTypeId: string;
993
+ rtId?: string;
994
+ displayName?: string;
995
+ }
996
+ /**
997
+ * Reusable component for selecting a runtime entity.
998
+ * Combines CK Type selector and Entity selector into a single component.
999
+ *
1000
+ * Usage:
1001
+ * ```html
1002
+ * <mm-runtime-entity-selector
1003
+ * [(ngModel)]="selectedEntity"
1004
+ * (entitySelected)="onEntitySelected($event)"
1005
+ * ckTypeLabel="Runtime Entities"
1006
+ * entityLabel="Entity">
1007
+ * </mm-runtime-entity-selector>
1008
+ * ```
1009
+ */
1010
+ declare class RuntimeEntitySelectorComponent implements ControlValueAccessor {
1011
+ private readonly getEntitiesByCkTypeGQL;
1012
+ private readonly ckTypeSelectorService;
1013
+ ckTypeSelector: CkTypeSelectorInputComponent;
1014
+ entitySelector?: EntitySelectInputComponent;
1015
+ ckTypeLabel: string;
1016
+ ckTypePlaceholder: string;
1017
+ ckTypeDialogTitle: string;
1018
+ ckTypeHint: string;
1019
+ ckTypeRequired: boolean;
1020
+ entityLabel: string;
1021
+ entityPlaceholder: string;
1022
+ entityDialogTitle: string;
1023
+ entityHint: string;
1024
+ entityRequired: boolean;
1025
+ /** Whether to show the entity selector (set to false if only CK Type selection is needed) */
1026
+ showEntitySelector: boolean;
1027
+ /** Whether the component is disabled */
1028
+ disabled: boolean;
1029
+ /** Emitted when a CK Type is selected */
1030
+ ckTypeSelected: EventEmitter<CkTypeSelectorItem>;
1031
+ /** Emitted when the CK Type is cleared */
1032
+ ckTypeCleared: EventEmitter<void>;
1033
+ /** Emitted when an entity is selected */
1034
+ entitySelected: EventEmitter<RuntimeEntityItem$1>;
1035
+ /** Emitted when the entity is cleared */
1036
+ entityCleared: EventEmitter<void>;
1037
+ /** Emitted when the full value changes */
1038
+ valueChange: EventEmitter<RuntimeEntitySelectorValue | null>;
1039
+ selectedCkType: CkTypeSelectorItem | null;
1040
+ selectedEntity: RuntimeEntityItem$1 | null;
1041
+ entityDataSource?: RuntimeEntitySelectDataSource$1;
1042
+ entityDialogDataSource?: RuntimeEntityDialogDataSource$1;
1043
+ private onChange;
1044
+ private onTouched;
1045
+ /**
1046
+ * Called when a CK Type is selected
1047
+ */
1048
+ onCkTypeSelected(ckType: CkTypeSelectorItem): void;
1049
+ /**
1050
+ * Called when the CK Type is cleared
1051
+ */
1052
+ onCkTypeCleared(): void;
1053
+ /**
1054
+ * Called when an entity is selected
1055
+ */
1056
+ onEntitySelected(entity: RuntimeEntityItem$1): void;
1057
+ /**
1058
+ * Called when the entity is cleared
1059
+ */
1060
+ onEntityCleared(): void;
1061
+ /**
1062
+ * Sets the value by loading CK Type and Entity by their IDs
1063
+ */
1064
+ setValueByIds(ckTypeId: string, rtId?: string): Promise<void>;
1065
+ /**
1066
+ * Loads a CK Type by its rtCkTypeId
1067
+ */
1068
+ private loadCkTypeByRtCkTypeId;
1069
+ /**
1070
+ * Emits the current value
1071
+ */
1072
+ private emitValue;
1073
+ /**
1074
+ * Gets the current value
1075
+ */
1076
+ private getCurrentValue;
1077
+ writeValue(value: RuntimeEntitySelectorValue | null): void;
1078
+ registerOnChange(fn: (value: RuntimeEntitySelectorValue | null) => void): void;
1079
+ registerOnTouched(fn: () => void): void;
1080
+ setDisabledState(isDisabled: boolean): void;
1081
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RuntimeEntitySelectorComponent, never>;
1082
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RuntimeEntitySelectorComponent, "mm-runtime-entity-selector", never, { "ckTypeLabel": { "alias": "ckTypeLabel"; "required": false; }; "ckTypePlaceholder": { "alias": "ckTypePlaceholder"; "required": false; }; "ckTypeDialogTitle": { "alias": "ckTypeDialogTitle"; "required": false; }; "ckTypeHint": { "alias": "ckTypeHint"; "required": false; }; "ckTypeRequired": { "alias": "ckTypeRequired"; "required": false; }; "entityLabel": { "alias": "entityLabel"; "required": false; }; "entityPlaceholder": { "alias": "entityPlaceholder"; "required": false; }; "entityDialogTitle": { "alias": "entityDialogTitle"; "required": false; }; "entityHint": { "alias": "entityHint"; "required": false; }; "entityRequired": { "alias": "entityRequired"; "required": false; }; "showEntitySelector": { "alias": "showEntitySelector"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "ckTypeSelected": "ckTypeSelected"; "ckTypeCleared": "ckTypeCleared"; "entitySelected": "entitySelected"; "entityCleared": "entityCleared"; "valueChange": "valueChange"; }, never, never, true, never>;
1083
+ }
1084
+
1085
+ /**
1086
+ * Shared component to display a consistent "widget not configured" message.
1087
+ * Used by all widget types when they are not properly configured.
1088
+ */
1089
+ declare class WidgetNotConfiguredComponent {
1090
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WidgetNotConfiguredComponent, never>;
1091
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WidgetNotConfiguredComponent, "mm-widget-not-configured", never, {}, {}, never, never, true, never>;
1092
+ }
1093
+
1094
+ /**
1095
+ * Defines how parent associations should be handled when mapping widget input
1096
+ */
1097
+ type ParentAssociationMode = {
1098
+ type: 'create';
1099
+ dashboardRtId: string;
1100
+ } | {
1101
+ type: 'keep';
1102
+ } | {
1103
+ type: 'move';
1104
+ oldDashboardRtId: string;
1105
+ newDashboardRtId: string;
1106
+ };
1107
+ interface PersistedMeshBoard {
1108
+ rtId: string;
1109
+ ckTypeId: string;
1110
+ rtWellKnownName?: string | null;
1111
+ name: string;
1112
+ description: string;
1113
+ columns: number;
1114
+ rowHeight: number;
1115
+ gap: number;
1116
+ }
1117
+ /** @deprecated Use PersistedMeshBoard instead */
1118
+ type PersistedDashboard = PersistedMeshBoard;
1119
+ interface PersistedWidget {
1120
+ rtId: string;
1121
+ ckTypeId: string;
1122
+ name: string;
1123
+ type: string;
1124
+ col: number;
1125
+ row: number;
1126
+ colSpan: number;
1127
+ rowSpan: number;
1128
+ dataSourceType: string;
1129
+ dataSourceCkTypeId?: string | null;
1130
+ dataSourceRtId?: string | null;
1131
+ config: string;
1132
+ }
1133
+ /**
1134
+ * Result of updating a dashboard, including created widget mappings
1135
+ */
1136
+ interface UpdateDashboardResult {
1137
+ createdWidgets: {
1138
+ localId: string;
1139
+ rtId: string;
1140
+ }[];
1141
+ }
1142
+ declare class MeshBoardPersistenceService {
1143
+ private readonly getDashboardsGQL;
1144
+ private readonly getDashboardWithWidgetsGQL;
1145
+ private readonly createDashboardGQL;
1146
+ private readonly updateDashboardGQL;
1147
+ private readonly createWidgetGQL;
1148
+ private readonly updateWidgetGQL;
1149
+ private readonly deleteEntitiesGQL;
1150
+ private readonly widgetRegistry;
1151
+ private readonly DASHBOARD_CK_TYPE_ID;
1152
+ private readonly WIDGET_CK_TYPE_ID;
1153
+ /**
1154
+ * Separator used to encode variables in the description field.
1155
+ * Format: <description>\n---MESHBOARD_VARIABLES---\n<json>
1156
+ *
1157
+ * Note: This is a temporary solution until the backend schema is updated
1158
+ * to include a dedicated 'config' field for MeshBoard configuration.
1159
+ */
1160
+ private readonly VARIABLES_SEPARATOR;
1161
+ /**
1162
+ * Fetches all available MeshBoards
1163
+ */
1164
+ getMeshBoards(first?: number): Promise<PersistedMeshBoard[]>;
1165
+ /**
1166
+ * Fetches a MeshBoard with all its widgets
1167
+ */
1168
+ getMeshBoardWithWidgets(rtId: string): Promise<{
1169
+ meshBoard: PersistedMeshBoard;
1170
+ widgets: PersistedWidget[];
1171
+ } | null>;
1172
+ /**
1173
+ * Creates a new MeshBoard with its widgets
1174
+ */
1175
+ createMeshBoard(config: MeshBoardConfig): Promise<string>;
1176
+ /**
1177
+ * Updates an existing MeshBoard and its widgets.
1178
+ * Returns mapping of created widgets (localId -> rtId) for state synchronization.
1179
+ */
1180
+ updateMeshBoard(rtId: string, config: MeshBoardConfig, existingWidgetRtIds?: string[]): Promise<UpdateDashboardResult>;
1181
+ /**
1182
+ * Converts a persisted MeshBoard to MeshBoardConfig
1183
+ */
1184
+ toMeshBoardConfig(meshBoard: PersistedMeshBoard, widgets: PersistedWidget[]): MeshBoardConfig;
1185
+ /**
1186
+ * Converts a persisted widget to AnyWidgetConfig.
1187
+ * Delegates to WidgetRegistryService for widget-specific deserialization (SOLID: Open/Closed Principle).
1188
+ */
1189
+ private toWidgetConfig;
1190
+ /**
1191
+ * Maps widget config to GraphQL input.
1192
+ * Delegates to WidgetRegistryService for widget-specific serialization (SOLID: Open/Closed Principle).
1193
+ */
1194
+ private mapWidgetToInput;
1195
+ /**
1196
+ * Builds parent association array based on the association mode
1197
+ */
1198
+ private buildParentAssociations;
1199
+ /**
1200
+ * Deletes a MeshBoard and all its widgets (via cascade delete)
1201
+ */
1202
+ deleteMeshBoard(rtId: string): Promise<void>;
1203
+ /**
1204
+ * Renames a MeshBoard (updates name and description)
1205
+ */
1206
+ renameMeshBoard(rtId: string, name: string, description: string): Promise<void>;
1207
+ /**
1208
+ * Encodes variables and timeFilter into the description field.
1209
+ * Format: <description>\n---MESHBOARD_VARIABLES---\n<json>
1210
+ *
1211
+ * Note: Only static variables are persisted. TimeFilter variables are derived
1212
+ * from the timeFilter selection when the MeshBoard is loaded.
1213
+ */
1214
+ private encodeVariablesInDescription;
1215
+ /**
1216
+ * Decodes variables and timeFilter from the description field.
1217
+ * Returns the original description, parsed variables, and timeFilter config.
1218
+ *
1219
+ * Handles both legacy format (just variables array) and new format (object with variables and timeFilter).
1220
+ */
1221
+ private decodeVariablesFromDescription;
1222
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MeshBoardPersistenceService, never>;
1223
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MeshBoardPersistenceService>;
1224
+ }
1225
+
1226
+ /**
1227
+ * Service that manages MeshBoard state and persistence.
1228
+ * Coordinates loading, saving, and switching between MeshBoards.
1229
+ */
1230
+ declare class MeshBoardStateService {
1231
+ private readonly ckModelService;
1232
+ private readonly persistenceService;
1233
+ private readonly gridService;
1234
+ private readonly _meshBoardConfig;
1235
+ private readonly _persistedMeshBoardId;
1236
+ /** Stores the rtIds of widgets that exist in the backend */
1237
+ private readonly _existingWidgetRtIds;
1238
+ private readonly _availableMeshBoards;
1239
+ private readonly _isLoading;
1240
+ private readonly _isModelAvailable;
1241
+ readonly meshBoardConfig: _angular_core.Signal<MeshBoardConfig>;
1242
+ readonly persistedMeshBoardId: _angular_core.Signal<string | null>;
1243
+ /** @deprecated Use existingWidgetRtIds instead */
1244
+ readonly existingWidgetIds: _angular_core.Signal<string[]>;
1245
+ readonly existingWidgetRtIds: _angular_core.Signal<string[]>;
1246
+ readonly availableMeshBoards: _angular_core.Signal<PersistedMeshBoard[]>;
1247
+ readonly isLoading: _angular_core.Signal<boolean>;
1248
+ readonly widgets: _angular_core.Signal<AnyWidgetConfig[]>;
1249
+ readonly isModelAvailable: _angular_core.Signal<boolean | null>;
1250
+ /** @deprecated Use meshBoardConfig instead */
1251
+ readonly dashboardConfig: _angular_core.Signal<MeshBoardConfig>;
1252
+ /** @deprecated Use persistedMeshBoardId instead */
1253
+ readonly persistedDashboardId: _angular_core.Signal<string | null>;
1254
+ /** @deprecated Use availableMeshBoards instead */
1255
+ readonly availableDashboards: _angular_core.Signal<PersistedMeshBoard[]>;
1256
+ /**
1257
+ * Creates the default MeshBoard configuration.
1258
+ */
1259
+ private createDefaultConfig;
1260
+ /**
1261
+ * Loads the initial MeshBoard from backend or starts with empty MeshBoard.
1262
+ * Only loads if the required CK model (System.UI) is available.
1263
+ */
1264
+ loadInitialMeshBoard(): Promise<AnyWidgetConfig[]>;
1265
+ /** @deprecated Use loadInitialMeshBoard instead */
1266
+ loadInitialDashboard(): Promise<AnyWidgetConfig[]>;
1267
+ /**
1268
+ * Switches to a different MeshBoard by rtId.
1269
+ * Returns the widgets for data loading.
1270
+ */
1271
+ switchToMeshBoard(rtId: string): Promise<AnyWidgetConfig[]>;
1272
+ /** @deprecated Use switchToMeshBoard instead */
1273
+ switchToDashboard(rtId: string): Promise<AnyWidgetConfig[]>;
1274
+ /**
1275
+ * Switches to a MeshBoard identified by its rtWellKnownName.
1276
+ * Loads initial MeshBoards if not already loaded.
1277
+ * Returns the widgets for data loading, or null if not found.
1278
+ */
1279
+ switchToMeshBoardByWellKnownName(wellKnownName: string): Promise<AnyWidgetConfig[] | null>;
1280
+ /**
1281
+ * Saves the current MeshBoard configuration to the backend.
1282
+ */
1283
+ saveMeshBoard(): Promise<void>;
1284
+ /** @deprecated Use saveMeshBoard instead */
1285
+ saveDashboard(): Promise<void>;
1286
+ /**
1287
+ * Updates the MeshBoard configuration.
1288
+ */
1289
+ updateConfig(updater: (config: MeshBoardConfig) => MeshBoardConfig): void;
1290
+ /**
1291
+ * Sets the MeshBoard configuration directly.
1292
+ */
1293
+ setConfig(config: MeshBoardConfig): void;
1294
+ /**
1295
+ * Gets the current MeshBoard configuration (non-reactive).
1296
+ */
1297
+ getConfig(): MeshBoardConfig;
1298
+ /**
1299
+ * Adds a widget to the MeshBoard.
1300
+ */
1301
+ addWidget(widget: AnyWidgetConfig): void;
1302
+ /**
1303
+ * Removes a widget from the MeshBoard.
1304
+ */
1305
+ removeWidget(widgetId: string): void;
1306
+ /**
1307
+ * Updates a specific widget in the MeshBoard.
1308
+ */
1309
+ updateWidget(widgetId: string, updater: (widget: AnyWidgetConfig) => AnyWidgetConfig): void;
1310
+ /**
1311
+ * Gets a widget by ID.
1312
+ */
1313
+ getWidget(widgetId: string): AnyWidgetConfig | undefined;
1314
+ /**
1315
+ * Updates MeshBoard settings (name, description, columns, variables, timeFilter, etc.).
1316
+ */
1317
+ updateSettings(settings: {
1318
+ name: string;
1319
+ description: string;
1320
+ rtWellKnownName?: string;
1321
+ columns: number;
1322
+ rowHeight: number;
1323
+ gap: number;
1324
+ variables?: MeshBoardVariable[];
1325
+ timeFilter?: MeshBoardTimeFilterConfig;
1326
+ }): void;
1327
+ /**
1328
+ * Gets current settings for the settings dialog.
1329
+ */
1330
+ getCurrentSettings(): {
1331
+ name: string;
1332
+ description: string;
1333
+ rtWellKnownName?: string | null;
1334
+ columns: number;
1335
+ rowHeight: number;
1336
+ gap: number;
1337
+ variables: MeshBoardVariable[];
1338
+ timeFilter?: MeshBoardTimeFilterConfig;
1339
+ };
1340
+ /**
1341
+ * Triggers a refresh of all widgets by creating new config references.
1342
+ * This causes ngOnChanges to fire in each widget, triggering data reload.
1343
+ */
1344
+ triggerRefresh(): void;
1345
+ /**
1346
+ * Refreshes the list of available MeshBoards from the backend.
1347
+ */
1348
+ refreshMeshBoardList(): Promise<void>;
1349
+ /** @deprecated Use refreshMeshBoardList instead */
1350
+ refreshDashboardList(): Promise<void>;
1351
+ /**
1352
+ * Creates a new MeshBoard and switches to it.
1353
+ */
1354
+ createNewMeshBoard(name: string, description: string): Promise<string>;
1355
+ /** @deprecated Use createNewMeshBoard instead */
1356
+ createNewDashboard(name: string, description: string): Promise<string>;
1357
+ /**
1358
+ * Renames the specified MeshBoard.
1359
+ */
1360
+ renameMeshBoard(rtId: string, name: string, description: string): Promise<void>;
1361
+ /** @deprecated Use renameMeshBoard instead */
1362
+ renameDashboard(rtId: string, name: string, description: string): Promise<void>;
1363
+ /**
1364
+ * Deletes a MeshBoard.
1365
+ * If the deleted MeshBoard was the current one, switches to the first available.
1366
+ */
1367
+ deleteMeshBoard(rtId: string): Promise<void>;
1368
+ /** @deprecated Use deleteMeshBoard instead */
1369
+ deleteDashboard(rtId: string): Promise<void>;
1370
+ /**
1371
+ * Gets all variables from the current MeshBoard configuration.
1372
+ */
1373
+ getVariables(): MeshBoardVariable[];
1374
+ /**
1375
+ * Gets a specific variable by name.
1376
+ */
1377
+ getVariable(name: string): MeshBoardVariable | undefined;
1378
+ /**
1379
+ * Updates all variables in the MeshBoard configuration.
1380
+ */
1381
+ updateVariables(variables: MeshBoardVariable[]): void;
1382
+ /**
1383
+ * Sets the value of a single variable.
1384
+ */
1385
+ setVariableValue(name: string, value: string): void;
1386
+ /**
1387
+ * Adds a new variable to the MeshBoard.
1388
+ */
1389
+ addVariable(variable: MeshBoardVariable): void;
1390
+ /**
1391
+ * Removes a variable by name.
1392
+ */
1393
+ removeVariable(name: string): void;
1394
+ /**
1395
+ * Checks if the time filter is enabled.
1396
+ */
1397
+ isTimeFilterEnabled(): boolean;
1398
+ /**
1399
+ * Gets the time filter configuration.
1400
+ */
1401
+ getTimeFilterConfig(): MeshBoardTimeFilterConfig | undefined;
1402
+ /**
1403
+ * Updates the time filter configuration.
1404
+ */
1405
+ updateTimeFilterConfig(config: MeshBoardTimeFilterConfig): void;
1406
+ /**
1407
+ * Updates the time filter selection and sets the predefined variables.
1408
+ */
1409
+ updateTimeFilterSelection(selection: TimeRangeSelection, fromISO: string, toISO: string): void;
1410
+ /**
1411
+ * Sets the time filter variables ($timeRangeFrom, $timeRangeTo).
1412
+ * Removes any existing timeFilter variables and adds the new ones.
1413
+ */
1414
+ setTimeFilterVariables(fromISO: string, toISO: string): void;
1415
+ /**
1416
+ * Clears time filter variables (called when time filter is disabled).
1417
+ */
1418
+ clearTimeFilterVariables(): void;
1419
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MeshBoardStateService, never>;
1420
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MeshBoardStateService>;
1421
+ }
1422
+
1423
+ /**
1424
+ * Grouped data item for chart visualization
1425
+ */
1426
+ interface GroupedDataItem {
1427
+ category: string;
1428
+ value: number;
1429
+ }
1430
+ /**
1431
+ * Result of a CK query for charts
1432
+ */
1433
+ interface CkQueryResult {
1434
+ items: GroupedDataItem[];
1435
+ totalCount: number;
1436
+ }
1437
+ /**
1438
+ * A single data item from a repeater query.
1439
+ * Used by Widget Group to render child widgets.
1440
+ */
1441
+ interface RepeaterDataItem {
1442
+ /** Runtime ID of the entity/row */
1443
+ rtId: string;
1444
+ /** CK Type ID */
1445
+ ckTypeId: string;
1446
+ /** Well-known name of the entity */
1447
+ rtWellKnownName?: string;
1448
+ /** All attributes as a Map for easy access */
1449
+ attributes: Map<string, unknown>;
1450
+ }
1451
+ declare class MeshBoardDataService {
1452
+ private readonly getDashboardEntityGQL;
1453
+ private readonly getCkModelsWithStateGQL;
1454
+ private readonly getEntitiesByCkTypeGQL;
1455
+ private readonly executeRuntimeQueryGQL;
1456
+ private readonly apollo;
1457
+ private readonly stateService;
1458
+ private readonly variableService;
1459
+ /**
1460
+ * Fetches data based on the data source configuration
1461
+ */
1462
+ fetchData(dataSource: DataSource): Observable<RuntimeEntityData | RuntimeEntityData[] | null>;
1463
+ /**
1464
+ * Fetches a single runtime entity by rtId and ckTypeId
1465
+ */
1466
+ fetchRuntimeEntity(dataSource: RuntimeEntityDataSource): Observable<RuntimeEntityData | null>;
1467
+ /**
1468
+ * Fetches a single entity with associations by rtId and ckTypeId (using generic query)
1469
+ */
1470
+ fetchEntityWithAssociations(rtId: string, ckTypeId: string): Observable<RuntimeEntityData | null>;
1471
+ /**
1472
+ * Maps GraphQL entity response to RuntimeEntityData
1473
+ */
1474
+ private mapToRuntimeEntityData;
1475
+ private readonly CK_COUNTS_QUERY;
1476
+ /**
1477
+ * Fetches aggregation results for multiple queries.
1478
+ * Returns a Map of query ID to aggregated value.
1479
+ *
1480
+ * Supports:
1481
+ * - Construction Kit count queries (ConstructionKit/* types)
1482
+ * - Runtime entity count queries (any CK type)
1483
+ */
1484
+ fetchAggregations(queries: AggregationQuery[]): Promise<Map<string, number>>;
1485
+ /**
1486
+ * Fetches the count of runtime entities for a given CK type.
1487
+ * Optionally applies field filters to narrow down the count.
1488
+ * Resolves MeshBoard variables in filter values.
1489
+ */
1490
+ private fetchRuntimeEntityCount;
1491
+ /**
1492
+ * Fetches all Construction Kit counts in a single query.
1493
+ */
1494
+ private fetchCkCounts;
1495
+ /**
1496
+ * Extracts the count for a specific CK type from the query result.
1497
+ */
1498
+ private getCkCountFromResult;
1499
+ /**
1500
+ * Fetches data from Construction Kit and groups it for chart visualization.
1501
+ * Supports grouping by fields like modelState for pie/bar charts.
1502
+ */
1503
+ fetchCkQueryData(dataSource: ConstructionKitQueryDataSource): Promise<CkQueryResult>;
1504
+ /**
1505
+ * Fetches data for Widget Group repeater.
1506
+ * Supports two modes:
1507
+ * 1. Query Mode: Execute a persistent query and map rows to items
1508
+ * 2. Entity Mode: Load entities by CK type with optional filters
1509
+ *
1510
+ * @param dataSource The repeater query data source configuration
1511
+ * @returns Array of RepeaterDataItem objects for rendering child widgets
1512
+ */
1513
+ fetchRepeaterData(dataSource: RepeaterQueryDataSource): Promise<RepeaterDataItem[]>;
1514
+ /**
1515
+ * Fetches repeater data from a persistent query.
1516
+ * Maps query rows to RepeaterDataItem objects.
1517
+ */
1518
+ private fetchRepeaterFromQuery;
1519
+ /**
1520
+ * Fetches repeater data from entities by CK type.
1521
+ * Maps entities to RepeaterDataItem objects.
1522
+ */
1523
+ private fetchRepeaterFromEntities;
1524
+ /**
1525
+ * Fetches CK models and groups them by a specified field.
1526
+ * Default groupBy is 'modelState'.
1527
+ */
1528
+ private fetchCkModelsGrouped;
1529
+ /**
1530
+ * Groups CK model items by a specified field.
1531
+ */
1532
+ private groupCkModels;
1533
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MeshBoardDataService, never>;
1534
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MeshBoardDataService>;
1535
+ }
1536
+ /** @deprecated Use MeshBoardDataService instead */
1537
+ declare const DashboardDataService: typeof MeshBoardDataService;
1538
+
1539
+ /**
1540
+ * Base interface for all widget config dialog results.
1541
+ * Each dialog must return at least the data source info.
1542
+ */
1543
+ interface WidgetConfigResult {
1544
+ ckTypeId: string;
1545
+ rtId?: string;
1546
+ }
1547
+ /**
1548
+ * Base configuration passed to widget factory functions.
1549
+ * Contains common fields that all widgets need.
1550
+ */
1551
+ interface BaseWidgetConfig {
1552
+ id: string;
1553
+ title: string;
1554
+ col: number;
1555
+ row: number;
1556
+ colSpan: number;
1557
+ rowSpan: number;
1558
+ configurable?: boolean;
1559
+ }
1560
+ /**
1561
+ * Persisted widget data from the backend.
1562
+ * Used for deserializing widgets from storage.
1563
+ */
1564
+ interface PersistedWidgetData {
1565
+ rtId: string;
1566
+ ckTypeId: string;
1567
+ name: string;
1568
+ type: string;
1569
+ col: number;
1570
+ row: number;
1571
+ colSpan: number;
1572
+ rowSpan: number;
1573
+ dataSourceType: string;
1574
+ dataSourceCkTypeId?: string | null;
1575
+ dataSourceRtId?: string | null;
1576
+ config: string;
1577
+ }
1578
+ /**
1579
+ * Data structure for widget persistence.
1580
+ * Returned by toPersistedConfig to serialize widget-specific config.
1581
+ */
1582
+ interface WidgetPersistenceData {
1583
+ /** Data source type for storage (note: 'persistentQuery' maps to 'systemQuery' in backend) */
1584
+ dataSourceType: DataSourceType;
1585
+ /** CkTypeId for runtimeEntity data sources */
1586
+ dataSourceCkTypeId?: string;
1587
+ /** RtId for runtimeEntity or queryRtId for persistentQuery */
1588
+ dataSourceRtId?: string;
1589
+ /** Widget-specific configuration as JSON-serializable object */
1590
+ config: Record<string, unknown>;
1591
+ }
1592
+ /**
1593
+ * Interface that config dialog components must implement.
1594
+ * Uses EventEmitters for save/cancelled events.
1595
+ */
1596
+ interface WidgetConfigDialog<TResult extends WidgetConfigResult = WidgetConfigResult> {
1597
+ initialCkTypeId?: string;
1598
+ initialRtId?: string;
1599
+ save: Subject<TResult>;
1600
+ cancelled: Subject<void>;
1601
+ }
1602
+ /**
1603
+ * Function type for applying config result to widget.
1604
+ * Takes the current widget and config result, returns updated widget.
1605
+ */
1606
+ type ConfigResultApplier<TWidget extends AnyWidgetConfig = AnyWidgetConfig, TResult extends WidgetConfigResult = WidgetConfigResult> = (widget: TWidget, result: TResult) => TWidget;
1607
+ /**
1608
+ * Registration for a widget type including display component, config dialog, and result handler.
1609
+ * This is the central definition for each widget type - all widget-specific logic lives here.
1610
+ */
1611
+ interface WidgetRegistration<TWidget extends AnyWidgetConfig = AnyWidgetConfig, TResult extends WidgetConfigResult = WidgetConfigResult> {
1612
+ /** Widget type identifier */
1613
+ type: WidgetType;
1614
+ /** Display name for UI */
1615
+ label: string;
1616
+ /** Component that renders the widget */
1617
+ component: Type<unknown>;
1618
+ /** Config dialog component (optional - some widgets may not be configurable) */
1619
+ configDialogComponent?: Type<WidgetConfigDialog<TResult>>;
1620
+ /** Function to apply config result to widget config */
1621
+ applyConfigResult?: ConfigResultApplier<TWidget, TResult>;
1622
+ /** Default size for the widget */
1623
+ defaultSize: {
1624
+ colSpan: number;
1625
+ rowSpan: number;
1626
+ };
1627
+ /** Function to extract initial config values for dialog */
1628
+ getInitialConfig?: (widget: TWidget) => Record<string, unknown>;
1629
+ /**
1630
+ * Data source types that this widget supports.
1631
+ * Used by config dialogs to show only relevant options.
1632
+ * If not specified, all data source types are assumed to be supported.
1633
+ */
1634
+ supportedDataSources?: DataSourceType[];
1635
+ /**
1636
+ * Creates a new widget with default configuration.
1637
+ * Called when adding a new widget to the dashboard.
1638
+ */
1639
+ createDefaultConfig: (baseConfig: BaseWidgetConfig) => TWidget;
1640
+ /**
1641
+ * Serializes widget configuration for persistence.
1642
+ * Extracts widget-specific data for storage in the backend.
1643
+ */
1644
+ toPersistedConfig: (widget: TWidget) => WidgetPersistenceData;
1645
+ /**
1646
+ * Deserializes persisted data back to widget configuration.
1647
+ * Called when loading a dashboard from the backend.
1648
+ */
1649
+ fromPersistedConfig: (data: PersistedWidgetData, baseConfig: BaseWidgetConfig) => TWidget;
1650
+ }
1651
+ /**
1652
+ * Result of opening a config dialog
1653
+ */
1654
+ interface ConfigDialogResult<TResult extends WidgetConfigResult = WidgetConfigResult> {
1655
+ saved: boolean;
1656
+ result?: TResult;
1657
+ }
1658
+ /**
1659
+ * Central registry for widget types.
1660
+ * Manages widget components, config dialogs, and their interactions.
1661
+ *
1662
+ * Usage:
1663
+ * 1. Widgets register themselves via registerWidget()
1664
+ * 2. Dashboard uses getRegisteredWidgets() for "Add Widget" dialog
1665
+ * 3. Dashboard uses getWidgetComponent() for rendering
1666
+ * 4. Dashboard uses openConfigDialog() for configuration
1667
+ */
1668
+ declare class WidgetRegistryService {
1669
+ private readonly injector;
1670
+ private readonly envInjector;
1671
+ private readonly appRef;
1672
+ private readonly registry;
1673
+ /**
1674
+ * Registers a widget type with its components and handlers.
1675
+ */
1676
+ registerWidget<TWidget extends AnyWidgetConfig = AnyWidgetConfig, TResult extends WidgetConfigResult = WidgetConfigResult>(registration: WidgetRegistration<TWidget, TResult>): void;
1677
+ /**
1678
+ * Gets all registered widget types for the "Add Widget" dialog.
1679
+ */
1680
+ getRegisteredWidgets(): {
1681
+ type: WidgetType;
1682
+ label: string;
1683
+ }[];
1684
+ /**
1685
+ * Gets the display component for a widget type.
1686
+ */
1687
+ getWidgetComponent(type: WidgetType): Type<unknown> | undefined;
1688
+ /**
1689
+ * Gets the default size for a widget type.
1690
+ */
1691
+ getDefaultSize(type: WidgetType): {
1692
+ colSpan: number;
1693
+ rowSpan: number;
1694
+ };
1695
+ /**
1696
+ * Gets the full registration for a widget type.
1697
+ * Used by factory and persistence services to delegate widget-specific logic.
1698
+ */
1699
+ getRegistration(type: WidgetType): WidgetRegistration | undefined;
1700
+ /**
1701
+ * Gets the supported data source types for a widget.
1702
+ * Returns all types if not specified in registration.
1703
+ */
1704
+ getSupportedDataSources(type: WidgetType): DataSourceType[];
1705
+ /**
1706
+ * Creates a new widget with default configuration.
1707
+ * Delegates to the widget's createDefaultConfig function.
1708
+ */
1709
+ createWidget(type: WidgetType, baseConfig: BaseWidgetConfig): AnyWidgetConfig;
1710
+ /**
1711
+ * Serializes a widget for persistence.
1712
+ * Delegates to the widget's toPersistedConfig function.
1713
+ */
1714
+ serializeWidget(widget: AnyWidgetConfig): WidgetPersistenceData;
1715
+ /**
1716
+ * Deserializes persisted data back to a widget configuration.
1717
+ * Delegates to the widget's fromPersistedConfig function.
1718
+ */
1719
+ deserializeWidget(data: PersistedWidgetData): AnyWidgetConfig;
1720
+ /**
1721
+ * Builds base configuration from persisted data.
1722
+ */
1723
+ private buildBaseConfig;
1724
+ /**
1725
+ * Checks if a widget type has a config dialog.
1726
+ */
1727
+ hasConfigDialog(type: WidgetType): boolean;
1728
+ /**
1729
+ * Gets the config dialog component for a widget type.
1730
+ */
1731
+ getConfigDialogComponent(type: WidgetType): Type<WidgetConfigDialog> | undefined;
1732
+ /**
1733
+ * Gets the initial config values for a widget's config dialog.
1734
+ */
1735
+ getInitialConfig(widget: AnyWidgetConfig): Record<string, unknown>;
1736
+ /**
1737
+ * Applies config result to a widget.
1738
+ */
1739
+ applyConfigResult(widget: AnyWidgetConfig, result: WidgetConfigResult): AnyWidgetConfig;
1740
+ /**
1741
+ * Opens a config dialog for a widget and returns an Observable with the result.
1742
+ * The dialog is created dynamically and destroyed after closing.
1743
+ */
1744
+ openConfigDialog(widget: AnyWidgetConfig): Observable<ConfigDialogResult>;
1745
+ /**
1746
+ * Opens a config dialog and waits for result (Promise version).
1747
+ */
1748
+ openConfigDialogAsync(widget: AnyWidgetConfig): Promise<ConfigDialogResult>;
1749
+ /**
1750
+ * Helper to extract ckTypeId from widget.
1751
+ */
1752
+ private getCkTypeId;
1753
+ /**
1754
+ * Helper to extract rtId from widget.
1755
+ */
1756
+ private getRtId;
1757
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WidgetRegistryService, never>;
1758
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<WidgetRegistryService>;
1759
+ }
1760
+
1761
+ interface WidgetCreationOptions {
1762
+ title: string;
1763
+ type: WidgetType;
1764
+ col?: number;
1765
+ row?: number;
1766
+ colSpan?: number;
1767
+ rowSpan?: number;
1768
+ ckTypeId?: string;
1769
+ }
1770
+ /**
1771
+ * Service responsible for creating widget configurations.
1772
+ * Delegates to WidgetRegistryService for widget-specific logic (SOLID: Open/Closed Principle).
1773
+ */
1774
+ declare class WidgetFactoryService {
1775
+ private readonly registry;
1776
+ /**
1777
+ * Generates a unique widget ID.
1778
+ */
1779
+ generateId(): string;
1780
+ /**
1781
+ * Creates a new widget with default configuration based on type.
1782
+ * Delegates to the widget registration's createDefaultConfig function.
1783
+ */
1784
+ createWidget(options: WidgetCreationOptions): AnyWidgetConfig;
1785
+ /**
1786
+ * Gets the default size for a widget type.
1787
+ * Delegates to WidgetRegistryService.
1788
+ */
1789
+ getDefaultSize(type: WidgetType): {
1790
+ colSpan: number;
1791
+ rowSpan: number;
1792
+ };
1793
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WidgetFactoryService, never>;
1794
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<WidgetFactoryService>;
1795
+ }
1796
+
1797
+ /**
1798
+ * Service that manages edit mode state and snapshot/restore functionality.
1799
+ * Provides a clean abstraction for entering/exiting edit mode with undo capability.
1800
+ */
1801
+ declare class EditModeStateService {
1802
+ private readonly _isEditMode;
1803
+ private readonly _isSaving;
1804
+ private snapshot;
1805
+ readonly isEditMode: _angular_core.Signal<boolean>;
1806
+ readonly isSaving: _angular_core.Signal<boolean>;
1807
+ /**
1808
+ * Enters edit mode and creates a snapshot of the provided data.
1809
+ * @param data The data to snapshot for potential restoration
1810
+ */
1811
+ enterEditMode<T>(data: T): void;
1812
+ /**
1813
+ * Toggles edit mode. When entering, creates a snapshot of the provided data.
1814
+ * @param data The data to snapshot when entering edit mode
1815
+ * @returns true if now in edit mode, false if exited
1816
+ */
1817
+ toggleEditMode<T>(data: T): boolean;
1818
+ /**
1819
+ * Cancels edit mode and restores the original data from the snapshot.
1820
+ * @returns The restored data, or null if no snapshot exists
1821
+ */
1822
+ cancelEdit<T>(): T | null;
1823
+ /**
1824
+ * Begins a save operation.
1825
+ */
1826
+ beginSave(): void;
1827
+ /**
1828
+ * Completes a save operation successfully, clearing the snapshot and exiting edit mode.
1829
+ */
1830
+ completeSave(): void;
1831
+ /**
1832
+ * Handles a failed save operation, staying in edit mode.
1833
+ */
1834
+ failSave(): void;
1835
+ /**
1836
+ * Checks if there are unsaved changes (snapshot exists).
1837
+ */
1838
+ hasUnsavedChanges(): boolean;
1839
+ /**
1840
+ * Gets the current snapshot without modifying state.
1841
+ * Useful for comparing current state with original.
1842
+ */
1843
+ getSnapshot<T>(): T | null;
1844
+ /**
1845
+ * Updates the snapshot with new data while staying in edit mode.
1846
+ * Useful when you want to update the "base" state during editing.
1847
+ */
1848
+ updateSnapshot<T>(data: T): void;
1849
+ /**
1850
+ * Resets all state (useful for cleanup).
1851
+ */
1852
+ reset(): void;
1853
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EditModeStateService, never>;
1854
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<EditModeStateService>;
1855
+ }
1856
+
1857
+ interface GridCell {
1858
+ col: number;
1859
+ row: number;
1860
+ }
1861
+ interface GridPosition {
1862
+ col: number;
1863
+ row: number;
1864
+ }
1865
+ /**
1866
+ * Service for MeshBoard grid layout calculations and collision detection.
1867
+ * Handles widget positioning, overlap detection, and finding available positions.
1868
+ */
1869
+ declare class MeshBoardGridService {
1870
+ /**
1871
+ * Returns all grid cells occupied by a widget at the given position/size.
1872
+ */
1873
+ getCells(col: number, row: number, colSpan: number, rowSpan: number): GridCell[];
1874
+ /**
1875
+ * Checks if placing a widget at the given position/size would overlap with any other widget.
1876
+ * Uses the model (not DOM) for accurate, predictable collision detection.
1877
+ */
1878
+ wouldCauseOverlap(widgets: AnyWidgetConfig[], widgetId: string, col: number, row: number, colSpan: number, rowSpan: number): boolean;
1879
+ /**
1880
+ * Checks if a widget would extend beyond the grid boundaries.
1881
+ */
1882
+ isOutOfBounds(col: number, colSpan: number, maxColumns: number): boolean;
1883
+ /**
1884
+ * Finds an available position for a widget of the given size.
1885
+ */
1886
+ findAvailablePosition(widgets: AnyWidgetConfig[], colSpan: number, rowSpan: number, maxColumns: number): GridPosition;
1887
+ /**
1888
+ * Resolves overlapping widgets by moving them to non-overlapping positions.
1889
+ * Modifies the widgets array in place.
1890
+ * Returns the list of widgets that were moved.
1891
+ */
1892
+ resolveOverlaps(widgets: AnyWidgetConfig[], maxColumns: number): AnyWidgetConfig[];
1893
+ /**
1894
+ * Gets all widgets that would be outside the grid if columns were reduced.
1895
+ */
1896
+ getWidgetsOutOfBounds(widgets: AnyWidgetConfig[], newColumns: number): AnyWidgetConfig[];
1897
+ /**
1898
+ * Calculates the maximum row used by any widget.
1899
+ */
1900
+ getMaxRow(widgets: AnyWidgetConfig[]): number;
1901
+ /**
1902
+ * Creates a set of all occupied cell keys from the widgets.
1903
+ */
1904
+ private getOccupiedCells;
1905
+ /**
1906
+ * Finds an available position using a pre-computed set of occupied cells.
1907
+ */
1908
+ private findAvailablePositionWithOccupied;
1909
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MeshBoardGridService, never>;
1910
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MeshBoardGridService>;
1911
+ }
1912
+ /** @deprecated Use MeshBoardGridService instead */
1913
+ declare const DashboardGridService: typeof MeshBoardGridService;
1914
+
1915
+ declare class EntityCardWidgetComponent implements DashboardWidget<EntityCardWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {
1916
+ private readonly dataService;
1917
+ config: EntityCardWidgetConfig;
1918
+ private readonly _isLoading;
1919
+ private readonly _data;
1920
+ private readonly _error;
1921
+ readonly isLoading: _angular_core.Signal<boolean>;
1922
+ readonly data: _angular_core.Signal<RuntimeEntityData | null>;
1923
+ readonly error: _angular_core.Signal<string | null>;
1924
+ /**
1925
+ * Check if widget is not configured (needs data source setup).
1926
+ * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.
1927
+ */
1928
+ isNotConfigured(): boolean;
1929
+ readonly entityTypeName: _angular_core.Signal<string>;
1930
+ readonly displayName: _angular_core.Signal<string>;
1931
+ readonly filteredAttributes: _angular_core.Signal<_meshmakers_octo_meshboard.EntityAttribute[]>;
1932
+ ngOnInit(): void;
1933
+ ngOnChanges(changes: SimpleChanges): void;
1934
+ refresh(): void;
1935
+ private loadData;
1936
+ formatValue(value: unknown): string;
1937
+ formatAttributeName(name: string): string;
1938
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityCardWidgetComponent, never>;
1939
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityCardWidgetComponent, "mm-entity-card-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
1940
+ }
1941
+
1942
+ /**
1943
+ * Configuration result from the dialog
1944
+ */
1945
+ interface EntityCardConfigResult {
1946
+ ckTypeId: string;
1947
+ rtId: string;
1948
+ }
1949
+ /**
1950
+ * Configuration dialog for EntityCard and EntityAssociations widgets.
1951
+ * Allows selecting a Runtime Entities type and a specific entity.
1952
+ */
1953
+ declare class EntityCardConfigDialogComponent implements OnInit {
1954
+ private readonly getEntitiesByCkTypeGQL;
1955
+ private readonly ckTypeSelectorService;
1956
+ ckTypeSelectorInput?: CkTypeSelectorInputComponent;
1957
+ entitySelectorInput?: EntitySelectInputComponent;
1958
+ initialCkTypeId?: string;
1959
+ initialRtId?: string;
1960
+ save: EventEmitter<EntityCardConfigResult>;
1961
+ cancelled: EventEmitter<void>;
1962
+ selectedCkType: CkTypeSelectorItem | null;
1963
+ selectedEntity: RuntimeEntityItem$1 | null;
1964
+ entityDataSource?: RuntimeEntitySelectDataSource$1;
1965
+ entityDialogDataSource?: RuntimeEntityDialogDataSource$1;
1966
+ isLoadingInitial: boolean;
1967
+ get isValid(): boolean;
1968
+ ngOnInit(): Promise<void>;
1969
+ private loadInitialValues;
1970
+ private loadInitialEntity;
1971
+ onCkTypeSelected(ckType: CkTypeSelectorItem): void;
1972
+ onCkTypeCleared(): void;
1973
+ onEntitySelected(entity: RuntimeEntityItem$1): void;
1974
+ onEntityCleared(): void;
1975
+ onSave(): void;
1976
+ onCancel(): void;
1977
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityCardConfigDialogComponent, never>;
1978
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityCardConfigDialogComponent, "mm-entity-card-config-dialog", never, { "initialCkTypeId": { "alias": "initialCkTypeId"; "required": false; }; "initialRtId": { "alias": "initialRtId"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
1979
+ }
1980
+
1981
+ declare class KpiWidgetComponent implements DashboardWidget<KpiWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {
1982
+ private readonly dataService;
1983
+ private readonly executeRuntimeQueryGQL;
1984
+ private readonly stateService;
1985
+ private readonly variableService;
1986
+ config: KpiWidgetConfig;
1987
+ protected readonly arrowUpIcon: _progress_kendo_svg_icons.SVGIcon;
1988
+ protected readonly arrowDownIcon: _progress_kendo_svg_icons.SVGIcon;
1989
+ protected readonly minusIcon: _progress_kendo_svg_icons.SVGIcon;
1990
+ private readonly _isLoading;
1991
+ private readonly _data;
1992
+ private readonly _error;
1993
+ readonly isLoading: _angular_core.Signal<boolean>;
1994
+ readonly data: _angular_core.Signal<RuntimeEntityData | null>;
1995
+ readonly error: _angular_core.Signal<string | null>;
1996
+ /**
1997
+ * Check if widget is not configured (needs data source setup).
1998
+ * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.
1999
+ */
2000
+ isNotConfigured(): boolean;
2001
+ readonly value: _angular_core.Signal<string>;
2002
+ /**
2003
+ * Gets a system property value from RuntimeEntityData.
2004
+ * System properties are top-level properties like rtId, ckTypeId, rtWellKnownName.
2005
+ */
2006
+ private getSystemPropertyValue;
2007
+ /**
2008
+ * Formats a value for display in the KPI widget.
2009
+ * Numbers are formatted with locale, strings are displayed as-is.
2010
+ */
2011
+ private formatDisplayValue;
2012
+ readonly label: _angular_core.Signal<string>;
2013
+ readonly trendIcon: _angular_core.Signal<_progress_kendo_svg_icons.SVGIcon>;
2014
+ readonly trendClass: _angular_core.Signal<"trend-up" | "trend-down" | "trend-neutral">;
2015
+ ngOnInit(): void;
2016
+ ngOnChanges(changes: SimpleChanges): void;
2017
+ refresh(): void;
2018
+ private loadData;
2019
+ private loadCountData;
2020
+ private loadPersistentQueryData;
2021
+ private extractAggregationValue;
2022
+ private extractGroupedAggregationValue;
2023
+ private parseNumericValue;
2024
+ /**
2025
+ * Extracts a cell value, preserving strings and converting numbers.
2026
+ * Returns the value as-is if it's a string, or parses it as a number.
2027
+ */
2028
+ private extractCellValue;
2029
+ private sanitizeFieldName;
2030
+ /**
2031
+ * Converts widget filter configuration to GraphQL FieldFilterDto format.
2032
+ * Resolves MeshBoard variables in filter values before conversion.
2033
+ */
2034
+ private convertFiltersToDto;
2035
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KpiWidgetComponent, never>;
2036
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KpiWidgetComponent, "mm-kpi-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
2037
+ }
2038
+
2039
+ /**
2040
+ * Data source type for KPI
2041
+ */
2042
+ type KpiDataSourceType = 'runtimeEntity' | 'persistentQuery';
2043
+ /**
2044
+ * Configuration result from the KPI dialog
2045
+ */
2046
+ interface KpiConfigResult extends WidgetConfigResult {
2047
+ dataSourceType: KpiDataSourceType;
2048
+ ckTypeId: string;
2049
+ rtId?: string;
2050
+ valueAttribute: string;
2051
+ labelAttribute?: string;
2052
+ queryRtId?: string;
2053
+ queryName?: string;
2054
+ queryMode?: KpiQueryMode;
2055
+ queryValueField?: string;
2056
+ queryCategoryField?: string;
2057
+ queryCategoryValue?: string;
2058
+ prefix?: string;
2059
+ suffix?: string;
2060
+ trend?: 'up' | 'down' | 'neutral';
2061
+ filters?: FieldFilterDto[];
2062
+ }
2063
+ interface TrendOption {
2064
+ value: 'up' | 'down' | 'neutral' | undefined;
2065
+ label: string;
2066
+ }
2067
+ /**
2068
+ * Configuration dialog for KPI widgets.
2069
+ * Allows selecting data source, value attribute, and display options.
2070
+ */
2071
+ declare class KpiConfigDialogComponent implements OnInit {
2072
+ private readonly getEntitiesByCkTypeGQL;
2073
+ private readonly ckTypeSelectorService;
2074
+ private readonly attributeSelectorService;
2075
+ private readonly executeRuntimeQueryGQL;
2076
+ private readonly getCkTypeAvailableQueryColumnsGQL;
2077
+ private readonly meshBoardStateService;
2078
+ ckTypeSelectorInput?: CkTypeSelectorInputComponent;
2079
+ entitySelectorInput?: EntitySelectInputComponent;
2080
+ querySelector?: QuerySelectorComponent;
2081
+ initialCkTypeId?: string;
2082
+ initialRtId?: string;
2083
+ initialValueAttribute?: string;
2084
+ initialLabelAttribute?: string;
2085
+ initialPrefix?: string;
2086
+ initialSuffix?: string;
2087
+ initialTrend?: 'up' | 'down' | 'neutral';
2088
+ initialDataSourceType?: KpiDataSourceType;
2089
+ initialQueryRtId?: string;
2090
+ initialQueryName?: string;
2091
+ initialQueryMode?: KpiQueryMode;
2092
+ initialQueryValueField?: string;
2093
+ initialQueryCategoryField?: string;
2094
+ initialQueryCategoryValue?: string;
2095
+ initialFilters?: WidgetFilterConfig[];
2096
+ save: EventEmitter<KpiConfigResult>;
2097
+ cancelled: EventEmitter<void>;
2098
+ dataSourceType: KpiDataSourceType;
2099
+ selectedCkType: CkTypeSelectorItem | null;
2100
+ selectedEntity: RuntimeEntityItem$1 | null;
2101
+ entityDataSource?: RuntimeEntitySelectDataSource$1;
2102
+ entityDialogDataSource?: RuntimeEntityDialogDataSource$1;
2103
+ isLoadingInitial: boolean;
2104
+ isCountMode: boolean;
2105
+ selectedPersistentQuery: PersistentQueryItem | null;
2106
+ queryColumns: QueryColumnItem[];
2107
+ categoryValues: CategoryValueItem[];
2108
+ queryMode: KpiQueryMode;
2109
+ isLoadingQueryColumns: boolean;
2110
+ isLoadingCategoryValues: boolean;
2111
+ readonly isLoadingAttributes: _angular_core.WritableSignal<boolean>;
2112
+ readonly availableAttributes: _angular_core.WritableSignal<AttributeItem[]>;
2113
+ readonly filteredValueAttributes: _angular_core.WritableSignal<AttributeItem[]>;
2114
+ readonly filteredLabelAttributes: _angular_core.WritableSignal<AttributeItem[]>;
2115
+ filters: FieldFilterItem[];
2116
+ filterAttributes: AttributeItem[];
2117
+ filterVariables: FilterVariable[];
2118
+ form: {
2119
+ valueAttribute: string;
2120
+ labelAttribute: string;
2121
+ prefix: string;
2122
+ suffix: string;
2123
+ trend: "up" | "down" | "neutral" | undefined;
2124
+ queryValueField: string;
2125
+ queryCategoryField: string;
2126
+ queryCategoryValue: string;
2127
+ };
2128
+ trendOptions: TrendOption[];
2129
+ queryModeOptions: {
2130
+ value: KpiQueryMode;
2131
+ label: string;
2132
+ }[];
2133
+ get isValid(): boolean;
2134
+ ngOnInit(): Promise<void>;
2135
+ private loadInitialValues;
2136
+ private loadInitialEntity;
2137
+ setCountMode(countMode: boolean): void;
2138
+ onCkTypeSelected(ckType: CkTypeSelectorItem): void;
2139
+ onCkTypeCleared(): void;
2140
+ private loadAvailableAttributes;
2141
+ onValueAttributeFilter(filter: string): void;
2142
+ onLabelAttributeFilter(filter: string): void;
2143
+ onEntitySelected(entity: RuntimeEntityItem$1): void;
2144
+ onEntityCleared(): void;
2145
+ onSave(): void;
2146
+ onCancel(): void;
2147
+ onDataSourceTypeChange(type: KpiDataSourceType): void;
2148
+ onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
2149
+ onQueryModeChange(mode: KpiQueryMode): Promise<void>;
2150
+ private loadQueryColumnsAndValues;
2151
+ /**
2152
+ * Loads all available filter attributes from the CK type.
2153
+ * Uses getCkTypeAvailableQueryColumns to get all attributes, not just query result columns.
2154
+ */
2155
+ private loadFilterAttributesFromCkType;
2156
+ onCategoryFieldChange(categoryField: string): Promise<void>;
2157
+ private loadCategoryValuesForField;
2158
+ private extractCategoryValues;
2159
+ private sanitizeFieldName;
2160
+ onFiltersChange(updatedFilters: FieldFilterItem[]): void;
2161
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KpiConfigDialogComponent, never>;
2162
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KpiConfigDialogComponent, "mm-kpi-config-dialog", never, { "initialCkTypeId": { "alias": "initialCkTypeId"; "required": false; }; "initialRtId": { "alias": "initialRtId"; "required": false; }; "initialValueAttribute": { "alias": "initialValueAttribute"; "required": false; }; "initialLabelAttribute": { "alias": "initialLabelAttribute"; "required": false; }; "initialPrefix": { "alias": "initialPrefix"; "required": false; }; "initialSuffix": { "alias": "initialSuffix"; "required": false; }; "initialTrend": { "alias": "initialTrend"; "required": false; }; "initialDataSourceType": { "alias": "initialDataSourceType"; "required": false; }; "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; "initialQueryMode": { "alias": "initialQueryMode"; "required": false; }; "initialQueryValueField": { "alias": "initialQueryValueField"; "required": false; }; "initialQueryCategoryField": { "alias": "initialQueryCategoryField"; "required": false; }; "initialQueryCategoryValue": { "alias": "initialQueryCategoryValue"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
2163
+ }
2164
+
2165
+ interface GroupedAssociation {
2166
+ roleId: string;
2167
+ roleName: string;
2168
+ targetType: string;
2169
+ direction: 'in' | 'out';
2170
+ count: number;
2171
+ associations: EntityAssociation[];
2172
+ isExpanded: boolean;
2173
+ }
2174
+ interface TargetEntity {
2175
+ rtId: string;
2176
+ ckTypeId: string;
2177
+ displayName: string;
2178
+ }
2179
+ declare class EntityAssociationsWidgetComponent implements DashboardWidget<EntityWithAssociationsWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {
2180
+ private readonly dataService;
2181
+ config: EntityWithAssociationsWidgetConfig;
2182
+ protected readonly arrowRightIcon: _progress_kendo_svg_icons.SVGIcon;
2183
+ protected readonly arrowLeftIcon: _progress_kendo_svg_icons.SVGIcon;
2184
+ protected readonly linkIcon: _progress_kendo_svg_icons.SVGIcon;
2185
+ protected readonly chevronDownIcon: _progress_kendo_svg_icons.SVGIcon;
2186
+ protected readonly chevronRightIcon: _progress_kendo_svg_icons.SVGIcon;
2187
+ private readonly _isLoading;
2188
+ private readonly _data;
2189
+ private readonly _error;
2190
+ private readonly _expandedGroups;
2191
+ protected showDetailDialog: boolean;
2192
+ protected detailEntityRtId: string;
2193
+ protected detailEntityCkTypeId: string;
2194
+ readonly isLoading: _angular_core.Signal<boolean>;
2195
+ readonly data: _angular_core.Signal<RuntimeEntityData | null>;
2196
+ readonly error: _angular_core.Signal<string | null>;
2197
+ /**
2198
+ * Check if widget is not configured (needs data source setup).
2199
+ * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.
2200
+ */
2201
+ isNotConfigured(): boolean;
2202
+ readonly entityName: _angular_core.Signal<string>;
2203
+ readonly entityRtId: _angular_core.Signal<string>;
2204
+ readonly entityCkTypeId: _angular_core.Signal<string>;
2205
+ readonly displayMode: _angular_core.Signal<"count" | "expandable">;
2206
+ readonly groupedAssociations: _angular_core.Signal<GroupedAssociation[]>;
2207
+ readonly totalAssociations: _angular_core.Signal<number>;
2208
+ ngOnInit(): void;
2209
+ ngOnChanges(changes: SimpleChanges): void;
2210
+ refresh(): void;
2211
+ protected toggleGroup(group: GroupedAssociation): void;
2212
+ protected isGroupExpanded(group: GroupedAssociation): boolean;
2213
+ protected getTargetEntities(group: GroupedAssociation): TargetEntity[];
2214
+ protected onTargetClick(target: TargetEntity): void;
2215
+ protected onDetailDialogClosed(): void;
2216
+ private loadData;
2217
+ private formatRoleName;
2218
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityAssociationsWidgetComponent, never>;
2219
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityAssociationsWidgetComponent, "mm-entity-associations-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
2220
+ }
2221
+
2222
+ /**
2223
+ * Represents a runtime entity for selection
2224
+ */
2225
+ interface RuntimeEntityItem {
2226
+ rtId: string;
2227
+ ckTypeId: string;
2228
+ rtWellKnownName?: string;
2229
+ displayName: string;
2230
+ }
2231
+ /**
2232
+ * Represents an association role for selection
2233
+ */
2234
+ interface AssociationRoleItem {
2235
+ roleId: string;
2236
+ navigationPropertyName: string;
2237
+ direction: 'in' | 'out';
2238
+ targetCkTypeId: string;
2239
+ multiplicity: string;
2240
+ displayName: string;
2241
+ }
2242
+ /**
2243
+ * Configuration result from the dialog
2244
+ */
2245
+ interface AssociationsConfigResult {
2246
+ ckTypeId: string;
2247
+ rtId: string;
2248
+ showIncoming: boolean;
2249
+ showOutgoing: boolean;
2250
+ roleFilter: string[];
2251
+ displayMode: 'count' | 'expandable';
2252
+ }
2253
+ /**
2254
+ * Data source for entity autocomplete - filters by ckTypeId
2255
+ */
2256
+ declare class RuntimeEntitySelectDataSource implements EntitySelectDataSource<RuntimeEntityItem> {
2257
+ private getEntitiesByCkTypeGQL;
2258
+ private ckTypeId;
2259
+ constructor(getEntitiesByCkTypeGQL: GetEntitiesByCkTypeDtoGQL, ckTypeId: string);
2260
+ onFilter(filter: string, take?: number): Promise<EntitySelectResult<RuntimeEntityItem>>;
2261
+ onDisplayEntity(entity: RuntimeEntityItem): string;
2262
+ getIdEntity(entity: RuntimeEntityItem): string;
2263
+ }
2264
+ /**
2265
+ * Dialog data source for entity selection grid
2266
+ */
2267
+ declare class RuntimeEntityDialogDataSource implements EntitySelectDialogDataSource<RuntimeEntityItem> {
2268
+ private getEntitiesByCkTypeGQL;
2269
+ private ckTypeId;
2270
+ constructor(getEntitiesByCkTypeGQL: GetEntitiesByCkTypeDtoGQL, ckTypeId: string);
2271
+ getColumns(): ColumnDefinition[];
2272
+ fetchData(options: DialogFetchOptions): Observable<DialogFetchResult<RuntimeEntityItem>>;
2273
+ onDisplayEntity(entity: RuntimeEntityItem): string;
2274
+ getIdEntity(entity: RuntimeEntityItem): string;
2275
+ }
2276
+ /**
2277
+ * Configuration dialog for EntityWithAssociations widget.
2278
+ * Allows selecting a CK Type, runtime entity, direction filters, and role filters.
2279
+ */
2280
+ declare class AssociationsConfigDialogComponent implements OnInit {
2281
+ private readonly getEntitiesByCkTypeGQL;
2282
+ private readonly getCkTypeAssociationRolesGQL;
2283
+ private readonly ckTypeSelectorService;
2284
+ initialCkTypeId?: string;
2285
+ initialRtId?: string;
2286
+ initialShowIncoming?: boolean;
2287
+ initialShowOutgoing?: boolean;
2288
+ initialRoleFilter?: string[];
2289
+ initialDisplayMode?: 'count' | 'expandable';
2290
+ save: EventEmitter<AssociationsConfigResult>;
2291
+ cancelled: EventEmitter<void>;
2292
+ selectedCkType: CkTypeSelectorItem | null;
2293
+ selectedEntity: RuntimeEntityItem | null;
2294
+ entityDataSource?: RuntimeEntitySelectDataSource;
2295
+ entityDialogDataSource?: RuntimeEntityDialogDataSource;
2296
+ showIncoming: boolean;
2297
+ showOutgoing: boolean;
2298
+ selectedRoles: AssociationRoleItem[];
2299
+ displayMode: 'count' | 'expandable';
2300
+ isLoadingInitial: boolean;
2301
+ readonly isLoadingRoles: _angular_core.WritableSignal<boolean>;
2302
+ readonly availableRoles: _angular_core.WritableSignal<AssociationRoleItem[]>;
2303
+ readonly filteredRoles: _angular_core.WritableSignal<AssociationRoleItem[]>;
2304
+ private roleFilterText;
2305
+ get isValid(): boolean;
2306
+ ngOnInit(): Promise<void>;
2307
+ private loadInitialValues;
2308
+ private loadInitialEntity;
2309
+ onCkTypeSelected(ckType: CkTypeSelectorItem): Promise<void>;
2310
+ onCkTypeCleared(): void;
2311
+ onEntitySelected(entity: RuntimeEntityItem): void;
2312
+ onEntityCleared(): void;
2313
+ onRoleFilterChange(filter: string): void;
2314
+ private updateFilteredRoles;
2315
+ private loadAssociationRoles;
2316
+ private formatTypeName;
2317
+ onSave(): void;
2318
+ onCancel(): void;
2319
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AssociationsConfigDialogComponent, never>;
2320
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AssociationsConfigDialogComponent, "mm-associations-config-dialog", never, { "initialCkTypeId": { "alias": "initialCkTypeId"; "required": false; }; "initialRtId": { "alias": "initialRtId"; "required": false; }; "initialShowIncoming": { "alias": "initialShowIncoming"; "required": false; }; "initialShowOutgoing": { "alias": "initialShowOutgoing"; "required": false; }; "initialRoleFilter": { "alias": "initialRoleFilter"; "required": false; }; "initialDisplayMode": { "alias": "initialDisplayMode"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
2321
+ }
2322
+
2323
+ /**
2324
+ * Dialog component for displaying entity details using property grid.
2325
+ * Shows all attributes of an entity with their names, values, and types.
2326
+ */
2327
+ declare class EntityDetailDialogComponent implements OnInit {
2328
+ private readonly getDashboardEntityGQL;
2329
+ rtId: string;
2330
+ ckTypeId: string;
2331
+ closed: EventEmitter<void>;
2332
+ readonly isLoading: _angular_core.WritableSignal<boolean>;
2333
+ readonly error: _angular_core.WritableSignal<string | null>;
2334
+ readonly rtWellKnownName: _angular_core.WritableSignal<string | null>;
2335
+ readonly propertyGridData: _angular_core.WritableSignal<PropertyGridItem[]>;
2336
+ readonly propertyGridConfig: PropertyGridConfig;
2337
+ get dialogTitle(): string;
2338
+ ngOnInit(): Promise<void>;
2339
+ formatCkTypeId(ckTypeId: string): string;
2340
+ private loadEntityDetails;
2341
+ private formatAttributeName;
2342
+ private inferAttributeType;
2343
+ onClose(): void;
2344
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityDetailDialogComponent, never>;
2345
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityDetailDialogComponent, "mm-entity-detail-dialog", never, { "rtId": { "alias": "rtId"; "required": false; }; "ckTypeId": { "alias": "ckTypeId"; "required": false; }; }, { "closed": "closed"; }, never, never, true, never>;
2346
+ }
2347
+
2348
+ /**
2349
+ * Column info derived from a persistent query response
2350
+ */
2351
+ interface QueryColumn {
2352
+ attributePath: string;
2353
+ attributeValueType: string;
2354
+ }
2355
+ /**
2356
+ * DataSource directive for the Table Widget.
2357
+ * Fetches entities based on the widget configuration (ckTypeId, filters, sorting).
2358
+ * Supports both RuntimeEntity and PersistentQuery data sources.
2359
+ */
2360
+ declare class TableWidgetDataSourceDirective extends OctoGraphQlDataSource<Record<string, unknown>> {
2361
+ private readonly getEntitiesByCkTypeGQL;
2362
+ private readonly executeRuntimeQueryGQL;
2363
+ private readonly stateService;
2364
+ private readonly variableService;
2365
+ private _config;
2366
+ /** Signal for dynamically derived columns from persistent query */
2367
+ private readonly _queryColumns;
2368
+ /** Exposed signal for reading derived columns */
2369
+ readonly queryColumns: Signal<QueryColumn[]>;
2370
+ /** Derived TableColumn array from persistent query columns */
2371
+ readonly derivedColumns: Signal<TableColumn[]>;
2372
+ /** Event emitted when query columns are loaded from a persistent query */
2373
+ queryColumnsLoaded: EventEmitter<QueryColumn[]>;
2374
+ set config(value: TableWidgetConfig | null);
2375
+ get config(): TableWidgetConfig | null;
2376
+ constructor();
2377
+ fetchData(queryOptions: FetchDataOptions): Observable<FetchResultTyped<Record<string, unknown>> | null>;
2378
+ /**
2379
+ * Recursively flattens attributes into the record using dot notation for nested attributes.
2380
+ * Handles nested CkRecord attributes by extracting their inner attributes.
2381
+ */
2382
+ private flattenAttributes;
2383
+ /**
2384
+ * Fetches data from a persistent query.
2385
+ * Extracts columns from the query response and transforms cells to flat records.
2386
+ */
2387
+ private fetchPersistentQueryData;
2388
+ /**
2389
+ * Converts query columns to TableColumn format for display.
2390
+ */
2391
+ getTableColumnsFromQuery(): TableColumn[];
2392
+ /**
2393
+ * Clears the cached query columns. Call this before fetching new data
2394
+ * when the query configuration changes.
2395
+ */
2396
+ clearQueryColumns(): void;
2397
+ private formatColumnTitle;
2398
+ /**
2399
+ * Sanitizes field names for Kendo Grid compatibility.
2400
+ * Kendo interprets dots as nested object paths, so we replace them with underscores.
2401
+ */
2402
+ private sanitizeFieldName;
2403
+ /**
2404
+ * Converts widget filter configuration to GraphQL FieldFilterDto format.
2405
+ * Resolves MeshBoard variables in filter values before conversion.
2406
+ */
2407
+ private convertFiltersToDto;
2408
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableWidgetDataSourceDirective, never>;
2409
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TableWidgetDataSourceDirective, "[mmTableWidgetDataSource]", ["mmTableWidgetDataSource"], { "config": { "alias": "config"; "required": false; }; }, { "queryColumnsLoaded": "queryColumnsLoaded"; }, never, never, true, never>;
2410
+ }
2411
+
2412
+ declare class TableWidgetComponent implements DashboardWidget<TableWidgetConfig, Record<string, unknown>[]>, OnChanges {
2413
+ config: TableWidgetConfig;
2414
+ dataSource?: TableWidgetDataSourceDirective;
2415
+ private readonly _isLoading;
2416
+ private readonly _data;
2417
+ private readonly _error;
2418
+ readonly isLoading: _angular_core.Signal<boolean>;
2419
+ readonly data: _angular_core.Signal<Record<string, unknown>[]>;
2420
+ readonly error: _angular_core.Signal<string | null>;
2421
+ /** Signal to track query columns from data source (for persistent queries) */
2422
+ private readonly _queryColumnsForView;
2423
+ /**
2424
+ * Called when the data source emits queryColumnsLoaded event.
2425
+ * Updates the view columns directly from the emitted columns.
2426
+ */
2427
+ onQueryColumnsLoaded(columns: QueryColumn[]): void;
2428
+ /**
2429
+ * Converts TableWidgetConfig columns to ListViewComponent TableColumn format.
2430
+ * For persistent queries, uses dynamically derived columns from the query response.
2431
+ */
2432
+ readonly listViewColumns: _angular_core.Signal<TableColumn$1[]>;
2433
+ /**
2434
+ * Checks if the widget has a valid configuration.
2435
+ * Supports both runtimeEntity and persistentQuery data sources.
2436
+ */
2437
+ hasValidConfig(): boolean;
2438
+ /**
2439
+ * Checks if columns are ready to be displayed.
2440
+ * For persistent queries, columns are derived from the query response.
2441
+ * Returns true once columns are available.
2442
+ */
2443
+ readonly columnsReady: _angular_core.Signal<boolean>;
2444
+ private formatColumnTitle;
2445
+ ngOnChanges(changes: SimpleChanges): void;
2446
+ refresh(): void;
2447
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableWidgetComponent, never>;
2448
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableWidgetComponent, "mm-table-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
2449
+ }
2450
+
2451
+ /**
2452
+ * Data source type for table widget
2453
+ */
2454
+ type TableDataSourceType = 'runtimeEntity' | 'persistentQuery';
2455
+ /**
2456
+ * Configuration result from the Table dialog
2457
+ */
2458
+ interface TableConfigResult {
2459
+ dataSourceType: TableDataSourceType;
2460
+ ckTypeId: string;
2461
+ columns: TableColumn[];
2462
+ sorting: SortDto[];
2463
+ filters: FieldFilterDto[];
2464
+ queryRtId?: string;
2465
+ queryName?: string;
2466
+ pageSize: number;
2467
+ sortable: boolean;
2468
+ }
2469
+ /**
2470
+ * Configuration dialog for Table widgets.
2471
+ * Uses the standard dialogs from octo-ui for column, sorting, and filter configuration.
2472
+ */
2473
+ declare class TableConfigDialogComponent implements OnInit {
2474
+ private readonly ckTypeSelectorService;
2475
+ private readonly attributeSelectorDialog;
2476
+ private readonly attributeSortSelectorDialog;
2477
+ private readonly notificationService;
2478
+ private readonly getCkTypeAvailableQueryColumnsGQL;
2479
+ private readonly stateService;
2480
+ ckTypeSelectorInput?: CkTypeSelectorInputComponent;
2481
+ filterEditor?: FieldFilterEditorComponent;
2482
+ querySelector?: QuerySelectorComponent;
2483
+ initialDataSourceType?: TableDataSourceType;
2484
+ initialCkTypeId?: string;
2485
+ initialColumns?: TableColumn[];
2486
+ initialSorting?: {
2487
+ attributePath: string;
2488
+ sortOrder: string;
2489
+ }[];
2490
+ initialFilters?: {
2491
+ attributePath: string;
2492
+ operator: string;
2493
+ comparisonValue: string;
2494
+ }[];
2495
+ initialPageSize?: number;
2496
+ initialSortable?: boolean;
2497
+ initialQueryRtId?: string;
2498
+ initialQueryName?: string;
2499
+ save: EventEmitter<TableConfigResult>;
2500
+ cancelled: EventEmitter<void>;
2501
+ protected readonly columnsIcon: _progress_kendo_svg_icons.SVGIcon;
2502
+ protected readonly sortIcon: _progress_kendo_svg_icons.SVGIcon;
2503
+ protected readonly filterIcon: _progress_kendo_svg_icons.SVGIcon;
2504
+ protected readonly searchIcon: _progress_kendo_svg_icons.SVGIcon;
2505
+ dataSourceType: TableDataSourceType;
2506
+ selectedCkType: CkTypeSelectorItem | null;
2507
+ isLoadingInitial: boolean;
2508
+ selectedColumns: string[];
2509
+ sorting: SortDto[];
2510
+ filters: FieldFilterItem[];
2511
+ availableAttributes: AttributeItem[];
2512
+ selectedPersistentQuery: PersistentQueryItem | null;
2513
+ isLoadingQueryColumns: boolean;
2514
+ queryFilterAttributes: AttributeItem[];
2515
+ filterVariables: FilterVariable[];
2516
+ form: {
2517
+ pageSize: number;
2518
+ sortable: boolean;
2519
+ };
2520
+ get isValid(): boolean;
2521
+ ngOnInit(): Promise<void>;
2522
+ private loadInitialValues;
2523
+ private loadAvailableAttributes;
2524
+ onCkTypeSelected(ckType: CkTypeSelectorItem): Promise<void>;
2525
+ onCkTypeCleared(): void;
2526
+ onDataSourceTypeChange(): void;
2527
+ onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
2528
+ /**
2529
+ * Loads all available filter attributes from the CK type.
2530
+ * Uses getCkTypeAvailableQueryColumns instead of query result columns.
2531
+ */
2532
+ private loadFilterAttributesForQuery;
2533
+ openColumnSelector(): Promise<void>;
2534
+ openSortSelector(): Promise<void>;
2535
+ onFiltersChange(filters: FieldFilterItem[]): void;
2536
+ getColumnsSummary(): string;
2537
+ getSortingSummary(): string;
2538
+ onSave(): void;
2539
+ private formatColumnTitle;
2540
+ onCancel(): void;
2541
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableConfigDialogComponent, never>;
2542
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableConfigDialogComponent, "mm-table-config-dialog", never, { "initialDataSourceType": { "alias": "initialDataSourceType"; "required": false; }; "initialCkTypeId": { "alias": "initialCkTypeId"; "required": false; }; "initialColumns": { "alias": "initialColumns"; "required": false; }; "initialSorting": { "alias": "initialSorting"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; "initialPageSize": { "alias": "initialPageSize"; "required": false; }; "initialSortable": { "alias": "initialSortable"; "required": false; }; "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
2543
+ }
2544
+
2545
+ declare class GaugeWidgetComponent implements DashboardWidget<GaugeWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {
2546
+ pointers: {
2547
+ value: number;
2548
+ color: string;
2549
+ }[];
2550
+ private readonly dataService;
2551
+ private readonly executeRuntimeQueryGQL;
2552
+ private readonly stateService;
2553
+ private readonly variableService;
2554
+ config: GaugeWidgetConfig;
2555
+ private readonly _isLoading;
2556
+ private readonly _data;
2557
+ private readonly _error;
2558
+ readonly isLoading: _angular_core.Signal<boolean>;
2559
+ readonly data: _angular_core.Signal<RuntimeEntityData | null>;
2560
+ readonly error: _angular_core.Signal<string | null>;
2561
+ /**
2562
+ * Check if widget is not configured (needs data source setup).
2563
+ * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.
2564
+ */
2565
+ isNotConfigured(): boolean;
2566
+ readonly numericValue: _angular_core.Signal<number>;
2567
+ readonly formattedValue: _angular_core.Signal<string>;
2568
+ readonly label: _angular_core.Signal<string>;
2569
+ ngOnInit(): void;
2570
+ ngOnChanges(changes: SimpleChanges): void;
2571
+ refresh(): void;
2572
+ private loadData;
2573
+ private loadPersistentQueryData;
2574
+ private extractAggregationValue;
2575
+ private extractGroupedAggregationValue;
2576
+ private parseNumericValue;
2577
+ private sanitizeFieldName;
2578
+ /**
2579
+ * Converts widget filter configuration to GraphQL FieldFilterDto format.
2580
+ * Resolves MeshBoard variables in filter values before conversion.
2581
+ */
2582
+ private convertFiltersToDto;
2583
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GaugeWidgetComponent, never>;
2584
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GaugeWidgetComponent, "mm-gauge-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
2585
+ }
2586
+
2587
+ /**
2588
+ * Data source type for Gauge
2589
+ */
2590
+ type GaugeDataSourceType = 'runtimeEntity' | 'persistentQuery';
2591
+ /**
2592
+ * Configuration result from the Gauge dialog
2593
+ */
2594
+ interface GaugeConfigResult extends WidgetConfigResult {
2595
+ dataSourceType: GaugeDataSourceType;
2596
+ ckTypeId: string;
2597
+ rtId?: string;
2598
+ valueAttribute: string;
2599
+ labelAttribute?: string;
2600
+ queryRtId?: string;
2601
+ queryName?: string;
2602
+ queryMode?: KpiQueryMode;
2603
+ queryValueField?: string;
2604
+ queryCategoryField?: string;
2605
+ queryCategoryValue?: string;
2606
+ gaugeType: GaugeType;
2607
+ min?: number;
2608
+ max?: number;
2609
+ ranges?: GaugeRange[];
2610
+ showLabel?: boolean;
2611
+ prefix?: string;
2612
+ suffix?: string;
2613
+ reverse?: boolean;
2614
+ filters?: FieldFilterDto[];
2615
+ }
2616
+ interface GaugeTypeOption {
2617
+ value: GaugeType;
2618
+ label: string;
2619
+ description: string;
2620
+ }
2621
+ /**
2622
+ * Configuration dialog for Gauge widgets.
2623
+ * Allows selecting data source, gauge type, value attribute, and display options.
2624
+ */
2625
+ declare class GaugeConfigDialogComponent implements OnInit {
2626
+ private readonly getEntitiesByCkTypeGQL;
2627
+ private readonly ckTypeSelectorService;
2628
+ private readonly attributeSelectorService;
2629
+ private readonly executeRuntimeQueryGQL;
2630
+ private readonly getCkTypeAvailableQueryColumnsGQL;
2631
+ private readonly meshBoardStateService;
2632
+ ckTypeSelectorInput?: CkTypeSelectorInputComponent;
2633
+ entitySelectorInput?: EntitySelectInputComponent;
2634
+ querySelector?: QuerySelectorComponent;
2635
+ initialCkTypeId?: string;
2636
+ initialRtId?: string;
2637
+ initialGaugeType?: GaugeType;
2638
+ initialValueAttribute?: string;
2639
+ initialLabelAttribute?: string;
2640
+ initialMin?: number;
2641
+ initialMax?: number;
2642
+ initialRanges?: GaugeRange[];
2643
+ initialShowLabel?: boolean;
2644
+ initialPrefix?: string;
2645
+ initialSuffix?: string;
2646
+ initialReverse?: boolean;
2647
+ initialDataSourceType?: GaugeDataSourceType;
2648
+ initialQueryRtId?: string;
2649
+ initialQueryName?: string;
2650
+ initialQueryMode?: KpiQueryMode;
2651
+ initialQueryValueField?: string;
2652
+ initialQueryCategoryField?: string;
2653
+ initialQueryCategoryValue?: string;
2654
+ initialFilters?: WidgetFilterConfig[];
2655
+ save: EventEmitter<GaugeConfigResult>;
2656
+ cancelled: EventEmitter<void>;
2657
+ dataSourceType: GaugeDataSourceType;
2658
+ selectedCkType: CkTypeSelectorItem | null;
2659
+ selectedEntity: RuntimeEntityItem$1 | null;
2660
+ entityDataSource?: RuntimeEntitySelectDataSource$1;
2661
+ entityDialogDataSource?: RuntimeEntityDialogDataSource$1;
2662
+ isLoadingInitial: boolean;
2663
+ selectedPersistentQuery: PersistentQueryItem | null;
2664
+ queryColumns: QueryColumnItem[];
2665
+ categoryValues: CategoryValueItem[];
2666
+ queryMode: KpiQueryMode;
2667
+ isLoadingQueryColumns: boolean;
2668
+ isLoadingCategoryValues: boolean;
2669
+ readonly isLoadingAttributes: _angular_core.WritableSignal<boolean>;
2670
+ readonly availableAttributes: _angular_core.WritableSignal<AttributeItem[]>;
2671
+ readonly filteredValueAttributes: _angular_core.WritableSignal<AttributeItem[]>;
2672
+ readonly filteredLabelAttributes: _angular_core.WritableSignal<AttributeItem[]>;
2673
+ filters: FieldFilterItem[];
2674
+ filterAttributes: AttributeItem[];
2675
+ filterVariables: FilterVariable[];
2676
+ form: {
2677
+ gaugeType: GaugeType;
2678
+ valueAttribute: string;
2679
+ labelAttribute: string;
2680
+ min: number | null;
2681
+ max: number | null;
2682
+ ranges: GaugeRange[];
2683
+ showLabel: boolean;
2684
+ prefix: string;
2685
+ suffix: string;
2686
+ reverse: boolean;
2687
+ queryValueField: string;
2688
+ queryCategoryField: string;
2689
+ queryCategoryValue: string;
2690
+ };
2691
+ gaugeTypeOptions: GaugeTypeOption[];
2692
+ queryModeOptions: {
2693
+ value: KpiQueryMode;
2694
+ label: string;
2695
+ }[];
2696
+ get isValid(): boolean;
2697
+ ngOnInit(): Promise<void>;
2698
+ private loadInitialValues;
2699
+ private loadInitialEntity;
2700
+ onCkTypeSelected(ckType: CkTypeSelectorItem): void;
2701
+ onCkTypeCleared(): void;
2702
+ private loadAvailableAttributes;
2703
+ onValueAttributeFilter(filter: string): void;
2704
+ onLabelAttributeFilter(filter: string): void;
2705
+ onEntitySelected(entity: RuntimeEntityItem$1): void;
2706
+ onEntityCleared(): void;
2707
+ addRange(): void;
2708
+ removeRange(index: number): void;
2709
+ onSave(): void;
2710
+ onCancel(): void;
2711
+ onDataSourceTypeChange(type: GaugeDataSourceType): void;
2712
+ onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
2713
+ onQueryModeChange(mode: KpiQueryMode): Promise<void>;
2714
+ private loadQueryColumnsAndValues;
2715
+ /**
2716
+ * Loads all available filter attributes from the CK type.
2717
+ * Uses getCkTypeAvailableQueryColumns to get all attributes, not just query result columns.
2718
+ */
2719
+ private loadFilterAttributesFromCkType;
2720
+ onCategoryFieldChange(categoryField: string): Promise<void>;
2721
+ private loadCategoryValuesForField;
2722
+ private extractCategoryValues;
2723
+ private sanitizeFieldName;
2724
+ onFiltersChange(updatedFilters: FieldFilterItem[]): void;
2725
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GaugeConfigDialogComponent, never>;
2726
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GaugeConfigDialogComponent, "mm-gauge-config-dialog", never, { "initialCkTypeId": { "alias": "initialCkTypeId"; "required": false; }; "initialRtId": { "alias": "initialRtId"; "required": false; }; "initialGaugeType": { "alias": "initialGaugeType"; "required": false; }; "initialValueAttribute": { "alias": "initialValueAttribute"; "required": false; }; "initialLabelAttribute": { "alias": "initialLabelAttribute"; "required": false; }; "initialMin": { "alias": "initialMin"; "required": false; }; "initialMax": { "alias": "initialMax"; "required": false; }; "initialRanges": { "alias": "initialRanges"; "required": false; }; "initialShowLabel": { "alias": "initialShowLabel"; "required": false; }; "initialPrefix": { "alias": "initialPrefix"; "required": false; }; "initialSuffix": { "alias": "initialSuffix"; "required": false; }; "initialReverse": { "alias": "initialReverse"; "required": false; }; "initialDataSourceType": { "alias": "initialDataSourceType"; "required": false; }; "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; "initialQueryMode": { "alias": "initialQueryMode"; "required": false; }; "initialQueryValueField": { "alias": "initialQueryValueField"; "required": false; }; "initialQueryCategoryField": { "alias": "initialQueryCategoryField"; "required": false; }; "initialQueryCategoryValue": { "alias": "initialQueryCategoryValue"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
2727
+ }
2728
+
2729
+ /**
2730
+ * Data item for the pie chart
2731
+ */
2732
+ interface ChartDataItem {
2733
+ category: string;
2734
+ value: number;
2735
+ }
2736
+ declare class PieChartWidgetComponent implements DashboardWidget<PieChartWidgetConfig, ChartDataItem[]>, OnInit, OnChanges {
2737
+ private readonly executeRuntimeQueryGQL;
2738
+ private readonly dataService;
2739
+ private readonly stateService;
2740
+ private readonly variableService;
2741
+ config: PieChartWidgetConfig;
2742
+ private readonly _isLoading;
2743
+ private readonly _chartData;
2744
+ private readonly _error;
2745
+ readonly isLoading: _angular_core.Signal<boolean>;
2746
+ readonly chartData: _angular_core.Signal<ChartDataItem[]>;
2747
+ readonly error: _angular_core.Signal<string | null>;
2748
+ readonly data: _angular_core.Signal<ChartDataItem[]>;
2749
+ /**
2750
+ * Check if widget is not configured (needs data source setup).
2751
+ * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.
2752
+ */
2753
+ isNotConfigured(): boolean;
2754
+ readonly labelSettings: _angular_core.Signal<{
2755
+ visible: boolean;
2756
+ content: (e: {
2757
+ category: string;
2758
+ value: number;
2759
+ }) => string;
2760
+ }>;
2761
+ ngOnInit(): void;
2762
+ ngOnChanges(changes: SimpleChanges): void;
2763
+ refresh(): void;
2764
+ hasValidConfig(): boolean;
2765
+ formatValue(value: number): string;
2766
+ private loadData;
2767
+ /**
2768
+ * Loads data from Construction Kit query data source.
2769
+ */
2770
+ private loadCkQueryData;
2771
+ /**
2772
+ * Loads data from persistent query data source.
2773
+ * Note: isNotConfigured() check in loadData() ensures queryRtId is set.
2774
+ */
2775
+ private loadPersistentQueryData;
2776
+ /**
2777
+ * Sanitizes field names for comparison.
2778
+ * Replaces dots with underscores (same as table widget).
2779
+ */
2780
+ private sanitizeFieldName;
2781
+ /**
2782
+ * Converts widget filter configuration to GraphQL FieldFilterDto format.
2783
+ * Resolves MeshBoard variables in filter values before conversion.
2784
+ */
2785
+ private convertFiltersToDto;
2786
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PieChartWidgetComponent, never>;
2787
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PieChartWidgetComponent, "mm-pie-chart-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
2788
+ }
2789
+
2790
+ /**
2791
+ * Configuration result from the Pie Chart dialog
2792
+ */
2793
+ interface PieChartConfigResult extends WidgetConfigResult {
2794
+ dataSourceType: DataSourceType;
2795
+ queryRtId?: string;
2796
+ queryName?: string;
2797
+ categoryField: string;
2798
+ valueField: string;
2799
+ ckQueryTarget?: CkQueryTarget;
2800
+ ckGroupBy?: string;
2801
+ chartType: PieChartType;
2802
+ showLabels: boolean;
2803
+ showLegend: boolean;
2804
+ legendPosition: 'top' | 'bottom' | 'left' | 'right';
2805
+ filters?: FieldFilterDto[];
2806
+ }
2807
+ /**
2808
+ * Configuration dialog for Pie Chart widgets.
2809
+ */
2810
+ declare class PieChartConfigDialogComponent implements OnInit {
2811
+ private readonly executeRuntimeQueryGQL;
2812
+ private readonly getCkTypeAvailableQueryColumnsGQL;
2813
+ private readonly stateService;
2814
+ querySelector?: QuerySelectorComponent;
2815
+ initialDataSourceType?: DataSourceType;
2816
+ initialQueryRtId?: string;
2817
+ initialQueryName?: string;
2818
+ initialChartType?: PieChartType;
2819
+ initialCategoryField?: string;
2820
+ initialValueField?: string;
2821
+ initialShowLabels?: boolean;
2822
+ initialShowLegend?: boolean;
2823
+ initialLegendPosition?: 'top' | 'bottom' | 'left' | 'right';
2824
+ initialCkQueryTarget?: CkQueryTarget;
2825
+ initialCkGroupBy?: string;
2826
+ initialFilters?: WidgetFilterConfig[];
2827
+ save: EventEmitter<PieChartConfigResult>;
2828
+ cancelled: EventEmitter<void>;
2829
+ protected readonly searchIcon: _progress_kendo_svg_icons.SVGIcon;
2830
+ protected readonly chartPieIcon: _progress_kendo_svg_icons.SVGIcon;
2831
+ isLoadingInitial: boolean;
2832
+ isLoadingColumns: boolean;
2833
+ dataSourceTypes: {
2834
+ value: string;
2835
+ label: string;
2836
+ }[];
2837
+ ckQueryTargets: {
2838
+ value: string;
2839
+ label: string;
2840
+ }[];
2841
+ ckGroupByOptions: {
2842
+ value: string;
2843
+ label: string;
2844
+ }[];
2845
+ selectedPersistentQuery: PersistentQueryItem | null;
2846
+ queryColumns: QueryColumnItem[];
2847
+ filters: FieldFilterItem[];
2848
+ filterAttributes: AttributeItem[];
2849
+ filterVariables: FilterVariable[];
2850
+ legendPositions: {
2851
+ value: string;
2852
+ label: string;
2853
+ }[];
2854
+ form: {
2855
+ dataSourceType: DataSourceType;
2856
+ chartType: PieChartType;
2857
+ categoryField: string;
2858
+ valueField: string;
2859
+ showLabels: boolean;
2860
+ showLegend: boolean;
2861
+ legendPosition: "top" | "bottom" | "left" | "right";
2862
+ ckQueryTarget: CkQueryTarget;
2863
+ ckGroupBy: string;
2864
+ };
2865
+ get isValid(): boolean;
2866
+ ngOnInit(): Promise<void>;
2867
+ onDataSourceTypeChange(dataSourceType: DataSourceType): void;
2868
+ onCkQueryTargetChange(target: CkQueryTarget): void;
2869
+ private updateCkGroupByOptions;
2870
+ onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
2871
+ private loadQueryColumns;
2872
+ /**
2873
+ * Loads all available filter attributes from the CK type.
2874
+ * Uses getCkTypeAvailableQueryColumns to get all attributes, not just query result columns.
2875
+ */
2876
+ private loadFilterAttributes;
2877
+ private sanitizeFieldName;
2878
+ onFiltersChange(updatedFilters: FieldFilterItem[]): void;
2879
+ onSave(): void;
2880
+ onCancel(): void;
2881
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PieChartConfigDialogComponent, never>;
2882
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PieChartConfigDialogComponent, "mm-pie-chart-config-dialog", never, { "initialDataSourceType": { "alias": "initialDataSourceType"; "required": false; }; "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; "initialChartType": { "alias": "initialChartType"; "required": false; }; "initialCategoryField": { "alias": "initialCategoryField"; "required": false; }; "initialValueField": { "alias": "initialValueField"; "required": false; }; "initialShowLabels": { "alias": "initialShowLabels"; "required": false; }; "initialShowLegend": { "alias": "initialShowLegend"; "required": false; }; "initialLegendPosition": { "alias": "initialLegendPosition"; "required": false; }; "initialCkQueryTarget": { "alias": "initialCkQueryTarget"; "required": false; }; "initialCkGroupBy": { "alias": "initialCkGroupBy"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
2883
+ }
2884
+
2885
+ /**
2886
+ * Series data for the bar chart
2887
+ */
2888
+ interface SeriesData {
2889
+ name: string;
2890
+ data: number[];
2891
+ color?: string;
2892
+ }
2893
+ declare class BarChartWidgetComponent implements DashboardWidget<BarChartWidgetConfig, SeriesData[]>, OnInit, OnChanges {
2894
+ private readonly executeRuntimeQueryGQL;
2895
+ private readonly stateService;
2896
+ private readonly variableService;
2897
+ config: BarChartWidgetConfig;
2898
+ private readonly _isLoading;
2899
+ private readonly _categories;
2900
+ private readonly _seriesData;
2901
+ private readonly _error;
2902
+ readonly isLoading: _angular_core.Signal<boolean>;
2903
+ readonly categories: _angular_core.Signal<string[]>;
2904
+ readonly seriesData: _angular_core.Signal<SeriesData[]>;
2905
+ readonly error: _angular_core.Signal<string | null>;
2906
+ readonly data: _angular_core.Signal<SeriesData[]>;
2907
+ /**
2908
+ * Check if widget is not configured (needs data source setup).
2909
+ * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.
2910
+ */
2911
+ isNotConfigured(): boolean;
2912
+ readonly kendoChartType: _angular_core.Signal<"column" | "bar">;
2913
+ readonly stackConfig: _angular_core.Signal<string | boolean>;
2914
+ readonly labelRotation: _angular_core.Signal<0 | -45>;
2915
+ ngOnInit(): void;
2916
+ ngOnChanges(changes: SimpleChanges): void;
2917
+ refresh(): void;
2918
+ hasValidConfig(): boolean;
2919
+ /**
2920
+ * Checks if using dynamic series mode (seriesGroupField + valueField)
2921
+ */
2922
+ private isDynamicSeriesMode;
2923
+ formatValue(value: number): string;
2924
+ private loadData;
2925
+ /**
2926
+ * Processes data in Static Series Mode.
2927
+ * Each series in config.series corresponds to a separate numeric field.
2928
+ */
2929
+ private processStaticSeriesData;
2930
+ /**
2931
+ * Processes data in Dynamic Series Mode.
2932
+ * Series are created dynamically from unique values of seriesGroupField.
2933
+ * Each row represents a combination of category + series group + value.
2934
+ *
2935
+ * Example data structure:
2936
+ * - Row 1: { legalEntityType: 'Company', billingType: 'Credit', quantity: 261721 }
2937
+ * - Row 2: { legalEntityType: 'Company', billingType: 'Debit', quantity: 65263 }
2938
+ * - ...
2939
+ *
2940
+ * Results in:
2941
+ * - Categories: ['Company', 'LegalPerson', 'LocalAuthority', 'NaturalPerson']
2942
+ * - Series 'Credit': [261721, 70343, 23140, 189794]
2943
+ * - Series 'Debit': [65263, 60153, 159636, 108225]
2944
+ */
2945
+ private processDynamicSeriesData;
2946
+ /**
2947
+ * Sanitizes field names for comparison.
2948
+ * Replaces dots with underscores (same as table widget).
2949
+ */
2950
+ private sanitizeFieldName;
2951
+ /**
2952
+ * Converts widget filter configuration to GraphQL FieldFilterDto format.
2953
+ * Resolves MeshBoard variables in filter values before conversion.
2954
+ */
2955
+ private convertFiltersToDto;
2956
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BarChartWidgetComponent, never>;
2957
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BarChartWidgetComponent, "mm-bar-chart-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
2958
+ }
2959
+
2960
+ /**
2961
+ * Series configuration mode
2962
+ */
2963
+ type SeriesMode = 'static' | 'dynamic';
2964
+ /**
2965
+ * Configuration result from the Bar Chart dialog
2966
+ */
2967
+ interface BarChartConfigResult extends WidgetConfigResult {
2968
+ queryRtId: string;
2969
+ queryName?: string;
2970
+ chartType: BarChartType;
2971
+ categoryField: string;
2972
+ series: BarChartSeries[];
2973
+ /** Series Group Field for dynamic series mode */
2974
+ seriesGroupField?: string;
2975
+ /** Value Field for dynamic series mode */
2976
+ valueField?: string;
2977
+ showLegend: boolean;
2978
+ legendPosition: 'top' | 'bottom' | 'left' | 'right';
2979
+ showDataLabels: boolean;
2980
+ filters?: FieldFilterDto[];
2981
+ }
2982
+ /**
2983
+ * Configuration dialog for Bar Chart widgets.
2984
+ * Supports column, bar, stacked, and 100% stacked chart types.
2985
+ */
2986
+ declare class BarChartConfigDialogComponent implements OnInit {
2987
+ private readonly executeRuntimeQueryGQL;
2988
+ private readonly getCkTypeAvailableQueryColumnsGQL;
2989
+ private readonly stateService;
2990
+ querySelector?: QuerySelectorComponent;
2991
+ initialQueryRtId?: string;
2992
+ initialQueryName?: string;
2993
+ initialChartType?: BarChartType;
2994
+ initialCategoryField?: string;
2995
+ initialSeries?: BarChartSeries[];
2996
+ initialSeriesGroupField?: string;
2997
+ initialValueField?: string;
2998
+ initialShowLegend?: boolean;
2999
+ initialLegendPosition?: 'top' | 'bottom' | 'left' | 'right';
3000
+ initialShowDataLabels?: boolean;
3001
+ initialFilters?: WidgetFilterConfig[];
3002
+ save: EventEmitter<BarChartConfigResult>;
3003
+ cancelled: EventEmitter<void>;
3004
+ isLoadingInitial: boolean;
3005
+ isLoadingColumns: boolean;
3006
+ selectedPersistentQuery: PersistentQueryItem | null;
3007
+ queryColumns: QueryColumnItem[];
3008
+ numericColumns: QueryColumnItem[];
3009
+ filters: FieldFilterItem[];
3010
+ filterAttributes: AttributeItem[];
3011
+ filterVariables: FilterVariable[];
3012
+ seriesMode: SeriesMode;
3013
+ selectedSeriesFields: string[];
3014
+ seriesGroupField: string;
3015
+ valueField: string;
3016
+ nonNumericColumns: QueryColumnItem[];
3017
+ seriesModeOptions: {
3018
+ value: string;
3019
+ label: string;
3020
+ }[];
3021
+ legendPositions: {
3022
+ value: string;
3023
+ label: string;
3024
+ }[];
3025
+ form: {
3026
+ chartType: BarChartType;
3027
+ categoryField: string;
3028
+ showLegend: boolean;
3029
+ legendPosition: "top" | "bottom" | "left" | "right";
3030
+ showDataLabels: boolean;
3031
+ };
3032
+ get isValid(): boolean;
3033
+ ngOnInit(): Promise<void>;
3034
+ onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
3035
+ private loadQueryColumns;
3036
+ /**
3037
+ * Loads all available filter attributes from the CK type.
3038
+ * Uses getCkTypeAvailableQueryColumns to get all attributes, not just query result columns.
3039
+ */
3040
+ private loadFilterAttributes;
3041
+ private sanitizeFieldName;
3042
+ onSeriesFieldsChange(fields: string[]): void;
3043
+ onFiltersChange(updatedFilters: FieldFilterItem[]): void;
3044
+ onSave(): void;
3045
+ onCancel(): void;
3046
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BarChartConfigDialogComponent, never>;
3047
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BarChartConfigDialogComponent, "mm-bar-chart-config-dialog", never, { "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; "initialChartType": { "alias": "initialChartType"; "required": false; }; "initialCategoryField": { "alias": "initialCategoryField"; "required": false; }; "initialSeries": { "alias": "initialSeries"; "required": false; }; "initialSeriesGroupField": { "alias": "initialSeriesGroupField"; "required": false; }; "initialValueField": { "alias": "initialValueField"; "required": false; }; "initialShowLegend": { "alias": "initialShowLegend"; "required": false; }; "initialLegendPosition": { "alias": "initialLegendPosition"; "required": false; }; "initialShowDataLabels": { "alias": "initialShowDataLabels"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
3048
+ }
3049
+
3050
+ interface StatValue {
3051
+ label: string;
3052
+ value: number | null;
3053
+ color: string;
3054
+ prefix?: string;
3055
+ suffix?: string;
3056
+ isLoading: boolean;
3057
+ }
3058
+ declare class StatsGridWidgetComponent implements OnInit, OnChanges {
3059
+ private readonly dataService;
3060
+ config: StatsGridWidgetConfig;
3061
+ private readonly _isLoading;
3062
+ private readonly _error;
3063
+ private readonly _statValues;
3064
+ readonly isLoading: _angular_core.Signal<boolean>;
3065
+ readonly error: _angular_core.Signal<string | null>;
3066
+ readonly statValues: _angular_core.Signal<StatValue[]>;
3067
+ /**
3068
+ * Check if widget is not configured (needs stats configuration).
3069
+ * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.
3070
+ */
3071
+ isNotConfigured(): boolean;
3072
+ ngOnInit(): void;
3073
+ ngOnChanges(changes: SimpleChanges): void;
3074
+ refresh(): void;
3075
+ private loadData;
3076
+ private getColorClass;
3077
+ formatValue(stat: StatValue): string;
3078
+ get gridColumns(): number;
3079
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatsGridWidgetComponent, never>;
3080
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatsGridWidgetComponent, "mm-stats-grid-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
3081
+ }
3082
+
3083
+ interface StatsGridConfigResult extends WidgetConfigResult {
3084
+ ckTypeId: string;
3085
+ stats: StatItem[];
3086
+ queries: AggregationQuery[];
3087
+ columns: number;
3088
+ }
3089
+ interface ColorOption {
3090
+ value: StatColor;
3091
+ label: string;
3092
+ color: string;
3093
+ }
3094
+ interface CkTypeOption {
3095
+ value: string;
3096
+ label: string;
3097
+ }
3098
+ interface EditableStat {
3099
+ id: string;
3100
+ label: string;
3101
+ ckTypeId: string;
3102
+ aggregation: AggregationType;
3103
+ color: StatColor;
3104
+ prefix?: string;
3105
+ suffix?: string;
3106
+ }
3107
+ declare class StatsGridConfigDialogComponent implements OnInit {
3108
+ initialStats?: StatItem[];
3109
+ initialQueries?: AggregationQuery[];
3110
+ initialColumns?: number;
3111
+ save: EventEmitter<StatsGridConfigResult>;
3112
+ cancelled: EventEmitter<void>;
3113
+ colorOptions: ColorOption[];
3114
+ ckTypeOptions: CkTypeOption[];
3115
+ filteredCkTypeOptions: CkTypeOption[];
3116
+ aggregationOptions: AggregationType[];
3117
+ form: {
3118
+ columns: number;
3119
+ stats: EditableStat[];
3120
+ };
3121
+ private nextId;
3122
+ get isValid(): boolean;
3123
+ ngOnInit(): void;
3124
+ onCkTypeFilter(filter: string): void;
3125
+ addStat(): void;
3126
+ removeStat(index: number): void;
3127
+ onSave(): void;
3128
+ onCancel(): void;
3129
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatsGridConfigDialogComponent, never>;
3130
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatsGridConfigDialogComponent, "mm-stats-grid-config-dialog", never, { "initialStats": { "alias": "initialStats"; "required": false; }; "initialQueries": { "alias": "initialQueries"; "required": false; }; "initialColumns": { "alias": "initialColumns"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
3131
+ }
3132
+
3133
+ declare class StatusIndicatorWidgetComponent implements OnInit, OnChanges {
3134
+ private readonly ckModelService;
3135
+ config: StatusIndicatorWidgetConfig;
3136
+ private readonly _isLoading;
3137
+ private readonly _error;
3138
+ private readonly _status;
3139
+ readonly isLoading: _angular_core.Signal<boolean>;
3140
+ readonly error: _angular_core.Signal<string | null>;
3141
+ readonly status: _angular_core.Signal<boolean | null>;
3142
+ /**
3143
+ * Check if widget is not configured (needs service call setup).
3144
+ * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.
3145
+ */
3146
+ isNotConfigured(): boolean;
3147
+ ngOnInit(): void;
3148
+ ngOnChanges(changes: SimpleChanges): void;
3149
+ refresh(): void;
3150
+ private loadStatus;
3151
+ private checkModelAvailable;
3152
+ get statusLabel(): string;
3153
+ get statusColor(): string;
3154
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatusIndicatorWidgetComponent, never>;
3155
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusIndicatorWidgetComponent, "mm-status-indicator-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
3156
+ }
3157
+
3158
+ interface StatusIndicatorConfigResult extends WidgetConfigResult {
3159
+ ckTypeId: string;
3160
+ callType: ServiceCallDataSource['callType'];
3161
+ modelName?: string;
3162
+ serviceType?: ServiceCallDataSource['serviceType'];
3163
+ trueLabel?: string;
3164
+ falseLabel?: string;
3165
+ trueColor?: string;
3166
+ falseColor?: string;
3167
+ }
3168
+ interface CallTypeOption {
3169
+ value: ServiceCallDataSource['callType'];
3170
+ label: string;
3171
+ }
3172
+ interface ServiceTypeOption$1 {
3173
+ value: ServiceCallDataSource['serviceType'];
3174
+ label: string;
3175
+ }
3176
+ declare class StatusIndicatorConfigDialogComponent implements OnInit {
3177
+ initialCallType?: ServiceCallDataSource['callType'];
3178
+ initialModelName?: string;
3179
+ initialServiceType?: ServiceCallDataSource['serviceType'];
3180
+ initialTrueLabel?: string;
3181
+ initialFalseLabel?: string;
3182
+ initialTrueColor?: string;
3183
+ initialFalseColor?: string;
3184
+ save: EventEmitter<StatusIndicatorConfigResult>;
3185
+ cancelled: EventEmitter<void>;
3186
+ callTypeOptions: CallTypeOption[];
3187
+ serviceTypeOptions: ServiceTypeOption$1[];
3188
+ form: {
3189
+ callType: ServiceCallDataSource["callType"];
3190
+ modelName: string;
3191
+ serviceType: ServiceCallDataSource["serviceType"];
3192
+ trueLabel: string;
3193
+ falseLabel: string;
3194
+ trueColor: string;
3195
+ falseColor: string;
3196
+ };
3197
+ get isValid(): boolean;
3198
+ ngOnInit(): void;
3199
+ onCallTypeChange(callType: ServiceCallDataSource['callType']): void;
3200
+ onSave(): void;
3201
+ onCancel(): void;
3202
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatusIndicatorConfigDialogComponent, never>;
3203
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusIndicatorConfigDialogComponent, "mm-status-indicator-config-dialog", never, { "initialCallType": { "alias": "initialCallType"; "required": false; }; "initialModelName": { "alias": "initialModelName"; "required": false; }; "initialServiceType": { "alias": "initialServiceType"; "required": false; }; "initialTrueLabel": { "alias": "initialTrueLabel"; "required": false; }; "initialFalseLabel": { "alias": "initialFalseLabel"; "required": false; }; "initialTrueColor": { "alias": "initialTrueColor"; "required": false; }; "initialFalseColor": { "alias": "initialFalseColor"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
3204
+ }
3205
+
3206
+ type HealthStatus = 'healthy' | 'unhealthy' | 'unknown' | 'loading';
3207
+ declare class ServiceHealthWidgetComponent implements OnInit, OnChanges, OnDestroy {
3208
+ private readonly healthService;
3209
+ private readonly router;
3210
+ config: ServiceHealthWidgetConfig;
3211
+ private readonly _healthStatus;
3212
+ private readonly _error;
3213
+ private readonly _lastChecked;
3214
+ readonly healthStatus: _angular_core.Signal<HealthStatus>;
3215
+ readonly error: _angular_core.Signal<string | null>;
3216
+ readonly lastChecked: _angular_core.Signal<Date | null>;
3217
+ /**
3218
+ * Check if widget is not configured (needs service call setup).
3219
+ * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.
3220
+ */
3221
+ isNotConfigured(): boolean;
3222
+ private refreshSubscription?;
3223
+ private readonly REFRESH_INTERVAL;
3224
+ ngOnInit(): void;
3225
+ ngOnChanges(changes: SimpleChanges): void;
3226
+ ngOnDestroy(): void;
3227
+ refresh(): void;
3228
+ onClick(): void;
3229
+ private startAutoRefresh;
3230
+ private stopAutoRefresh;
3231
+ private checkHealth;
3232
+ private performHealthCheck;
3233
+ get serviceName(): string;
3234
+ get statusLabel(): string;
3235
+ get showPulse(): boolean;
3236
+ get isClickable(): boolean;
3237
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ServiceHealthWidgetComponent, never>;
3238
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ServiceHealthWidgetComponent, "mm-service-health-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
3239
+ }
3240
+
3241
+ interface ServiceHealthConfigResult extends WidgetConfigResult {
3242
+ ckTypeId: string;
3243
+ serviceType: ServiceCallDataSource['serviceType'];
3244
+ customEndpoint?: string;
3245
+ showPulse: boolean;
3246
+ navigateOnClick: boolean;
3247
+ detailRoute?: string;
3248
+ }
3249
+ interface ServiceTypeOption {
3250
+ value: ServiceCallDataSource['serviceType'];
3251
+ label: string;
3252
+ }
3253
+ declare class ServiceHealthConfigDialogComponent implements OnInit {
3254
+ initialServiceType?: ServiceCallDataSource['serviceType'];
3255
+ initialCustomEndpoint?: string;
3256
+ initialShowPulse?: boolean;
3257
+ initialNavigateOnClick?: boolean;
3258
+ initialDetailRoute?: string;
3259
+ save: EventEmitter<ServiceHealthConfigResult>;
3260
+ cancelled: EventEmitter<void>;
3261
+ serviceTypeOptions: ServiceTypeOption[];
3262
+ form: {
3263
+ serviceType: ServiceCallDataSource["serviceType"];
3264
+ customEndpoint: string;
3265
+ showPulse: boolean;
3266
+ navigateOnClick: boolean;
3267
+ detailRoute: string;
3268
+ };
3269
+ get isValid(): boolean;
3270
+ ngOnInit(): void;
3271
+ onServiceTypeChange(serviceType: ServiceCallDataSource['serviceType']): void;
3272
+ onSave(): void;
3273
+ onCancel(): void;
3274
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ServiceHealthConfigDialogComponent, never>;
3275
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ServiceHealthConfigDialogComponent, "mm-service-health-config-dialog", never, { "initialServiceType": { "alias": "initialServiceType"; "required": false; }; "initialCustomEndpoint": { "alias": "initialCustomEndpoint"; "required": false; }; "initialShowPulse": { "alias": "initialShowPulse"; "required": false; }; "initialNavigateOnClick": { "alias": "initialNavigateOnClick"; "required": false; }; "initialDetailRoute": { "alias": "initialDetailRoute"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
3276
+ }
3277
+
3278
+ /**
3279
+ * Widget Group Component
3280
+ *
3281
+ * Renders a collection of child widgets based on data from a repeater query.
3282
+ * Acts as a container that executes a query and dynamically creates child widgets
3283
+ * for each row/entity returned.
3284
+ *
3285
+ * Example use case: Query returns 5 machines → 5 KPI widgets show each machine's status.
3286
+ */
3287
+ declare class WidgetGroupComponent implements DashboardWidget<WidgetGroupConfig, RepeaterDataItem[]>, OnInit, OnChanges {
3288
+ private readonly dataService;
3289
+ private readonly variableService;
3290
+ private readonly stateService;
3291
+ config: WidgetGroupConfig;
3292
+ private readonly _isLoading;
3293
+ private readonly _data;
3294
+ private readonly _error;
3295
+ readonly isLoading: _angular_core.Signal<boolean>;
3296
+ readonly data: _angular_core.Signal<RepeaterDataItem[] | null>;
3297
+ readonly error: _angular_core.Signal<string | null>;
3298
+ /**
3299
+ * Computed: Check if widget is not configured (needs data source setup).
3300
+ */
3301
+ readonly isNotConfigured: _angular_core.Signal<boolean>;
3302
+ /**
3303
+ * Computed: Generate child widget configs from data items
3304
+ */
3305
+ readonly childConfigs: _angular_core.Signal<AnyWidgetConfig[]>;
3306
+ /**
3307
+ * Computed: CSS grid template columns based on layout configuration
3308
+ */
3309
+ readonly gridTemplateColumns: _angular_core.Signal<string>;
3310
+ /**
3311
+ * Computed: Layout CSS class
3312
+ */
3313
+ readonly layoutClass: _angular_core.Signal<string>;
3314
+ /**
3315
+ * Computed: Gap style
3316
+ */
3317
+ readonly gapStyle: _angular_core.Signal<string>;
3318
+ ngOnInit(): void;
3319
+ ngOnChanges(changes: SimpleChanges): void;
3320
+ refresh(): void;
3321
+ private loadData;
3322
+ /**
3323
+ * Creates a child widget configuration from a data item.
3324
+ * Applies the template configuration and maps attributes.
3325
+ */
3326
+ private createChildConfig;
3327
+ /**
3328
+ * Creates a KPI widget config for a child widget.
3329
+ */
3330
+ private createKpiChildConfig;
3331
+ /**
3332
+ * Creates a Gauge widget config for a child widget.
3333
+ */
3334
+ private createGaugeChildConfig;
3335
+ /**
3336
+ * Creates an Entity Card widget config for a child widget.
3337
+ */
3338
+ private createEntityCardChildConfig;
3339
+ /**
3340
+ * Converts a RepeaterDataItem to RuntimeEntityData format.
3341
+ */
3342
+ private convertToRuntimeEntityData;
3343
+ /**
3344
+ * Resolves a template string with variable substitution.
3345
+ * Supports $rtWellKnownName, $rtId, $ckTypeId, and $attributeName syntax.
3346
+ */
3347
+ private resolveTemplate;
3348
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WidgetGroupComponent, never>;
3349
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WidgetGroupComponent, "mm-widget-group", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
3350
+ }
3351
+
3352
+ /**
3353
+ * Data source type selection
3354
+ */
3355
+ type WidgetGroupDataSourceMode = 'persistentQuery' | 'ckType';
3356
+ /**
3357
+ * Configuration result from the Widget Group dialog
3358
+ */
3359
+ interface WidgetGroupConfigResult extends WidgetConfigResult {
3360
+ /** Required by WidgetConfigResult - empty string for query mode, actual type for ckType mode */
3361
+ ckTypeId: string;
3362
+ dataSourceMode: WidgetGroupDataSourceMode;
3363
+ queryRtId?: string;
3364
+ queryName?: string;
3365
+ filters?: FieldFilterDto[];
3366
+ maxItems?: number;
3367
+ childTemplate: WidgetGroupChildTemplate;
3368
+ layout: WidgetGroupLayout;
3369
+ gridColumns?: number;
3370
+ minChildWidth?: number;
3371
+ gap?: number;
3372
+ emptyMessage?: string;
3373
+ }
3374
+ /**
3375
+ * Configuration dialog for Widget Group widgets.
3376
+ * Allows configuring data source, child widget template, and layout options.
3377
+ */
3378
+ declare class WidgetGroupConfigDialogComponent implements OnInit {
3379
+ private readonly ckTypeSelectorService;
3380
+ private readonly attributeSelectorService;
3381
+ private readonly executeRuntimeQueryGQL;
3382
+ private readonly getCkTypeAvailableQueryColumnsGQL;
3383
+ private readonly meshBoardStateService;
3384
+ querySelector?: QuerySelectorComponent;
3385
+ initialDataSourceMode?: WidgetGroupDataSourceMode;
3386
+ initialQueryRtId?: string;
3387
+ initialQueryName?: string;
3388
+ initialCkTypeId?: string;
3389
+ initialFilters?: WidgetFilterConfig[];
3390
+ initialMaxItems?: number;
3391
+ initialChildTemplate?: WidgetGroupChildTemplate;
3392
+ initialLayout?: WidgetGroupLayout;
3393
+ initialGridColumns?: number;
3394
+ initialMinChildWidth?: number;
3395
+ initialGap?: number;
3396
+ initialEmptyMessage?: string;
3397
+ save: EventEmitter<WidgetGroupConfigResult>;
3398
+ cancelled: EventEmitter<void>;
3399
+ dataSourceMode: WidgetGroupDataSourceMode;
3400
+ selectedPersistentQuery: PersistentQueryItem | null;
3401
+ selectedCkType: CkTypeSelectorItem | null;
3402
+ availableColumns: QueryColumnItem[];
3403
+ isLoadingColumns: boolean;
3404
+ private columnFilter;
3405
+ filters: FieldFilterItem[];
3406
+ filterAttributes: AttributeItem[];
3407
+ filterVariables: FilterVariable[];
3408
+ isLoadingInitial: boolean;
3409
+ form: {
3410
+ maxItems: number;
3411
+ childWidgetType: GroupChildWidgetType;
3412
+ titleTemplate: string;
3413
+ valueAttribute: string;
3414
+ prefix: string;
3415
+ suffix: string;
3416
+ gaugeType: GaugeType;
3417
+ gaugeMin: number;
3418
+ gaugeMax: number;
3419
+ layout: WidgetGroupLayout;
3420
+ gridColumns: number;
3421
+ minChildWidth: number;
3422
+ gap: number;
3423
+ emptyMessage: string;
3424
+ };
3425
+ childWidgetTypeOptions: {
3426
+ value: GroupChildWidgetType;
3427
+ label: string;
3428
+ }[];
3429
+ gaugeTypeOptions: {
3430
+ value: GaugeType;
3431
+ label: string;
3432
+ }[];
3433
+ /**
3434
+ * Computed: Filtered columns based on search
3435
+ */
3436
+ filteredColumns: _angular_core.WritableSignal<QueryColumnItem[]>;
3437
+ get isValid(): boolean;
3438
+ ngOnInit(): Promise<void>;
3439
+ onDataSourceModeChange(mode: WidgetGroupDataSourceMode): void;
3440
+ onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
3441
+ private loadQueryColumns;
3442
+ private loadInitialCkTypeValues;
3443
+ onCkTypeSelected(ckType: CkTypeSelectorItem): void;
3444
+ onCkTypeCleared(): void;
3445
+ private loadCkTypeAttributes;
3446
+ onColumnFilter(filter: string): void;
3447
+ onFiltersChange(updatedFilters: FieldFilterItem[]): void;
3448
+ onSave(): void;
3449
+ private buildStaticConfig;
3450
+ onCancel(): void;
3451
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WidgetGroupConfigDialogComponent, never>;
3452
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WidgetGroupConfigDialogComponent, "mm-widget-group-config-dialog", never, { "initialDataSourceMode": { "alias": "initialDataSourceMode"; "required": false; }; "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; "initialCkTypeId": { "alias": "initialCkTypeId"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; "initialMaxItems": { "alias": "initialMaxItems"; "required": false; }; "initialChildTemplate": { "alias": "initialChildTemplate"; "required": false; }; "initialLayout": { "alias": "initialLayout"; "required": false; }; "initialGridColumns": { "alias": "initialGridColumns"; "required": false; }; "initialMinChildWidth": { "alias": "initialMinChildWidth"; "required": false; }; "initialGap": { "alias": "initialGap"; "required": false; }; "initialEmptyMessage": { "alias": "initialEmptyMessage"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
3453
+ }
3454
+
3455
+ declare class MarkdownWidgetComponent implements DashboardWidget<MarkdownWidgetConfig, string>, OnInit, OnChanges {
3456
+ private readonly stateService;
3457
+ private readonly variableService;
3458
+ config: MarkdownWidgetConfig;
3459
+ private readonly _isLoading;
3460
+ private readonly _data;
3461
+ private readonly _error;
3462
+ readonly isLoading: _angular_core.Signal<boolean>;
3463
+ readonly data: _angular_core.Signal<string | null>;
3464
+ readonly error: _angular_core.Signal<string | null>;
3465
+ /**
3466
+ * Check if widget has content configured.
3467
+ * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.
3468
+ */
3469
+ isNotConfigured(): boolean;
3470
+ /**
3471
+ * Resolved markdown content with variables interpolated.
3472
+ */
3473
+ readonly resolvedContent: _angular_core.Signal<string>;
3474
+ /**
3475
+ * Style object for custom padding and alignment.
3476
+ */
3477
+ readonly containerStyle: _angular_core.Signal<{
3478
+ padding: string;
3479
+ textAlign: _meshmakers_octo_meshboard.MarkdownTextAlign;
3480
+ }>;
3481
+ ngOnInit(): void;
3482
+ ngOnChanges(changes: SimpleChanges): void;
3483
+ refresh(): void;
3484
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MarkdownWidgetComponent, never>;
3485
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MarkdownWidgetComponent, "mm-markdown-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
3486
+ }
3487
+
3488
+ /**
3489
+ * Result from the Markdown config dialog.
3490
+ */
3491
+ interface MarkdownConfigResult extends WidgetConfigResult {
3492
+ content: string;
3493
+ resolveVariables: boolean;
3494
+ padding?: string;
3495
+ textAlign?: MarkdownTextAlign;
3496
+ }
3497
+ declare class MarkdownConfigDialogComponent implements OnInit {
3498
+ initialContent?: string;
3499
+ initialResolveVariables?: boolean;
3500
+ initialPadding?: string;
3501
+ initialTextAlign?: MarkdownTextAlign;
3502
+ save: Subject<MarkdownConfigResult>;
3503
+ cancelled: Subject<void>;
3504
+ readonly showPreview: _angular_core.WritableSignal<boolean>;
3505
+ content: string;
3506
+ resolveVariables: boolean;
3507
+ padding: string;
3508
+ textAlign: MarkdownTextAlign;
3509
+ ngOnInit(): void;
3510
+ onSave(): void;
3511
+ onCancel(): void;
3512
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MarkdownConfigDialogComponent, never>;
3513
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MarkdownConfigDialogComponent, "mm-markdown-config-dialog", never, { "initialContent": { "alias": "initialContent"; "required": false; }; "initialResolveVariables": { "alias": "initialResolveVariables"; "required": false; }; "initialPadding": { "alias": "initialPadding"; "required": false; }; "initialTextAlign": { "alias": "initialTextAlign"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
3514
+ }
3515
+
3516
+ /**
3517
+ * Process Widget Registration
3518
+ *
3519
+ * This file is separate from default-widget-registrations.ts to enable
3520
+ * lazy loading of the ProcessWidget and its dependencies (octo-process-diagrams).
3521
+ *
3522
+ * Usage:
3523
+ * - Import and call registerProcessWidget() only in routes/components that need it
3524
+ * - Or use provideProcessWidget() in app config for eager loading
3525
+ */
3526
+
3527
+ /**
3528
+ * Registers the Process Widget with the widget registry.
3529
+ *
3530
+ * Call this function to enable Process Diagram widgets in MeshBoard.
3531
+ * This is kept separate to allow lazy loading of the octo-process-diagrams dependency.
3532
+ *
3533
+ * @example
3534
+ * ```typescript
3535
+ * // In a lazy-loaded route or component
3536
+ * const registry = inject(WidgetRegistryService);
3537
+ * registerProcessWidget(registry);
3538
+ * ```
3539
+ */
3540
+ declare function registerProcessWidget(registry: WidgetRegistryService): void;
3541
+ /**
3542
+ * Provides the Process Widget registration as an environment provider.
3543
+ *
3544
+ * Use this if you want to eagerly register the Process Widget at app startup.
3545
+ * For lazy loading, use registerProcessWidget() directly in the component/route instead.
3546
+ *
3547
+ * @example
3548
+ * ```typescript
3549
+ * // In app.config.ts (eager loading)
3550
+ * export const appConfig: ApplicationConfig = {
3551
+ * providers: [
3552
+ * provideMeshBoard(),
3553
+ * provideProcessWidget() // Optional: only if you need ProcessWidget
3554
+ * ]
3555
+ * };
3556
+ * ```
3557
+ */
3558
+ declare function provideProcessWidget(): EnvironmentProviders;
3559
+
3560
+ /**
3561
+ * Registers all built-in widget types with the registry.
3562
+ * Called during app initialization.
3563
+ */
3564
+ declare function registerDefaultWidgets(registry: WidgetRegistryService): void;
3565
+ /**
3566
+ * Provides the widget registry with all built-in widgets registered.
3567
+ * Add this to your app's providers array.
3568
+ *
3569
+ * Usage:
3570
+ * ```typescript
3571
+ * bootstrapApplication(AppComponent, {
3572
+ * providers: [
3573
+ * provideDefaultWidgets()
3574
+ * ]
3575
+ * });
3576
+ * ```
3577
+ */
3578
+ declare function provideDefaultWidgets(): EnvironmentProviders;
3579
+
3580
+ /**
3581
+ * Configuration options for MeshBoard
3582
+ */
3583
+ interface MeshBoardOptions {
3584
+ /** Whether to include default widgets (default: true) */
3585
+ includeDefaultWidgets?: boolean;
3586
+ /** Default grid columns (default: 6) */
3587
+ defaultColumns?: number;
3588
+ /** Default row height in pixels (default: 200) */
3589
+ defaultRowHeight?: number;
3590
+ /** Default gap between widgets in pixels (default: 16) */
3591
+ defaultGap?: number;
3592
+ }
3593
+ /**
3594
+ * Injection token for MeshBoard options
3595
+ */
3596
+ declare const MESHBOARD_OPTIONS: InjectionToken<MeshBoardOptions>;
3597
+
3598
+ /**
3599
+ * @deprecated Use TENANT_ID_PROVIDER from @meshmakers/octo-services instead
3600
+ */
3601
+ declare const MESHBOARD_TENANT_ID_PROVIDER: InjectionToken<_meshmakers_octo_services.TenantIdProvider>;
3602
+ /**
3603
+ * Main provider function for the MeshBoard library.
3604
+ * This is the recommended way to configure MeshBoard in your application.
3605
+ *
3606
+ * Usage:
3607
+ * ```typescript
3608
+ * // app.config.ts
3609
+ * import { provideMeshBoard } from '@meshmakers/octo-meshboard';
3610
+ *
3611
+ * export const appConfig: ApplicationConfig = {
3612
+ * providers: [
3613
+ * provideMeshBoard(),
3614
+ * // or with options:
3615
+ * provideMeshBoard({ defaultColumns: 4 })
3616
+ * ]
3617
+ * };
3618
+ * ```
3619
+ */
3620
+ declare function provideMeshBoard(options?: MeshBoardOptions): EnvironmentProviders;
3621
+ /**
3622
+ * Provider function for registering custom widgets.
3623
+ * Use this to add your own widget types to MeshBoard.
3624
+ *
3625
+ * Usage:
3626
+ * ```typescript
3627
+ * // app.config.ts
3628
+ * import { provideMeshBoard, provideWidgetRegistrations } from '@meshmakers/octo-meshboard';
3629
+ * import { MyCustomWidget, MyCustomConfigDialog } from './widgets/my-custom-widget';
3630
+ *
3631
+ * const customWidgets: WidgetRegistration<any, any>[] = [
3632
+ * {
3633
+ * type: 'myCustom',
3634
+ * label: 'My Custom Widget',
3635
+ * component: MyCustomWidget,
3636
+ * configDialogComponent: MyCustomConfigDialog,
3637
+ * defaultSize: { colSpan: 2, rowSpan: 1 },
3638
+ * supportedDataSources: ['runtimeEntity'],
3639
+ * // ... other registration options
3640
+ * }
3641
+ * ];
3642
+ *
3643
+ * export const appConfig: ApplicationConfig = {
3644
+ * providers: [
3645
+ * provideMeshBoard(),
3646
+ * provideWidgetRegistrations(customWidgets)
3647
+ * ]
3648
+ * };
3649
+ * ```
3650
+ */
3651
+ declare function provideWidgetRegistrations(registrations: WidgetRegistration<any, any>[]): EnvironmentProviders;
3652
+
3653
+ interface WidgetPositionUpdate {
3654
+ id: string;
3655
+ title: string;
3656
+ col: number;
3657
+ row: number;
3658
+ colSpan: number;
3659
+ rowSpan: number;
3660
+ }
3661
+ declare class EditWidgetDialogComponent implements OnInit {
3662
+ widget: AnyWidgetConfig;
3663
+ widgets: AnyWidgetConfig[];
3664
+ maxColumns: number;
3665
+ gridService: MeshBoardGridService;
3666
+ save: EventEmitter<WidgetPositionUpdate>;
3667
+ cancelled: EventEmitter<void>;
3668
+ form: WidgetPositionUpdate;
3669
+ error: string;
3670
+ ngOnInit(): void;
3671
+ onSave(): void;
3672
+ onCancel(): void;
3673
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EditWidgetDialogComponent, never>;
3674
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EditWidgetDialogComponent, "mm-edit-widget-dialog", never, { "widget": { "alias": "widget"; "required": false; }; "widgets": { "alias": "widgets"; "required": false; }; "maxColumns": { "alias": "maxColumns"; "required": false; }; "gridService": { "alias": "gridService"; "required": false; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
3675
+ }
3676
+
3677
+ /**
3678
+ * Main container component that displays a MeshBoard with widgets in a grid layout.
3679
+ * Provides toolbar for settings, adding widgets, saving, and refreshing.
3680
+ */
3681
+ declare class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedChanges {
3682
+ private readonly stateService;
3683
+ private readonly editModeService;
3684
+ private readonly widgetFactory;
3685
+ private readonly widgetRegistry;
3686
+ private readonly dataService;
3687
+ private readonly dialogService;
3688
+ private readonly viewContainerRef;
3689
+ private readonly router;
3690
+ private readonly route;
3691
+ protected readonly gridService: MeshBoardGridService;
3692
+ private readonly tenantIdProvider;
3693
+ private lastNavigatedRtId;
3694
+ protected readonly gearIcon: _progress_kendo_svg_icons.SVGIcon;
3695
+ protected readonly plusIcon: _progress_kendo_svg_icons.SVGIcon;
3696
+ protected readonly saveIcon: _progress_kendo_svg_icons.SVGIcon;
3697
+ protected readonly arrowRotateCwIcon: _progress_kendo_svg_icons.SVGIcon;
3698
+ protected readonly pencilIcon: _progress_kendo_svg_icons.SVGIcon;
3699
+ protected readonly xIcon: _progress_kendo_svg_icons.SVGIcon;
3700
+ protected readonly linkIcon: _progress_kendo_svg_icons.SVGIcon;
3701
+ protected readonly trashIcon: _progress_kendo_svg_icons.SVGIcon;
3702
+ protected readonly gridLayoutIcon: _progress_kendo_svg_icons.SVGIcon;
3703
+ protected showEditWidgetDialog: boolean;
3704
+ protected editingWidget: AnyWidgetConfig | null;
3705
+ private configDialogRef;
3706
+ protected readonly config: _angular_core.Signal<MeshBoardConfig>;
3707
+ protected readonly isEditMode: _angular_core.Signal<boolean>;
3708
+ protected readonly isSaving: _angular_core.Signal<boolean>;
3709
+ protected readonly isLoading: _angular_core.Signal<boolean>;
3710
+ protected readonly isModelAvailable: _angular_core.Signal<boolean | null>;
3711
+ private readonly _isInitialized;
3712
+ protected readonly isInitialized: _angular_core.Signal<boolean>;
3713
+ private readonly _notFoundError;
3714
+ protected readonly notFoundError: _angular_core.Signal<string | null>;
3715
+ protected readonly meshBoardPageLink: _angular_core.Signal<string>;
3716
+ protected readonly hasWidgets: _angular_core.Signal<boolean>;
3717
+ protected readonly canSave: _angular_core.Signal<boolean>;
3718
+ protected readonly isTimeFilterEnabled: _angular_core.Signal<boolean>;
3719
+ protected readonly timeFilterConfig: _angular_core.Signal<_meshmakers_octo_meshboard.MeshBoardTimeFilterConfig | undefined>;
3720
+ protected readonly initialTimeSelection: _angular_core.Signal<TimeRangeSelection$1 | undefined>;
3721
+ constructor();
3722
+ /**
3723
+ * Updates the URL to include the current MeshBoard rtId.
3724
+ */
3725
+ private updateUrlWithRtId;
3726
+ ngOnInit(): Promise<void>;
3727
+ /**
3728
+ * Loads a specific MeshBoard by its rtId.
3729
+ */
3730
+ private loadMeshBoardById;
3731
+ ngOnDestroy(): void;
3732
+ /**
3733
+ * Preloads data for all widgets to improve initial rendering performance.
3734
+ */
3735
+ private preloadWidgetData;
3736
+ /**
3737
+ * Initializes time filter variables based on the stored selection.
3738
+ * Called after loading a MeshBoard to ensure time filter variables are set.
3739
+ */
3740
+ private initializeTimeFilterVariables;
3741
+ /**
3742
+ * Gets the component type for a widget based on its type.
3743
+ */
3744
+ getWidgetComponentType(type: WidgetType): Type<unknown> | undefined;
3745
+ /**
3746
+ * Toggles edit mode.
3747
+ */
3748
+ toggleEditMode(): void;
3749
+ /**
3750
+ * Cancels edit mode and restores original state.
3751
+ */
3752
+ cancelEdit(): void;
3753
+ /**
3754
+ * Opens the settings dialog.
3755
+ */
3756
+ openSettings(): Promise<void>;
3757
+ /**
3758
+ * Opens the add widget dialog.
3759
+ */
3760
+ openAddWidget(): Promise<void>;
3761
+ /**
3762
+ * Opens the MeshBoard manager dialog.
3763
+ */
3764
+ openManager(): Promise<void>;
3765
+ /**
3766
+ * Adds a widget to the MeshBoard.
3767
+ */
3768
+ private addWidget;
3769
+ /**
3770
+ * Finds a free position in the grid for a new widget.
3771
+ */
3772
+ private findFreePosition;
3773
+ /**
3774
+ * Checks if a position is occupied by existing widgets.
3775
+ */
3776
+ private isPositionOccupied;
3777
+ /**
3778
+ * Saves the MeshBoard.
3779
+ */
3780
+ save(): Promise<void>;
3781
+ /**
3782
+ * Refreshes all widget data.
3783
+ */
3784
+ refresh(): void;
3785
+ /**
3786
+ * Handles time range change from the time range picker.
3787
+ * Triggers a refresh of all widgets to apply the new filter.
3788
+ */
3789
+ onTimeRangeChange(_range: TimeRange): void;
3790
+ /**
3791
+ * Handles time selection change from the time range picker.
3792
+ * Updates the time filter variables and persists the selection.
3793
+ */
3794
+ onTimeSelectionChange(sharedSelection: TimeRangeSelection$1): void;
3795
+ /**
3796
+ * Compares two TimeRangeSelection objects for equality.
3797
+ */
3798
+ private isSelectionEqual;
3799
+ /**
3800
+ * Removes a widget from the MeshBoard.
3801
+ */
3802
+ removeWidget(widgetId: string): void;
3803
+ /**
3804
+ * Opens the configuration dialog for a widget.
3805
+ * Creates the dialog component dynamically using ViewContainerRef to avoid
3806
+ * double-wrapping with DialogService (config dialogs have their own kendo-dialog).
3807
+ */
3808
+ openWidgetConfig(widget: AnyWidgetConfig): void;
3809
+ /**
3810
+ * Closes the configuration dialog if open.
3811
+ */
3812
+ private closeConfigDialog;
3813
+ /**
3814
+ * Handles TileLayout reorder events.
3815
+ */
3816
+ onReorder(event: {
3817
+ newIndex: number;
3818
+ oldIndex: number;
3819
+ }): void;
3820
+ /**
3821
+ * Handles TileLayout resize events.
3822
+ */
3823
+ onResize(event: any): void;
3824
+ /**
3825
+ * Track by function for widget rendering.
3826
+ */
3827
+ trackByWidgetId(_index: number, widget: AnyWidgetConfig): string;
3828
+ /**
3829
+ * Checks if a widget is unconfigured (needs data source setup).
3830
+ */
3831
+ isWidgetUnconfigured(widget: AnyWidgetConfig): boolean;
3832
+ /**
3833
+ * Checks if a widget type supports configuration.
3834
+ */
3835
+ supportsConfiguration(widget: AnyWidgetConfig): boolean;
3836
+ /**
3837
+ * Opens the edit widget dialog for position/size editing.
3838
+ */
3839
+ openEditWidgetDialog(widget: AnyWidgetConfig): void;
3840
+ /**
3841
+ * Handles save from the edit widget dialog.
3842
+ */
3843
+ onEditWidgetSave(update: WidgetPositionUpdate): void;
3844
+ /**
3845
+ * Closes the edit widget dialog.
3846
+ */
3847
+ closeEditWidgetDialog(): void;
3848
+ /**
3849
+ * Checks if there are unsaved changes in the MeshBoard.
3850
+ * Returns true if in edit mode with a snapshot (indicating changes).
3851
+ */
3852
+ hasUnsavedChanges(): boolean;
3853
+ /**
3854
+ * Saves the MeshBoard and returns true if successful.
3855
+ * This is called by the UnsavedChangesGuard when the user chooses to save.
3856
+ */
3857
+ saveChanges(): Promise<boolean>;
3858
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MeshBoardViewComponent, never>;
3859
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MeshBoardViewComponent, "mm-meshboard-view", never, {}, {}, never, never, true, [{ directive: typeof i1.UnsavedChangesDirective; inputs: {}; outputs: {}; }]>;
3860
+ }
3861
+
3862
+ /**
3863
+ * Result returned when the dialog is closed with save action.
3864
+ */
3865
+ declare class MeshBoardSettingsResult {
3866
+ name: string;
3867
+ description: string;
3868
+ columns: number;
3869
+ rowHeight: number;
3870
+ gap: number;
3871
+ variables: MeshBoardVariable[];
3872
+ timeFilter?: MeshBoardTimeFilterConfig | undefined;
3873
+ rtWellKnownName?: string | undefined;
3874
+ constructor(name: string, description: string, columns: number, rowHeight: number, gap: number, variables: MeshBoardVariable[], timeFilter?: MeshBoardTimeFilterConfig | undefined, rtWellKnownName?: string | undefined);
3875
+ }
3876
+ /**
3877
+ * Dialog for editing MeshBoard settings.
3878
+ * Allows configuration of name, description, columns, rowHeight, and gap.
3879
+ */
3880
+ declare class MeshBoardSettingsDialogComponent {
3881
+ private readonly dialogRef;
3882
+ name: string;
3883
+ description: string;
3884
+ rtWellKnownName: string;
3885
+ columns: number;
3886
+ rowHeight: number;
3887
+ gap: number;
3888
+ variables: MeshBoardVariable[];
3889
+ timeFilterEnabled: boolean;
3890
+ get isValid(): boolean;
3891
+ /**
3892
+ * Sets the initial values for the form fields.
3893
+ */
3894
+ setInitialValues(settings: {
3895
+ name: string;
3896
+ description: string;
3897
+ rtWellKnownName?: string | null;
3898
+ columns: number;
3899
+ rowHeight: number;
3900
+ gap: number;
3901
+ variables?: MeshBoardVariable[];
3902
+ timeFilter?: MeshBoardTimeFilterConfig;
3903
+ }): void;
3904
+ /**
3905
+ * Saves the settings and closes the dialog.
3906
+ */
3907
+ save(): void;
3908
+ /**
3909
+ * Cancels and closes the dialog.
3910
+ */
3911
+ cancel(): void;
3912
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MeshBoardSettingsDialogComponent, never>;
3913
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MeshBoardSettingsDialogComponent, "mm-meshboard-settings-dialog", never, {}, {}, never, never, true, never>;
3914
+ }
3915
+
3916
+ /**
3917
+ * Widget type info for display in the dialog.
3918
+ */
3919
+ interface WidgetTypeInfo {
3920
+ type: WidgetType;
3921
+ label: string;
3922
+ description: string;
3923
+ icon: SVGIcon;
3924
+ }
3925
+ /**
3926
+ * Dialog for selecting a widget type to add to the MeshBoard.
3927
+ */
3928
+ declare class AddWidgetDialogComponent implements OnInit {
3929
+ private readonly dialogRef;
3930
+ private readonly widgetRegistry;
3931
+ protected readonly checkCircleIcon: SVGIcon;
3932
+ protected readonly widgetTypes: _angular_core.WritableSignal<WidgetTypeInfo[]>;
3933
+ protected readonly selectedType: _angular_core.WritableSignal<WidgetType | null>;
3934
+ ngOnInit(): void;
3935
+ /**
3936
+ * Gets the icon for a widget type.
3937
+ */
3938
+ private getWidgetIcon;
3939
+ /**
3940
+ * Gets the description for a widget type.
3941
+ */
3942
+ private getWidgetDescription;
3943
+ /**
3944
+ * Selects a widget type.
3945
+ */
3946
+ selectType(type: WidgetType): void;
3947
+ /**
3948
+ * Checks if a widget type is selected.
3949
+ */
3950
+ isSelected(type: WidgetType): boolean;
3951
+ /**
3952
+ * Adds the selected widget and closes the dialog.
3953
+ */
3954
+ add(): void;
3955
+ /**
3956
+ * Cancels and closes the dialog.
3957
+ */
3958
+ cancel(): void;
3959
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AddWidgetDialogComponent, never>;
3960
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AddWidgetDialogComponent, "mm-add-widget-dialog", never, {}, {}, never, never, true, never>;
3961
+ }
3962
+
3963
+ /**
3964
+ * Dialog for managing multiple MeshBoards.
3965
+ * Provides actions to switch, create, rename, and delete MeshBoards.
3966
+ */
3967
+ declare class MeshBoardManagerDialogComponent implements OnInit {
3968
+ private readonly dialogRef;
3969
+ private readonly stateService;
3970
+ private readonly dialogService;
3971
+ private readonly assetRepoService;
3972
+ private readonly jobManagementService;
3973
+ private readonly importStrategyDialogService;
3974
+ private readonly injectedTenantIdProvider;
3975
+ externalTenantIdProvider: TenantIdProvider | null;
3976
+ private readonly DASHBOARD_CK_TYPE_ID;
3977
+ private readonly VARIABLES_SEPARATOR;
3978
+ /**
3979
+ * Gets the tenant ID provider from either external property or DI.
3980
+ */
3981
+ private get tenantIdProvider();
3982
+ protected readonly plusIcon: _progress_kendo_svg_icons.SVGIcon;
3983
+ protected readonly trashIcon: _progress_kendo_svg_icons.SVGIcon;
3984
+ protected readonly pencilIcon: _progress_kendo_svg_icons.SVGIcon;
3985
+ protected readonly checkIcon: _progress_kendo_svg_icons.SVGIcon;
3986
+ protected readonly xIcon: _progress_kendo_svg_icons.SVGIcon;
3987
+ protected readonly gridLayoutIcon: _progress_kendo_svg_icons.SVGIcon;
3988
+ protected readonly downloadIcon: _progress_kendo_svg_icons.SVGIcon;
3989
+ protected readonly uploadIcon: _progress_kendo_svg_icons.SVGIcon;
3990
+ protected readonly isExporting: _angular_core.WritableSignal<boolean>;
3991
+ protected readonly isImporting: _angular_core.WritableSignal<boolean>;
3992
+ protected readonly meshBoards: _angular_core.Signal<PersistedMeshBoard[]>;
3993
+ protected readonly currentMeshBoardId: _angular_core.Signal<string | null>;
3994
+ protected readonly isLoading: _angular_core.WritableSignal<boolean>;
3995
+ protected readonly editingId: _angular_core.WritableSignal<string | null>;
3996
+ protected readonly editingName: _angular_core.WritableSignal<string>;
3997
+ protected readonly editingDescription: _angular_core.WritableSignal<string>;
3998
+ protected readonly isCreating: _angular_core.WritableSignal<boolean>;
3999
+ protected readonly newName: _angular_core.WritableSignal<string>;
4000
+ protected readonly newDescription: _angular_core.WritableSignal<string>;
4001
+ protected readonly hasMeshBoards: _angular_core.Signal<boolean>;
4002
+ ngOnInit(): Promise<void>;
4003
+ /**
4004
+ * Refreshes the list of MeshBoards.
4005
+ */
4006
+ private refresh;
4007
+ /**
4008
+ * Checks if a MeshBoard is the currently active one.
4009
+ */
4010
+ isActive(meshBoard: PersistedMeshBoard): boolean;
4011
+ /**
4012
+ * Gets the display description for a MeshBoard.
4013
+ * Strips the encoded variables/timeFilter JSON from the raw description.
4014
+ */
4015
+ getDisplayDescription(meshBoard: PersistedMeshBoard): string;
4016
+ /**
4017
+ * Checks if a MeshBoard is being edited.
4018
+ */
4019
+ isEditing(meshBoard: PersistedMeshBoard): boolean;
4020
+ /**
4021
+ * Switches to a different MeshBoard.
4022
+ */
4023
+ switchTo(meshBoard: PersistedMeshBoard): Promise<void>;
4024
+ /**
4025
+ * Starts editing a MeshBoard.
4026
+ */
4027
+ startEdit(meshBoard: PersistedMeshBoard): void;
4028
+ /**
4029
+ * Cancels editing a MeshBoard.
4030
+ */
4031
+ cancelEdit(): void;
4032
+ /**
4033
+ * Saves the edited MeshBoard.
4034
+ */
4035
+ saveEdit(): Promise<void>;
4036
+ /**
4037
+ * Deletes a MeshBoard after confirmation.
4038
+ */
4039
+ delete(meshBoard: PersistedMeshBoard): Promise<void>;
4040
+ /**
4041
+ * Shows a confirmation dialog before deleting.
4042
+ */
4043
+ private confirmDelete;
4044
+ /**
4045
+ * Starts creating a new MeshBoard.
4046
+ */
4047
+ startCreate(): void;
4048
+ /**
4049
+ * Cancels creating a new MeshBoard.
4050
+ */
4051
+ cancelCreate(): void;
4052
+ /**
4053
+ * Creates a new MeshBoard.
4054
+ */
4055
+ create(): Promise<void>;
4056
+ /**
4057
+ * Closes the dialog.
4058
+ */
4059
+ close(): void;
4060
+ /**
4061
+ * Checks if export is available (requires tenant provider).
4062
+ */
4063
+ get canExport(): boolean;
4064
+ /**
4065
+ * Exports a MeshBoard as a deep graph.
4066
+ */
4067
+ exportMeshBoard(meshBoard: PersistedMeshBoard, event: Event): Promise<void>;
4068
+ /**
4069
+ * Triggers the file input for importing a MeshBoard.
4070
+ */
4071
+ triggerImport(): void;
4072
+ /**
4073
+ * Imports a MeshBoard from a ZIP file.
4074
+ */
4075
+ importMeshBoard(file: File): Promise<void>;
4076
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MeshBoardManagerDialogComponent, never>;
4077
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MeshBoardManagerDialogComponent, "mm-meshboard-manager-dialog", never, {}, {}, never, never, true, never>;
4078
+ }
4079
+
4080
+ export { AddWidgetDialogComponent, AssociationsConfigDialogComponent, BarChartConfigDialogComponent, BarChartWidgetComponent, DashboardDataService, DashboardGridService, EditModeStateService, EditWidgetDialogComponent, EntityAssociationsWidgetComponent, EntityCardConfigDialogComponent, EntityCardWidgetComponent, EntityDetailDialogComponent, GaugeConfigDialogComponent, GaugeWidgetComponent, KpiConfigDialogComponent, KpiWidgetComponent, MESHBOARD_OPTIONS, MESHBOARD_TENANT_ID_PROVIDER, MarkdownConfigDialogComponent, MarkdownWidgetComponent, MeshBoardDataService, MeshBoardGridService, MeshBoardManagerDialogComponent, MeshBoardPersistenceService, MeshBoardSettingsDialogComponent, MeshBoardSettingsResult, MeshBoardStateService, MeshBoardViewComponent, PieChartConfigDialogComponent, PieChartWidgetComponent, QuerySelectorComponent, RuntimeEntityDialogDataSource$1 as RuntimeEntityDialogDataSource, RuntimeEntitySelectDataSource$1 as RuntimeEntitySelectDataSource, RuntimeEntitySelectorComponent, ServiceHealthConfigDialogComponent, ServiceHealthWidgetComponent, StatsGridConfigDialogComponent, StatsGridWidgetComponent, StatusIndicatorConfigDialogComponent, StatusIndicatorWidgetComponent, TableConfigDialogComponent, TableWidgetComponent, TableWidgetDataSourceDirective, WidgetFactoryService, WidgetGroupComponent, WidgetGroupConfigDialogComponent, WidgetNotConfiguredComponent, WidgetRegistryService, provideDefaultWidgets, provideMeshBoard, provideProcessWidget, provideWidgetRegistrations, registerDefaultWidgets, registerProcessWidget };
4081
+ export type { AggregationDataSource, AggregationQuery, AggregationType, AnyWidgetConfig, AssociationsConfigResult, BarChartConfigResult, BarChartSeries, BarChartType, BarChartWidgetConfig, BaseWidgetConfig, CategoryValueItem, CkQueryResult, CkQueryTarget, ConfigDialogResult, ConfigResultApplier, ConstructionKitQueryDataSource, DashboardConfig, DashboardWidget, DataSource, DataSourceType, DiagramPropertyMapping, EntityAssociation, EntityAttribute, EntityCardConfigResult, EntityCardWidgetConfig, EntityListWidget, EntityWidget, EntityWithAssociationsWidgetConfig, GaugeConfigResult, GaugeRange, GaugeType, GaugeWidgetConfig, GridCell, GridPosition, GroupChildWidgetType, GroupedDataItem, KpiConfigResult, KpiDataSourceType, KpiQueryMode, KpiWidgetConfig, MarkdownConfigResult, MarkdownTextAlign, MarkdownWidgetConfig, MeshBoardConfig, MeshBoardOptions, MeshBoardTimeFilterConfig, MeshBoardVariable, MeshBoardVariableSource, MeshBoardVariableType, ParentAssociationMode, PersistedDashboard, PersistedMeshBoard, PersistedWidget, PersistedWidgetData, PersistentQueryDataSource, PersistentQueryItem, PieChartConfigResult, PieChartType, PieChartWidgetConfig, ProcessWidgetConfig, Quarter, QueryColumn, QueryColumnItem, RelativeTimeUnit, RepeaterDataItem, RepeaterQueryDataSource, RuntimeEntityData, RuntimeEntityDataSource, RuntimeEntityItem$1 as RuntimeEntityItem, RuntimeEntitySelectorValue, ServiceCallDataSource, ServiceCallType, ServiceHealthConfigResult, ServiceHealthWidgetConfig, StatColor, StatItem, StaticDataSource, StatsGridConfigResult, StatsGridWidgetConfig, StatusIndicatorConfigResult, StatusIndicatorWidgetConfig, TableColumn, TableConfigResult, TableFilterConfig, TableSortConfig, TableWidgetConfig, TimeRangePickerConfig, TimeRangeSelection, TimeRangeType, UpdateDashboardResult, WidgetConfig, WidgetConfigDialog, WidgetConfigResult, WidgetCreationOptions, WidgetDataSource, WidgetFilterConfig, WidgetGroupAttributeMappings, WidgetGroupChildTemplate, WidgetGroupConfig, WidgetGroupConfigResult, WidgetGroupLayout, WidgetPersistenceData, WidgetPositionUpdate, WidgetRegistration, WidgetType };