@meshmakers/octo-meshboard 3.4.200 → 3.4.220

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.
@@ -161,6 +161,28 @@ interface ProcessWidgetConfig extends WidgetConfig, ProcessWidgetSpecificConfig
161
161
  * Display name of the persistent query (for UI)
162
162
  */
163
163
  bindingQueryName?: string;
164
+ /**
165
+ * Query family of the bound persistent query: `'runtime'` or `'streamData'`.
166
+ * Derived from the query's `queryCkTypeId` when absent (one-time lookup by the
167
+ * executor). Persisted so a stream-data binding picks the correct executor
168
+ * without an extra round-trip — switching runtime ↔ stream-data is a config
169
+ * change, not a different widget.
170
+ */
171
+ bindingQueryFamily?: QueryFamily;
172
+ /**
173
+ * Stream-data opt-out: when `true`, the MeshBoard time filter is NOT bound to
174
+ * the bound query's `streamDataArgs.from/.to`, so the query's intrinsic time
175
+ * bounds win. Default (absent/`false`) auto-binds the active time filter.
176
+ * Ignored for runtime queries (they don't consume `streamDataArgs`).
177
+ */
178
+ bindingIgnoreTimeFilter?: boolean;
179
+ /**
180
+ * Asset-scope binding: the `id` of an entity selector whose selection scopes
181
+ * the bound stream-data query. The selector's resolved source rtIds are passed
182
+ * as `streamDataArgs.rtIds`, replacing the persisted scope at execution time.
183
+ * Ignored for runtime queries.
184
+ */
185
+ bindingEntitySelectorId?: string;
164
186
  /**
165
187
  * Field filters applied to the data binding query
166
188
  * Works with both runtimeEntity and persistentQuery modes
@@ -202,10 +224,27 @@ interface WidgetDataSource {
202
224
  */
203
225
  interface RuntimeEntityDataSource extends WidgetDataSource {
204
226
  type: 'runtimeEntity';
227
+ /**
228
+ * CK type of the entity. May contain a MeshBoard variable (e.g.
229
+ * `$mp_rtCkTypeId`) which is resolved against the active variables before the
230
+ * entity is fetched.
231
+ */
205
232
  ckTypeId?: string;
233
+ /**
234
+ * Runtime id of the entity. May contain a MeshBoard variable (e.g. `$mp_rtId`)
235
+ * which is resolved against the active variables before the entity is fetched.
236
+ */
206
237
  rtId?: string;
207
238
  attributePaths?: string[];
208
239
  includeAssociations?: boolean;
240
+ /**
241
+ * Entity-selector binding: the `id` of a MeshBoard entity selector whose
242
+ * current selection supplies this widget's entity. When set, the selector's
243
+ * `selectedRtId` and the picked entity's CK type (`$<id>_rtCkTypeId`) override
244
+ * `rtId`/`ckTypeId`, so the widget follows the asset picked at board level.
245
+ * Absent ⇒ the literal (optionally variable-bearing) `rtId`/`ckTypeId` win.
246
+ */
247
+ entitySelectorId?: string;
209
248
  }
210
249
  /**
211
250
  * Static data source for demo/testing or variable-based display
@@ -238,6 +277,16 @@ interface PersistentQueryDataSource extends WidgetDataSource {
238
277
  * Ignored for runtime queries (they don't consume `streamDataArgs`).
239
278
  */
240
279
  ignoreTimeFilter?: boolean;
280
+ /**
281
+ * Asset-scope binding: the `id` of an entity selector whose selection scopes
282
+ * this widget's stream-data query. The selector resolves its picked entity to
283
+ * a set of source rtIds (via its `childScope` one-hop, or the picked entity
284
+ * itself when no childScope is configured); those rtIds are passed as the
285
+ * query's `streamDataArgs.rtIds`, replacing the persisted RtIds at execution
286
+ * time. Absent ⇒ the query runs with its persisted scope. Ignored for runtime
287
+ * queries (the archive `rtIds` override is a stream-data concept).
288
+ */
289
+ entitySelectorId?: string;
241
290
  }
242
291
  /**
243
292
  * Aggregation types supported
@@ -709,6 +758,48 @@ interface HeatmapWidgetConfig extends WidgetConfig {
709
758
  /** Field filters for data source */
710
759
  filters?: WidgetFilterConfig[];
711
760
  }
761
+ /**
762
+ * Query mode for a persistent-query cell source — how the single displayed value
763
+ * is derived from the query result. Mirrors the KPI/gauge widget query modes.
764
+ */
765
+ type PersistentQueryCellMode = 'simpleCount' | 'aggregation' | 'groupedAggregation';
766
+ /**
767
+ * A single-value data source backed by a persistent query (runtime OR stream-data).
768
+ *
769
+ * Used per-cell by aggregation-style widgets (stats-grid stat, summary-card tile)
770
+ * as an alternative to their built-in runtime aggregation source. Switching a cell
771
+ * between runtime and stream-data is a configuration change (the `queryFamily`
772
+ * discriminator picks the executor), not a different widget — mirroring how the
773
+ * KPI/gauge widgets consume {@link PersistentQueryDataSource}.
774
+ */
775
+ interface PersistentQueryCellSource {
776
+ /** The rtId of the persistent query to execute. */
777
+ queryRtId: string;
778
+ /** Display name of the query (for UI). */
779
+ queryName?: string;
780
+ /** Query family: 'runtime' or 'streamData'. Derived from the query's CK type when absent. */
781
+ queryFamily?: QueryFamily;
782
+ /**
783
+ * Stream-data opt-out: when `true`, the MeshBoard time filter is NOT bound to
784
+ * the query's `streamDataArgs.from/.to`. Ignored for runtime queries.
785
+ */
786
+ ignoreTimeFilter?: boolean;
787
+ /**
788
+ * Asset-scope binding: the `id` of an entity selector whose selection scopes the
789
+ * stream-data query via `streamDataArgs.rtIds`. Ignored for runtime queries.
790
+ */
791
+ entitySelectorId?: string;
792
+ /** How to reduce the query result to one value. */
793
+ queryMode: PersistentQueryCellMode;
794
+ /** Value column for `aggregation` / `groupedAggregation` modes. */
795
+ queryValueField?: string;
796
+ /** Category column for `groupedAggregation` mode. */
797
+ queryCategoryField?: string;
798
+ /** Category value to match for `groupedAggregation` mode. */
799
+ queryCategoryValue?: string;
800
+ /** Field filters applied to the query rows. */
801
+ filters?: WidgetFilterConfig[];
802
+ }
712
803
  /**
713
804
  * Color options for stat items
714
805
  */
@@ -719,8 +810,16 @@ type StatColor = 'mint' | 'cyan' | 'violet' | 'toffee' | 'lilac' | 'bubblegum' |
719
810
  interface StatItem {
720
811
  /** Display label */
721
812
  label: string;
722
- /** Reference to aggregation query ID */
813
+ /**
814
+ * Reference to the aggregation query ID in the widget's `AggregationDataSource`.
815
+ * Used when `persistentQuerySource` is absent (the default runtime aggregation).
816
+ */
723
817
  queryId: string;
818
+ /**
819
+ * Optional per-stat persistent-query source (runtime or stream-data). When set,
820
+ * it supersedes `queryId` / the aggregation source for this stat.
821
+ */
822
+ persistentQuerySource?: PersistentQueryCellSource;
724
823
  /** Color variant */
725
824
  color?: StatColor;
726
825
  /** Number format */
@@ -901,6 +1000,11 @@ interface SummaryCardTile {
901
1000
  attribute?: string;
902
1001
  filters?: WidgetFilterConfig[];
903
1002
  };
1003
+ /**
1004
+ * Fetch a single value from a persistent query (runtime or stream-data). When
1005
+ * set, it supersedes `entitySource` / `aggregationSource` for this tile.
1006
+ */
1007
+ persistentQuerySource?: PersistentQueryCellSource;
904
1008
  }
905
1009
  interface AlertBannerWidgetConfig extends WidgetConfig {
906
1010
  type: 'alertBanner';
@@ -986,6 +1090,22 @@ type TimeRangeType = 'year' | 'quarter' | 'month' | 'day' | 'relative' | 'custom
986
1090
  * Time units for relative time ranges
987
1091
  */
988
1092
  type RelativeTimeUnit = 'hours' | 'days' | 'weeks' | 'months';
1093
+ /**
1094
+ * Timezone basis the MeshBoard uses for BOTH the time-filter boundary
1095
+ * computation and the display of every datetime value across all widgets.
1096
+ *
1097
+ * - `'local'` (default): the browser's local timezone. "Year 2026" spans the
1098
+ * local calendar year and datetime cells render in local wall-clock time.
1099
+ * - `'utc'`: UTC. "Year 2026" spans the UTC calendar year and datetime cells
1100
+ * render in UTC.
1101
+ *
1102
+ * Keeping filter and display on the same basis avoids the boundary artifact
1103
+ * where a local-year filter selects rows whose UTC timestamps fall in the
1104
+ * neighbouring calendar year. Mirrors shared-ui's `TimeRangeZone`.
1105
+ */
1106
+ type MeshBoardTimeZoneMode = 'local' | 'utc';
1107
+ /** The board-level default timezone mode applied when none is persisted. */
1108
+ declare const DEFAULT_TIME_ZONE_MODE: MeshBoardTimeZoneMode;
989
1109
  /**
990
1110
  * Quarter number (1-4)
991
1111
  */
@@ -1050,6 +1170,30 @@ interface EntitySelectorAttributeMapping {
1050
1170
  /** Attribute value type for variable type mapping */
1051
1171
  attributeValueType?: string;
1052
1172
  }
1173
+ /**
1174
+ * One-hop association traversal that turns a selected entity into the set of
1175
+ * source rtIds a stream-data widget should be scoped to.
1176
+ *
1177
+ * Use case: the user picks a `MeteringPoint`, but the stream-data archive is
1178
+ * keyed by its child `EnergyMeasurement` rtIds. The childScope describes that
1179
+ * single hop (target type + association role + direction); the selected
1180
+ * entity's children of `targetCkTypeId` reached via `roleId` become the scope
1181
+ * rtIds. When a selector has no childScope, the picked entity's own rtId is the
1182
+ * scope (direct keying).
1183
+ */
1184
+ interface EntitySelectorChildScope {
1185
+ /** CK type of the child entities that key the stream-data archive (e.g. EnergyMeasurement). */
1186
+ targetCkTypeId: string;
1187
+ /** Association role linking the selected entity to the children (e.g. "System/ParentChild"). */
1188
+ roleId: string;
1189
+ /**
1190
+ * Traversal direction from the selected (parent) entity to its children.
1191
+ * For `System/ParentChild` the child owns the association to its parent, so
1192
+ * the children are reached **inbound** — hence `'in'` is the default. Use
1193
+ * `'out'` only for custom roles modelled parent → child.
1194
+ */
1195
+ direction?: 'in' | 'out';
1196
+ }
1053
1197
  /**
1054
1198
  * Configuration for a single entity selector in the MeshBoard toolbar.
1055
1199
  * Each selector is bound to a CK type and populates variables from the selected entity.
@@ -1067,6 +1211,12 @@ interface EntitySelectorConfig {
1067
1211
  showInToolbar?: boolean;
1068
1212
  /** Optional pre-selected entity rtId */
1069
1213
  defaultRtId?: string;
1214
+ /**
1215
+ * Optional one-hop traversal that resolves the picked entity to the child
1216
+ * source rtIds a stream-data widget scopes by. Absent ⇒ the picked entity's
1217
+ * own rtId is the scope. See {@link EntitySelectorChildScope}.
1218
+ */
1219
+ childScope?: EntitySelectorChildScope;
1070
1220
  /** Current selection (transient, not persisted) */
1071
1221
  selectedRtId?: string;
1072
1222
  /** Display name of the currently selected entity */
@@ -1088,6 +1238,11 @@ interface MeshBoardConfig {
1088
1238
  variables?: MeshBoardVariable[];
1089
1239
  /** Optional time filter configuration */
1090
1240
  timeFilter?: MeshBoardTimeFilterConfig;
1241
+ /**
1242
+ * Timezone basis for time-filter boundaries and datetime display across all
1243
+ * widgets. `undefined` ⇒ {@link DEFAULT_TIME_ZONE_MODE} (`'local'`).
1244
+ */
1245
+ timeZoneMode?: MeshBoardTimeZoneMode;
1091
1246
  /** Entity selector configurations for the toolbar */
1092
1247
  entitySelectors?: EntitySelectorConfig[];
1093
1248
  /**
@@ -1583,6 +1738,13 @@ declare class MeshBoardStateService {
1583
1738
  private readonly _isLoading;
1584
1739
  private readonly _isModelAvailable;
1585
1740
  private readonly _variableResolutionErrors;
1741
+ /**
1742
+ * Transient cache of the source rtIds resolved from each entity selector's
1743
+ * current selection (keyed by selector id). Populated by the view component
1744
+ * when a selection resolves (one-hop childScope traversal, or the picked
1745
+ * entity's own rtId). Not persisted — derived fresh from each selection.
1746
+ */
1747
+ private readonly _entitySelectorRtIds;
1586
1748
  readonly meshBoardConfig: _angular_core.Signal<MeshBoardConfig>;
1587
1749
  readonly persistedMeshBoardId: _angular_core.Signal<string | null>;
1588
1750
  /** @deprecated Use existingWidgetRtIds instead */
@@ -1593,6 +1755,12 @@ declare class MeshBoardStateService {
1593
1755
  readonly widgets: _angular_core.Signal<AnyWidgetConfig[]>;
1594
1756
  readonly isModelAvailable: _angular_core.Signal<boolean | null>;
1595
1757
  readonly variableResolutionErrors: _angular_core.Signal<VariableResolutionError[]>;
1758
+ /**
1759
+ * The board's effective timezone mode (defaults to `'local'`). Drives both the
1760
+ * time-filter boundary computation and datetime display across all widgets.
1761
+ * Widgets read this to format timestamps consistently with the active filter.
1762
+ */
1763
+ readonly timeZoneMode: _angular_core.Signal<MeshBoardTimeZoneMode>;
1596
1764
  /** @deprecated Use meshBoardConfig instead */
1597
1765
  readonly dashboardConfig: _angular_core.Signal<MeshBoardConfig>;
1598
1766
  /** @deprecated Use persistedMeshBoardId instead */
@@ -1669,6 +1837,7 @@ declare class MeshBoardStateService {
1669
1837
  gap: number;
1670
1838
  variables?: MeshBoardVariable[];
1671
1839
  timeFilter?: MeshBoardTimeFilterConfig;
1840
+ timeZoneMode?: MeshBoardTimeZoneMode;
1672
1841
  entitySelectors?: EntitySelectorConfig[];
1673
1842
  autoRefreshSeconds?: number;
1674
1843
  }): void;
@@ -1684,6 +1853,7 @@ declare class MeshBoardStateService {
1684
1853
  gap: number;
1685
1854
  variables: MeshBoardVariable[];
1686
1855
  timeFilter?: MeshBoardTimeFilterConfig;
1856
+ timeZoneMode?: MeshBoardTimeZoneMode;
1687
1857
  entitySelectors?: EntitySelectorConfig[];
1688
1858
  autoRefreshSeconds?: number;
1689
1859
  };
@@ -1762,8 +1932,9 @@ declare class MeshBoardStateService {
1762
1932
  * Stream-data persistent queries consume this to bound their result set;
1763
1933
  * runtime queries ignore it.
1764
1934
  *
1765
- * IANA-timezone-aware bucket boundaries are tracked separately (AB#4190);
1766
- * this helper currently returns UTC boundaries derived from the picker.
1935
+ * Boundaries are resolved on the board's {@link timeZoneMode} basis (local by
1936
+ * default, or UTC), the same basis widgets format their datetime display on —
1937
+ * so the selected range and the displayed timestamps stay consistent.
1767
1938
  */
1768
1939
  resolveCurrentTimeRange(): TimeRange | null;
1769
1940
  /**
@@ -1779,6 +1950,25 @@ declare class MeshBoardStateService {
1779
1950
  from: Date;
1780
1951
  to: Date;
1781
1952
  } | undefined;
1953
+ /**
1954
+ * Stores the source rtIds resolved from an entity selector's current
1955
+ * selection. Called by the view component after a selection resolves (the
1956
+ * one-hop childScope traversal, or the picked entity's own rtId when the
1957
+ * selector has no childScope). Transient — not persisted.
1958
+ */
1959
+ setEntitySelectorRtIds(selectorId: string, rtIds: string[]): void;
1960
+ /**
1961
+ * Clears the cached source rtIds for an entity selector (e.g. when its
1962
+ * selection is cleared).
1963
+ */
1964
+ clearEntitySelectorRtIds(selectorId: string): void;
1965
+ /**
1966
+ * Resolves the stream-data `rtIds` scope for a persistent-query widget bound
1967
+ * to an entity selector. Returns the source rtIds cached from the selector's
1968
+ * current selection, or `undefined` when the selector id is absent, unknown,
1969
+ * or has no active selection (so the query keeps its persisted scope).
1970
+ */
1971
+ resolveStreamDataRtIds(entitySelectorId?: string): string[] | undefined;
1782
1972
  /**
1783
1973
  * Updates the time filter configuration.
1784
1974
  */
@@ -2381,19 +2571,17 @@ declare const DashboardGridService: typeof MeshBoardGridService;
2381
2571
  * without importing generated DTO types directly.
2382
2572
  *
2383
2573
  * Backend semantics (verified against StreamDataQueryDtoType.cs and
2384
- * StreamDataVariantExecutor.cs as of 2026-06-24):
2574
+ * StreamDataVariantExecutor.cs; `queryMode` override added in AB#4233):
2385
2575
  * - `from` / `to` / `limit` override the persisted query's intrinsic values
2386
2576
  * when set (`execOverride?.From ?? simple.From` pattern in the resolver).
2387
2577
  * - `interval` is currently ignored by every variant; the downsampling path
2388
2578
  * derives `(to - from) / limit` itself.
2389
- * - `queryMode` is **ignored on both persistent and transient dispatch** —
2390
- * the variant (Simple / Aggregation / GroupingAggregation / Downsampling)
2391
- * comes from the persisted entity's CK subtype or the transient query's
2392
- * GraphQL sub-connection URL. We still emit it because the schema declares
2393
- * `queryMode: QueryMode!` (NonNull); see backend cleanup issue.
2394
- *
2395
- * Don't pretend to override the mode from here — even if `queryMode: DOWNSAMPLING`
2396
- * is set on a `SimpleSdQuery`, the backend still runs the simple variant.
2579
+ * - `queryMode: DOWNSAMPLING` on a `SimpleSdQuery` (persisted) or the transient
2580
+ * `simple` sub-connection now drives the downsampling execution path: with a
2581
+ * full from/to/limit contract the backend reduces to `limit` buckets per series
2582
+ * (per-type reducers + group-by source rtId). Without all three it falls back
2583
+ * to raw rows. For the other variants the execution shape still comes from the
2584
+ * CK subtype / sub-connection; `queryMode` is a no-op there.
2397
2585
  */
2398
2586
  interface StreamDataExecutionArgs {
2399
2587
  from?: Date | null;
@@ -2401,10 +2589,18 @@ interface StreamDataExecutionArgs {
2401
2589
  interval?: number | null;
2402
2590
  limit?: number | null;
2403
2591
  /**
2404
- * Currently a no-op on the dispatch side; kept because the GraphQL input
2405
- * schema marks `queryMode` non-null. Defaults to `Default`.
2592
+ * `DOWNSAMPLING` switches a SimpleSdQuery / transient `simple` query to the
2593
+ * downsampling path (with from/to/limit); a no-op for the other variants.
2594
+ * Defaults to `Default` (raw rows).
2406
2595
  */
2407
2596
  queryMode?: QueryModeDto;
2597
+ /**
2598
+ * Source runtime ids to scope the query to. When set, replaces the persisted
2599
+ * RtIds on the query at execution time — used to scope a stream-data widget to
2600
+ * the entities resolved from a selected asset (e.g. the EnergyMeasurement rtIds
2601
+ * under a picked MeteringPoint). An empty array is treated as "no scope".
2602
+ */
2603
+ rtIds?: string[] | null;
2408
2604
  }
2409
2605
  interface QueryExecutionOptions {
2410
2606
  /** Page size — passed to the GraphQL `first` variable. */
@@ -2537,6 +2733,8 @@ declare class AutoRefreshTimerService implements OnDestroy {
2537
2733
 
2538
2734
  declare class EntityCardWidgetComponent implements DashboardWidget<EntityCardWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {
2539
2735
  private readonly dataService;
2736
+ private readonly stateService;
2737
+ private readonly variableService;
2540
2738
  config: EntityCardWidgetConfig;
2541
2739
  private readonly _isLoading;
2542
2740
  private readonly _data;
@@ -2562,18 +2760,47 @@ declare class EntityCardWidgetComponent implements DashboardWidget<EntityCardWid
2562
2760
  ngOnChanges(changes: SimpleChanges): void;
2563
2761
  refresh(): void;
2564
2762
  private loadData;
2763
+ /**
2764
+ * Message for the neutral empty state — shown when the widget IS configured
2765
+ * but no entity is currently resolved (e.g. a bound selector hasn't been
2766
+ * picked yet, or a variable is still unresolved). This is deliberately not the
2767
+ * red "not configured" placeholder, which would wrongly imply the widget needs
2768
+ * setup.
2769
+ */
2770
+ emptyMessage(): string;
2771
+ /**
2772
+ * Resolves the effective `{ rtId, ckTypeId }` to fetch from a runtime-entity
2773
+ * data source.
2774
+ *
2775
+ * - When `entitySelectorId` is set, the bound MeshBoard entity selector's
2776
+ * current `selectedRtId` and the picked entity's type
2777
+ * (`$<selectorId>_rtCkTypeId`, falling back to the selector's configured
2778
+ * `ckTypeId`) win — so the card follows the asset picked at board level.
2779
+ * - Otherwise the configured `rtId`/`ckTypeId` are resolved against the active
2780
+ * MeshBoard variables, allowing values like `$mp_rtId` / `$mp_rtCkTypeId`.
2781
+ */
2782
+ private resolveEntityRef;
2565
2783
  inferAttributeType(value: unknown): AttributeValueTypeDto;
2566
2784
  formatAttributeName(name: string): string;
2567
2785
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityCardWidgetComponent, never>;
2568
2786
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityCardWidgetComponent, "mm-entity-card-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
2569
2787
  }
2570
2788
 
2789
+ /** How the entity card resolves which entity to display. */
2790
+ type EntityCardBindingMode = 'fixed' | 'selector' | 'variable';
2571
2791
  /**
2572
- * Configuration result from the dialog
2792
+ * Configuration result from the dialog.
2793
+ *
2794
+ * - `fixed` mode → `ckTypeId`/`rtId` hold a concrete type + entity.
2795
+ * - `selector` mode → `entitySelectorId` names a board-level entity selector;
2796
+ * `ckTypeId`/`rtId` are empty (resolved live from the selection).
2797
+ * - `variable` mode → `ckTypeId`/`rtId` hold MeshBoard variables (e.g.
2798
+ * `$mp_rtCkTypeId` / `$mp_rtId`) resolved at render time.
2573
2799
  */
2574
2800
  interface EntityCardConfigResult {
2575
2801
  ckTypeId: string;
2576
2802
  rtId: string;
2803
+ entitySelectorId?: string;
2577
2804
  hideEmptyAttributes: boolean;
2578
2805
  }
2579
2806
  /**
@@ -2583,20 +2810,28 @@ interface EntityCardConfigResult {
2583
2810
  declare class EntityCardConfigDialogComponent implements OnInit {
2584
2811
  private readonly getEntitiesByCkTypeGQL;
2585
2812
  private readonly ckTypeSelectorService;
2813
+ private readonly stateService;
2586
2814
  private readonly windowRef;
2587
2815
  ckTypeSelectorInput?: CkTypeSelectorInputComponent;
2588
2816
  entitySelectorInput?: EntitySelectInputComponent;
2589
2817
  initialCkTypeId?: string;
2590
2818
  initialRtId?: string;
2819
+ initialEntitySelectorId?: string;
2591
2820
  initialHideEmptyAttributes: boolean;
2821
+ bindingMode: EntityCardBindingMode;
2592
2822
  selectedCkType: CkTypeSelectorItem | null;
2593
2823
  selectedEntity: RuntimeEntityItem$1 | null;
2594
2824
  entityDataSource?: RuntimeEntitySelectDataSource$1;
2595
2825
  entityDialogDataSource?: RuntimeEntityDialogDataSource$1;
2596
2826
  isLoadingInitial: boolean;
2597
2827
  hideEmptyAttributes: boolean;
2828
+ entitySelectorId: string;
2829
+ variableCkTypeId: string;
2830
+ variableRtId: string;
2831
+ get availableSelectors(): EntitySelectorConfig[];
2598
2832
  get isValid(): boolean;
2599
2833
  ngOnInit(): Promise<void>;
2834
+ private containsVariable;
2600
2835
  private loadInitialValues;
2601
2836
  private loadInitialEntity;
2602
2837
  onCkTypeSelected(ckType: CkTypeSelectorItem): void;
@@ -2606,7 +2841,7 @@ declare class EntityCardConfigDialogComponent implements OnInit {
2606
2841
  onSave(): void;
2607
2842
  onCancel(): void;
2608
2843
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityCardConfigDialogComponent, never>;
2609
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityCardConfigDialogComponent, "mm-entity-card-config-dialog", never, { "initialCkTypeId": { "alias": "initialCkTypeId"; "required": false; }; "initialRtId": { "alias": "initialRtId"; "required": false; }; "initialHideEmptyAttributes": { "alias": "initialHideEmptyAttributes"; "required": false; }; }, {}, never, never, true, never>;
2844
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityCardConfigDialogComponent, "mm-entity-card-config-dialog", never, { "initialCkTypeId": { "alias": "initialCkTypeId"; "required": false; }; "initialRtId": { "alias": "initialRtId"; "required": false; }; "initialEntitySelectorId": { "alias": "initialEntitySelectorId"; "required": false; }; "initialHideEmptyAttributes": { "alias": "initialHideEmptyAttributes"; "required": false; }; }, {}, never, never, true, never>;
2610
2845
  }
2611
2846
 
2612
2847
  declare class KpiWidgetComponent implements DashboardWidget<KpiWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {
@@ -2691,6 +2926,8 @@ interface KpiConfigResult extends WidgetConfigResult {
2691
2926
  queryName?: string;
2692
2927
  queryFamily?: QueryFamily;
2693
2928
  ignoreTimeFilter?: boolean;
2929
+ /** Asset-scope binding: id of the entity selector whose selection scopes the stream-data query. */
2930
+ entitySelectorId?: string;
2694
2931
  queryMode?: KpiQueryMode;
2695
2932
  queryValueField?: string;
2696
2933
  queryCategoryField?: string;
@@ -2739,6 +2976,7 @@ declare class KpiConfigDialogComponent implements OnInit {
2739
2976
  initialQueryName?: string;
2740
2977
  initialQueryFamily?: QueryFamily;
2741
2978
  initialIgnoreTimeFilter?: boolean;
2979
+ initialEntitySelectorId?: string;
2742
2980
  initialQueryMode?: KpiQueryMode;
2743
2981
  initialQueryValueField?: string;
2744
2982
  initialQueryCategoryField?: string;
@@ -2755,11 +2993,14 @@ declare class KpiConfigDialogComponent implements OnInit {
2755
2993
  selectedPersistentQuery: PersistentQueryItem | null;
2756
2994
  /** Stream-data opt-out: when true the MeshBoard time filter is not bound to the query. */
2757
2995
  ignoreTimeFilter: boolean;
2996
+ entitySelectorId?: string;
2758
2997
  queryColumns: QueryColumnItem[];
2759
2998
  categoryValues: CategoryValueItem[];
2760
2999
  queryMode: KpiQueryMode;
2761
3000
  /** Family of the currently selected query; drives the time-filter toggle's visibility. */
2762
3001
  get selectedQueryFamily(): QueryFamily | null;
3002
+ /** Entity selectors available on the current MeshBoard (for the scope picker). */
3003
+ get availableEntitySelectors(): EntitySelectorConfig[];
2763
3004
  isLoadingQueryColumns: boolean;
2764
3005
  isLoadingCategoryValues: boolean;
2765
3006
  readonly isLoadingAttributes: _angular_core.WritableSignal<boolean>;
@@ -2815,7 +3056,7 @@ declare class KpiConfigDialogComponent implements OnInit {
2815
3056
  private loadCategoryValuesForField;
2816
3057
  onFiltersChange(updatedFilters: FieldFilterItem[]): void;
2817
3058
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KpiConfigDialogComponent, never>;
2818
- 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "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>;
3059
+ 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "required": false; }; "initialEntitySelectorId": { "alias": "initialEntitySelectorId"; "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>;
2819
3060
  }
2820
3061
 
2821
3062
  interface GroupedAssociation {
@@ -2835,6 +3076,7 @@ interface TargetEntity {
2835
3076
  }
2836
3077
  declare class EntityAssociationsWidgetComponent implements DashboardWidget<EntityWithAssociationsWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {
2837
3078
  private readonly dataService;
3079
+ private readonly stateService;
2838
3080
  config: EntityWithAssociationsWidgetConfig;
2839
3081
  protected readonly arrowRightIcon: _progress_kendo_svg_icons.SVGIcon;
2840
3082
  protected readonly arrowLeftIcon: _progress_kendo_svg_icons.SVGIcon;
@@ -3164,6 +3406,7 @@ declare class TableWidgetDataSourceDirective extends OctoGraphQlDataSource<Recor
3164
3406
  declare class TableWidgetComponent implements DashboardWidget<TableWidgetConfig, Record<string, unknown>[]>, OnChanges {
3165
3407
  config: TableWidgetConfig;
3166
3408
  dataSource?: TableWidgetDataSourceDirective;
3409
+ private readonly stateService;
3167
3410
  private readonly _isLoading;
3168
3411
  private readonly _data;
3169
3412
  private readonly _error;
@@ -3219,6 +3462,8 @@ interface TableConfigResult {
3219
3462
  queryFamily?: QueryFamily;
3220
3463
  /** Stream-data opt-out: keep the query's own time bounds, ignore the MeshBoard time filter. */
3221
3464
  ignoreTimeFilter?: boolean;
3465
+ /** Asset-scope binding: id of the entity selector whose selection scopes the stream-data query. */
3466
+ entitySelectorId?: string;
3222
3467
  pageSize: number;
3223
3468
  sortable: boolean;
3224
3469
  }
@@ -3255,6 +3500,7 @@ declare class TableConfigDialogComponent implements OnInit {
3255
3500
  initialQueryName?: string;
3256
3501
  initialQueryFamily?: QueryFamily;
3257
3502
  initialIgnoreTimeFilter?: boolean;
3503
+ initialEntitySelectorId?: string;
3258
3504
  protected readonly columnsIcon: _progress_kendo_svg_icons.SVGIcon;
3259
3505
  protected readonly sortIcon: _progress_kendo_svg_icons.SVGIcon;
3260
3506
  protected readonly filterIcon: _progress_kendo_svg_icons.SVGIcon;
@@ -3268,7 +3514,10 @@ declare class TableConfigDialogComponent implements OnInit {
3268
3514
  availableAttributes: AttributeItem[];
3269
3515
  selectedPersistentQuery: PersistentQueryItem | null;
3270
3516
  ignoreTimeFilter: boolean;
3517
+ entitySelectorId?: string;
3271
3518
  filterVariables: FilterVariable[];
3519
+ /** Entity selectors available on the current MeshBoard (for the scope picker). */
3520
+ get availableEntitySelectors(): EntitySelectorConfig[];
3272
3521
  form: {
3273
3522
  pageSize: number;
3274
3523
  sortable: boolean;
@@ -3291,7 +3540,7 @@ declare class TableConfigDialogComponent implements OnInit {
3291
3540
  private formatColumnTitle;
3292
3541
  onCancel(): void;
3293
3542
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableConfigDialogComponent, never>;
3294
- 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "required": false; }; }, {}, never, never, true, never>;
3543
+ 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "required": false; }; "initialEntitySelectorId": { "alias": "initialEntitySelectorId"; "required": false; }; }, {}, never, never, true, never>;
3295
3544
  }
3296
3545
 
3297
3546
  declare class GaugeWidgetComponent implements DashboardWidget<GaugeWidgetConfig, RuntimeEntityData>, OnInit, OnChanges {
@@ -3354,6 +3603,8 @@ interface GaugeConfigResult extends WidgetConfigResult {
3354
3603
  queryName?: string;
3355
3604
  queryFamily?: QueryFamily;
3356
3605
  ignoreTimeFilter?: boolean;
3606
+ /** Asset-scope binding: id of the entity selector whose selection scopes the stream-data query. */
3607
+ entitySelectorId?: string;
3357
3608
  queryMode?: KpiQueryMode;
3358
3609
  queryValueField?: string;
3359
3610
  queryCategoryField?: string;
@@ -3410,6 +3661,7 @@ declare class GaugeConfigDialogComponent implements OnInit {
3410
3661
  initialQueryName?: string;
3411
3662
  initialQueryFamily?: QueryFamily;
3412
3663
  initialIgnoreTimeFilter?: boolean;
3664
+ initialEntitySelectorId?: string;
3413
3665
  initialQueryMode?: KpiQueryMode;
3414
3666
  initialQueryValueField?: string;
3415
3667
  initialQueryCategoryField?: string;
@@ -3424,11 +3676,14 @@ declare class GaugeConfigDialogComponent implements OnInit {
3424
3676
  selectedPersistentQuery: PersistentQueryItem | null;
3425
3677
  /** Stream-data opt-out: when true the MeshBoard time filter is not bound to the query. */
3426
3678
  ignoreTimeFilter: boolean;
3679
+ entitySelectorId?: string;
3427
3680
  queryColumns: QueryColumnItem[];
3428
3681
  categoryValues: CategoryValueItem[];
3429
3682
  queryMode: KpiQueryMode;
3430
3683
  /** Family of the currently selected query; drives the time-filter toggle's visibility. */
3431
3684
  get selectedQueryFamily(): QueryFamily | null;
3685
+ /** Entity selectors available on the current MeshBoard (for the scope picker). */
3686
+ get availableEntitySelectors(): EntitySelectorConfig[];
3432
3687
  isLoadingQueryColumns: boolean;
3433
3688
  isLoadingCategoryValues: boolean;
3434
3689
  readonly isLoadingAttributes: _angular_core.WritableSignal<boolean>;
@@ -3487,7 +3742,7 @@ declare class GaugeConfigDialogComponent implements OnInit {
3487
3742
  private loadCategoryValuesForField;
3488
3743
  onFiltersChange(updatedFilters: FieldFilterItem[]): void;
3489
3744
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<GaugeConfigDialogComponent, never>;
3490
- 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "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>;
3745
+ 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "required": false; }; "initialEntitySelectorId": { "alias": "initialEntitySelectorId"; "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>;
3491
3746
  }
3492
3747
 
3493
3748
  /**
@@ -3566,6 +3821,8 @@ interface PieChartConfigResult extends WidgetConfigResult {
3566
3821
  queryName?: string;
3567
3822
  queryFamily?: QueryFamily;
3568
3823
  ignoreTimeFilter?: boolean;
3824
+ /** Asset-scope binding: id of the entity selector whose selection scopes the stream-data query. */
3825
+ entitySelectorId?: string;
3569
3826
  categoryField: string;
3570
3827
  valueField: string;
3571
3828
  ckQueryTarget?: CkQueryTarget;
@@ -3590,6 +3847,7 @@ declare class PieChartConfigDialogComponent implements OnInit, AfterViewInit {
3590
3847
  initialQueryName?: string;
3591
3848
  initialQueryFamily?: QueryFamily;
3592
3849
  initialIgnoreTimeFilter?: boolean;
3850
+ initialEntitySelectorId?: string;
3593
3851
  initialChartType?: PieChartType;
3594
3852
  initialCategoryField?: string;
3595
3853
  initialValueField?: string;
@@ -3618,6 +3876,7 @@ declare class PieChartConfigDialogComponent implements OnInit, AfterViewInit {
3618
3876
  selectedPersistentQuery: PersistentQueryItem | null;
3619
3877
  /** Stream-data opt-out: when true the MeshBoard time filter is not bound to the query. */
3620
3878
  ignoreTimeFilter: boolean;
3879
+ entitySelectorId?: string;
3621
3880
  queryColumns: QueryColumnItem[];
3622
3881
  filters: FieldFilterItem[];
3623
3882
  filterVariables: FilterVariable[];
@@ -3638,6 +3897,8 @@ declare class PieChartConfigDialogComponent implements OnInit, AfterViewInit {
3638
3897
  get isValid(): boolean;
3639
3898
  /** Family of the currently selected query; drives the time-filter toggle's visibility. */
3640
3899
  get selectedQueryFamily(): QueryFamily | null;
3900
+ /** Entity selectors available on the current MeshBoard (for the scope picker). */
3901
+ get availableEntitySelectors(): EntitySelectorConfig[];
3641
3902
  ngOnInit(): Promise<void>;
3642
3903
  ngAfterViewInit(): Promise<void>;
3643
3904
  onDataSourceTypeChange(dataSourceType: DataSourceType): void;
@@ -3655,7 +3916,7 @@ declare class PieChartConfigDialogComponent implements OnInit, AfterViewInit {
3655
3916
  onSave(): void;
3656
3917
  onCancel(): void;
3657
3918
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PieChartConfigDialogComponent, never>;
3658
- 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "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>;
3919
+ 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "required": false; }; "initialEntitySelectorId": { "alias": "initialEntitySelectorId"; "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>;
3659
3920
  }
3660
3921
 
3661
3922
  /**
@@ -3762,6 +4023,8 @@ interface BarChartConfigResult extends WidgetConfigResult {
3762
4023
  queryName?: string;
3763
4024
  queryFamily?: QueryFamily;
3764
4025
  ignoreTimeFilter?: boolean;
4026
+ /** Asset-scope binding: id of the entity selector whose selection scopes the stream-data query. */
4027
+ entitySelectorId?: string;
3765
4028
  chartType: BarChartType;
3766
4029
  categoryField: string;
3767
4030
  series: BarChartSeries[];
@@ -3790,6 +4053,7 @@ declare class BarChartConfigDialogComponent implements OnInit {
3790
4053
  initialQueryName?: string;
3791
4054
  initialQueryFamily?: QueryFamily;
3792
4055
  initialIgnoreTimeFilter?: boolean;
4056
+ initialEntitySelectorId?: string;
3793
4057
  initialChartType?: BarChartType;
3794
4058
  initialCategoryField?: string;
3795
4059
  initialSeries?: BarChartSeries[];
@@ -3808,6 +4072,10 @@ declare class BarChartConfigDialogComponent implements OnInit {
3808
4072
  numericColumns: QueryColumnItem[];
3809
4073
  /** Per-widget opt-out of the MeshBoard time-filter → stream-data binding. */
3810
4074
  ignoreTimeFilter: boolean;
4075
+ /** Asset-scope binding: id of the entity selector whose selection scopes the stream-data query. */
4076
+ entitySelectorId?: string;
4077
+ /** Entity selectors available on the current MeshBoard (for the scope picker). */
4078
+ get availableEntitySelectors(): EntitySelectorConfig[];
3811
4079
  /** Family of the currently selected query — gates the time-filter opt-out toggle. */
3812
4080
  get selectedQueryFamily(): QueryFamily | null;
3813
4081
  filters: FieldFilterItem[];
@@ -3851,7 +4119,7 @@ declare class BarChartConfigDialogComponent implements OnInit {
3851
4119
  removeColorThreshold(index: number): void;
3852
4120
  onCancel(): void;
3853
4121
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BarChartConfigDialogComponent, never>;
3854
- 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "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>;
4122
+ 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "required": false; }; "initialEntitySelectorId": { "alias": "initialEntitySelectorId"; "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>;
3855
4123
  }
3856
4124
 
3857
4125
  /**
@@ -3860,8 +4128,14 @@ declare class BarChartConfigDialogComponent implements OnInit {
3860
4128
  interface LineSeriesData {
3861
4129
  name: string;
3862
4130
  data: (number | null)[];
4131
+ /** min/max envelope per category (downsampling only); rendered as a rangeArea band. */
4132
+ band?: ({
4133
+ from: number;
4134
+ to: number;
4135
+ } | null)[];
3863
4136
  unit?: string;
3864
4137
  axisName?: string;
4138
+ color?: string;
3865
4139
  }
3866
4140
  /**
3867
4141
  * Value axis configuration
@@ -3871,8 +4145,14 @@ interface ValueAxisConfig {
3871
4145
  unit: string;
3872
4146
  position: 'left' | 'right';
3873
4147
  }
3874
- declare class LineChartWidgetComponent implements DashboardWidget<LineChartWidgetConfig, LineSeriesData[]>, OnInit, OnChanges {
4148
+ declare class LineChartWidgetComponent implements DashboardWidget<LineChartWidgetConfig, LineSeriesData[]>, AfterViewInit, OnChanges, OnDestroy {
3875
4149
  private readonly queryExecutor;
4150
+ private readonly elementRef;
4151
+ private readonly ngZone;
4152
+ private resizeObserver?;
4153
+ private resizeTimer?;
4154
+ /** The downsampling `limit` used by the last load; 0 when the last load wasn't downsampled. */
4155
+ private lastLimit;
3876
4156
  private static readonly SUPPORTED_ROW_TYPES;
3877
4157
  private readonly stateService;
3878
4158
  private readonly variableService;
@@ -3883,11 +4163,17 @@ declare class LineChartWidgetComponent implements DashboardWidget<LineChartWidge
3883
4163
  private readonly _valueAxes;
3884
4164
  private readonly _error;
3885
4165
  private readonly _seriesUnitMap;
4166
+ private readonly _dataInfo;
3886
4167
  readonly isLoading: _angular_core.Signal<boolean>;
3887
4168
  readonly categories: _angular_core.Signal<string[]>;
3888
4169
  readonly seriesData: _angular_core.Signal<LineSeriesData[]>;
3889
4170
  readonly valueAxes: _angular_core.Signal<ValueAxisConfig[]>;
3890
4171
  readonly error: _angular_core.Signal<string | null>;
4172
+ readonly dataInfo: _angular_core.Signal<{
4173
+ rows: number;
4174
+ points: number;
4175
+ total: number;
4176
+ } | null>;
3891
4177
  readonly data: _angular_core.Signal<LineSeriesData[]>;
3892
4178
  readonly plotBands: _angular_core.Signal<{
3893
4179
  from: number;
@@ -3919,7 +4205,15 @@ declare class LineChartWidgetComponent implements DashboardWidget<LineChartWidge
3919
4205
  categoryLabelContent: (e: {
3920
4206
  value: string;
3921
4207
  }) => string;
3922
- ngOnInit(): void;
4208
+ ngAfterViewInit(): void;
4209
+ ngOnDestroy(): void;
4210
+ /**
4211
+ * FE-2: when the chart is resized so the pixel-derived bucket count would change materially
4212
+ * (>15%), re-query at the new resolution after a 300 ms debounce. Only relevant while
4213
+ * downsampling is active (lastLimit > 0); raw charts don't depend on width.
4214
+ */
4215
+ private setupResizeObserver;
4216
+ private onResize;
3923
4217
  ngOnChanges(changes: SimpleChanges): void;
3924
4218
  refresh(): void;
3925
4219
  hasValidConfig(): boolean;
@@ -3927,6 +4221,11 @@ declare class LineChartWidgetComponent implements DashboardWidget<LineChartWidge
3927
4221
  getUnitForSeries(seriesName: string): string;
3928
4222
  private loadData;
3929
4223
  private buildStreamDataArgs;
4224
+ /**
4225
+ * Bucket count for backend downsampling, sized to the rendered width (~1 bucket / 2 px),
4226
+ * clamped to [50, 4000]. Falls back to 1500 before the host has a measured width.
4227
+ */
4228
+ private computeDownsampleLimit;
3930
4229
  /**
3931
4230
  * Processes query rows into line chart data.
3932
4231
  * Groups by seriesGroupField, orders by categoryField (date), supports multi-axis by unitField.
@@ -3938,9 +4237,13 @@ declare class LineChartWidgetComponent implements DashboardWidget<LineChartWidge
3938
4237
  private formatDate;
3939
4238
  /**
3940
4239
  * Formats a date with time for display on the category axis.
4240
+ * Date and time parts are formatted separately (joined with a space) to keep
4241
+ * the compact axis label; both honor the board's timezone mode.
3941
4242
  */
3942
4243
  private formatDateTime;
3943
4244
  private sanitizeAxisName;
4245
+ /** Parses a cell value to a number, or null when missing / non-numeric (renders as a gap). */
4246
+ private toNumber;
3944
4247
  private convertFiltersToDto;
3945
4248
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LineChartWidgetComponent, never>;
3946
4249
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<LineChartWidgetComponent, "mm-line-chart-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
@@ -3954,6 +4257,8 @@ interface LineChartConfigResult extends WidgetConfigResult {
3954
4257
  queryName?: string;
3955
4258
  queryFamily?: QueryFamily;
3956
4259
  ignoreTimeFilter?: boolean;
4260
+ /** Asset-scope binding: id of the entity selector whose selection scopes the stream-data query. */
4261
+ entitySelectorId?: string;
3957
4262
  chartType: LineChartType;
3958
4263
  categoryField: string;
3959
4264
  seriesGroupField: string;
@@ -3979,6 +4284,7 @@ declare class LineChartConfigDialogComponent implements OnInit {
3979
4284
  initialQueryName?: string;
3980
4285
  initialQueryFamily?: QueryFamily;
3981
4286
  initialIgnoreTimeFilter?: boolean;
4287
+ initialEntitySelectorId?: string;
3982
4288
  initialChartType?: LineChartType;
3983
4289
  initialCategoryField?: string;
3984
4290
  initialSeriesGroupField?: string;
@@ -3997,6 +4303,10 @@ declare class LineChartConfigDialogComponent implements OnInit {
3997
4303
  nonNumericColumns: QueryColumnItem[];
3998
4304
  /** Per-widget opt-out of the MeshBoard time-filter → stream-data binding. */
3999
4305
  ignoreTimeFilter: boolean;
4306
+ /** Asset-scope binding: id of the entity selector whose selection scopes the stream-data query. */
4307
+ entitySelectorId?: string;
4308
+ /** Entity selectors available on the current MeshBoard (for the scope picker). */
4309
+ get availableEntitySelectors(): EntitySelectorConfig[];
4000
4310
  /** Family of the currently selected query — gates the time-filter opt-out toggle. */
4001
4311
  get selectedQueryFamily(): QueryFamily | null;
4002
4312
  filters: FieldFilterItem[];
@@ -4032,7 +4342,7 @@ declare class LineChartConfigDialogComponent implements OnInit {
4032
4342
  removeReferenceLine(index: number): void;
4033
4343
  onCancel(): void;
4034
4344
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LineChartConfigDialogComponent, never>;
4035
- 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "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>;
4345
+ 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "required": false; }; "initialEntitySelectorId": { "alias": "initialEntitySelectorId"; "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>;
4036
4346
  }
4037
4347
 
4038
4348
  /**
@@ -4115,7 +4425,6 @@ declare class HeatmapWidgetComponent implements DashboardWidget<HeatmapWidgetCon
4115
4425
  private assignColors;
4116
4426
  private aggregate;
4117
4427
  private parseDate;
4118
- private formatDateKey;
4119
4428
  private convertFiltersToDto;
4120
4429
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeatmapWidgetComponent, never>;
4121
4430
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeatmapWidgetComponent, "mm-heatmap-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
@@ -4129,6 +4438,8 @@ interface HeatmapConfigResult extends WidgetConfigResult {
4129
4438
  queryName?: string;
4130
4439
  queryFamily?: QueryFamily;
4131
4440
  ignoreTimeFilter?: boolean;
4441
+ /** Asset-scope binding: id of the entity selector whose selection scopes the stream-data query. */
4442
+ entitySelectorId?: string;
4132
4443
  dateField: string;
4133
4444
  dateEndField?: string;
4134
4445
  valueField?: string;
@@ -4151,6 +4462,7 @@ declare class HeatmapConfigDialogComponent implements OnInit {
4151
4462
  initialQueryName?: string;
4152
4463
  initialQueryFamily?: QueryFamily;
4153
4464
  initialIgnoreTimeFilter?: boolean;
4465
+ initialEntitySelectorId?: string;
4154
4466
  initialDateField?: string;
4155
4467
  initialDateEndField?: string;
4156
4468
  initialValueField?: string;
@@ -4166,6 +4478,7 @@ declare class HeatmapConfigDialogComponent implements OnInit {
4166
4478
  isLoadingColumns: boolean;
4167
4479
  selectedPersistentQuery: PersistentQueryItem | null;
4168
4480
  ignoreTimeFilter: boolean;
4481
+ entitySelectorId?: string;
4169
4482
  queryColumns: QueryColumnItem[];
4170
4483
  numericColumns: QueryColumnItem[];
4171
4484
  dateTimeColumns: QueryColumnItem[];
@@ -4201,6 +4514,8 @@ declare class HeatmapConfigDialogComponent implements OnInit {
4201
4514
  valueMultiplier: number;
4202
4515
  };
4203
4516
  get isValid(): boolean;
4517
+ /** Entity selectors available on the current MeshBoard (for the scope picker). */
4518
+ get availableEntitySelectors(): EntitySelectorConfig[];
4204
4519
  get selectedQueryFamily(): QueryFamily | null;
4205
4520
  ngOnInit(): Promise<void>;
4206
4521
  onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
@@ -4215,7 +4530,7 @@ declare class HeatmapConfigDialogComponent implements OnInit {
4215
4530
  onSave(): void;
4216
4531
  onCancel(): void;
4217
4532
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeatmapConfigDialogComponent, never>;
4218
- 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "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>;
4533
+ 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; }; "initialIgnoreTimeFilter": { "alias": "initialIgnoreTimeFilter"; "required": false; }; "initialEntitySelectorId": { "alias": "initialEntitySelectorId"; "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>;
4219
4534
  }
4220
4535
 
4221
4536
  interface StatValue {
@@ -4228,6 +4543,9 @@ interface StatValue {
4228
4543
  }
4229
4544
  declare class StatsGridWidgetComponent implements OnInit, OnChanges {
4230
4545
  private readonly dataService;
4546
+ private readonly queryExecutor;
4547
+ private readonly stateService;
4548
+ private readonly variableService;
4231
4549
  config: StatsGridWidgetConfig;
4232
4550
  private readonly _isLoading;
4233
4551
  private readonly _error;
@@ -4244,6 +4562,14 @@ declare class StatsGridWidgetComponent implements OnInit, OnChanges {
4244
4562
  ngOnChanges(changes: SimpleChanges): void;
4245
4563
  refresh(): void;
4246
4564
  private loadData;
4565
+ /**
4566
+ * Resolves a single stat's value: a per-stat persistent query (runtime or
4567
+ * stream-data) when configured, otherwise the runtime aggregation result.
4568
+ */
4569
+ private resolveStatValue;
4570
+ private loadPersistentQueryValue;
4571
+ private buildStreamDataArgs;
4572
+ private convertFiltersToDto;
4247
4573
  private getColorClass;
4248
4574
  formatValue(stat: StatValue): string;
4249
4575
  get gridColumns(): number;
@@ -4257,6 +4583,7 @@ interface StatsGridConfigResult extends WidgetConfigResult {
4257
4583
  queries: AggregationQuery[];
4258
4584
  columns: number;
4259
4585
  }
4586
+ type StatSourceType = 'aggregation' | 'persistentQuery';
4260
4587
  interface ColorOption {
4261
4588
  value: StatColor;
4262
4589
  label: string;
@@ -4269,17 +4596,25 @@ interface CkTypeOption {
4269
4596
  interface EditableStat {
4270
4597
  id: string;
4271
4598
  label: string;
4599
+ sourceType: StatSourceType;
4272
4600
  ckTypeId: string;
4273
4601
  aggregation: AggregationType;
4602
+ persistentQuerySource?: PersistentQueryCellSource;
4274
4603
  color: StatColor;
4275
4604
  prefix?: string;
4276
4605
  suffix?: string;
4277
4606
  }
4278
4607
  declare class StatsGridConfigDialogComponent implements OnInit {
4279
4608
  private readonly windowRef;
4609
+ private readonly stateService;
4280
4610
  initialStats?: StatItem[];
4281
4611
  initialQueries?: AggregationQuery[];
4282
4612
  initialColumns?: number;
4613
+ entitySelectors: EntitySelectorConfig[];
4614
+ sourceTypeOptions: {
4615
+ value: StatSourceType;
4616
+ label: string;
4617
+ }[];
4283
4618
  colorOptions: ColorOption[];
4284
4619
  ckTypeOptions: CkTypeOption[];
4285
4620
  filteredCkTypeOptions: CkTypeOption[];
@@ -4764,6 +5099,9 @@ interface TileValue {
4764
5099
  declare class SummaryCardWidgetComponent implements DashboardWidget<SummaryCardWidgetConfig, TileValue[]>, OnInit, OnChanges {
4765
5100
  private readonly entityGQL;
4766
5101
  private readonly dataService;
5102
+ private readonly queryExecutor;
5103
+ private readonly stateService;
5104
+ private readonly variableService;
4767
5105
  config: SummaryCardWidgetConfig;
4768
5106
  private readonly _isLoading;
4769
5107
  private readonly _error;
@@ -4778,6 +5116,9 @@ declare class SummaryCardWidgetComponent implements DashboardWidget<SummaryCardW
4778
5116
  refresh(): void;
4779
5117
  private loadData;
4780
5118
  private fetchTileValue;
5119
+ private fetchPersistentQueryValue;
5120
+ private buildStreamDataArgs;
5121
+ private convertFiltersToDto;
4781
5122
  private fetchEntityAttributes;
4782
5123
  private formatValue;
4783
5124
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SummaryCardWidgetComponent, never>;
@@ -4788,6 +5129,7 @@ interface SummaryCardConfigResult extends WidgetConfigResult {
4788
5129
  columns: number;
4789
5130
  tiles: SummaryCardTile[];
4790
5131
  }
5132
+ type TileSourceType = 'entity' | 'aggregation' | 'persistentQuery';
4791
5133
  interface EditableTile {
4792
5134
  id: string;
4793
5135
  label: string;
@@ -4795,24 +5137,27 @@ interface EditableTile {
4795
5137
  suffix: string;
4796
5138
  color: string;
4797
5139
  size: string;
4798
- sourceType: 'entity' | 'aggregation';
5140
+ sourceType: TileSourceType;
4799
5141
  rtId: string;
4800
5142
  ckTypeId: string;
4801
5143
  attributePath: string;
4802
5144
  aggregation: string;
4803
5145
  aggAttribute: string;
5146
+ persistentQuerySource?: PersistentQueryCellSource;
4804
5147
  }
4805
5148
  declare class SummaryCardConfigDialogComponent implements OnInit {
4806
5149
  private readonly windowRef;
5150
+ private readonly stateService;
4807
5151
  initialColumns?: number;
4808
5152
  initialTiles?: SummaryCardTile[];
5153
+ entitySelectors: EntitySelectorConfig[];
4809
5154
  form: {
4810
5155
  columns: number;
4811
5156
  tiles: EditableTile[];
4812
5157
  };
4813
5158
  colorOptions: string[];
4814
5159
  sizeOptions: string[];
4815
- sourceTypeOptions: string[];
5160
+ sourceTypeOptions: TileSourceType[];
4816
5161
  aggregationOptions: string[];
4817
5162
  get isValid(): boolean;
4818
5163
  ngOnInit(): void;
@@ -4882,6 +5227,7 @@ declare class AlertBannerConfigDialogComponent {
4882
5227
 
4883
5228
  declare class AlertListWidgetComponent implements DashboardWidget<AlertListWidgetConfig, AlertItem[]>, OnInit, OnChanges {
4884
5229
  private readonly getEntitiesByCkTypeGQL;
5230
+ private readonly stateService;
4885
5231
  config: AlertListWidgetConfig;
4886
5232
  private readonly _isLoading;
4887
5233
  private readonly _error;
@@ -5172,6 +5518,10 @@ declare class EntitySelectorEditorComponent {
5172
5518
  protected editMappings: EntitySelectorAttributeMapping[];
5173
5519
  protected editShowInToolbar: boolean;
5174
5520
  protected editDefaultRtId: string;
5521
+ protected editChildScopeTargetCkTypeId: string;
5522
+ protected editChildScopeTargetCkTypeItem: CkTypeSelectorItem | null;
5523
+ protected editChildScopeRoleId: string;
5524
+ protected editChildScopeDirection: 'in' | 'out';
5175
5525
  protected defaultEntityDataSource: RuntimeEntitySelectDataSource$1 | null;
5176
5526
  protected defaultEntityDialogDataSource: RuntimeEntityDialogDataSource$1 | null;
5177
5527
  /**
@@ -5198,6 +5548,14 @@ declare class EntitySelectorEditorComponent {
5198
5548
  * Opens the attribute selector dialog to pick attributes for variable mappings.
5199
5549
  */
5200
5550
  selectAttributes(): Promise<void>;
5551
+ /**
5552
+ * Handles child-scope target CK type selection.
5553
+ */
5554
+ onChildScopeCkTypeSelected(ckType: CkTypeSelectorItem): void;
5555
+ /**
5556
+ * Handles child-scope target CK type cleared.
5557
+ */
5558
+ onChildScopeCkTypeCleared(): void;
5201
5559
  /**
5202
5560
  * Handles default entity selection from the entity picker.
5203
5561
  */
@@ -5442,6 +5800,13 @@ declare class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedCha
5442
5800
  * URL params take precedence over stored selection to support page reload.
5443
5801
  */
5444
5802
  private initializeTimeFilterVariables;
5803
+ /**
5804
+ * Recomputes the active time-filter range from the current selection on the
5805
+ * board's (possibly just-changed) timezone mode and republishes the
5806
+ * `$timeRangeFrom`/`$timeRangeTo` variables. No-op when the filter is
5807
+ * disabled or no selection is active.
5808
+ */
5809
+ private reapplyTimeFilterRange;
5445
5810
  /**
5446
5811
  * Converts a TimeRangeSelection to a SharedTimeRangeSelection.
5447
5812
  */
@@ -5626,6 +5991,16 @@ declare class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedCha
5626
5991
  * Resolves variables for an entity selector by fetching entity attributes.
5627
5992
  */
5628
5993
  private resolveEntitySelectorVariables;
5994
+ /**
5995
+ * Resolves the set of source rtIds that a stream-data widget bound to this
5996
+ * selector should be scoped to, and caches them on the state service.
5997
+ *
5998
+ * When the selector defines a {@link EntitySelectorChildScope}, the picked
5999
+ * entity's children of `targetCkTypeId` reached via `roleId`/`direction`
6000
+ * become the scope (e.g. MeteringPoint → its EnergyMeasurement rtIds). With
6001
+ * no childScope, the picked entity's own rtId is the scope (direct keying).
6002
+ */
6003
+ private resolveEntitySelectorScopeRtIds;
5629
6004
  /**
5630
6005
  * Writes entity selector selections to URL query parameters.
5631
6006
  * Format: es_<selectorId>=<rtId>
@@ -5664,7 +6039,8 @@ declare class MeshBoardSettingsResult {
5664
6039
  rtWellKnownName?: string | undefined;
5665
6040
  entitySelectors?: EntitySelectorConfig[] | undefined;
5666
6041
  autoRefreshSeconds?: number | undefined;
5667
- 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);
6042
+ timeZoneMode?: MeshBoardTimeZoneMode | undefined;
6043
+ 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, timeZoneMode?: MeshBoardTimeZoneMode | undefined);
5668
6044
  }
5669
6045
  /**
5670
6046
  * Dialog for editing MeshBoard settings.
@@ -5690,6 +6066,11 @@ declare class MeshBoardSettingsDialogComponent {
5690
6066
  timeFilterEnabled: boolean;
5691
6067
  defaultSelection?: TimeRangeSelection;
5692
6068
  initialDefaultSelection?: TimeRangeSelection$1;
6069
+ /**
6070
+ * Timezone basis for time-filter boundaries and datetime display across all
6071
+ * widgets. Defaults to `'local'` (browser timezone).
6072
+ */
6073
+ timeZoneMode: MeshBoardTimeZoneMode;
5693
6074
  /** Static and time filter variable names for duplicate detection in entity selector editor */
5694
6075
  get staticVariableNames(): string[];
5695
6076
  get isValid(): boolean;
@@ -5705,6 +6086,7 @@ declare class MeshBoardSettingsDialogComponent {
5705
6086
  gap: number;
5706
6087
  variables?: MeshBoardVariable[];
5707
6088
  timeFilter?: MeshBoardTimeFilterConfig;
6089
+ timeZoneMode?: MeshBoardTimeZoneMode;
5708
6090
  entitySelectors?: EntitySelectorConfig[];
5709
6091
  autoRefreshSeconds?: number;
5710
6092
  }): void;
@@ -5903,5 +6285,5 @@ declare class MeshBoardManagerDialogComponent implements OnInit {
5903
6285
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MeshBoardManagerDialogComponent, "mm-meshboard-manager-dialog", never, {}, {}, never, never, true, never>;
5904
6286
  }
5905
6287
 
5906
- export { AddWidgetDialogComponent, AiInsightsConfigDialogComponent, AiInsightsService, AiInsightsWidgetComponent, AlertBannerConfigDialogComponent, AlertBannerWidgetComponent, AlertListConfigDialogComponent, AlertListWidgetComponent, AssociationsConfigDialogComponent, AutoRefreshTimerService, 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 };
5907
- 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 };
6288
+ export { AddWidgetDialogComponent, AiInsightsConfigDialogComponent, AiInsightsService, AiInsightsWidgetComponent, AlertBannerConfigDialogComponent, AlertBannerWidgetComponent, AlertListConfigDialogComponent, AlertListWidgetComponent, AssociationsConfigDialogComponent, AutoRefreshTimerService, BarChartConfigDialogComponent, BarChartWidgetComponent, DEFAULT_TIME_ZONE_MODE, 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 };
6289
+ 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, EntitySelectorChildScope, 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, MeshBoardTimeZoneMode, MeshBoardVariable, MeshBoardVariableSource, MeshBoardVariableType, ParentAssociationMode, PersistedDashboard, PersistedMeshBoard, PersistedWidget, PersistedWidgetData, PersistentQueryCellMode, PersistentQueryCellSource, 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 };