@meshmakers/octo-meshboard 3.4.160 → 3.4.180

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.
@@ -1,13 +1,13 @@
1
1
  import { ProcessWidgetSpecificConfig } from '@meshmakers/octo-process-diagrams';
2
2
  import * as _angular_core from '@angular/core';
3
- import { Signal, AfterViewInit, EventEmitter, Type, OnInit, OnChanges, SimpleChanges, OnDestroy, EnvironmentProviders, InjectionToken } from '@angular/core';
3
+ import { Signal, AfterViewInit, OnChanges, EventEmitter, SimpleChanges, Type, OnInit, OnDestroy, EnvironmentProviders, InjectionToken } from '@angular/core';
4
4
  import { ControlValueAccessor } from '@angular/forms';
5
5
  import * as i1 from '@meshmakers/shared-ui';
6
- import { EntitySelectDialogDataSource, ColumnDefinition, DialogFetchOptions, DialogFetchResult, EntitySelectInputComponent, FetchDataOptions, FetchResultTyped, TableColumn as TableColumn$1, HasUnsavedChanges, TimeRangePickerLabels, TimeRangeSelection as TimeRangeSelection$1, TimeRange } from '@meshmakers/shared-ui';
6
+ import { EntitySelectDialogDataSource, ColumnDefinition, DialogFetchOptions, DialogFetchResult, EntitySelectInputComponent, TimeRange, FetchDataOptions, FetchResultTyped, TableColumn as TableColumn$1, HasUnsavedChanges, TimeRangePickerLabels, TimeRangeSelection as TimeRangeSelection$1 } from '@meshmakers/shared-ui';
7
7
  import { Observable, Subject } from 'rxjs';
8
8
  import { EntitySelectDataSource, EntitySelectResult } from '@meshmakers/shared-services';
9
9
  import * as _meshmakers_octo_services from '@meshmakers/octo-services';
10
- import { Exact, InputMaybe, Scalars, SearchFilterDto, FieldFilterDto, SortDto, CkTypeSelectorItem, RuntimeEntityItem as RuntimeEntityItem$1, RuntimeEntitySelectDataSource as RuntimeEntitySelectDataSource$1, RuntimeEntityDialogDataSource as RuntimeEntityDialogDataSource$1, AttributeItem, TenantIdProvider } from '@meshmakers/octo-services';
10
+ import { Exact, InputMaybe, Scalars, SearchFilterDto, FieldFilterDto, SortDto, CkTypeSelectorItem, RuntimeEntityItem as RuntimeEntityItem$1, RuntimeEntitySelectDataSource as RuntimeEntitySelectDataSource$1, RuntimeEntityDialogDataSource as RuntimeEntityDialogDataSource$1, QueryModeDto, AttributeItem, TenantIdProvider } from '@meshmakers/octo-services';
11
11
  export { RuntimeEntityDialogDataSource, RuntimeEntityItem, RuntimeEntitySelectDataSource, TENANT_ID_PROVIDER, TenantIdProvider } from '@meshmakers/octo-services';
12
12
  import * as Apollo from 'apollo-angular';
13
13
  import { CkTypeSelectorInputComponent, AttributeValueTypeDto, FieldFilterItem, FilterVariable, PropertyGridItem, PropertyGridConfig, OctoGraphQlDataSource, FieldFilterEditorComponent } from '@meshmakers/octo-ui';
@@ -16,6 +16,34 @@ import * as _progress_kendo_svg_icons from '@progress/kendo-svg-icons';
16
16
  import { SVGIcon } from '@progress/kendo-svg-icons';
17
17
  import { TileLayoutReorderEvent, TileLayoutResizeEvent } from '@progress/kendo-angular-layout';
18
18
 
19
+ /**
20
+ * Persistent-query family classification.
21
+ *
22
+ * The query builder persists both runtime-data and stream-data queries as
23
+ * `systemPersistentQuery` entities. They are distinguished by the
24
+ * `queryCkTypeId` field, which carries a substring matching one of the
25
+ * known kinds below.
26
+ *
27
+ * Ordering matters: `GroupingAggregationSdQuery` contains `AggregationSdQuery`
28
+ * as a substring, so the grouping variant must be tested first.
29
+ */
30
+ type QueryFamily = 'runtime' | 'streamData';
31
+ type QueryKind = 'simple' | 'aggregation' | 'groupingAggregation' | 'downsampling';
32
+ interface QueryClassification {
33
+ family: QueryFamily;
34
+ kind: QueryKind;
35
+ }
36
+ /**
37
+ * Classify a persistent query by its `queryCkTypeId`.
38
+ * Returns `null` for unknown / legacy values; callers decide how to handle them.
39
+ */
40
+ declare function classifyQuery(queryCkTypeId: string | null | undefined): QueryClassification | null;
41
+ /**
42
+ * Convenience accessor — returns just the family ('runtime' | 'streamData')
43
+ * or null when the query type is unrecognised.
44
+ */
45
+ declare function queryFamily(queryCkTypeId: string | null | undefined): QueryFamily | null;
46
+
19
47
  /**
20
48
  * Mapping from diagram exposed property to runtime data source
21
49
  *
@@ -158,6 +186,7 @@ interface ProcessWidgetConfig extends WidgetConfig, ProcessWidgetSpecificConfig
158
186
  * MeshBoard Widget Models
159
187
  * Defines the interfaces for MeshBoard widgets and their data sources
160
188
  */
189
+
161
190
  /**
162
191
  * All supported data source types
163
192
  */
@@ -186,7 +215,13 @@ interface StaticDataSource extends WidgetDataSource {
186
215
  data?: unknown;
187
216
  }
188
217
  /**
189
- * Data source that executes a persistent query by its rtId
218
+ * Data source that executes a persistent query by its rtId.
219
+ *
220
+ * Both runtime-data and stream-data persistent queries are referenced through
221
+ * this single data-source type — switching between them is a configuration
222
+ * change, not a different widget. The `queryFamily` discriminator lets the
223
+ * widget pick the correct executor without an extra GraphQL round-trip; when
224
+ * absent it is derived from the query's `queryCkTypeId` at load time.
190
225
  */
191
226
  interface PersistentQueryDataSource extends WidgetDataSource {
192
227
  type: 'persistentQuery';
@@ -194,6 +229,8 @@ interface PersistentQueryDataSource extends WidgetDataSource {
194
229
  queryRtId: string;
195
230
  /** Display name of the query (for UI) */
196
231
  queryName?: string;
232
+ /** Query family: 'runtime' or 'streamData'. Derived from queryCkTypeId when absent. */
233
+ queryFamily?: QueryFamily;
197
234
  }
198
235
  /**
199
236
  * Aggregation types supported
@@ -273,6 +310,8 @@ interface RepeaterQueryDataSource extends WidgetDataSource {
273
310
  queryRtId?: string;
274
311
  /** Display name of the query (for UI) */
275
312
  queryName?: string;
313
+ /** Query family for the repeater query: 'runtime' or 'streamData'. Derived from queryCkTypeId when absent. */
314
+ queryFamily?: QueryFamily;
276
315
  /** Load entities by CK type (Entity Mode) */
277
316
  ckTypeId?: string;
278
317
  /** Filters for Entity Mode */
@@ -1044,6 +1083,12 @@ interface MeshBoardConfig {
1044
1083
  timeFilter?: MeshBoardTimeFilterConfig;
1045
1084
  /** Entity selector configurations for the toolbar */
1046
1085
  entitySelectors?: EntitySelectorConfig[];
1086
+ /**
1087
+ * Auto-refresh interval in seconds. `undefined` or `0` disables auto-refresh.
1088
+ * When set, the view polls all widgets at this interval and pauses while the
1089
+ * tab is hidden. Stream-data and runtime widgets refresh identically.
1090
+ */
1091
+ autoRefreshSeconds?: number;
1047
1092
  widgets: AnyWidgetConfig[];
1048
1093
  }
1049
1094
  /** @deprecated Use MeshBoardConfig instead */
@@ -1105,12 +1150,22 @@ type EntityWidget = DashboardWidget<AnyWidgetConfig, RuntimeEntityData>;
1105
1150
  type EntityListWidget = DashboardWidget<AnyWidgetConfig, RuntimeEntityData[]>;
1106
1151
 
1107
1152
  /**
1108
- * Persistent query item for selection in config dialogs
1153
+ * Persistent query item for selection in config dialogs.
1154
+ *
1155
+ * Two CK-type fields are exposed because they mean different things:
1156
+ * - `ckTypeId` — the persistent-query entity's own CK type (e.g.
1157
+ * `RtSimpleSdQuery`, `RtSimpleRtQuery`). This carries
1158
+ * the family marker used for runtime/stream-data
1159
+ * classification.
1160
+ * - `queryCkTypeId` — the CK type the query queries against (e.g.
1161
+ * `Basic.Energy/EnergyMeasurement`). Useful as a label
1162
+ * in pickers; NEVER use for family classification.
1109
1163
  */
1110
1164
  interface PersistentQueryItem {
1111
1165
  rtId: string;
1112
1166
  name: string;
1113
1167
  description?: string | null;
1168
+ ckTypeId?: string | null;
1114
1169
  queryCkTypeId?: string | null;
1115
1170
  }
1116
1171
  /**
@@ -1170,22 +1225,24 @@ declare class GetSystemPersistentQueriesDtoGQL extends Apollo.Query<GetSystemPer
1170
1225
 
1171
1226
  /**
1172
1227
  * Autocomplete data source for persistent query selection.
1173
- * Filters queries by search text using GraphQL.
1228
+ * Filters queries by search text using GraphQL, then narrows by family on the client.
1174
1229
  */
1175
1230
  declare class PersistentQueryAutocompleteDataSource implements EntitySelectDataSource<PersistentQueryItem> {
1176
1231
  private gql;
1177
- constructor(gql: GetSystemPersistentQueriesDtoGQL);
1232
+ private acceptFamilies;
1233
+ constructor(gql: GetSystemPersistentQueriesDtoGQL, acceptFamilies?: readonly QueryFamily[]);
1178
1234
  onFilter(filter: string, take?: number): Promise<EntitySelectResult<PersistentQueryItem>>;
1179
1235
  onDisplayEntity(entity: PersistentQueryItem): string;
1180
1236
  getIdEntity(entity: PersistentQueryItem): string;
1181
1237
  }
1182
1238
  /**
1183
1239
  * Dialog data source for persistent query selection grid.
1184
- * Provides columns and paginated data for the entity select dialog.
1240
+ * Provides columns and paginated data for the entity select dialog, narrowed by family on the client.
1185
1241
  */
1186
1242
  declare class PersistentQueryDialogDataSource implements EntitySelectDialogDataSource<PersistentQueryItem> {
1187
1243
  private gql;
1188
- constructor(gql: GetSystemPersistentQueriesDtoGQL);
1244
+ private acceptFamilies;
1245
+ constructor(gql: GetSystemPersistentQueriesDtoGQL, acceptFamilies?: readonly QueryFamily[]);
1189
1246
  getColumns(): ColumnDefinition[];
1190
1247
  fetchData(options: DialogFetchOptions): Observable<DialogFetchResult<PersistentQueryItem>>;
1191
1248
  onDisplayEntity(entity: PersistentQueryItem): string;
@@ -1206,7 +1263,7 @@ declare class PersistentQueryDialogDataSource implements EntitySelectDialogDataS
1206
1263
  * </mm-query-selector>
1207
1264
  * ```
1208
1265
  */
1209
- declare class QuerySelectorComponent implements ControlValueAccessor, AfterViewInit {
1266
+ declare class QuerySelectorComponent implements ControlValueAccessor, AfterViewInit, OnChanges {
1210
1267
  private readonly getSystemPersistentQueriesGQL;
1211
1268
  entitySelect: EntitySelectInputComponent;
1212
1269
  /** Placeholder text for the input */
@@ -1215,16 +1272,29 @@ declare class QuerySelectorComponent implements ControlValueAccessor, AfterViewI
1215
1272
  hint?: string;
1216
1273
  /** Whether the component is disabled */
1217
1274
  disabled: boolean;
1275
+ /**
1276
+ * Which query families to show in the picker.
1277
+ * Default: both runtime and stream-data.
1278
+ * Set to `['runtime']` for legacy widgets that cannot consume stream-data,
1279
+ * or `['streamData']` for stream-data-only pickers.
1280
+ *
1281
+ * Filtering happens client-side after a server-side fetch — small per-tenant
1282
+ * query counts make this acceptable; a server-side filter would require a
1283
+ * backend change.
1284
+ */
1285
+ acceptFamilies: readonly QueryFamily[];
1218
1286
  /** Emitted when a query is selected */
1219
1287
  querySelected: EventEmitter<PersistentQueryItem | null>;
1220
1288
  /** Emitted when queries are loaded (emits the selected query in a single-item array for compatibility) */
1221
1289
  queriesLoaded: EventEmitter<PersistentQueryItem[]>;
1222
- readonly queryDataSource: PersistentQueryAutocompleteDataSource;
1223
- readonly queryDialogDataSource: PersistentQueryDialogDataSource;
1290
+ queryDataSource: PersistentQueryAutocompleteDataSource;
1291
+ queryDialogDataSource: PersistentQueryDialogDataSource;
1224
1292
  private selectedQuery;
1225
1293
  private onChange;
1226
1294
  private onTouched;
1227
1295
  constructor();
1296
+ ngOnChanges(changes: SimpleChanges): void;
1297
+ private rebuildDataSources;
1228
1298
  ngAfterViewInit(): void;
1229
1299
  /**
1230
1300
  * Called when an entity is selected from the autocomplete or dialog
@@ -1244,7 +1314,7 @@ declare class QuerySelectorComponent implements ControlValueAccessor, AfterViewI
1244
1314
  registerOnTouched(fn: () => void): void;
1245
1315
  setDisabledState(isDisabled: boolean): void;
1246
1316
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<QuerySelectorComponent, never>;
1247
- 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; }; }, { "querySelected": "querySelected"; "queriesLoaded": "queriesLoaded"; }, never, never, true, never>;
1317
+ 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; }; "acceptFamilies": { "alias": "acceptFamilies"; "required": false; }; }, { "querySelected": "querySelected"; "queriesLoaded": "queriesLoaded"; }, never, never, true, never>;
1248
1318
  }
1249
1319
 
1250
1320
  /**
@@ -1593,6 +1663,7 @@ declare class MeshBoardStateService {
1593
1663
  variables?: MeshBoardVariable[];
1594
1664
  timeFilter?: MeshBoardTimeFilterConfig;
1595
1665
  entitySelectors?: EntitySelectorConfig[];
1666
+ autoRefreshSeconds?: number;
1596
1667
  }): void;
1597
1668
  /**
1598
1669
  * Gets current settings for the settings dialog.
@@ -1607,6 +1678,7 @@ declare class MeshBoardStateService {
1607
1678
  variables: MeshBoardVariable[];
1608
1679
  timeFilter?: MeshBoardTimeFilterConfig;
1609
1680
  entitySelectors?: EntitySelectorConfig[];
1681
+ autoRefreshSeconds?: number;
1610
1682
  };
1611
1683
  /**
1612
1684
  * Triggers a refresh of all widgets by creating new config references.
@@ -1675,6 +1747,18 @@ declare class MeshBoardStateService {
1675
1747
  * Gets the time filter configuration.
1676
1748
  */
1677
1749
  getTimeFilterConfig(): MeshBoardTimeFilterConfig | undefined;
1750
+ /**
1751
+ * Resolves the current time-filter selection to a concrete UTC `{from, to}`
1752
+ * range. Returns `null` when the filter is disabled, no selection exists,
1753
+ * or the selection is incomplete.
1754
+ *
1755
+ * Stream-data persistent queries consume this to bound their result set;
1756
+ * runtime queries ignore it.
1757
+ *
1758
+ * IANA-timezone-aware bucket boundaries are tracked separately (AB#4190);
1759
+ * this helper currently returns UTC boundaries derived from the picker.
1760
+ */
1761
+ resolveCurrentTimeRange(): TimeRange | null;
1678
1762
  /**
1679
1763
  * Updates the time filter configuration.
1680
1764
  */
@@ -1773,7 +1857,7 @@ declare class MeshBoardDataService {
1773
1857
  private readonly getDashboardEntityGQL;
1774
1858
  private readonly getCkModelsWithStateGQL;
1775
1859
  private readonly getEntitiesByCkTypeGQL;
1776
- private readonly executeRuntimeQueryGQL;
1860
+ private readonly queryExecutor;
1777
1861
  private readonly getAssociationTargetsGQL;
1778
1862
  private readonly getCkTypeAttributesGQL;
1779
1863
  private readonly apollo;
@@ -1835,10 +1919,12 @@ declare class MeshBoardDataService {
1835
1919
  */
1836
1920
  fetchRepeaterData(dataSource: RepeaterQueryDataSource): Promise<RepeaterDataItem[]>;
1837
1921
  /**
1838
- * Fetches repeater data from a persistent query.
1839
- * Maps query rows to RepeaterDataItem objects.
1922
+ * Fetches repeater data from a persistent query (runtime or stream-data).
1923
+ * Always sends `streamDataArgs` when a time filter is active — the runtime
1924
+ * path ignores the field, so this is safe regardless of the resolved family.
1840
1925
  */
1841
1926
  private fetchRepeaterFromQuery;
1927
+ private buildRepeaterStreamDataArgs;
1842
1928
  /**
1843
1929
  * Fetches repeater data from entities by CK type.
1844
1930
  * Maps entities to RepeaterDataItem objects.
@@ -2269,6 +2355,126 @@ declare class MeshBoardGridService {
2269
2355
  /** @deprecated Use MeshBoardGridService instead */
2270
2356
  declare const DashboardGridService: typeof MeshBoardGridService;
2271
2357
 
2358
+ /**
2359
+ * Time-range and downsampling arguments for stream-data persistent queries.
2360
+ * Mirrors the GraphQL input `StreamDataArguments` so widgets can build it
2361
+ * without importing generated DTO types directly.
2362
+ *
2363
+ * Backend semantics (verified against StreamDataQueryDtoType.cs and
2364
+ * StreamDataVariantExecutor.cs as of 2026-06-24):
2365
+ * - `from` / `to` / `limit` override the persisted query's intrinsic values
2366
+ * when set (`execOverride?.From ?? simple.From` pattern in the resolver).
2367
+ * - `interval` is currently ignored by every variant; the downsampling path
2368
+ * derives `(to - from) / limit` itself.
2369
+ * - `queryMode` is **ignored on both persistent and transient dispatch** —
2370
+ * the variant (Simple / Aggregation / GroupingAggregation / Downsampling)
2371
+ * comes from the persisted entity's CK subtype or the transient query's
2372
+ * GraphQL sub-connection URL. We still emit it because the schema declares
2373
+ * `queryMode: QueryMode!` (NonNull); see backend cleanup issue.
2374
+ *
2375
+ * Don't pretend to override the mode from here — even if `queryMode: DOWNSAMPLING`
2376
+ * is set on a `SimpleSdQuery`, the backend still runs the simple variant.
2377
+ */
2378
+ interface StreamDataExecutionArgs {
2379
+ from?: Date | null;
2380
+ to?: Date | null;
2381
+ interval?: number | null;
2382
+ limit?: number | null;
2383
+ /**
2384
+ * Currently a no-op on the dispatch side; kept because the GraphQL input
2385
+ * schema marks `queryMode` non-null. Defaults to `Default`.
2386
+ */
2387
+ queryMode?: QueryModeDto;
2388
+ }
2389
+ interface QueryExecutionOptions {
2390
+ /** Page size — passed to the GraphQL `first` variable. */
2391
+ first?: number | null;
2392
+ /** Cursor — passed to the GraphQL `after` variable. */
2393
+ after?: string | null;
2394
+ /** Optional column / row sort definitions. */
2395
+ sortOrder?: SortDto[] | null;
2396
+ /** Field filters applied to the query rows. */
2397
+ fieldFilter?: FieldFilterDto[] | null;
2398
+ /** Stream-data-only: time-range, interval, limit, queryMode. Ignored for runtime queries. */
2399
+ streamDataArgs?: StreamDataExecutionArgs | null;
2400
+ /** Force a network round-trip instead of using the Apollo cache. */
2401
+ forceRefresh?: boolean;
2402
+ }
2403
+ interface QueryColumnInfo {
2404
+ attributePath: string;
2405
+ attributeValueType?: string | null;
2406
+ aggregationType?: string | null;
2407
+ }
2408
+ interface QueryCell {
2409
+ attributePath: string;
2410
+ value: unknown;
2411
+ }
2412
+ /**
2413
+ * Unified result-row shape across runtime and stream-data queries.
2414
+ * `__typename` lets callers distinguish row kinds when needed
2415
+ * (`RtSimpleQueryRow`, `RtAggregationQueryRow`, `RtGroupingAggregationQueryRow`,
2416
+ * `StreamDataQueryRow`).
2417
+ *
2418
+ * Stream-data rows surface `timestamp`, `rtWellKnownName`,
2419
+ * `rtCreationDateTime`, and `rtChangedDateTime` directly on the row — useful
2420
+ * for time-series x-axes. Runtime rows leave those fields undefined.
2421
+ */
2422
+ interface QueryResultRow {
2423
+ __typename?: string;
2424
+ rtId?: string | null;
2425
+ ckTypeId?: string | null;
2426
+ timestamp?: Date | null;
2427
+ rtWellKnownName?: string | null;
2428
+ rtCreationDateTime?: Date | null;
2429
+ rtChangedDateTime?: Date | null;
2430
+ cells: QueryCell[];
2431
+ }
2432
+ interface QueryExecutionResult {
2433
+ family: QueryFamily;
2434
+ queryRtId?: string | null;
2435
+ associatedCkTypeId?: string | null;
2436
+ columns: QueryColumnInfo[];
2437
+ rows: QueryResultRow[];
2438
+ totalCount: number;
2439
+ hasNextPage: boolean;
2440
+ endCursor?: string | null;
2441
+ }
2442
+ /**
2443
+ * Executes persistent queries by rtId and returns a unified result shape
2444
+ * regardless of whether the underlying query is runtime-data or stream-data.
2445
+ *
2446
+ * Widgets consume `QueryExecutionResult` and stay agnostic about which family
2447
+ * the saved query belongs to — switching a widget's data source between
2448
+ * runtime and stream-data is purely a configuration change.
2449
+ */
2450
+ declare class QueryExecutorService {
2451
+ private readonly runtimeGql;
2452
+ private readonly streamDataGql;
2453
+ private readonly persistentQueriesGql;
2454
+ /**
2455
+ * Cache of resolved query families, keyed by query rtId. Filled lazily for
2456
+ * legacy widget configs that pre-date the `queryFamily` field — saves a
2457
+ * round-trip on every refresh.
2458
+ */
2459
+ private readonly familyCache;
2460
+ execute(family: QueryFamily | undefined, queryRtId: string, options?: QueryExecutionOptions): Observable<QueryExecutionResult>;
2461
+ /**
2462
+ * Resolves the family of a persistent query by rtId. Falls back to
2463
+ * `'runtime'` when the query type cannot be classified — this matches the
2464
+ * pre-Phase-1 behavior.
2465
+ */
2466
+ resolveFamily(queryRtId: string): Promise<QueryFamily>;
2467
+ executeRuntime(queryRtId: string, options?: QueryExecutionOptions): Observable<QueryExecutionResult>;
2468
+ executeStreamData(queryRtId: string, options?: QueryExecutionOptions): Observable<QueryExecutionResult>;
2469
+ private buildStreamDataArg;
2470
+ private mapColumns;
2471
+ private mapRuntimeRows;
2472
+ private mapStreamDataRows;
2473
+ private mapCells;
2474
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryExecutorService, never>;
2475
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<QueryExecutorService>;
2476
+ }
2477
+
2272
2478
  declare class EntityCardWidgetComponent implements DashboardWidget<EntityCardWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {
2273
2479
  private readonly dataService;
2274
2480
  config: EntityCardWidgetConfig;
@@ -2345,9 +2551,15 @@ declare class EntityCardConfigDialogComponent implements OnInit {
2345
2551
 
2346
2552
  declare class KpiWidgetComponent implements DashboardWidget<KpiWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {
2347
2553
  private readonly dataService;
2348
- private readonly executeRuntimeQueryGQL;
2554
+ private readonly queryExecutor;
2349
2555
  private readonly stateService;
2350
2556
  private readonly variableService;
2557
+ /**
2558
+ * Row __typenames KPI extraction recognises.
2559
+ * Runtime queries discriminate; stream-data queries collapse all kinds
2560
+ * (simple / aggregation / grouped / downsampling) into `StreamDataQueryRow`.
2561
+ */
2562
+ private static readonly SUPPORTED_ROW_TYPES;
2351
2563
  config: KpiWidgetConfig;
2352
2564
  protected readonly arrowUpIcon: _progress_kendo_svg_icons.SVGIcon;
2353
2565
  protected readonly arrowDownIcon: _progress_kendo_svg_icons.SVGIcon;
@@ -2385,6 +2597,7 @@ declare class KpiWidgetComponent implements DashboardWidget<KpiWidgetConfig, Run
2385
2597
  private loadData;
2386
2598
  private loadCountData;
2387
2599
  private loadPersistentQueryData;
2600
+ private buildStreamDataArgs;
2388
2601
  private extractAggregationValue;
2389
2602
  private extractGroupedAggregationValue;
2390
2603
  /**
@@ -2416,6 +2629,7 @@ interface KpiConfigResult extends WidgetConfigResult {
2416
2629
  labelAttribute?: string;
2417
2630
  queryRtId?: string;
2418
2631
  queryName?: string;
2632
+ queryFamily?: QueryFamily;
2419
2633
  queryMode?: KpiQueryMode;
2420
2634
  queryValueField?: string;
2421
2635
  queryCategoryField?: string;
@@ -2439,8 +2653,13 @@ declare class KpiConfigDialogComponent implements OnInit {
2439
2653
  private readonly getEntitiesByCkTypeGQL;
2440
2654
  private readonly ckTypeSelectorService;
2441
2655
  private readonly attributeSelectorService;
2442
- private readonly executeRuntimeQueryGQL;
2443
2656
  private readonly getRuntimeQueryColumnsGQL;
2657
+ private readonly queryExecutor;
2658
+ /**
2659
+ * Row __typenames the dialog recognises when collecting distinct category
2660
+ * values from a query result for the grouped-aggregation category picker.
2661
+ */
2662
+ private static readonly INTROSPECTION_ROW_TYPES;
2444
2663
  private readonly meshBoardStateService;
2445
2664
  private readonly windowRef;
2446
2665
  ckTypeSelectorInput?: CkTypeSelectorInputComponent;
@@ -2457,6 +2676,7 @@ declare class KpiConfigDialogComponent implements OnInit {
2457
2676
  initialDataSourceType?: KpiDataSourceType;
2458
2677
  initialQueryRtId?: string;
2459
2678
  initialQueryName?: string;
2679
+ initialQueryFamily?: QueryFamily;
2460
2680
  initialQueryMode?: KpiQueryMode;
2461
2681
  initialQueryValueField?: string;
2462
2682
  initialQueryCategoryField?: string;
@@ -2518,11 +2738,18 @@ declare class KpiConfigDialogComponent implements OnInit {
2518
2738
  onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
2519
2739
  onQueryModeChange(mode: KpiQueryMode): Promise<void>;
2520
2740
  private loadQueryColumnsAndValues;
2741
+ /**
2742
+ * Loads column metadata for the picker. Runtime queries use the
2743
+ * metadata-only resolver (no aggregation executed); stream-data queries
2744
+ * fall back to executing the query with `first: 1`. When `family` is
2745
+ * unknown (legacy configs), the executor resolves it once by rtId lookup.
2746
+ */
2747
+ private fetchColumnsForFamily;
2521
2748
  onCategoryFieldChange(categoryField: string): Promise<void>;
2522
2749
  private loadCategoryValuesForField;
2523
2750
  onFiltersChange(updatedFilters: FieldFilterItem[]): void;
2524
2751
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KpiConfigDialogComponent, never>;
2525
- 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; }; "initialComparisonText": { "alias": "initialComparisonText"; "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; }; "initialStaticValue": { "alias": "initialStaticValue"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, {}, never, never, true, never>;
2752
+ 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; }; "initialComparisonText": { "alias": "initialComparisonText"; "required": false; }; "initialDataSourceType": { "alias": "initialDataSourceType"; "required": false; }; "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; "initialQueryFamily": { "alias": "initialQueryFamily"; "required": false; }; "initialQueryMode": { "alias": "initialQueryMode"; "required": false; }; "initialQueryValueField": { "alias": "initialQueryValueField"; "required": false; }; "initialQueryCategoryField": { "alias": "initialQueryCategoryField"; "required": false; }; "initialQueryCategoryValue": { "alias": "initialQueryCategoryValue"; "required": false; }; "initialStaticValue": { "alias": "initialStaticValue"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, {}, never, never, true, never>;
2526
2753
  }
2527
2754
 
2528
2755
  interface GroupedAssociation {
@@ -2795,7 +3022,7 @@ interface QueryColumn {
2795
3022
  */
2796
3023
  declare class TableWidgetDataSourceDirective extends OctoGraphQlDataSource<Record<string, unknown>> {
2797
3024
  private readonly getEntitiesByCkTypeGQL;
2798
- private readonly executeRuntimeQueryGQL;
3025
+ private readonly queryExecutor;
2799
3026
  private readonly stateService;
2800
3027
  private readonly variableService;
2801
3028
  private _config;
@@ -2817,10 +3044,27 @@ declare class TableWidgetDataSourceDirective extends OctoGraphQlDataSource<Recor
2817
3044
  */
2818
3045
  private flattenAttributes;
2819
3046
  /**
2820
- * Fetches data from a persistent query.
2821
- * Extracts columns from the query response and transforms cells to flat records.
3047
+ * Row __typenames the table widget knows how to flatten. Runtime queries
3048
+ * use three discriminated variants; stream-data queries collapse all
3049
+ * kinds (simple / aggregation / grouped / downsampling) into a single
3050
+ * `StreamDataQueryRow` type.
3051
+ */
3052
+ private static readonly SUPPORTED_ROW_TYPES;
3053
+ /**
3054
+ * Fetches data from a persistent query (runtime or stream-data).
3055
+ * Family is determined from the cached `queryFamily` on the data source
3056
+ * (set by the config dialog when the user picks a query) and defaults to
3057
+ * `'runtime'` for legacy configs that predate stream-data support.
2822
3058
  */
2823
3059
  private fetchPersistentQueryData;
3060
+ /**
3061
+ * Flattens a unified `QueryResultRow` into a Kendo-grid-friendly record.
3062
+ * Cells are stored under their matching column's `attributePath` rather than
3063
+ * the cell's own — the engine emits cell paths in wire-form with a function
3064
+ * suffix (e.g. cell path `meterreading_count` for column path `meterReading`).
3065
+ * `matchesAttributePath` reconciles both forms.
3066
+ */
3067
+ private queryRowToRecord;
2824
3068
  /**
2825
3069
  * Converts query columns to TableColumn format for display.
2826
3070
  */
@@ -2841,6 +3085,12 @@ declare class TableWidgetDataSourceDirective extends OctoGraphQlDataSource<Recor
2841
3085
  * Resolves MeshBoard variables in filter values before conversion.
2842
3086
  */
2843
3087
  private convertFiltersToDto;
3088
+ /**
3089
+ * Builds `StreamDataExecutionArgs` from the MeshBoard's current time filter.
3090
+ * Returns `undefined` when no filter is active so the persistent query's
3091
+ * own bounds apply.
3092
+ */
3093
+ private buildStreamDataArgs;
2844
3094
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableWidgetDataSourceDirective, never>;
2845
3095
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TableWidgetDataSourceDirective, "[mmTableWidgetDataSource]", ["mmTableWidgetDataSource"], { "config": { "alias": "config"; "required": false; }; }, { "queryColumnsLoaded": "queryColumnsLoaded"; }, never, never, true, never>;
2846
3096
  }
@@ -2899,6 +3149,8 @@ interface TableConfigResult {
2899
3149
  filters: FieldFilterDto[];
2900
3150
  queryRtId?: string;
2901
3151
  queryName?: string;
3152
+ /** Family of the selected persistent query — 'runtime' or 'streamData'. */
3153
+ queryFamily?: QueryFamily;
2902
3154
  pageSize: number;
2903
3155
  sortable: boolean;
2904
3156
  }
@@ -2933,6 +3185,7 @@ declare class TableConfigDialogComponent implements OnInit {
2933
3185
  initialSortable?: boolean;
2934
3186
  initialQueryRtId?: string;
2935
3187
  initialQueryName?: string;
3188
+ initialQueryFamily?: QueryFamily;
2936
3189
  protected readonly columnsIcon: _progress_kendo_svg_icons.SVGIcon;
2937
3190
  protected readonly sortIcon: _progress_kendo_svg_icons.SVGIcon;
2938
3191
  protected readonly filterIcon: _progress_kendo_svg_icons.SVGIcon;
@@ -2967,7 +3220,7 @@ declare class TableConfigDialogComponent implements OnInit {
2967
3220
  private formatColumnTitle;
2968
3221
  onCancel(): void;
2969
3222
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableConfigDialogComponent, never>;
2970
- 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; }; }, {}, never, never, true, never>;
3223
+ 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; }; "initialQueryFamily": { "alias": "initialQueryFamily"; "required": false; }; }, {}, never, never, true, never>;
2971
3224
  }
2972
3225
 
2973
3226
  declare class GaugeWidgetComponent implements DashboardWidget<GaugeWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {
@@ -2976,7 +3229,8 @@ declare class GaugeWidgetComponent implements DashboardWidget<GaugeWidgetConfig,
2976
3229
  color: string;
2977
3230
  }[];
2978
3231
  private readonly dataService;
2979
- private readonly executeRuntimeQueryGQL;
3232
+ private readonly queryExecutor;
3233
+ private static readonly SUPPORTED_ROW_TYPES;
2980
3234
  private readonly stateService;
2981
3235
  private readonly variableService;
2982
3236
  config: GaugeWidgetConfig;
@@ -2999,6 +3253,7 @@ declare class GaugeWidgetComponent implements DashboardWidget<GaugeWidgetConfig,
2999
3253
  refresh(): void;
3000
3254
  private loadData;
3001
3255
  private loadPersistentQueryData;
3256
+ private buildStreamDataArgs;
3002
3257
  private extractAggregationValue;
3003
3258
  private extractGroupedAggregationValue;
3004
3259
  private parseNumericValue;
@@ -3026,6 +3281,7 @@ interface GaugeConfigResult extends WidgetConfigResult {
3026
3281
  labelAttribute?: string;
3027
3282
  queryRtId?: string;
3028
3283
  queryName?: string;
3284
+ queryFamily?: QueryFamily;
3029
3285
  queryMode?: KpiQueryMode;
3030
3286
  queryValueField?: string;
3031
3287
  queryCategoryField?: string;
@@ -3053,8 +3309,13 @@ declare class GaugeConfigDialogComponent implements OnInit {
3053
3309
  private readonly getEntitiesByCkTypeGQL;
3054
3310
  private readonly ckTypeSelectorService;
3055
3311
  private readonly attributeSelectorService;
3056
- private readonly executeRuntimeQueryGQL;
3057
3312
  private readonly getRuntimeQueryColumnsGQL;
3313
+ private readonly queryExecutor;
3314
+ /**
3315
+ * Row __typenames the dialog recognises when collecting distinct category
3316
+ * values from a query result for the grouped-aggregation category picker.
3317
+ */
3318
+ private static readonly INTROSPECTION_ROW_TYPES;
3058
3319
  private readonly meshBoardStateService;
3059
3320
  private readonly windowRef;
3060
3321
  ckTypeSelectorInput?: CkTypeSelectorInputComponent;
@@ -3075,6 +3336,7 @@ declare class GaugeConfigDialogComponent implements OnInit {
3075
3336
  initialDataSourceType?: GaugeDataSourceType;
3076
3337
  initialQueryRtId?: string;
3077
3338
  initialQueryName?: string;
3339
+ initialQueryFamily?: QueryFamily;
3078
3340
  initialQueryMode?: KpiQueryMode;
3079
3341
  initialQueryValueField?: string;
3080
3342
  initialQueryCategoryField?: string;
@@ -3137,11 +3399,18 @@ declare class GaugeConfigDialogComponent implements OnInit {
3137
3399
  onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
3138
3400
  onQueryModeChange(mode: KpiQueryMode): Promise<void>;
3139
3401
  private loadQueryColumnsAndValues;
3402
+ /**
3403
+ * Runtime queries use the metadata-only resolver (no aggregation executed);
3404
+ * stream-data queries fall back to executing the query with `first: 1`.
3405
+ * When `family` is unknown (legacy configs), the executor resolves it once
3406
+ * by rtId lookup.
3407
+ */
3408
+ private fetchColumnsForFamily;
3140
3409
  onCategoryFieldChange(categoryField: string): Promise<void>;
3141
3410
  private loadCategoryValuesForField;
3142
3411
  onFiltersChange(updatedFilters: FieldFilterItem[]): void;
3143
3412
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<GaugeConfigDialogComponent, never>;
3144
- 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; }; }, {}, never, never, true, never>;
3413
+ 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; }; "initialQueryFamily": { "alias": "initialQueryFamily"; "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; }; }, {}, never, never, true, never>;
3145
3414
  }
3146
3415
 
3147
3416
  /**
@@ -3152,7 +3421,8 @@ interface ChartDataItem {
3152
3421
  value: number;
3153
3422
  }
3154
3423
  declare class PieChartWidgetComponent implements DashboardWidget<PieChartWidgetConfig, ChartDataItem[]>, OnInit, OnChanges {
3155
- private readonly executeRuntimeQueryGQL;
3424
+ private readonly queryExecutor;
3425
+ private static readonly SUPPORTED_ROW_TYPES;
3156
3426
  private readonly dataService;
3157
3427
  private readonly stateService;
3158
3428
  private readonly variableService;
@@ -3200,6 +3470,7 @@ declare class PieChartWidgetComponent implements DashboardWidget<PieChartWidgetC
3200
3470
  * Note: isNotConfigured() check in loadData() ensures queryRtId is set.
3201
3471
  */
3202
3472
  private loadPersistentQueryData;
3473
+ private buildStreamDataArgs;
3203
3474
  /**
3204
3475
  * Converts widget filter configuration to GraphQL FieldFilterDto format.
3205
3476
  * Resolves MeshBoard variables in filter values before conversion.
@@ -3216,6 +3487,7 @@ interface PieChartConfigResult extends WidgetConfigResult {
3216
3487
  dataSourceType: DataSourceType;
3217
3488
  queryRtId?: string;
3218
3489
  queryName?: string;
3490
+ queryFamily?: QueryFamily;
3219
3491
  categoryField: string;
3220
3492
  valueField: string;
3221
3493
  ckQueryTarget?: CkQueryTarget;
@@ -3231,12 +3503,14 @@ interface PieChartConfigResult extends WidgetConfigResult {
3231
3503
  */
3232
3504
  declare class PieChartConfigDialogComponent implements OnInit, AfterViewInit {
3233
3505
  private readonly getRuntimeQueryColumnsGQL;
3506
+ private readonly queryExecutor;
3234
3507
  private readonly stateService;
3235
3508
  private readonly windowRef;
3236
3509
  querySelector?: QuerySelectorComponent;
3237
3510
  initialDataSourceType?: DataSourceType;
3238
3511
  initialQueryRtId?: string;
3239
3512
  initialQueryName?: string;
3513
+ initialQueryFamily?: QueryFamily;
3240
3514
  initialChartType?: PieChartType;
3241
3515
  initialCategoryField?: string;
3242
3516
  initialValueField?: string;
@@ -3288,11 +3562,17 @@ declare class PieChartConfigDialogComponent implements OnInit, AfterViewInit {
3288
3562
  private updateCkGroupByOptions;
3289
3563
  onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
3290
3564
  private loadQueryColumns;
3565
+ /**
3566
+ * Runtime queries use the metadata-only resolver (no aggregation executed);
3567
+ * stream-data queries fall back to executing the query with `first: 1`
3568
+ * because the SD path has no dedicated column-introspection endpoint today.
3569
+ */
3570
+ private fetchColumnsForFamily;
3291
3571
  onFiltersChange(updatedFilters: FieldFilterItem[]): void;
3292
3572
  onSave(): void;
3293
3573
  onCancel(): void;
3294
3574
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PieChartConfigDialogComponent, never>;
3295
- 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; }; }, {}, never, never, true, never>;
3575
+ 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; }; "initialQueryFamily": { "alias": "initialQueryFamily"; "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; }; }, {}, never, never, true, never>;
3296
3576
  }
3297
3577
 
3298
3578
  /**
@@ -3304,7 +3584,8 @@ interface SeriesData {
3304
3584
  color?: string;
3305
3585
  }
3306
3586
  declare class BarChartWidgetComponent implements DashboardWidget<BarChartWidgetConfig, SeriesData[]>, OnInit, OnChanges {
3307
- private readonly executeRuntimeQueryGQL;
3587
+ private readonly queryExecutor;
3588
+ private static readonly SUPPORTED_ROW_TYPES;
3308
3589
  private readonly stateService;
3309
3590
  private readonly variableService;
3310
3591
  config: BarChartWidgetConfig;
@@ -3346,6 +3627,7 @@ declare class BarChartWidgetComponent implements DashboardWidget<BarChartWidgetC
3346
3627
  private isDynamicSeriesMode;
3347
3628
  formatValue(value: number): string;
3348
3629
  private loadData;
3630
+ private buildStreamDataArgs;
3349
3631
  /**
3350
3632
  * Processes data in Static Series Mode.
3351
3633
  * Each series in config.series corresponds to a separate numeric field.
@@ -3395,6 +3677,7 @@ type SeriesMode = 'static' | 'dynamic';
3395
3677
  interface BarChartConfigResult extends WidgetConfigResult {
3396
3678
  queryRtId: string;
3397
3679
  queryName?: string;
3680
+ queryFamily?: QueryFamily;
3398
3681
  chartType: BarChartType;
3399
3682
  categoryField: string;
3400
3683
  series: BarChartSeries[];
@@ -3415,11 +3698,13 @@ interface BarChartConfigResult extends WidgetConfigResult {
3415
3698
  */
3416
3699
  declare class BarChartConfigDialogComponent implements OnInit {
3417
3700
  private readonly getRuntimeQueryColumnsGQL;
3701
+ private readonly queryExecutor;
3418
3702
  private readonly stateService;
3419
3703
  private readonly windowRef;
3420
3704
  querySelector?: QuerySelectorComponent;
3421
3705
  initialQueryRtId?: string;
3422
3706
  initialQueryName?: string;
3707
+ initialQueryFamily?: QueryFamily;
3423
3708
  initialChartType?: BarChartType;
3424
3709
  initialCategoryField?: string;
3425
3710
  initialSeries?: BarChartSeries[];
@@ -3464,6 +3749,12 @@ declare class BarChartConfigDialogComponent implements OnInit {
3464
3749
  ngOnInit(): Promise<void>;
3465
3750
  onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
3466
3751
  private loadQueryColumns;
3752
+ /**
3753
+ * Runtime queries use the metadata-only resolver (no aggregation executed);
3754
+ * stream-data queries fall back to executing the query with `first: 1`
3755
+ * because the SD path has no dedicated column-introspection endpoint today.
3756
+ */
3757
+ private fetchColumnsForFamily;
3467
3758
  onSeriesFieldsChange(fields: string[]): void;
3468
3759
  onFiltersChange(updatedFilters: FieldFilterItem[]): void;
3469
3760
  onSave(): void;
@@ -3471,7 +3762,7 @@ declare class BarChartConfigDialogComponent implements OnInit {
3471
3762
  removeColorThreshold(index: number): void;
3472
3763
  onCancel(): void;
3473
3764
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BarChartConfigDialogComponent, never>;
3474
- 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; }; "initialColorThresholds": { "alias": "initialColorThresholds"; "required": false; }; "initialDefaultBarColor": { "alias": "initialDefaultBarColor"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, {}, never, never, true, never>;
3765
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BarChartConfigDialogComponent, "mm-bar-chart-config-dialog", never, { "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; "initialQueryFamily": { "alias": "initialQueryFamily"; "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; }; "initialColorThresholds": { "alias": "initialColorThresholds"; "required": false; }; "initialDefaultBarColor": { "alias": "initialDefaultBarColor"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, {}, never, never, true, never>;
3475
3766
  }
3476
3767
 
3477
3768
  /**
@@ -3492,7 +3783,8 @@ interface ValueAxisConfig {
3492
3783
  position: 'left' | 'right';
3493
3784
  }
3494
3785
  declare class LineChartWidgetComponent implements DashboardWidget<LineChartWidgetConfig, LineSeriesData[]>, OnInit, OnChanges {
3495
- private readonly executeRuntimeQueryGQL;
3786
+ private readonly queryExecutor;
3787
+ private static readonly SUPPORTED_ROW_TYPES;
3496
3788
  private readonly stateService;
3497
3789
  private readonly variableService;
3498
3790
  config: LineChartWidgetConfig;
@@ -3545,6 +3837,7 @@ declare class LineChartWidgetComponent implements DashboardWidget<LineChartWidge
3545
3837
  formatValue(value: number): string;
3546
3838
  getUnitForSeries(seriesName: string): string;
3547
3839
  private loadData;
3840
+ private buildStreamDataArgs;
3548
3841
  /**
3549
3842
  * Processes query rows into line chart data.
3550
3843
  * Groups by seriesGroupField, orders by categoryField (date), supports multi-axis by unitField.
@@ -3570,6 +3863,7 @@ declare class LineChartWidgetComponent implements DashboardWidget<LineChartWidge
3570
3863
  interface LineChartConfigResult extends WidgetConfigResult {
3571
3864
  queryRtId: string;
3572
3865
  queryName?: string;
3866
+ queryFamily?: QueryFamily;
3573
3867
  chartType: LineChartType;
3574
3868
  categoryField: string;
3575
3869
  seriesGroupField: string;
@@ -3587,11 +3881,13 @@ interface LineChartConfigResult extends WidgetConfigResult {
3587
3881
  */
3588
3882
  declare class LineChartConfigDialogComponent implements OnInit {
3589
3883
  private readonly getRuntimeQueryColumnsGQL;
3884
+ private readonly queryExecutor;
3590
3885
  private readonly stateService;
3591
3886
  private readonly windowRef;
3592
3887
  querySelector?: QuerySelectorComponent;
3593
3888
  initialQueryRtId?: string;
3594
3889
  initialQueryName?: string;
3890
+ initialQueryFamily?: QueryFamily;
3595
3891
  initialChartType?: LineChartType;
3596
3892
  initialCategoryField?: string;
3597
3893
  initialSeriesGroupField?: string;
@@ -3629,13 +3925,19 @@ declare class LineChartConfigDialogComponent implements OnInit {
3629
3925
  ngOnInit(): Promise<void>;
3630
3926
  onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
3631
3927
  private loadQueryColumns;
3928
+ /**
3929
+ * Runtime queries use the metadata-only resolver (no aggregation executed);
3930
+ * stream-data queries fall back to executing the query with `first: 1`
3931
+ * because the SD path has no dedicated column-introspection endpoint today.
3932
+ */
3933
+ private fetchColumnsForFamily;
3632
3934
  onFiltersChange(updatedFilters: FieldFilterItem[]): void;
3633
3935
  onSave(): void;
3634
3936
  addReferenceLine(): void;
3635
3937
  removeReferenceLine(index: number): void;
3636
3938
  onCancel(): void;
3637
3939
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LineChartConfigDialogComponent, never>;
3638
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<LineChartConfigDialogComponent, "mm-line-chart-config-dialog", never, { "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; "initialChartType": { "alias": "initialChartType"; "required": false; }; "initialCategoryField": { "alias": "initialCategoryField"; "required": false; }; "initialSeriesGroupField": { "alias": "initialSeriesGroupField"; "required": false; }; "initialValueField": { "alias": "initialValueField"; "required": false; }; "initialUnitField": { "alias": "initialUnitField"; "required": false; }; "initialShowLegend": { "alias": "initialShowLegend"; "required": false; }; "initialLegendPosition": { "alias": "initialLegendPosition"; "required": false; }; "initialShowMarkers": { "alias": "initialShowMarkers"; "required": false; }; "initialReferenceLines": { "alias": "initialReferenceLines"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, {}, never, never, true, never>;
3940
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LineChartConfigDialogComponent, "mm-line-chart-config-dialog", never, { "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; "initialQueryFamily": { "alias": "initialQueryFamily"; "required": false; }; "initialChartType": { "alias": "initialChartType"; "required": false; }; "initialCategoryField": { "alias": "initialCategoryField"; "required": false; }; "initialSeriesGroupField": { "alias": "initialSeriesGroupField"; "required": false; }; "initialValueField": { "alias": "initialValueField"; "required": false; }; "initialUnitField": { "alias": "initialUnitField"; "required": false; }; "initialShowLegend": { "alias": "initialShowLegend"; "required": false; }; "initialLegendPosition": { "alias": "initialLegendPosition"; "required": false; }; "initialShowMarkers": { "alias": "initialShowMarkers"; "required": false; }; "initialReferenceLines": { "alias": "initialReferenceLines"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, {}, never, never, true, never>;
3639
3941
  }
3640
3942
 
3641
3943
  /**
@@ -3652,7 +3954,8 @@ interface HeatmapDataItem {
3652
3954
  color: string;
3653
3955
  }
3654
3956
  declare class HeatmapWidgetComponent implements DashboardWidget<HeatmapWidgetConfig, HeatmapDataItem[]>, OnInit, OnChanges {
3655
- private readonly executeRuntimeQueryGQL;
3957
+ private readonly queryExecutor;
3958
+ private static readonly SUPPORTED_ROW_TYPES;
3656
3959
  private readonly stateService;
3657
3960
  private readonly variableService;
3658
3961
  config: HeatmapWidgetConfig;
@@ -3690,6 +3993,7 @@ declare class HeatmapWidgetComponent implements DashboardWidget<HeatmapWidgetCon
3690
3993
  value: string;
3691
3994
  }) => string;
3692
3995
  private loadData;
3996
+ private buildStreamDataArgs;
3693
3997
  /**
3694
3998
  * Processes query rows into heatmap data.
3695
3999
  * When dateEndField is configured, auto-detects the interval width and shows sub-hour columns.
@@ -3728,6 +4032,7 @@ declare class HeatmapWidgetComponent implements DashboardWidget<HeatmapWidgetCon
3728
4032
  interface HeatmapConfigResult extends WidgetConfigResult {
3729
4033
  queryRtId: string;
3730
4034
  queryName?: string;
4035
+ queryFamily?: QueryFamily;
3731
4036
  dateField: string;
3732
4037
  dateEndField?: string;
3733
4038
  valueField?: string;
@@ -3742,11 +4047,13 @@ interface HeatmapConfigResult extends WidgetConfigResult {
3742
4047
  }
3743
4048
  declare class HeatmapConfigDialogComponent implements OnInit {
3744
4049
  private readonly getRuntimeQueryColumnsGQL;
4050
+ private readonly queryExecutor;
3745
4051
  private readonly stateService;
3746
4052
  private readonly windowRef;
3747
4053
  querySelector?: QuerySelectorComponent;
3748
4054
  initialQueryRtId?: string;
3749
4055
  initialQueryName?: string;
4056
+ initialQueryFamily?: QueryFamily;
3750
4057
  initialDateField?: string;
3751
4058
  initialDateEndField?: string;
3752
4059
  initialValueField?: string;
@@ -3799,11 +4106,17 @@ declare class HeatmapConfigDialogComponent implements OnInit {
3799
4106
  ngOnInit(): Promise<void>;
3800
4107
  onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
3801
4108
  private loadQueryColumns;
4109
+ /**
4110
+ * Runtime queries use the metadata-only resolver (no aggregation executed);
4111
+ * stream-data queries fall back to executing the query with `first: 1`
4112
+ * because the SD path has no dedicated column-introspection endpoint today.
4113
+ */
4114
+ private fetchColumnsForFamily;
3802
4115
  onFiltersChange(updatedFilters: FieldFilterItem[]): void;
3803
4116
  onSave(): void;
3804
4117
  onCancel(): void;
3805
4118
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeatmapConfigDialogComponent, never>;
3806
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeatmapConfigDialogComponent, "mm-heatmap-config-dialog", never, { "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; "initialDateField": { "alias": "initialDateField"; "required": false; }; "initialDateEndField": { "alias": "initialDateEndField"; "required": false; }; "initialValueField": { "alias": "initialValueField"; "required": false; }; "initialAggregation": { "alias": "initialAggregation"; "required": false; }; "initialColorScheme": { "alias": "initialColorScheme"; "required": false; }; "initialShowLegend": { "alias": "initialShowLegend"; "required": false; }; "initialLegendPosition": { "alias": "initialLegendPosition"; "required": false; }; "initialDecimalPlaces": { "alias": "initialDecimalPlaces"; "required": false; }; "initialCompactNumbers": { "alias": "initialCompactNumbers"; "required": false; }; "initialValueMultiplier": { "alias": "initialValueMultiplier"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, {}, never, never, true, never>;
4119
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeatmapConfigDialogComponent, "mm-heatmap-config-dialog", never, { "initialQueryRtId": { "alias": "initialQueryRtId"; "required": false; }; "initialQueryName": { "alias": "initialQueryName"; "required": false; }; "initialQueryFamily": { "alias": "initialQueryFamily"; "required": false; }; "initialDateField": { "alias": "initialDateField"; "required": false; }; "initialDateEndField": { "alias": "initialDateEndField"; "required": false; }; "initialValueField": { "alias": "initialValueField"; "required": false; }; "initialAggregation": { "alias": "initialAggregation"; "required": false; }; "initialColorScheme": { "alias": "initialColorScheme"; "required": false; }; "initialShowLegend": { "alias": "initialShowLegend"; "required": false; }; "initialLegendPosition": { "alias": "initialLegendPosition"; "required": false; }; "initialDecimalPlaces": { "alias": "initialDecimalPlaces"; "required": false; }; "initialCompactNumbers": { "alias": "initialCompactNumbers"; "required": false; }; "initialValueMultiplier": { "alias": "initialValueMultiplier"; "required": false; }; "initialFilters": { "alias": "initialFilters"; "required": false; }; }, {}, never, never, true, never>;
3807
4120
  }
3808
4121
 
3809
4122
  interface StatValue {
@@ -4119,6 +4432,7 @@ interface WidgetGroupConfigResult extends WidgetConfigResult {
4119
4432
  dataSourceMode: WidgetGroupDataSourceMode;
4120
4433
  queryRtId?: string;
4121
4434
  queryName?: string;
4435
+ queryFamily?: QueryFamily;
4122
4436
  filters?: FieldFilterDto[];
4123
4437
  maxItems?: number;
4124
4438
  childTemplate: WidgetGroupChildTemplate;
@@ -4136,6 +4450,7 @@ declare class WidgetGroupConfigDialogComponent implements OnInit {
4136
4450
  private readonly ckTypeSelectorService;
4137
4451
  private readonly attributeSelectorService;
4138
4452
  private readonly getRuntimeQueryColumnsGQL;
4453
+ private readonly queryExecutor;
4139
4454
  private readonly getCkTypeAvailableQueryColumnsGQL;
4140
4455
  private readonly meshBoardStateService;
4141
4456
  private readonly windowRef;
@@ -4143,6 +4458,7 @@ declare class WidgetGroupConfigDialogComponent implements OnInit {
4143
4458
  initialDataSourceMode?: WidgetGroupDataSourceMode;
4144
4459
  initialQueryRtId?: string;
4145
4460
  initialQueryName?: string;
4461
+ initialQueryFamily?: QueryFamily;
4146
4462
  initialCkTypeId?: string;
4147
4463
  initialFilters?: WidgetFilterConfig[];
4148
4464
  initialMaxItems?: number;
@@ -4194,6 +4510,12 @@ declare class WidgetGroupConfigDialogComponent implements OnInit {
4194
4510
  onDataSourceModeChange(mode: WidgetGroupDataSourceMode): void;
4195
4511
  onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
4196
4512
  private loadQueryColumns;
4513
+ /**
4514
+ * Runtime queries use the metadata-only resolver (no aggregation executed);
4515
+ * stream-data queries fall back to executing the query with `first: 1`
4516
+ * because the SD path has no dedicated column-introspection endpoint today.
4517
+ */
4518
+ private fetchColumnsForFamily;
4197
4519
  private loadInitialCkTypeValues;
4198
4520
  onCkTypeSelected(ckType: CkTypeSelectorItem): void;
4199
4521
  onCkTypeCleared(): void;
@@ -4204,7 +4526,7 @@ declare class WidgetGroupConfigDialogComponent implements OnInit {
4204
4526
  private buildStaticConfig;
4205
4527
  onCancel(): void;
4206
4528
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WidgetGroupConfigDialogComponent, never>;
4207
- 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; }; }, {}, never, never, true, never>;
4529
+ 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; }; "initialQueryFamily": { "alias": "initialQueryFamily"; "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; }; }, {}, never, never, true, never>;
4208
4530
  }
4209
4531
 
4210
4532
  declare class MarkdownWidgetComponent implements DashboardWidget<MarkdownWidgetConfig, string>, OnInit, OnChanges {
@@ -4953,6 +5275,9 @@ declare class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedCha
4953
5275
  protected editingWidget: AnyWidgetConfig | null;
4954
5276
  private configDialogSubscription;
4955
5277
  private navigationSubscription;
5278
+ private autoRefreshTimerId;
5279
+ private autoRefreshActiveSeconds;
5280
+ private readonly visibilityListener;
4956
5281
  protected readonly config: _angular_core.Signal<MeshBoardConfig>;
4957
5282
  protected readonly isEditMode: _angular_core.Signal<boolean>;
4958
5283
  protected readonly isSaving: _angular_core.Signal<boolean>;
@@ -5001,6 +5326,16 @@ declare class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedCha
5001
5326
  */
5002
5327
  private loadMeshBoardById;
5003
5328
  ngOnDestroy(): void;
5329
+ /**
5330
+ * Starts, restarts, or stops the auto-refresh timer based on the MeshBoard
5331
+ * config and document visibility. Called on init, whenever config changes,
5332
+ * and whenever the tab visibility changes.
5333
+ *
5334
+ * Pause-on-hidden saves bandwidth and avoids Apollo cache thrashing when
5335
+ * the user has the tab in the background.
5336
+ */
5337
+ private evaluateAutoRefresh;
5338
+ private stopAutoRefresh;
5004
5339
  /**
5005
5340
  * Preloads data for all widgets to improve initial rendering performance.
5006
5341
  */
@@ -5231,7 +5566,8 @@ declare class MeshBoardSettingsResult {
5231
5566
  timeFilter?: MeshBoardTimeFilterConfig | undefined;
5232
5567
  rtWellKnownName?: string | undefined;
5233
5568
  entitySelectors?: EntitySelectorConfig[] | undefined;
5234
- constructor(name: string, description: string, columns: number, rowHeight: number, gap: number, variables: MeshBoardVariable[], timeFilter?: MeshBoardTimeFilterConfig | undefined, rtWellKnownName?: string | undefined, entitySelectors?: EntitySelectorConfig[] | undefined);
5569
+ autoRefreshSeconds?: number | undefined;
5570
+ constructor(name: string, description: string, columns: number, rowHeight: number, gap: number, variables: MeshBoardVariable[], timeFilter?: MeshBoardTimeFilterConfig | undefined, rtWellKnownName?: string | undefined, entitySelectors?: EntitySelectorConfig[] | undefined, autoRefreshSeconds?: number | undefined);
5235
5571
  }
5236
5572
  /**
5237
5573
  * Dialog for editing MeshBoard settings.
@@ -5245,6 +5581,12 @@ declare class MeshBoardSettingsDialogComponent {
5245
5581
  columns: number;
5246
5582
  rowHeight: number;
5247
5583
  gap: number;
5584
+ /**
5585
+ * Auto-refresh interval in seconds. `0` disables auto-refresh and is the default.
5586
+ * When > 0 the MeshBoard view re-polls all widgets at this interval while the
5587
+ * tab is visible.
5588
+ */
5589
+ autoRefreshSeconds: number;
5248
5590
  variables: MeshBoardVariable[];
5249
5591
  entitySelectors: EntitySelectorConfig[];
5250
5592
  entitySelectorEditing: boolean;
@@ -5267,6 +5609,7 @@ declare class MeshBoardSettingsDialogComponent {
5267
5609
  variables?: MeshBoardVariable[];
5268
5610
  timeFilter?: MeshBoardTimeFilterConfig;
5269
5611
  entitySelectors?: EntitySelectorConfig[];
5612
+ autoRefreshSeconds?: number;
5270
5613
  }): void;
5271
5614
  /**
5272
5615
  * Handles default selection change from the time range picker.
@@ -5463,5 +5806,5 @@ declare class MeshBoardManagerDialogComponent implements OnInit {
5463
5806
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MeshBoardManagerDialogComponent, "mm-meshboard-manager-dialog", never, {}, {}, never, never, true, never>;
5464
5807
  }
5465
5808
 
5466
- export { AddWidgetDialogComponent, AiInsightsConfigDialogComponent, AiInsightsService, AiInsightsWidgetComponent, AlertBannerConfigDialogComponent, AlertBannerWidgetComponent, AlertListConfigDialogComponent, AlertListWidgetComponent, AssociationsConfigDialogComponent, BarChartConfigDialogComponent, BarChartWidgetComponent, DashboardDataService, DashboardGridService, EditModeStateService, EditWidgetDialogComponent, EntityAssociationsWidgetComponent, EntityCardConfigDialogComponent, EntityCardWidgetComponent, EntityDetailDialogComponent, EntitySelectorEditorComponent, EntitySelectorToolbarComponent, GaugeConfigDialogComponent, GaugeWidgetComponent, HeatmapConfigDialogComponent, HeatmapWidgetComponent, KpiConfigDialogComponent, KpiWidgetComponent, LineChartConfigDialogComponent, LineChartWidgetComponent, MESHBOARD_OPTIONS, MESHBOARD_TENANT_ID_PROVIDER, MarkdownConfigDialogComponent, MarkdownWidgetComponent, MeshBoardDataService, MeshBoardGridService, MeshBoardManagerDialogComponent, MeshBoardPersistenceService, MeshBoardSettingsDialogComponent, MeshBoardSettingsResult, MeshBoardStateService, MeshBoardViewComponent, PieChartConfigDialogComponent, PieChartWidgetComponent, QuerySelectorComponent, RuntimeEntitySelectorComponent, ServiceHealthConfigDialogComponent, ServiceHealthWidgetComponent, StatsGridConfigDialogComponent, StatsGridWidgetComponent, StatusIndicatorConfigDialogComponent, StatusIndicatorWidgetComponent, StatusListConfigDialogComponent, StatusListWidgetComponent, SummaryCardConfigDialogComponent, SummaryCardWidgetComponent, TableConfigDialogComponent, TableWidgetComponent, TableWidgetDataSourceDirective, WidgetFactoryService, WidgetGroupComponent, WidgetGroupConfigDialogComponent, WidgetNotConfiguredComponent, WidgetRegistryService, provideDefaultWidgets, provideMeshBoard, provideProcessWidget, provideWidgetRegistrations, registerDefaultWidgets, registerProcessWidget };
5467
- export type { AggregationDataSource, AggregationQuery, AggregationType, AiInsightsConfigResult, AiInsightsWidgetConfig, AlertBannerConfigResult, AlertBannerWidgetConfig, AlertListConfigResult, AlertListWidgetConfig, AnyWidgetConfig, AssociationsConfigResult, BarChartColorThreshold, BarChartConfigResult, BarChartSeries, BarChartType, BarChartWidgetConfig, BaseWidgetConfig, CategoryValueItem, ChartReferenceLine, CkQueryResult, CkQueryTarget, CkTypeAttributeInfo, ConfigDialogResult, ConfigResultApplier, ConstructionKitQueryDataSource, DashboardConfig, DashboardWidget, DataSource, DataSourceType, DiagramPropertyMapping, EntityAssociation, EntityAttribute, EntityCardConfigResult, EntityCardWidgetConfig, EntityListWidget, EntitySelectorAttributeMapping, EntitySelectorClearEvent, EntitySelectorConfig, EntitySelectorEvent, EntityWidget, EntityWithAssociationsWidgetConfig, GaugeConfigResult, GaugeRange, GaugeType, GaugeWidgetConfig, GridCell, GridPosition, GroupChildWidgetType, GroupedDataItem, HeatmapAggregation, HeatmapColorScheme, HeatmapConfigResult, HeatmapWidgetConfig, KpiConfigResult, KpiDataSourceType, KpiQueryMode, KpiWidgetConfig, LineChartConfigResult, LineChartType, LineChartWidgetConfig, 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, RuntimeEntitySelectorValue, ServiceCallDataSource, ServiceCallType, ServiceHealthConfigResult, ServiceHealthWidgetConfig, StatColor, StatItem, StaticDataSource, StatsGridConfigResult, StatsGridWidgetConfig, StatusIndicatorConfigResult, StatusIndicatorWidgetConfig, StatusListConfigResult, StatusListWidgetConfig, SummaryCardConfigResult, SummaryCardTile, SummaryCardWidgetConfig, TableColumn, TableColumnStatusIconMapping, TableConfigResult, TableFilterConfig, TableSortConfig, TableWidgetConfig, TargetEntityWithAttributes, TimeRangePickerConfig, TimeRangeSelection, TimeRangeType, UpdateDashboardResult, VariableResolutionError, WidgetConfig, WidgetConfigDialog, WidgetConfigDialogSize, WidgetConfigResult, WidgetCreationOptions, WidgetDataSource, WidgetFilterConfig, WidgetGroupAttributeMappings, WidgetGroupChildTemplate, WidgetGroupConfig, WidgetGroupConfigResult, WidgetGroupLayout, WidgetPersistenceData, WidgetPositionUpdate, WidgetRegistration, WidgetType, WidgetZone };
5809
+ export { AddWidgetDialogComponent, AiInsightsConfigDialogComponent, AiInsightsService, AiInsightsWidgetComponent, AlertBannerConfigDialogComponent, AlertBannerWidgetComponent, AlertListConfigDialogComponent, AlertListWidgetComponent, AssociationsConfigDialogComponent, BarChartConfigDialogComponent, BarChartWidgetComponent, DashboardDataService, DashboardGridService, EditModeStateService, EditWidgetDialogComponent, EntityAssociationsWidgetComponent, EntityCardConfigDialogComponent, EntityCardWidgetComponent, EntityDetailDialogComponent, EntitySelectorEditorComponent, EntitySelectorToolbarComponent, GaugeConfigDialogComponent, GaugeWidgetComponent, HeatmapConfigDialogComponent, HeatmapWidgetComponent, KpiConfigDialogComponent, KpiWidgetComponent, LineChartConfigDialogComponent, LineChartWidgetComponent, MESHBOARD_OPTIONS, MESHBOARD_TENANT_ID_PROVIDER, MarkdownConfigDialogComponent, MarkdownWidgetComponent, MeshBoardDataService, MeshBoardGridService, MeshBoardManagerDialogComponent, MeshBoardPersistenceService, MeshBoardSettingsDialogComponent, MeshBoardSettingsResult, MeshBoardStateService, MeshBoardViewComponent, PieChartConfigDialogComponent, PieChartWidgetComponent, QueryExecutorService, QuerySelectorComponent, RuntimeEntitySelectorComponent, ServiceHealthConfigDialogComponent, ServiceHealthWidgetComponent, StatsGridConfigDialogComponent, StatsGridWidgetComponent, StatusIndicatorConfigDialogComponent, StatusIndicatorWidgetComponent, StatusListConfigDialogComponent, StatusListWidgetComponent, SummaryCardConfigDialogComponent, SummaryCardWidgetComponent, TableConfigDialogComponent, TableWidgetComponent, TableWidgetDataSourceDirective, WidgetFactoryService, WidgetGroupComponent, WidgetGroupConfigDialogComponent, WidgetNotConfiguredComponent, WidgetRegistryService, classifyQuery, provideDefaultWidgets, provideMeshBoard, provideProcessWidget, provideWidgetRegistrations, queryFamily, registerDefaultWidgets, registerProcessWidget };
5810
+ export type { AggregationDataSource, AggregationQuery, AggregationType, AiInsightsConfigResult, AiInsightsWidgetConfig, AlertBannerConfigResult, AlertBannerWidgetConfig, AlertListConfigResult, AlertListWidgetConfig, AnyWidgetConfig, AssociationsConfigResult, BarChartColorThreshold, BarChartConfigResult, BarChartSeries, BarChartType, BarChartWidgetConfig, BaseWidgetConfig, CategoryValueItem, ChartReferenceLine, CkQueryResult, CkQueryTarget, CkTypeAttributeInfo, ConfigDialogResult, ConfigResultApplier, ConstructionKitQueryDataSource, DashboardConfig, DashboardWidget, DataSource, DataSourceType, DiagramPropertyMapping, EntityAssociation, EntityAttribute, EntityCardConfigResult, EntityCardWidgetConfig, EntityListWidget, EntitySelectorAttributeMapping, EntitySelectorClearEvent, EntitySelectorConfig, EntitySelectorEvent, EntityWidget, EntityWithAssociationsWidgetConfig, GaugeConfigResult, GaugeRange, GaugeType, GaugeWidgetConfig, GridCell, GridPosition, GroupChildWidgetType, GroupedDataItem, HeatmapAggregation, HeatmapColorScheme, HeatmapConfigResult, HeatmapWidgetConfig, KpiConfigResult, KpiDataSourceType, KpiQueryMode, KpiWidgetConfig, LineChartConfigResult, LineChartType, LineChartWidgetConfig, MarkdownConfigResult, MarkdownTextAlign, MarkdownWidgetConfig, MeshBoardConfig, MeshBoardOptions, MeshBoardTimeFilterConfig, MeshBoardVariable, MeshBoardVariableSource, MeshBoardVariableType, ParentAssociationMode, PersistedDashboard, PersistedMeshBoard, PersistedWidget, PersistedWidgetData, PersistentQueryDataSource, PersistentQueryItem, PieChartConfigResult, PieChartType, PieChartWidgetConfig, ProcessWidgetConfig, Quarter, QueryCell, QueryClassification, QueryColumn, QueryColumnInfo, QueryColumnItem, QueryExecutionOptions, QueryExecutionResult, QueryFamily, QueryKind, QueryResultRow, RelativeTimeUnit, RepeaterDataItem, RepeaterQueryDataSource, RuntimeEntityData, RuntimeEntityDataSource, RuntimeEntitySelectorValue, ServiceCallDataSource, ServiceCallType, ServiceHealthConfigResult, ServiceHealthWidgetConfig, StatColor, StatItem, StaticDataSource, StatsGridConfigResult, StatsGridWidgetConfig, StatusIndicatorConfigResult, StatusIndicatorWidgetConfig, StatusListConfigResult, StatusListWidgetConfig, StreamDataExecutionArgs, SummaryCardConfigResult, SummaryCardTile, SummaryCardWidgetConfig, TableColumn, TableColumnStatusIconMapping, TableConfigResult, TableFilterConfig, TableSortConfig, TableWidgetConfig, TargetEntityWithAttributes, TimeRangePickerConfig, TimeRangeSelection, TimeRangeType, UpdateDashboardResult, VariableResolutionError, WidgetConfig, WidgetConfigDialog, WidgetConfigDialogSize, WidgetConfigResult, WidgetCreationOptions, WidgetDataSource, WidgetFilterConfig, WidgetGroupAttributeMappings, WidgetGroupChildTemplate, WidgetGroupConfig, WidgetGroupConfigResult, WidgetGroupLayout, WidgetPersistenceData, WidgetPositionUpdate, WidgetRegistration, WidgetType, WidgetZone };