@meshmakers/octo-meshboard 3.5.510 → 3.5.520

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.
@@ -668,6 +668,17 @@ interface GaugeWidgetConfig extends WidgetConfig {
668
668
  queryCategoryValue?: string;
669
669
  /** Field filters for data source */
670
670
  filters?: WidgetFilterConfig[];
671
+ /**
672
+ * How the value is obtained, as on the KPI (AB#7950). `'formula'` computes it from
673
+ * {@link formula} over MeshBoard variables (the data source stays `{ type: 'static' }`);
674
+ * `'value'` or absent uses the data source.
675
+ */
676
+ valueMode?: KpiValueMode;
677
+ /**
678
+ * Formula over MeshBoard variables, e.g. `max(0, min(100, (1 - ${import} / ${consumption}) * 100))`.
679
+ * Used when `valueMode` is `'formula'`; the result must be a number.
680
+ */
681
+ formula?: string;
671
682
  }
672
683
  /**
673
684
  * Pie Chart types available
@@ -861,9 +872,21 @@ type HeatmapColorScheme = 'green' | 'redGreen' | 'blue' | 'heat';
861
872
  */
862
873
  type HeatmapColorMode = 'gradient' | 'threshold';
863
874
  /**
864
- * Client-side aggregation function for simple queries
875
+ * Client-side aggregation function for simple queries.
876
+ * `weightedAvg` (AB#7956): cell = Σ valueField / Σ weightField, for rollup archives that store a
877
+ * mean as a sum column plus a count column; a cell without rows is empty, not 0.
878
+ */
879
+ type HeatmapAggregation = 'count' | 'sum' | 'avg' | 'weightedAvg';
880
+ /**
881
+ * Widget-level relative time window of a heatmap (AB#7956), e.g. the last 30 days.
882
+ * Overrides the board time filter for this widget's stream-data query.
865
883
  */
866
- type HeatmapAggregation = 'count' | 'sum' | 'avg';
884
+ interface HeatmapTimeWindow {
885
+ /** Number of units, a positive integer */
886
+ value: number;
887
+ /** Unit of the window */
888
+ unit: RelativeTimeUnit;
889
+ }
867
890
  /**
868
891
  * Heatmap Widget - displays data availability or density as a heatmap
869
892
  * X-axis: Date (day), Y-axis: Time slot (hour or 15-min interval), Color: aggregated value
@@ -880,10 +903,25 @@ interface HeatmapWidgetConfig extends WidgetConfig {
880
903
  /** Optional end-of-interval field (e.g. timeRange.to). When set, the interval width is auto-detected
881
904
  * and sub-hour columns are shown (e.g. 00-15, 15-30, 30-45, 45-60 for 15-min data). */
882
905
  dateEndField?: string;
883
- /** Field containing the numeric value to aggregate (for sum/avg) */
906
+ /** Field containing the numeric value to aggregate (for sum/avg; the sum column for weightedAvg) */
884
907
  valueField?: string;
885
908
  /** Client-side aggregation function for simple queries */
886
909
  aggregation: HeatmapAggregation;
910
+ /** `weightedAvg` only: the weight (count) column; cell = Σ valueField / Σ weightField (AB#7956) */
911
+ weightField?: string;
912
+ /**
913
+ * The date field marks the END of a bucket (rollup archives) (AB#7956). Each row is shifted back by
914
+ * {@link bucketWidthMinutes} to its bucket start before hour/day bucketing, so the last bucket of an
915
+ * hour stays in that hour. Ignored when {@link dateEndField} is set.
916
+ */
917
+ timestampIsBucketEnd?: boolean;
918
+ /** Bucket width in minutes for {@link timestampIsBucketEnd} (e.g. 5 for a 5-min rollup) */
919
+ bucketWidthMinutes?: number;
920
+ /**
921
+ * Own relative time window (AB#7956). When set, it overrides the board time filter for this
922
+ * widget's stream-data query, and the widget shows the window in a badge. Unset = board filter.
923
+ */
924
+ timeWindow?: HeatmapTimeWindow;
887
925
  /** Color scheme for the heatmap (used in `gradient` color mode) */
888
926
  colorScheme: HeatmapColorScheme;
889
927
  /** Coloring mode — relative `gradient` (default) or absolute `threshold` bands */
@@ -1457,6 +1495,27 @@ interface EntitySelectorChildScope {
1457
1495
  }
1458
1496
  /** Maximum number of hops of a child-scope path, enforced by editor and runtime (AB#7723). */
1459
1497
  declare const MAX_SCOPE_HOPS = 5;
1498
+ /**
1499
+ * Scope source of a dependent selector (AB#7915): the selector's picker lists
1500
+ * only the entities reached from the leader's current pick through `path`.
1501
+ *
1502
+ * - `selectorId` — the leader: another selector of the same board that is
1503
+ * neither a follower (`followsSelectorId`) nor itself dependent. One level
1504
+ * only, like AB#7722 followers.
1505
+ * - `path` — 1 to {@link MAX_SCOPE_HOPS} hops (the AB#7723 hop shape) from the
1506
+ * leader's CK type to this selector's CK type. Always a path, also for a
1507
+ * single hop (no one-hop shorthand).
1508
+ *
1509
+ * The picker sends the distinct rtIds at the end of the path as GraphQL field
1510
+ * filter `rtId IN (…)`, AND-combined with the picker filter (AB#7724) and the
1511
+ * text search. See `utils/entity-selector-scope-source.ts`.
1512
+ */
1513
+ interface EntitySelectorScopeSource {
1514
+ /** Id of the leader selector. */
1515
+ selectorId: string;
1516
+ /** Hops from the leader's CK type to this selector's CK type (1–{@link MAX_SCOPE_HOPS}). */
1517
+ path: EntitySelectorScopeHop[];
1518
+ }
1460
1519
  /**
1461
1520
  * Configuration for a single entity selector in the MeshBoard toolbar.
1462
1521
  * Each selector is bound to a CK type and populates variables from the selected entity.
@@ -1507,6 +1566,16 @@ interface EntitySelectorConfig {
1507
1566
  * See `utils/entity-selector-filter.ts`.
1508
1567
  */
1509
1568
  filters?: WidgetFilterConfig[];
1569
+ /**
1570
+ * Optional scope source (AB#7915): makes this selector *dependent* on a
1571
+ * leader selector. While the leader has a pick, the toolbar dropdown and its
1572
+ * search dialog list only the entities reached from that pick through
1573
+ * `path` (server side, `rtId IN`). Without a leader pick the picker lists as
1574
+ * if no scope source were set. A failed or invalid scope lists nothing — it
1575
+ * never falls back to the full list. Followers ignore it.
1576
+ * See {@link EntitySelectorScopeSource}.
1577
+ */
1578
+ scopeSource?: EntitySelectorScopeSource;
1510
1579
  /** Current selection (transient, not persisted) */
1511
1580
  selectedRtId?: string;
1512
1581
  /** Display name of the currently selected entity */
@@ -2106,6 +2175,10 @@ declare class QueryExecutorService {
2106
2175
  * - `pending`: the pick is being resolved (childScope traversal, one hop or a path).
2107
2176
  * - `resolved`: the pick resolved to `rtIds` — possibly none.
2108
2177
  * - `failed`: the resolution threw (e.g. the association fetch failed).
2178
+ * - `needsPick` (AB#7916): a dependent selector (`scopeSource`) — or a follower
2179
+ * of one — has no pick while its leader has one. Bound widgets show no data
2180
+ * and the view asks for a pick; the persisted scope would show entities
2181
+ * outside the leader's pick. Only used for widget scopes, never for picker scopes.
2109
2182
  *
2110
2183
  * A selector without an entry has no active pick: bound widgets keep the
2111
2184
  * query's persisted scope.
@@ -2117,6 +2190,8 @@ type EntitySelectorScopeState = {
2117
2190
  rtIds: string[];
2118
2191
  } | {
2119
2192
  status: 'failed';
2193
+ } | {
2194
+ status: 'needsPick';
2120
2195
  };
2121
2196
  /**
2122
2197
  * What a widget bound to an entity selector does with its persistent query —
@@ -2133,6 +2208,8 @@ type EntitySelectorScopeState = {
2133
2208
  * - `empty`: the pick has nothing in scope (`noTargets`) or the lookup failed
2134
2209
  * (`failed`) — show the no-data state and send NO query. Never fall back to
2135
2210
  * the persisted scope: that would show rows of other entities.
2211
+ * `noPick` (AB#7916): a dependent selector has no pick while its leader has
2212
+ * one — the view shows "Pick a <label> to see this data.".
2136
2213
  * `invalidTimeRange` (AB#7582): the embedding host set a `timeRange` that is
2137
2214
  * unparseable or empty (`from >= to`) — every stream-data query bound to the
2138
2215
  * time filter is skipped, whatever its selector binding; a widget with
@@ -2147,7 +2224,7 @@ type StreamDataScope = {
2147
2224
  rtIds: string[];
2148
2225
  } | {
2149
2226
  kind: 'empty';
2150
- reason: 'noTargets' | 'failed' | 'invalidTimeRange';
2227
+ reason: 'noTargets' | 'failed' | 'noPick' | 'invalidTimeRange';
2151
2228
  };
2152
2229
  /**
2153
2230
  * The result a widget renders instead of executing its query when its scope is
@@ -2389,6 +2466,83 @@ declare class WidgetNotConfiguredComponent {
2389
2466
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<WidgetNotConfiguredComponent, "mm-widget-not-configured", never, {}, {}, never, never, true, never>;
2390
2467
  }
2391
2468
 
2469
+ interface FormulaValidationResult {
2470
+ valid: boolean;
2471
+ /** Syntax error or other reason the formula is invalid */
2472
+ error?: string;
2473
+ /** Referenced variables that do not exist (bare identifiers are reported as well) */
2474
+ unknownVariables: string[];
2475
+ }
2476
+ /**
2477
+ * Outcome of evaluating a formula:
2478
+ * - `ok`: a value;
2479
+ * - `pending`: empty formula or a referenced variable has no value yet → the widget shows `-`, no error;
2480
+ * - `nonFinite`: the result is `Infinity`/`NaN` (e.g. division by zero, PV = 0 at night) → the widget
2481
+ * shows `-` and the `reason` as tooltip, no error state (AB#7950);
2482
+ * - `error`: syntax or evaluation error → the widget error state with the message.
2483
+ */
2484
+ type FormulaEvaluationResult = {
2485
+ status: 'pending';
2486
+ } | {
2487
+ status: 'ok';
2488
+ value: number | string | boolean;
2489
+ } | {
2490
+ status: 'nonFinite';
2491
+ reason: string;
2492
+ } | {
2493
+ status: 'error';
2494
+ error: string;
2495
+ };
2496
+
2497
+ /**
2498
+ * Formula field shared by the widget config dialogs (KPI, gauge; AB#7950): the formula input,
2499
+ * the syntax hint, the validation message, the live preview and the list of insertable variables.
2500
+ *
2501
+ * Validation is `validateFormulaField` of `utils/meshboard-formula.ts` — the dialogs call the same
2502
+ * function to decide whether Save is enabled, so there is exactly one validation rule.
2503
+ *
2504
+ * Usage:
2505
+ * ```html
2506
+ * <mm-meshboard-formula-field
2507
+ * [(formula)]="form.formula"
2508
+ * [variables]="formulaVariables"
2509
+ * [declaredNames]="declaredVariableNames">
2510
+ * </mm-meshboard-formula-field>
2511
+ * ```
2512
+ */
2513
+ declare class FormulaFieldComponent {
2514
+ private readonly evaluator;
2515
+ /** The formula text (two-way: `[(formula)]`) */
2516
+ readonly formula: _angular_core.ModelSignal<string>;
2517
+ /** Variables the formula can reference; their current values drive the preview */
2518
+ readonly variables: _angular_core.InputSignal<readonly MeshBoardVariable[]>;
2519
+ /** Names that exist by configuration but carry no value yet (count as known, preview pending) */
2520
+ readonly declaredNames: _angular_core.InputSignal<readonly string[]>;
2521
+ /** The result must be a number (gauge): a string/boolean preview shows "Result is not a number" */
2522
+ readonly numericOnly: _angular_core.InputSignal<boolean>;
2523
+ /** Show the clamp pattern in the hint (widgets with a scale) */
2524
+ readonly clampHint: _angular_core.InputSignal<boolean>;
2525
+ readonly label: _angular_core.InputSignal<string>;
2526
+ readonly placeholder: _angular_core.InputSignal<string>;
2527
+ readonly variableSyntaxHint = "${variableName}";
2528
+ readonly clampExample = "max(0, min(100, \u2026))";
2529
+ private readonly id;
2530
+ readonly inputId: string;
2531
+ readonly hintId: string;
2532
+ readonly messageId: string;
2533
+ readonly variablesLabelId: string;
2534
+ /** Validation of the current formula (the same rule the dialogs use for Save) */
2535
+ readonly validation: _angular_core.Signal<FormulaValidationResult>;
2536
+ /** Evaluation of the current formula over the current variable values */
2537
+ readonly evaluation: _angular_core.Signal<FormulaEvaluationResult>;
2538
+ readonly preview: _angular_core.Signal<string>;
2539
+ readonly inputAttributes: _angular_core.Signal<Record<string, string>>;
2540
+ /** Appends a `${name}` reference to the formula */
2541
+ insertVariable(name: string): void;
2542
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormulaFieldComponent, never>;
2543
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormulaFieldComponent, "mm-meshboard-formula-field", never, { "formula": { "alias": "formula"; "required": false; "isSignal": true; }; "variables": { "alias": "variables"; "required": false; "isSignal": true; }; "declaredNames": { "alias": "declaredNames"; "required": false; "isSignal": true; }; "numericOnly": { "alias": "numericOnly"; "required": false; "isSignal": true; }; "clampHint": { "alias": "clampHint"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "formula": "formulaChange"; }, never, never, true, never>;
2544
+ }
2545
+
2392
2546
  /**
2393
2547
  * Defines how parent associations should be handled when mapping widget input
2394
2548
  */
@@ -2572,6 +2726,16 @@ declare class MeshBoardStateService {
2572
2726
  * (AB#7721).
2573
2727
  */
2574
2728
  private readonly _entitySelectorScopes;
2729
+ /**
2730
+ * Transient picker scope of each dependent selector (AB#7915, keyed by the
2731
+ * dependent's id): `pending` while the leader's pick resolves along
2732
+ * `scopeSource.path`, `resolved` with the rtIds the picker may list
2733
+ * (possibly none), or `failed`. No entry = the leader has no pick, the picker
2734
+ * lists unscoped. Not persisted, cleared on board switch.
2735
+ */
2736
+ private readonly _pickerScopes;
2737
+ /** Picker scopes of the dependent selectors (AB#7915), for the toolbar. */
2738
+ readonly pickerScopes: _angular_core.Signal<Record<string, EntitySelectorScopeState>>;
2575
2739
  /**
2576
2740
  * Period set by the page that embeds the board (`MeshBoardViewComponent.timeRange`, AB#7582):
2577
2741
  * exact instants, or `invalid` when the host passed an unusable range. `null` = the board's own
@@ -2887,6 +3051,13 @@ declare class MeshBoardStateService {
2887
3051
  * (AB#7721).
2888
3052
  */
2889
3053
  setEntitySelectorScopeFailed(selectorId: string): void;
3054
+ /**
3055
+ * Marks a selector as "needs a pick" (AB#7916): a dependent selector — or a
3056
+ * follower of one — has no pick while its leader has one. Bound widgets show
3057
+ * no data and send no query (never the persisted scope, which would show
3058
+ * entities outside the leader's pick); the view asks for a pick.
3059
+ */
3060
+ setEntitySelectorScopeNeedsPick(selectorId: string): void;
2890
3061
  /**
2891
3062
  * Clears the scope state for an entity selector (its selection was cleared).
2892
3063
  * Bound widgets then query with the persisted scope again.
@@ -2899,6 +3070,11 @@ declare class MeshBoardStateService {
2899
3070
  * "could not resolve the scope" notice, AB#7721).
2900
3071
  */
2901
3072
  readonly failedEntitySelectorScopeIds: _angular_core.Signal<string[]>;
3073
+ /**
3074
+ * Ids of the selectors that need a pick (AB#7916), for the view's
3075
+ * "Pick a <label> to see this data." notice.
3076
+ */
3077
+ readonly needsPickEntitySelectorIds: _angular_core.Signal<string[]>;
2902
3078
  /**
2903
3079
  * Decides how a widget runs its persistent query — the entry point every
2904
3080
  * built-in widget calls with its binding, query family and time-filter opt-out:
@@ -2924,6 +3100,8 @@ declare class MeshBoardStateService {
2924
3100
  * (`QueryExecutionOptions.scopeRtIds`).
2925
3101
  * - `empty` — the pick has nothing in scope or the lookup failed: show the
2926
3102
  * no-data state and send no query. Never fall back to the persisted scope.
3103
+ * Also a dependent selector without pick while its leader has one
3104
+ * (`noPick`, AB#7916).
2927
3105
  */
2928
3106
  resolveEntitySelectorScope(entitySelectorId?: string): StreamDataScope;
2929
3107
  /**
@@ -2936,6 +3114,17 @@ declare class MeshBoardStateService {
2936
3114
  * skip the query for `pending` / `empty` (AB#7721).
2937
3115
  */
2938
3116
  resolveStreamDataRtIds(entitySelectorId?: string): string[] | undefined;
3117
+ /** Marks a dependent selector's picker scope as resolving (AB#7915): the picker lists nothing yet. */
3118
+ setPickerScopePending(selectorId: string): void;
3119
+ /** Stores the rtIds a dependent selector's picker may list (AB#7915); `[]` = nothing in the leader's pick. */
3120
+ setPickerScopeRtIds(selectorId: string, rtIds: string[]): void;
3121
+ /** Marks a dependent selector's picker scope as failed (AB#7915): the picker lists nothing. */
3122
+ setPickerScopeFailed(selectorId: string): void;
3123
+ /** Clears a dependent selector's picker scope (its leader has no pick): the picker lists unscoped. */
3124
+ clearPickerScope(selectorId: string): void;
3125
+ /** The picker scope of a dependent selector, or `undefined` when its leader has no pick. */
3126
+ getPickerScopeState(selectorId: string): EntitySelectorScopeState | undefined;
3127
+ private setPickerScope;
2939
3128
  private setEntitySelectorScope;
2940
3129
  /**
2941
3130
  * Sets (or with `null` clears) the period of the page embedding the board
@@ -3788,6 +3977,11 @@ declare class KpiWidgetComponent implements DashboardWidget<KpiWidgetConfig, Run
3788
3977
  private readonly formulaResult;
3789
3978
  /** Error message of the formula (syntax, evaluation or circular reference). */
3790
3979
  readonly formulaError: _angular_core.Signal<string | null>;
3980
+ /**
3981
+ * Tooltip of the value: the reason a formula result is shown as `-` although every
3982
+ * variable has a value (non-finite result, e.g. division by zero; AB#7950), else `null`.
3983
+ */
3984
+ readonly valueTooltip: _angular_core.Signal<string | null>;
3791
3985
  /**
3792
3986
  * Unformatted value: the formula result, or the value taken from the loaded data
3793
3987
  * (query values already scaled by `valueMultiplier`).
@@ -3841,14 +4035,6 @@ declare class KpiWidgetComponent implements DashboardWidget<KpiWidgetConfig, Run
3841
4035
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KpiWidgetComponent, "mm-kpi-widget", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
3842
4036
  }
3843
4037
 
3844
- interface FormulaValidationResult {
3845
- valid: boolean;
3846
- /** Syntax error or other reason the formula is invalid */
3847
- error?: string;
3848
- /** Referenced variables that do not exist (bare identifiers are reported as well) */
3849
- unknownVariables: string[];
3850
- }
3851
-
3852
4038
  /**
3853
4039
  * Data source type for KPI. `'formula'` computes the value from a formula over
3854
4040
  * MeshBoard variables (stored as static data source with `valueMode: 'formula'`).
@@ -3988,15 +4174,13 @@ declare class KpiConfigDialogComponent implements OnInit {
3988
4174
  * outputs declared by other KPIs (e.g. still loading or in error) and the variables an
3989
4175
  * entity selector exposes once an entity is picked.
3990
4176
  */
3991
- private get declaredVariableNames();
4177
+ get declaredVariableNames(): string[];
3992
4178
  /**
3993
4179
  * Validation of the current formula (memoized per formula text and available variable names).
3994
4180
  * Declared names count as known, so a reference to an output without a value yet can be saved;
3995
4181
  * the preview keeps evaluating the live values and shows it as pending.
3996
4182
  */
3997
4183
  get formulaValidation(): FormulaValidationResult;
3998
- /** Result of the current formula over the current variable values */
3999
- get formulaPreview(): string;
4000
4184
  /** Validation message for the output variable name, or `null` when valid or empty */
4001
4185
  get outputVariableError(): string | null;
4002
4186
  /** Circular reference introduced by the pending formula / output name, or `null` */
@@ -4024,8 +4208,6 @@ declare class KpiConfigDialogComponent implements OnInit {
4024
4208
  private displayFields;
4025
4209
  onCancel(): void;
4026
4210
  onDataSourceTypeChange(type: KpiDataSourceType): void;
4027
- /** Appends a `${name}` reference to the formula */
4028
- insertVariable(name: string): void;
4029
4211
  onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
4030
4212
  onQueryModeChange(mode: KpiQueryMode): Promise<void>;
4031
4213
  private loadQueryColumnsAndValues;
@@ -4506,10 +4688,23 @@ declare class GaugeWidgetComponent implements DashboardWidget<GaugeWidgetConfig,
4506
4688
  private static readonly SUPPORTED_ROW_TYPES;
4507
4689
  private readonly stateService;
4508
4690
  private readonly variableService;
4691
+ private readonly expressionEvaluator;
4509
4692
  config: GaugeWidgetConfig;
4693
+ /**
4694
+ * Signal mirror of the `config` input, so the formula computeds re-run when the config
4695
+ * changes (the input itself is a plain property). Falls back to the input before the
4696
+ * first lifecycle hook.
4697
+ */
4698
+ private readonly _config;
4699
+ private currentConfig;
4510
4700
  private readonly _isLoading;
4511
4701
  private readonly _data;
4512
4702
  private readonly _error;
4703
+ /**
4704
+ * Incremented on every load; a request that resolves after a newer load started (e.g. the
4705
+ * config switched to formula mode meanwhile) must not overwrite the newer state.
4706
+ */
4707
+ private loadGeneration;
4513
4708
  readonly isLoading: _angular_core.Signal<boolean>;
4514
4709
  readonly data: _angular_core.Signal<RuntimeEntityData | null>;
4515
4710
  readonly error: _angular_core.Signal<string | null>;
@@ -4518,7 +4713,31 @@ declare class GaugeWidgetComponent implements DashboardWidget<GaugeWidgetConfig,
4518
4713
  * This is a method (not computed) to ensure it re-evaluates when config changes via @Input.
4519
4714
  */
4520
4715
  isNotConfigured(): boolean;
4716
+ /** True when the value is computed from a formula over MeshBoard variables (AB#7950). */
4717
+ isFormulaMode(): boolean;
4718
+ /**
4719
+ * Formula evaluation result, live over the MeshBoard variables (AB#7950); `null` outside
4720
+ * formula mode. Same engine and rules as the KPI, but the result must be a number.
4721
+ * A gauge publishes no output variable, so it can never be part of a variable cycle.
4722
+ */
4723
+ private readonly formulaResult;
4724
+ /** Error message of the formula (syntax, evaluation, non-numeric result). */
4725
+ readonly formulaError: _angular_core.Signal<string | null>;
4726
+ /**
4727
+ * Tooltip of the value label: the reason a formula result is shown as `-` although every
4728
+ * variable has a value (non-finite result, e.g. division by zero), else `null`.
4729
+ */
4730
+ readonly valueTooltip: _angular_core.Signal<string | null>;
4731
+ /** True when there is a value to show (data loaded, or a formula result). */
4732
+ readonly hasValue: _angular_core.Signal<boolean>;
4733
+ /** The real value, shown in the label (may lie outside the scale). */
4521
4734
  readonly numericValue: _angular_core.Signal<number>;
4735
+ /**
4736
+ * Value of the pointer: the real value clamped to the scale, so the pointer stops at the
4737
+ * scale end while the label shows the real value (AB#7950). Without a value it rests at
4738
+ * the scale start.
4739
+ */
4740
+ readonly pointerValue: _angular_core.Signal<number>;
4522
4741
  readonly formattedValue: _angular_core.Signal<string>;
4523
4742
  readonly label: _angular_core.Signal<string>;
4524
4743
  ngOnInit(): void;
@@ -4540,9 +4759,10 @@ declare class GaugeWidgetComponent implements DashboardWidget<GaugeWidgetConfig,
4540
4759
  }
4541
4760
 
4542
4761
  /**
4543
- * Data source type for Gauge
4762
+ * Data source type for Gauge. `'formula'` computes the value from a formula over MeshBoard
4763
+ * variables (stored as static data source with `valueMode: 'formula'`, AB#7950).
4544
4764
  */
4545
- type GaugeDataSourceType = 'runtimeEntity' | 'persistentQuery';
4765
+ type GaugeDataSourceType = 'runtimeEntity' | 'persistentQuery' | 'formula';
4546
4766
  /**
4547
4767
  * Configuration result from the Gauge dialog
4548
4768
  */
@@ -4562,6 +4782,7 @@ interface GaugeConfigResult extends WidgetConfigResult {
4562
4782
  queryValueField?: string;
4563
4783
  queryCategoryField?: string;
4564
4784
  queryCategoryValue?: string;
4785
+ formula?: string;
4565
4786
  gaugeType: GaugeType;
4566
4787
  min?: number;
4567
4788
  max?: number;
@@ -4595,6 +4816,7 @@ declare class GaugeConfigDialogComponent implements OnInit {
4595
4816
  private static readonly INTROSPECTION_ROW_TYPES;
4596
4817
  private readonly meshBoardStateService;
4597
4818
  private readonly windowRef;
4819
+ private readonly expressionEvaluator;
4598
4820
  ckTypeSelectorInput?: CkTypeSelectorInputComponent;
4599
4821
  entitySelectorInput?: EntitySelectInputComponent;
4600
4822
  querySelector?: QuerySelectorComponent;
@@ -4621,6 +4843,9 @@ declare class GaugeConfigDialogComponent implements OnInit {
4621
4843
  initialQueryCategoryField?: string;
4622
4844
  initialQueryCategoryValue?: string;
4623
4845
  initialFilters?: WidgetFilterConfig[];
4846
+ /** Id of the edited widget (excluded from the declared output names) */
4847
+ initialWidgetId?: string;
4848
+ initialFormula?: string;
4624
4849
  dataSourceType: GaugeDataSourceType;
4625
4850
  selectedCkType: CkTypeSelectorItem | null;
4626
4851
  selectedEntity: RuntimeEntityItem | null;
@@ -4660,7 +4885,18 @@ declare class GaugeConfigDialogComponent implements OnInit {
4660
4885
  queryValueField: string;
4661
4886
  queryCategoryField: string;
4662
4887
  queryCategoryValue: string;
4888
+ formula: string;
4663
4889
  };
4890
+ /**
4891
+ * Variables a formula can reference: MeshBoard variables plus the KPIs' published outputs.
4892
+ * Read live, so outputs published while the dialog is open become available immediately.
4893
+ */
4894
+ get formulaVariables(): MeshBoardVariable[];
4895
+ /** Names that exist by configuration but carry no value yet (declared KPI outputs, selector variables) */
4896
+ get declaredVariableNames(): string[];
4897
+ private formulaValidationCache?;
4898
+ /** Validation of the current formula — the same rule the shared formula field shows */
4899
+ get formulaValidation(): FormulaValidationResult;
4664
4900
  gaugeTypeOptions: GaugeTypeOption[];
4665
4901
  queryModeOptions: {
4666
4902
  value: KpiQueryMode;
@@ -4680,6 +4916,8 @@ declare class GaugeConfigDialogComponent implements OnInit {
4680
4916
  addRange(): void;
4681
4917
  removeRange(index: number): void;
4682
4918
  onSave(): void;
4919
+ /** Gauge options shared by every data source */
4920
+ private gaugeOptionsResult;
4683
4921
  onCancel(): void;
4684
4922
  onDataSourceTypeChange(type: GaugeDataSourceType): void;
4685
4923
  onQuerySelected(query: PersistentQueryItem | null): Promise<void>;
@@ -4696,7 +4934,7 @@ declare class GaugeConfigDialogComponent implements OnInit {
4696
4934
  private loadCategoryValuesForField;
4697
4935
  onFiltersChange(updatedFilters: FieldFilterItem[]): void;
4698
4936
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<GaugeConfigDialogComponent, never>;
4699
- 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>;
4937
+ 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; }; "initialWidgetId": { "alias": "initialWidgetId"; "required": false; }; "initialFormula": { "alias": "initialFormula"; "required": false; }; }, {}, never, never, true, never>;
4700
4938
  }
4701
4939
 
4702
4940
  /**
@@ -5480,8 +5718,8 @@ interface HeatmapDataItem {
5480
5718
  date: string;
5481
5719
  /** Y-axis: hour label (e.g. '08:00') */
5482
5720
  hour: string;
5483
- /** Color intensity value */
5484
- value: number;
5721
+ /** Color intensity value; `null` = empty cell (`weightedAvg` without rows, AB#7956) */
5722
+ value: number | null;
5485
5723
  /** Per-cell color (transparent for no-data) */
5486
5724
  color: string;
5487
5725
  }
@@ -5505,10 +5743,10 @@ declare class HeatmapWidgetComponent implements DashboardWidget<HeatmapWidgetCon
5505
5743
  readonly error: _angular_core.Signal<string | null>;
5506
5744
  readonly data: _angular_core.Signal<HeatmapDataItem[]>;
5507
5745
  /**
5508
- * Returns the color for a given value based on the color scheme ranges.
5509
- * Returns 'transparent' for zero/no-data values.
5746
+ * Returns the gradient color for a filled cell based on the color scheme ranges.
5747
+ * Empty cells are made transparent by the caller ({@link isEmptyCell}).
5510
5748
  */
5511
- private getColorForValue;
5749
+ private rangeColor;
5512
5750
  isNotConfigured(): boolean;
5513
5751
  ngOnInit(): void;
5514
5752
  ngOnChanges(changes: SimpleChanges): void;
@@ -5521,8 +5759,18 @@ declare class HeatmapWidgetComponent implements DashboardWidget<HeatmapWidgetCon
5521
5759
  */
5522
5760
  private formatSI;
5523
5761
  cellLabelContent: (e: {
5524
- value: number;
5762
+ value: number | null;
5525
5763
  }) => string;
5764
+ /**
5765
+ * An empty cell shows no label and no colour: `null` always; 0 too, except for `weightedAvg`,
5766
+ * where 0 is a real mean and an empty cell is `null` (AB#7956).
5767
+ */
5768
+ isEmptyCell(value: number | null | undefined): boolean;
5769
+ /**
5770
+ * Badge text of the widget's own time window (AB#7956), e.g. `Last 30 days`; `null` when the
5771
+ * widget follows the board time filter or queries runtime data (the window binds stream data only).
5772
+ */
5773
+ timeWindowLabel(): string | null;
5526
5774
  xLabelContent: (e: {
5527
5775
  value: string;
5528
5776
  }) => string;
@@ -5534,17 +5782,23 @@ declare class HeatmapWidgetComponent implements DashboardWidget<HeatmapWidgetCon
5534
5782
  * Otherwise aggregates into hourly buckets.
5535
5783
  */
5536
5784
  private processHeatmapData;
5785
+ /**
5786
+ * True when `dateField` refers to the top-level timestamp of a stream-data row.
5787
+ * Runtime rows are excluded so their date keeps coming only from the cells.
5788
+ */
5789
+ private static isRowTimestampField;
5537
5790
  /**
5538
5791
  * Detects the interval width in minutes from the first row with from+to.
5539
5792
  */
5540
5793
  private detectIntervalMinutes;
5541
5794
  /**
5542
- * Processes data into hourly buckets (original behavior).
5795
+ * Processes data into hourly buckets. Hour and day follow the board time zone; a DST
5796
+ * fall-back day keeps its repeated hour as its own row (`02:00 (2)`, AB#7956).
5543
5797
  */
5544
5798
  private processHourlyData;
5545
5799
  /**
5546
5800
  * Processes data into sub-hour interval buckets.
5547
- * Y-axis: hours (00:00..23:00), X-axis: interval labels (e.g. "00-15", "15-30", ...).
5801
+ * Y-axis: hours (00:00..23:00, plus a repeated DST hour), X-axis: interval labels (e.g. "00-15", "15-30", ...).
5548
5802
  * For multi-day data, X-axis labels are prefixed with the date.
5549
5803
  */
5550
5804
  private processSubHourData;
@@ -5566,7 +5820,6 @@ declare class HeatmapWidgetComponent implements DashboardWidget<HeatmapWidgetCon
5566
5820
  * → amber, above → red.
5567
5821
  */
5568
5822
  private getThresholdColor;
5569
- private aggregate;
5570
5823
  /** Delegates to {@link toInstant} so naive wire timestamps are pinned to UTC (AB#4818). */
5571
5824
  private parseDate;
5572
5825
  private convertFiltersToDto;
@@ -5588,6 +5841,13 @@ interface HeatmapConfigResult extends WidgetConfigResult {
5588
5841
  dateEndField?: string;
5589
5842
  valueField?: string;
5590
5843
  aggregation: HeatmapAggregation;
5844
+ /** `weightedAvg` only: the weight (count) column (AB#7956) */
5845
+ weightField?: string;
5846
+ /** The date field marks the bucket end; shift rows by {@link bucketWidthMinutes} (AB#7956) */
5847
+ timestampIsBucketEnd?: boolean;
5848
+ bucketWidthMinutes?: number;
5849
+ /** Own relative time window that overrides the board time filter (AB#7956) */
5850
+ timeWindow?: HeatmapTimeWindow;
5591
5851
  colorScheme: HeatmapColorScheme;
5592
5852
  colorMode?: HeatmapColorMode;
5593
5853
  thresholdTarget?: number;
@@ -5613,6 +5873,10 @@ declare class HeatmapConfigDialogComponent implements OnInit {
5613
5873
  initialDateEndField?: string;
5614
5874
  initialValueField?: string;
5615
5875
  initialAggregation?: HeatmapAggregation;
5876
+ initialWeightField?: string;
5877
+ initialTimestampIsBucketEnd?: boolean;
5878
+ initialBucketWidthMinutes?: number;
5879
+ initialTimeWindow?: HeatmapTimeWindow;
5616
5880
  initialColorScheme?: HeatmapColorScheme;
5617
5881
  initialColorMode?: HeatmapColorMode;
5618
5882
  initialThresholdTarget?: number;
@@ -5636,6 +5900,10 @@ declare class HeatmapConfigDialogComponent implements OnInit {
5636
5900
  value: string;
5637
5901
  label: string;
5638
5902
  }[];
5903
+ timeWindowUnitOptions: {
5904
+ value: RelativeTimeUnit;
5905
+ label: string;
5906
+ }[];
5639
5907
  colorModeOptions: {
5640
5908
  value: HeatmapColorMode;
5641
5909
  label: string;
@@ -5658,6 +5926,12 @@ declare class HeatmapConfigDialogComponent implements OnInit {
5658
5926
  dateEndField: string | undefined;
5659
5927
  valueField: string | undefined;
5660
5928
  aggregation: HeatmapAggregation;
5929
+ weightField: string | undefined;
5930
+ timestampIsBucketEnd: boolean;
5931
+ bucketWidthMinutes: number | undefined;
5932
+ useTimeWindow: boolean;
5933
+ timeWindowValue: number | undefined;
5934
+ timeWindowUnit: RelativeTimeUnit;
5661
5935
  colorScheme: HeatmapColorScheme;
5662
5936
  colorMode: HeatmapColorMode;
5663
5937
  thresholdTarget: number | undefined;
@@ -5668,6 +5942,8 @@ declare class HeatmapConfigDialogComponent implements OnInit {
5668
5942
  valueMultiplier: number;
5669
5943
  };
5670
5944
  get isValid(): boolean;
5945
+ /** Why the AB#7956 options block saving, or `null`. */
5946
+ get optionsError(): string | null;
5671
5947
  /** Entity selectors available on the current MeshBoard (for the scope picker). */
5672
5948
  get availableEntitySelectors(): EntitySelectorConfig[];
5673
5949
  get selectedQueryFamily(): QueryFamily | null;
@@ -5684,7 +5960,7 @@ declare class HeatmapConfigDialogComponent implements OnInit {
5684
5960
  onSave(): void;
5685
5961
  onCancel(): void;
5686
5962
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeatmapConfigDialogComponent, never>;
5687
- 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; }; "initialColorMode": { "alias": "initialColorMode"; "required": false; }; "initialThresholdTarget": { "alias": "initialThresholdTarget"; "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>;
5963
+ 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; }; "initialWeightField": { "alias": "initialWeightField"; "required": false; }; "initialTimestampIsBucketEnd": { "alias": "initialTimestampIsBucketEnd"; "required": false; }; "initialBucketWidthMinutes": { "alias": "initialBucketWidthMinutes"; "required": false; }; "initialTimeWindow": { "alias": "initialTimeWindow"; "required": false; }; "initialColorScheme": { "alias": "initialColorScheme"; "required": false; }; "initialColorMode": { "alias": "initialColorMode"; "required": false; }; "initialThresholdTarget": { "alias": "initialThresholdTarget"; "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>;
5688
5964
  }
5689
5965
 
5690
5966
  interface StatValue {
@@ -6615,6 +6891,12 @@ interface MeshBoardMessages {
6615
6891
  * 'Could not resolve the scope of "{label}" - widgets bound to it show no data.'
6616
6892
  */
6617
6893
  scopeResolutionFailed?: string;
6894
+ /**
6895
+ * Board notice for a dependent entity selector without pick while its leader has one (AB#7916):
6896
+ * widgets bound to it show no data until a pick is made. `{label}` is replaced by the selector
6897
+ * label. Default: 'Pick a {label} to see this data.'
6898
+ */
6899
+ scopePickRequired?: string;
6618
6900
  }
6619
6901
  /** Default texts of {@link MeshBoardMessages} (the list texts default inside `mm-list-view`). */
6620
6902
  declare const DEFAULT_MESHBOARD_MESSAGES: Required<Omit<MeshBoardMessages, 'tableList'>>;
@@ -6828,6 +7110,7 @@ declare class EntitySelectorEditorComponent {
6828
7110
  private readonly confirmationService;
6829
7111
  private readonly cdr;
6830
7112
  private readonly destroyRef;
7113
+ private readonly injector;
6831
7114
  entitySelectors: EntitySelectorConfig[];
6832
7115
  /** Existing variable names from other sources (static variables, other selectors) for duplicate detection */
6833
7116
  existingVariableNames: string[];
@@ -6861,6 +7144,12 @@ declare class EntitySelectorEditorComponent {
6861
7144
  /** Result of the server check whether the default entity matches the filter. */
6862
7145
  protected defaultFilterCheck: DefaultFilterCheck;
6863
7146
  private readonly defaultCheckRequests;
7147
+ protected editScopeSourceSelectorId: string;
7148
+ /** Hops from the leader's CK type to this selector's CK type; the last target is fixed. */
7149
+ protected editScopeSourceHops: EntitySelectorScopeHop[];
7150
+ /** Result of the check whether the default entity is inside the leader's default pick. */
7151
+ protected defaultScopeCheck: DefaultScopeCheck;
7152
+ private readonly scopeCheckRequests;
6864
7153
  protected defaultEntityDataSource: RuntimeEntitySelectDataSource | null;
6865
7154
  protected defaultEntityDialogDataSource: RuntimeEntityDialogDataSource | null;
6866
7155
  constructor();
@@ -6886,6 +7175,45 @@ declare class EntitySelectorEditorComponent {
6886
7175
  get followedByLabels(): string;
6887
7176
  /** Validation message of the "Follows" choice, or '' when it is valid. */
6888
7177
  get followError(): string;
7178
+ /** Selectors that list only entities inside the edited selector (AB#7917). */
7179
+ get dependents(): EntitySelectorConfig[];
7180
+ /** "A and B" of the selectors depending on the edited one. */
7181
+ get dependentsLabels(): string;
7182
+ /** True when the Follows choice is locked: the selector is followed or has dependents and follows nobody. */
7183
+ get isFollowsLocked(): boolean;
7184
+ /** Selectors the edited one may list "inside": not followers, not dependent, not itself. */
7185
+ get scopeSourceLeaderOptions(): EntitySelectorConfig[];
7186
+ /** True when the stored leader is not among the selectable leaders (deleted, follower, dependent). */
7187
+ get isScopeSourceLeaderUnavailable(): boolean;
7188
+ /** The leader selector of the scope source, if it exists. */
7189
+ get scopeSourceLeader(): EntitySelectorConfig | undefined;
7190
+ /** Label of the scope source leader (label, else id). */
7191
+ get scopeSourceLeaderLabel(): string;
7192
+ /** Source type of hop 1: the leader's CK type. */
7193
+ get scopeSourceLeaderCkTypeId(): string;
7194
+ /** "Room" — the edited selector in texts. */
7195
+ get editName(): string;
7196
+ /** True when the "Inside the pick of" choice is locked: other selectors depend on this one (one level). */
7197
+ get isScopeSourceLocked(): boolean;
7198
+ /** Validation message of the scope source, or '' when it can be saved (or is dropped on save). */
7199
+ get scopeSourceError(): string;
7200
+ /**
7201
+ * The scope source error as the section shows it: hop errors are already
7202
+ * shown by the path editor next to the hop, so they are not repeated here.
7203
+ */
7204
+ get scopeSourceDisplayError(): string;
7205
+ /** Maximum hop count of a path (getter: relative imports must not initialise fields). */
7206
+ get maxScopeHops(): number;
7207
+ /** Handles a change of the "Inside the pick of" choice. */
7208
+ onScopeSourceChanged(leaderId: string): void;
7209
+ /** Takes the hop list of the scope source path editor. */
7210
+ onScopeSourceHopsChanged(hops: EntitySelectorScopeHop[]): void;
7211
+ /** "Inside: Site (3 hops)" chip of a selector in the list, or ''. */
7212
+ getScopeSourceSummary(selector: EntitySelectorConfig): string;
7213
+ /** True when a selector's scope source cannot be used (list chip shown as an error). */
7214
+ isInvalidScopeSource(selector: EntitySelectorConfig): boolean;
7215
+ /** The edited selector as far as the scope source validation needs it. */
7216
+ private formSelectorForValidation;
6889
7217
  /** True while the edited selector follows another one. */
6890
7218
  get isFollower(): boolean;
6891
7219
  /**
@@ -6987,10 +7315,32 @@ declare class EntitySelectorEditorComponent {
6987
7315
  private requestDefaultCheck;
6988
7316
  /** Asks the server whether the entity is among the filtered ones (rtId + filter, first 1). */
6989
7317
  private checkDefaultEntity;
7318
+ /**
7319
+ * Queues the (debounced) check whether the default entity lies inside the
7320
+ * leader's default pick (AB#7917). Only for a valid scope source and when
7321
+ * both selectors have a default; otherwise clears the result.
7322
+ */
7323
+ private requestScopeCheck;
7324
+ /** Resolves the leader's default pick through the path and looks for the default entity. */
7325
+ private checkDefaultInScope;
6990
7326
  private emitChange;
6991
7327
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntitySelectorEditorComponent, never>;
6992
7328
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntitySelectorEditorComponent, "mm-entity-selector-editor", never, { "entitySelectors": { "alias": "entitySelectors"; "required": false; }; "existingVariableNames": { "alias": "existingVariableNames"; "required": false; }; "variables": { "alias": "variables"; "required": false; }; }, { "entitySelectorsChange": "entitySelectorsChange"; "editingStateChange": "editingStateChange"; }, never, never, true, never>;
6993
7329
  }
7330
+ /**
7331
+ * Outcome of the check whether a dependent selector's default entity lies
7332
+ * inside its leader's default pick (AB#7917). Never blocks saving: `outside`
7333
+ * warns, `error` says the check failed.
7334
+ */
7335
+ type DefaultScopeCheck = {
7336
+ state: 'none';
7337
+ } | {
7338
+ state: 'inside';
7339
+ } | {
7340
+ state: 'outside';
7341
+ } | {
7342
+ state: 'error';
7343
+ };
6994
7344
  /**
6995
7345
  * Outcome of the default-entity filter check (AB#7724). Never blocks saving:
6996
7346
  * `mismatch` warns, `error` says the check failed, `unchecked` names the
@@ -7056,14 +7406,40 @@ declare class EntitySelectorScopePathEditorComponent {
7056
7406
  protected readonly arrowUpIcon: _progress_kendo_svg_icons.SVGIcon;
7057
7407
  protected readonly arrowDownIcon: _progress_kendo_svg_icons.SVGIcon;
7058
7408
  protected readonly trashIcon: _progress_kendo_svg_icons.SVGIcon;
7409
+ /**
7410
+ * Intro text above the hop list. Unset = the child-scope text (AB#7723);
7411
+ * the scope-source section of the selector editor passes its own (AB#7917).
7412
+ */
7413
+ description: string | null;
7414
+ /** What the source of hop 1 is, shown after its type ("picked entity"). */
7415
+ sourceDescription: string;
7416
+ /** Text shown while there is no hop. Unset = the child-scope text. */
7417
+ emptyText: string | null;
7059
7418
  private _sourceCkTypeId;
7419
+ private _lockedTargetCkTypeId;
7060
7420
  private lastEmitted;
7061
7421
  private readonly associations;
7062
7422
  /** CK type of the picked entity — the source type of hop 1. */
7063
7423
  set sourceCkTypeId(value: string | null | undefined);
7064
7424
  get sourceCkTypeId(): string;
7425
+ /**
7426
+ * When set, the last hop's target type is fixed to this type (AB#7917: the
7427
+ * scope source path always ends at the dependent selector's CK type). The
7428
+ * last hop then shows the type read-only, new hops are inserted before it,
7429
+ * and it cannot be moved; removing it makes the previous hop the fixed one.
7430
+ */
7431
+ set lockedTargetCkTypeId(value: string | null | undefined);
7432
+ get lockedTargetCkTypeId(): string;
7065
7433
  /** The configured hops (one-hop form = one hop). */
7066
7434
  set hops(value: EntitySelectorScopeHop[] | null | undefined);
7435
+ /** True when the last hop's target type is fixed ({@link lockedTargetCkTypeId}). */
7436
+ get isLocked(): boolean;
7437
+ /** True when hop `index` is the last hop and its target type is fixed. */
7438
+ isLockedHop(index: number): boolean;
7439
+ /** True when hop `index` offers "move up" (a fixed last hop stays last). */
7440
+ canMoveUp(index: number): boolean;
7441
+ /** True when hop `index` offers "move down" (nothing moves below a fixed last hop). */
7442
+ canMoveDown(index: number): boolean;
7067
7443
  /** Maximum hop count (getter: relative imports must not initialise fields, see CLAUDE.md). */
7068
7444
  get maxHops(): number;
7069
7445
  get canAddHop(): boolean;
@@ -7099,6 +7475,8 @@ declare class EntitySelectorScopePathEditorComponent {
7099
7475
  onDirectionChanged(index: number, direction: 'in' | 'out'): void;
7100
7476
  onTargetSelected(index: number, ckType: CkTypeSelectorItem): void;
7101
7477
  onTargetCleared(index: number): void;
7478
+ /** Sets the last hop's target type to the fixed type (no-op without a lock). */
7479
+ private applyLock;
7102
7480
  private emit;
7103
7481
  private loadOf;
7104
7482
  /**
@@ -7111,7 +7489,7 @@ declare class EntitySelectorScopePathEditorComponent {
7111
7489
  /** Keeps the keyboard focus on a moved hop (wireframe change 4). */
7112
7490
  private focusHop;
7113
7491
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntitySelectorScopePathEditorComponent, never>;
7114
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntitySelectorScopePathEditorComponent, "mm-entity-selector-scope-path-editor", never, { "sourceCkTypeId": { "alias": "sourceCkTypeId"; "required": false; }; "hops": { "alias": "hops"; "required": false; }; }, { "hopsChange": "hopsChange"; }, never, never, true, never>;
7492
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntitySelectorScopePathEditorComponent, "mm-entity-selector-scope-path-editor", never, { "description": { "alias": "description"; "required": false; }; "sourceDescription": { "alias": "sourceDescription"; "required": false; }; "emptyText": { "alias": "emptyText"; "required": false; }; "sourceCkTypeId": { "alias": "sourceCkTypeId"; "required": false; }; "lockedTargetCkTypeId": { "alias": "lockedTargetCkTypeId"; "required": false; }; "hops": { "alias": "hops"; "required": false; }; }, { "hopsChange": "hopsChange"; }, never, never, true, never>;
7115
7493
  }
7116
7494
 
7117
7495
  /**
@@ -7129,9 +7507,10 @@ interface EntitySelectorClearEvent {
7129
7507
  }
7130
7508
  /**
7131
7509
  * Toolbar component that renders entity select inputs for each configured entity selector.
7132
- * Creates data sources per CK type and picker filter (AB#7724) and emits selection/clear events.
7510
+ * Creates data sources per CK type, picker filter (AB#7724) and picker scope (AB#7915) and emits
7511
+ * selection/clear events.
7133
7512
  */
7134
- declare class EntitySelectorToolbarComponent implements OnChanges {
7513
+ declare class EntitySelectorToolbarComponent implements OnChanges, OnDestroy {
7135
7514
  private readonly getEntitiesByCkTypeGQL;
7136
7515
  private readonly variableService;
7137
7516
  entitySelectors: EntitySelectorConfig[];
@@ -7140,6 +7519,11 @@ declare class EntitySelectorToolbarComponent implements OnChanges {
7140
7519
  * the same substitution widget filters get.
7141
7520
  */
7142
7521
  variables: MeshBoardVariable[];
7522
+ /**
7523
+ * Picker scopes of dependent selectors (AB#7915), keyed by selector id
7524
+ * (`MeshBoardStateService.pickerScopes`). No entry = the leader has no pick.
7525
+ */
7526
+ pickerScopes: Record<string, EntitySelectorScopeState>;
7143
7527
  entitySelected: EventEmitter<EntitySelectorEvent>;
7144
7528
  entityCleared: EventEmitter<EntitySelectorClearEvent>;
7145
7529
  private dataSourceCache;
@@ -7147,7 +7531,10 @@ declare class EntitySelectorToolbarComponent implements OnChanges {
7147
7531
  protected selectorDataSources: Map<string, RuntimeEntitySelectDataSource>;
7148
7532
  protected selectorDialogDataSources: Map<string, RuntimeEntityDialogDataSource>;
7149
7533
  protected selectorMessages: Map<string, Partial<EntitySelectInputMessages>>;
7534
+ private filteredSelectorIds;
7535
+ private readonly settledPickers$;
7150
7536
  ngOnChanges(changes: SimpleChanges): void;
7537
+ ngOnDestroy(): void;
7151
7538
  /** Texts of the selector's picker: a filtered picker explains its empty list (AB#7724). */
7152
7539
  getMessages(selector: EntitySelectorConfig): Partial<EntitySelectInputMessages>;
7153
7540
  /** Title of the selector's search dialog; marks a filtered picker (AB#7724). */
@@ -7175,16 +7562,32 @@ declare class EntitySelectorToolbarComponent implements OnChanges {
7175
7562
  onEntityCleared(selectorId: string): void;
7176
7563
  /**
7177
7564
  * Creates or retrieves cached data sources for each selector. Selectors of
7178
- * the same CK type and the same resolved filter share their data sources; a
7179
- * selector without filter uses the plain query, exactly as before AB#7724.
7180
- * Entries no selector uses any more (e.g. after a filter variable changed)
7181
- * are dropped, so the caches never outgrow the current selectors.
7565
+ * the same CK type, the same resolved filter and the same picker scope share
7566
+ * their data sources; a selector without filter and scope source uses the
7567
+ * plain query, exactly as before AB#7724. The cache key changes with the
7568
+ * picker scope (AB#7915), so a leader change gives the dependent fresh data
7569
+ * sources. Entries no selector uses any more are dropped, so the caches never
7570
+ * outgrow the current selectors.
7182
7571
  */
7183
7572
  private updateDataSources;
7573
+ /**
7574
+ * The query service of a picker: filter rows (AB#7724) plus, for a dependent
7575
+ * selector, the picker scope `rtId IN (…)` (AB#7915). Empty and failed scopes
7576
+ * list nothing without a request; a pending scope waits until it settled.
7577
+ */
7578
+ private pickerQuery;
7579
+ /** The query of `selectorId` once its picker scope is no longer pending (`null` = list nothing). */
7580
+ private settledPicker;
7581
+ /**
7582
+ * Picker texts (wording agreed with the Studio PO): a dependent picker with
7583
+ * nothing in scope or a failed scope says so right away (also before the
7584
+ * user types); a filtered picker explains an empty search result (AB#7724).
7585
+ */
7586
+ private pickerMessages;
7184
7587
  /** Number of cached data source pairs (for tests). */
7185
7588
  get cachedDataSourceCount(): number;
7186
7589
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntitySelectorToolbarComponent, never>;
7187
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntitySelectorToolbarComponent, "mm-entity-selector-toolbar", never, { "entitySelectors": { "alias": "entitySelectors"; "required": false; }; "variables": { "alias": "variables"; "required": false; }; }, { "entitySelected": "entitySelected"; "entityCleared": "entityCleared"; }, never, never, true, never>;
7590
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntitySelectorToolbarComponent, "mm-entity-selector-toolbar", never, { "entitySelectors": { "alias": "entitySelectors"; "required": false; }; "variables": { "alias": "variables"; "required": false; }; "pickerScopes": { "alias": "pickerScopes"; "required": false; }; }, { "entitySelected": "entitySelected"; "entityCleared": "entityCleared"; }, never, never, true, never>;
7188
7591
  }
7189
7592
 
7190
7593
  /**
@@ -7395,6 +7798,8 @@ declare class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedCha
7395
7798
  private readonly _urlTimeSelection;
7396
7799
  protected readonly initialTimeSelection: _angular_core.Signal<TimeRangeSelection$1 | undefined>;
7397
7800
  protected readonly entitySelectorsConfig: _angular_core.Signal<EntitySelectorConfig[]>;
7801
+ /** Picker scopes of dependent selectors (AB#7915). */
7802
+ protected readonly pickerScopes: _angular_core.Signal<Record<string, EntitySelectorScopeState>>;
7398
7803
  /** Board variables substituted into the selectors' picker filters (AB#7724). */
7399
7804
  protected readonly boardVariables: _angular_core.Signal<_meshmakers_octo_meshboard.MeshBoardVariable[]>;
7400
7805
  protected readonly hasEntitySelectors: _angular_core.Signal<boolean>;
@@ -7523,17 +7928,80 @@ declare class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedCha
7523
7928
  * Programmatically sets an entity selector value from outside the component.
7524
7929
  * Use this when the host application controls entity selection (e.g., with meshBoardHideEntitySelectors).
7525
7930
  * Resolves entity attributes, sets variables, and refreshes widgets.
7931
+ *
7932
+ * Dependent selectors (AB#7916): an rtId outside the dependent's picker scope
7933
+ * (the leader's pick) is rejected with a console warning and nothing
7934
+ * re-queries. On a leader the leader-change rules apply: each dependent keeps
7935
+ * its pick if it is in the new scope, else its default if that is, else it
7936
+ * has no pick; widgets refresh once for the whole change.
7526
7937
  */
7527
7938
  setEntitySelector(selectorId: string, rtId: string, displayName?: string): Promise<void>;
7528
7939
  /**
7529
7940
  * Programmatically clears an entity selector value from outside the component.
7941
+ * Clearing a leader keeps its dependents' picks (AB#7916); clearing a
7942
+ * dependent while its leader has a pick leaves its widgets without data
7943
+ * until a new pick is made.
7530
7944
  */
7531
7945
  clearEntitySelector(selectorId: string): void;
7532
7946
  /**
7533
7947
  * Clears one selector's pick, variables and scope state. Without a pick bound
7534
- * widgets fall back to the persisted scope (AB#7721).
7948
+ * widgets fall back to the persisted scope (AB#7721) — except a dependent
7949
+ * selector (or a follower of one without pick) while the leader has a pick:
7950
+ * its widgets show no data and the view asks for a pick (AB#7916).
7535
7951
  */
7536
7952
  private clearSelectorPick;
7953
+ /**
7954
+ * True when the selector — having no pick — must show no data instead of
7955
+ * the persisted scope (AB#7916): it is a valid dependent whose leader has a
7956
+ * pick (the dependent has a picker scope), or a follower of such a dependent
7957
+ * while the dependent has no pick either.
7958
+ */
7959
+ private needsPickWithoutOwnPick;
7960
+ /** True when the selector has a usable scope source (AB#7915). */
7961
+ private isDependent;
7962
+ /**
7963
+ * A dependent may only be picked inside its picker scope (AB#7916). While the
7964
+ * scope resolves the check waits for it; a scope overtaken meanwhile is read
7965
+ * again.
7966
+ */
7967
+ private acceptsDependentPick;
7968
+ /** Starts a new change of `selectorId`'s pick and returns its number (AB#7916). */
7969
+ private beginLeaderChange;
7970
+ /** True while no newer change of `selectorId`'s pick has started. */
7971
+ private isCurrentLeaderChange;
7972
+ /**
7973
+ * Picks `rtId` on a selector that may lead dependents (AB#7915/AB#7916). In
7974
+ * one synchronous step it marks the selector and its followers pending and
7975
+ * starts the dependents' picker scopes and pick decisions
7976
+ * ({@link settleDependentsOf}); then resolves the selector's own variables
7977
+ * and scope. `displayName` settles with the picked entity's display name,
7978
+ * `dependents` once every dependent's pick is decided, with the ids of the
7979
+ * dependents whose pick changed. `initialPicks` (board load) replaces the
7980
+ * dependents' current picks.
7981
+ */
7982
+ private pickWithDependents;
7983
+ /**
7984
+ * The leader `leaderId` was picked (`leaderRtId`): decides each dependent's
7985
+ * pick (AB#7916). Synchronously, each dependent's picker scope becomes
7986
+ * pending; a dependent with a current pick or a default is also marked
7987
+ * pending together with its followers, so bound widgets show loading and
7988
+ * never the old pick's data. Once the picker scope resolved, the pick is
7989
+ * {@link nextDependentPick}: kept if in scope, else the default if in scope,
7990
+ * else none. Without pick the dependent's widgets show no data with a
7991
+ * "pick" notice — a failed picker scope shows the scope-failed notice
7992
+ * instead. A decision overtaken by a newer leader change or a leader clear
7993
+ * is dropped. Resolves with the ids of the dependents whose pick changed.
7994
+ */
7995
+ private settleDependentsOf;
7996
+ /**
7997
+ * The leader `leaderId` loses its pick (`clear` clears it, which also drops
7998
+ * the dependents' picker scopes): dependents keep their picks (AB#7916). A
7999
+ * dependent without pick goes back to the persisted scope (AB#7721), and so
8000
+ * do its followers that needed a pick; a dependent whose pick was still being
8001
+ * decided resolves its current pick again. Returns a promise for those
8002
+ * resolutions, or `null` when there are none.
8003
+ */
8004
+ private releaseDependentsOf;
7537
8005
  /**
7538
8006
  * The leader `leaderId` has no pick any more: each of its followers resolves
7539
8007
  * its own `defaultRtId`, or — without one — has no pick and no scope
@@ -7553,11 +8021,36 @@ declare class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedCha
7553
8021
  selectorId: string;
7554
8022
  message: string;
7555
8023
  }[]>;
8024
+ /**
8025
+ * One notice per dependent selector without pick while its leader has one
8026
+ * (AB#7916): "Pick a <label> to see this data.". Followers of such a
8027
+ * dependent show no data too, but the notice names the selector to pick.
8028
+ */
8029
+ protected readonly scopePickRequiredNotices: _angular_core.Signal<{
8030
+ selectorId: string;
8031
+ message: string;
8032
+ }[]>;
7556
8033
  /**
7557
8034
  * Per-selector sequence number of the latest scope resolution, so a slower
7558
8035
  * resolution of an earlier pick never overwrites the scope of a newer pick.
7559
8036
  */
7560
8037
  private readonly scopeRequestSeq;
8038
+ /**
8039
+ * Per-dependent sequence number of the latest picker-scope resolution
8040
+ * (AB#7915): a late resolution of an earlier leader pick is discarded.
8041
+ */
8042
+ private readonly pickerScopeSeq;
8043
+ /** The latest picker-scope resolution of each dependent (AB#7916), awaited by a host pick. */
8044
+ private readonly pickerScopeResolutions;
8045
+ /**
8046
+ * Per-selector number of the latest pick change (AB#7916): the widget
8047
+ * refresh and URL write of a change overtaken by a newer one are skipped.
8048
+ */
8049
+ private readonly leaderChangeSeq;
8050
+ /** Dependents whose pick is being decided after a leader change (AB#7916). */
8051
+ private readonly decidingDependents;
8052
+ /** Set when the board load dropped an out-of-scope dependent pick from the URL or route data (AB#7916). */
8053
+ private entitySelectorUrlNeedsRewrite;
7561
8054
  /**
7562
8055
  * Handles time range change from the time range picker.
7563
8056
  * No-op: refresh is triggered by onTimeSelectionChange to ensure variables are updated first.
@@ -7667,17 +8160,34 @@ declare class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedCha
7667
8160
  /**
7668
8161
  * Handles entity selection from the entity selector toolbar.
7669
8162
  * Fetches entity attributes, sets variables, syncs to URL, and refreshes widgets.
8163
+ * On a leader the dependents' picks are decided first (AB#7916) and the
8164
+ * widgets refresh once for the whole change; a dependent only accepts an
8165
+ * rtId inside its picker scope.
7670
8166
  */
7671
8167
  onEntitySelectorSelected(event: EntitySelectorEvent): Promise<void>;
7672
8168
  /**
7673
8169
  * Handles entity cleared from the entity selector toolbar.
7674
- * Clears variables, syncs URL, and refreshes widgets.
8170
+ * Clears variables, syncs URL, and refreshes widgets. Clearing a leader keeps
8171
+ * its dependents' picks (AB#7916).
7675
8172
  */
7676
8173
  onEntitySelectorCleared(event: EntitySelectorClearEvent): Promise<void>;
7677
8174
  /**
7678
8175
  * Initializes entity selectors from URL params, route data, or defaults.
8176
+ *
8177
+ * Leaders resolve first (AB#7916): a dependent whose leader has a pick gets
8178
+ * its pick decided against the picker scope — an initial pick outside it is
8179
+ * dropped (default if in scope, else no pick); one dropped from the URL or
8180
+ * route data is logged once and the URL is rewritten. Widgets refresh once,
8181
+ * after every pick is decided.
7679
8182
  */
7680
8183
  private initializeEntitySelectors;
8184
+ /**
8185
+ * Logs (once per board load) each dependent whose URL or route-data pick was
8186
+ * dropped because it is outside the leader's pick, and marks the URL for a
8187
+ * rewrite (AB#7916). A dropped `defaultRtId` is not reported: it never was
8188
+ * in the URL.
8189
+ */
8190
+ private reportDroppedInitialPicks;
7681
8191
  /**
7682
8192
  * The initial pick of each entity selector. Priority: route data > URL
7683
8193
  * params > defaultRtId. Selectors without a pick are left out.
@@ -7697,6 +8207,24 @@ declare class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedCha
7697
8207
  * Selectors without a pick stay without scope state (persisted scope).
7698
8208
  */
7699
8209
  private primeEntitySelectorScopes;
8210
+ /**
8211
+ * Picker scopes of dependent selectors right after a board loaded (AB#7915):
8212
+ * a dependent whose leader has an initial pick is pending (its picker lists
8213
+ * nothing until the scope resolved); an invalid scope source is failed and
8214
+ * logs one warning per board load (the state is cleared on board switch, so
8215
+ * the guard on an existing state makes this idempotent).
8216
+ */
8217
+ private primePickerScopes;
8218
+ /**
8219
+ * Resolves the picker scope of `dependent` from its leader's pick `rtId`
8220
+ * (AB#7915): marks it pending synchronously, then walks `scopeSource.path`
8221
+ * with `resolveScopePath` (one batched request per hop) and stores the
8222
+ * distinct rtIds of the last hop — `[]` when the pick reaches nothing. A
8223
+ * failing hop is a failed picker scope (logged once). Resolves with the
8224
+ * stored state, or `null` when a newer leader pick (or a clear) overtook it.
8225
+ * Never rejects.
8226
+ */
8227
+ private resolvePickerScope;
7700
8228
  /**
7701
8229
  * Resolves variables for an entity selector by fetching entity attributes,
7702
8230
  * then its stream-data scope.
@@ -7741,6 +8269,8 @@ declare class MeshBoardViewComponent implements OnInit, OnDestroy, HasUnsavedCha
7741
8269
  * Format: es_<selectorId>=<rtId>
7742
8270
  */
7743
8271
  private writeEntitySelectorsToUrl;
8272
+ /** The `es_<selectorId>` query parameters of the current picks (`null` = remove). */
8273
+ private entitySelectorUrlParams;
7744
8274
  /**
7745
8275
  * Reads entity selector selections from URL query parameters.
7746
8276
  * Returns a map of selectorId -> rtId.
@@ -9619,5 +10149,5 @@ declare function pipelineExecutionInputs(children: (unknown | null)[] | null | u
9619
10149
  */
9620
10150
  declare function countPipelineExecutions(pipelines: PipelineExecutionInput[], now?: number): PipelineExecutionCounts;
9621
10151
 
9622
- export { ADAPTER_OFFLINE_GRACE_MS, ASSOCIATION_HOP_SOURCE_BATCH, ASSOCIATION_HOP_TARGETS_PER_SOURCE, ATTENTION_SEVERITY_ORDER, AdaptersAttentionProvider, AddWidgetDialogComponent, AiInsightsConfigDialogComponent, AiInsightsService, AiInsightsWidgetComponent, AlertBannerConfigDialogComponent, AlertBannerWidgetComponent, AlertListConfigDialogComponent, AlertListWidgetComponent, AssociationsConfigDialogComponent, AttentionListConfigDialogComponent, AttentionListWidgetComponent, AutoRefreshTimerService, BUILT_IN_ATTENTION_PROVIDERS, BarChartConfigDialogComponent, BarChartWidgetComponent, BlueprintUpdatesAttentionProvider, COCKPIT_ADAPTER_LIMIT, COCKPIT_ATTENTION_PROVIDERS, COCKPIT_BLUEPRINT_CATALOG_LIMIT, COCKPIT_CHILD_TENANT_IDS, COCKPIT_DATA_FLOW_LIMIT, COCKPIT_EXPLAIN_HANDLER, COCKPIT_FAILED_EXECUTIONS_OPTIONS, COCKPIT_KPI_GATES, COCKPIT_KPI_SLOW_LOADING_MS, COCKPIT_LINK_RESOLVER, COCKPIT_RECENT_ITEMS, COCKPIT_ROLES, COCKPIT_SERVICE_NAMES, COCKPIT_VERSION_SOURCE, COCKPIT_VIEWER_ACCESS, COCKPIT_WIDGET_MESSAGES, COCKPIT_WIDGET_TYPES, CkModelsResolveFailedAttentionProvider, CockpitAdapterStatesService, CockpitAttentionService, CockpitBlueprintStatusService, CockpitChildTenantsService, CockpitCkModelStatesService, CockpitContextService, CockpitDataFlowExecutionsService, CockpitKpiConfigDialogComponent, CockpitKpiService, CockpitKpiWidgetComponent, CockpitServiceHealthService, DAY_MS, DEFAULT_ATTENTION_MAX_ITEMS, DEFAULT_COCKPIT_WIDGET_MESSAGES, DEFAULT_FAILED_EXECUTIONS_OPTIONS, DEFAULT_MESHBOARD_MESSAGES, DEFAULT_RECENT_ITEMS_MAX, DEFAULT_TIME_ZONE_MODE, DashboardDataService, DashboardGridService, EditModeStateService, EditWidgetDialogComponent, EntityAssociationsWidgetComponent, EntityCardConfigDialogComponent, EntityCardWidgetComponent, EntityDetailDialogComponent, EntitySelectorEditorComponent, EntitySelectorScopePathEditorComponent, EntitySelectorToolbarComponent, FALLBACK_SERIES_COLORS, FailedExecutionsAttentionProvider, FeaturesNotInstalledAttentionProvider, GaugeConfigDialogComponent, GaugeWidgetComponent, HISTOGRAM_HOURS, HOUR_MS, HeatmapConfigDialogComponent, HeatmapWidgetComponent, KPI_ERROR_TEXT, KpiConfigDialogComponent, KpiWidgetComponent, LazyMarkdownComponent, LineChartConfigDialogComponent, LineChartWidgetComponent, MAX_RECENT_ITEMS, MAX_SCOPE_HOPS, MESHBOARD_CHROME_ROUTE_DATA, MESHBOARD_DESCRIPTION_MARKER, MESHBOARD_EDIT_QUERY_PARAM, MESHBOARD_HEADER_MODE_ROUTE_DATA, MESHBOARD_LABEL_RESOLVER, MESHBOARD_LANGUAGE, MESHBOARD_MESSAGES, MESHBOARD_OPTIONS, MESHBOARD_TENANT_ID_PROVIDER, MarkdownConfigDialogComponent, MarkdownWidgetComponent, MeshBoardDataService, MeshBoardGridService, MeshBoardManagerDialogComponent, MeshBoardPersistenceService, MeshBoardSettingsDialogComponent, MeshBoardSettingsResult, MeshBoardStateService, MeshBoardViewComponent, NOT_AVAILABLE_TEXT, PieChartConfigDialogComponent, PieChartWidgetComponent, QueryExecutorService, QuerySelectorComponent, RecentItemsConfigDialogComponent, RecentItemsWidgetComponent, RuntimeEntitySelectorComponent, SERVICE_MANAGED_BLUEPRINT_PREFIX, STATE_STATUS_BY_KEY, ServiceHealthConfigDialogComponent, ServiceHealthWidgetComponent, ServicesHealthAttentionProvider, StatsGridConfigDialogComponent, StatsGridWidgetComponent, StatusIndicatorConfigDialogComponent, StatusIndicatorWidgetComponent, StatusListConfigDialogComponent, StatusListWidgetComponent, SummaryCardConfigDialogComponent, SummaryCardWidgetComponent, TableConfigDialogComponent, TableWidgetComponent, TableWidgetDataSourceDirective, UnregisteredPoolsAttentionProvider, WidgetFactoryService, WidgetGroupComponent, WidgetGroupConfigDialogComponent, WidgetNotConfiguredComponent, WidgetRegistryService, adapterKpi, adaptersInError, adaptersOffline, blueprintUpdatesKpi, buildHourlyHistogram, categoryStatus, chartSeriesColors, ckModelKpi, classifyQuery, compareBlueprintVersions, compareMeshBoardNavigation, countFlowExecutions, countLabel, countPipelineExecutions, emptyQueryExecutionResult, enabledButNotInstalled, executionKpi, failedExecutionsSeverity, formatCockpitMessage, formatCount, humanizeCategory, isAdapterAtRest, isAdapterExpectedToRun, isAdapterOnline, isCockpitWidgetType, isMeshBoardChrome, isMeshBoardHeaderMode, isServiceConfigured, joinEncodedDescription, kpiKindOf, latestStatisticsUpdate, legacyCockpitLinkTarget, loadNgxMarkdown, nameList, newMeshBoardConfig, normalizeNavigation, observeThemeChanges, parseHostTimeRange, pickLocalizedText, pipelineExecutionInputs, plural, provideCockpitWidgetHost, provideCockpitWidgets, provideDefaultWidgets, provideMeshBoard, provideMeshBoardLanguage, provideMeshBoardMessages, provideProcessWidget, provideWidgetRegistrations, queryFamily, readMeshBoardNavigation, recentRelativeTime, registerCockpitWidgets, registerDefaultWidgets, registerProcessWidget, resolveChartColor, resolveCockpitWidgetMessages, resolveMeshBoardChrome, resolveMeshBoardHeaderMode, resolveMeshBoardLabel, resolveMeshBoardMessages, selectProviders, serviceStateText, servicesHealthKpi, sortAttentionFindings, sparklineGeometry, splitBlueprintId, splitEncodedDescription, statusColor, summarizeAdapterOnline, tenantCountKpi, toBlueprintStatus, toServiceHealthStatus, truncationNote, versionKpi, withMeshBoardNavigation };
9623
- export type { AdapterOnlineFields, AdapterOnlineSummary, AdapterStatusWidgetConfig, AggregationDataSource, AggregationQuery, AggregationType, AiInsightsConfigResult, AiInsightsWidgetConfig, AlertBannerConfigResult, AlertBannerWidgetConfig, AlertListConfigResult, AlertListWidgetConfig, AnyWidgetConfig, AssociationsConfigResult, AttentionContext, AttentionFinding, AttentionLink, AttentionListConfigResult, AttentionListWidgetConfig, AttentionProvider, AttentionProviderInfo, AttentionSeverity, AttentionState, BarChartColorThreshold, BarChartConfigResult, BarChartSeries, BarChartType, BarChartWidgetConfig, BaseWidgetConfig, BlueprintUpdatesWidgetConfig, CategoryStatus, CategoryValueItem, ChartReferenceLine, CkModelStateWidgetConfig, CkQueryResult, CkQueryTarget, CkTypeAttributeInfo, CockpitAdapterState, CockpitAdapterStates, CockpitBlueprintStatus, CockpitBlueprintUpdate, CockpitChildTenants, CockpitCkModelCounts, CockpitDataFlowExecutions, CockpitDataFlowRow, CockpitExecutionCounts, CockpitExplainHandler, CockpitExplainTarget, CockpitKpi, CockpitKpiConfigResult, CockpitKpiKind, CockpitKpiResult, CockpitKpiStatus, CockpitKpiWidgetConfig, CockpitKpiWidgetOptions, CockpitLinkQueryParams, CockpitLinkResolver, CockpitLinkTarget, CockpitRecentItem, CockpitRecentItemKind, CockpitRecentItemsSource, CockpitResolvedLink, CockpitRouteLinkTarget, CockpitServiceHealth, CockpitServiceHealthStatus, CockpitServiceKey, CockpitVersionEntry, CockpitVersionSource, CockpitViewerAccess, CockpitWidgetHost, CockpitWidgetMessages, CockpitWidgetMessagesSource, CockpitWidgetType, ConfigDialogResult, ConfigResultApplier, ConstructionKitQueryDataSource, DashboardConfig, DashboardWidget, DataSource, DataSourceType, DiagramPropertyMapping, EncodedDescription, EntityAssociation, EntityAttribute, EntityCardConfigResult, EntityCardWidgetConfig, EntityListWidget, EntitySelectorAttributeMapping, EntitySelectorChildScope, EntitySelectorClearEvent, EntitySelectorConfig, EntitySelectorEvent, EntitySelectorScopeHop, EntitySelectorScopeState, EntityWidget, EntityWithAssociationsWidgetConfig, FailedExecutionsAttentionOptions, GaugeConfigResult, GaugeRange, GaugeType, GaugeWidgetConfig, GridCell, GridPosition, GroupChildWidgetType, GroupedDataItem, HeatmapAggregation, HeatmapColorMode, HeatmapColorScheme, HeatmapConfigResult, HeatmapWidgetConfig, HostTimeRangeState, HourlyExecutionBucket, HourlyHistogramOptions, KpiConfigResult, KpiDataSourceType, KpiQueryMode, KpiValueMode, KpiWidgetConfig, LatestExecutionInput, LineChartConfigResult, LineChartType, LineChartWidgetConfig, MarkdownConfigResult, MarkdownTextAlign, MarkdownWidgetConfig, MeshBoardChrome, MeshBoardConfig, MeshBoardHeaderMode, MeshBoardHostTimeRange, MeshBoardLabelKind, MeshBoardLabelRequest, MeshBoardLabelResolver, MeshBoardLanguageSource, MeshBoardMessages, MeshBoardMessagesSource, MeshBoardNavigationConfig, MeshBoardOptions, MeshBoardTimeFilterConfig, MeshBoardTimeFilterControl, MeshBoardTimeZoneMode, MeshBoardVariable, MeshBoardVariableSource, MeshBoardVariableType, ParentAssociationMode, PersistedDashboard, PersistedMeshBoard, PersistedWidget, PersistedWidgetData, PersistentQueryCellMode, PersistentQueryCellSource, PersistentQueryDataSource, PersistentQueryItem, PieChartConfigResult, PieChartLabelPosition, PieChartType, PieChartWidgetConfig, PipelineExecutionCounts, PipelineExecutionInput, PipelineExecutionsWidgetConfig, PipelineStatisticsInput, ProcessWidgetConfig, Quarter, QueryCell, QueryClassification, QueryColumn, QueryColumnInfo, QueryColumnItem, QueryExecutionOptions, QueryExecutionResult, QueryFamily, QueryKind, QueryResultRow, RawHourBucket, RecentItemsConfigResult, RecentItemsWidgetConfig, RelativeTimeUnit, RepeaterDataItem, RepeaterQueryDataSource, RuntimeEntityData, RuntimeEntityDataSource, RuntimeEntitySelectorValue, SeriesAggregationFunction, SeriesResolutionResult, ServiceCallDataSource, ServiceCallType, ServiceHealthConfigResult, ServiceHealthWidgetConfig, ServicesHealthWidgetConfig, SparklineGeometry, StatColor, StatItem, StaticDataSource, StatsGridConfigResult, StatsGridWidgetConfig, StatusIndicatorConfigResult, StatusIndicatorWidgetConfig, StatusListConfigResult, StatusListWidgetConfig, StreamDataExecutionArgs, StreamDataScope, SummaryCardConfigResult, SummaryCardTile, SummaryCardWidgetConfig, TableColumn, TableColumnStatusIconMapping, TableColumnValueLabel, TableConfigResult, TableFilterConfig, TableSortConfig, TableWidgetConfig, TargetEntityWithAttributes, TenantCountWidgetConfig, TimeRangePickerConfig, TimeRangeSelection, TimeRangeType, UpdateDashboardResult, VariableResolutionError, VersionInfoWidgetConfig, WidgetConfig, WidgetConfigDialog, WidgetConfigDialogSize, WidgetConfigResult, WidgetCreationOptions, WidgetDataSource, WidgetFilterConfig, WidgetGroupAttributeMappings, WidgetGroupChildTemplate, WidgetGroupConfig, WidgetGroupConfigResult, WidgetGroupLayout, WidgetPersistenceData, WidgetPositionUpdate, WidgetRegistration, WidgetType, WidgetZone };
10152
+ export { ADAPTER_OFFLINE_GRACE_MS, ASSOCIATION_HOP_SOURCE_BATCH, ASSOCIATION_HOP_TARGETS_PER_SOURCE, ATTENTION_SEVERITY_ORDER, AdaptersAttentionProvider, AddWidgetDialogComponent, AiInsightsConfigDialogComponent, AiInsightsService, AiInsightsWidgetComponent, AlertBannerConfigDialogComponent, AlertBannerWidgetComponent, AlertListConfigDialogComponent, AlertListWidgetComponent, AssociationsConfigDialogComponent, AttentionListConfigDialogComponent, AttentionListWidgetComponent, AutoRefreshTimerService, BUILT_IN_ATTENTION_PROVIDERS, BarChartConfigDialogComponent, BarChartWidgetComponent, BlueprintUpdatesAttentionProvider, COCKPIT_ADAPTER_LIMIT, COCKPIT_ATTENTION_PROVIDERS, COCKPIT_BLUEPRINT_CATALOG_LIMIT, COCKPIT_CHILD_TENANT_IDS, COCKPIT_DATA_FLOW_LIMIT, COCKPIT_EXPLAIN_HANDLER, COCKPIT_FAILED_EXECUTIONS_OPTIONS, COCKPIT_KPI_GATES, COCKPIT_KPI_SLOW_LOADING_MS, COCKPIT_LINK_RESOLVER, COCKPIT_RECENT_ITEMS, COCKPIT_ROLES, COCKPIT_SERVICE_NAMES, COCKPIT_VERSION_SOURCE, COCKPIT_VIEWER_ACCESS, COCKPIT_WIDGET_MESSAGES, COCKPIT_WIDGET_TYPES, CkModelsResolveFailedAttentionProvider, CockpitAdapterStatesService, CockpitAttentionService, CockpitBlueprintStatusService, CockpitChildTenantsService, CockpitCkModelStatesService, CockpitContextService, CockpitDataFlowExecutionsService, CockpitKpiConfigDialogComponent, CockpitKpiService, CockpitKpiWidgetComponent, CockpitServiceHealthService, DAY_MS, DEFAULT_ATTENTION_MAX_ITEMS, DEFAULT_COCKPIT_WIDGET_MESSAGES, DEFAULT_FAILED_EXECUTIONS_OPTIONS, DEFAULT_MESHBOARD_MESSAGES, DEFAULT_RECENT_ITEMS_MAX, DEFAULT_TIME_ZONE_MODE, DashboardDataService, DashboardGridService, EditModeStateService, EditWidgetDialogComponent, EntityAssociationsWidgetComponent, EntityCardConfigDialogComponent, EntityCardWidgetComponent, EntityDetailDialogComponent, EntitySelectorEditorComponent, EntitySelectorScopePathEditorComponent, EntitySelectorToolbarComponent, FALLBACK_SERIES_COLORS, FailedExecutionsAttentionProvider, FeaturesNotInstalledAttentionProvider, FormulaFieldComponent, GaugeConfigDialogComponent, GaugeWidgetComponent, HISTOGRAM_HOURS, HOUR_MS, HeatmapConfigDialogComponent, HeatmapWidgetComponent, KPI_ERROR_TEXT, KpiConfigDialogComponent, KpiWidgetComponent, LazyMarkdownComponent, LineChartConfigDialogComponent, LineChartWidgetComponent, MAX_RECENT_ITEMS, MAX_SCOPE_HOPS, MESHBOARD_CHROME_ROUTE_DATA, MESHBOARD_DESCRIPTION_MARKER, MESHBOARD_EDIT_QUERY_PARAM, MESHBOARD_HEADER_MODE_ROUTE_DATA, MESHBOARD_LABEL_RESOLVER, MESHBOARD_LANGUAGE, MESHBOARD_MESSAGES, MESHBOARD_OPTIONS, MESHBOARD_TENANT_ID_PROVIDER, MarkdownConfigDialogComponent, MarkdownWidgetComponent, MeshBoardDataService, MeshBoardGridService, MeshBoardManagerDialogComponent, MeshBoardPersistenceService, MeshBoardSettingsDialogComponent, MeshBoardSettingsResult, MeshBoardStateService, MeshBoardViewComponent, NOT_AVAILABLE_TEXT, PieChartConfigDialogComponent, PieChartWidgetComponent, QueryExecutorService, QuerySelectorComponent, RecentItemsConfigDialogComponent, RecentItemsWidgetComponent, RuntimeEntitySelectorComponent, SERVICE_MANAGED_BLUEPRINT_PREFIX, STATE_STATUS_BY_KEY, ServiceHealthConfigDialogComponent, ServiceHealthWidgetComponent, ServicesHealthAttentionProvider, StatsGridConfigDialogComponent, StatsGridWidgetComponent, StatusIndicatorConfigDialogComponent, StatusIndicatorWidgetComponent, StatusListConfigDialogComponent, StatusListWidgetComponent, SummaryCardConfigDialogComponent, SummaryCardWidgetComponent, TableConfigDialogComponent, TableWidgetComponent, TableWidgetDataSourceDirective, UnregisteredPoolsAttentionProvider, WidgetFactoryService, WidgetGroupComponent, WidgetGroupConfigDialogComponent, WidgetNotConfiguredComponent, WidgetRegistryService, adapterKpi, adaptersInError, adaptersOffline, blueprintUpdatesKpi, buildHourlyHistogram, categoryStatus, chartSeriesColors, ckModelKpi, classifyQuery, compareBlueprintVersions, compareMeshBoardNavigation, countFlowExecutions, countLabel, countPipelineExecutions, emptyQueryExecutionResult, enabledButNotInstalled, executionKpi, failedExecutionsSeverity, formatCockpitMessage, formatCount, humanizeCategory, isAdapterAtRest, isAdapterExpectedToRun, isAdapterOnline, isCockpitWidgetType, isMeshBoardChrome, isMeshBoardHeaderMode, isServiceConfigured, joinEncodedDescription, kpiKindOf, latestStatisticsUpdate, legacyCockpitLinkTarget, loadNgxMarkdown, nameList, newMeshBoardConfig, normalizeNavigation, observeThemeChanges, parseHostTimeRange, pickLocalizedText, pipelineExecutionInputs, plural, provideCockpitWidgetHost, provideCockpitWidgets, provideDefaultWidgets, provideMeshBoard, provideMeshBoardLanguage, provideMeshBoardMessages, provideProcessWidget, provideWidgetRegistrations, queryFamily, readMeshBoardNavigation, recentRelativeTime, registerCockpitWidgets, registerDefaultWidgets, registerProcessWidget, resolveChartColor, resolveCockpitWidgetMessages, resolveMeshBoardChrome, resolveMeshBoardHeaderMode, resolveMeshBoardLabel, resolveMeshBoardMessages, selectProviders, serviceStateText, servicesHealthKpi, sortAttentionFindings, sparklineGeometry, splitBlueprintId, splitEncodedDescription, statusColor, summarizeAdapterOnline, tenantCountKpi, toBlueprintStatus, toServiceHealthStatus, truncationNote, versionKpi, withMeshBoardNavigation };
10153
+ export type { AdapterOnlineFields, AdapterOnlineSummary, AdapterStatusWidgetConfig, AggregationDataSource, AggregationQuery, AggregationType, AiInsightsConfigResult, AiInsightsWidgetConfig, AlertBannerConfigResult, AlertBannerWidgetConfig, AlertListConfigResult, AlertListWidgetConfig, AnyWidgetConfig, AssociationsConfigResult, AttentionContext, AttentionFinding, AttentionLink, AttentionListConfigResult, AttentionListWidgetConfig, AttentionProvider, AttentionProviderInfo, AttentionSeverity, AttentionState, BarChartColorThreshold, BarChartConfigResult, BarChartSeries, BarChartType, BarChartWidgetConfig, BaseWidgetConfig, BlueprintUpdatesWidgetConfig, CategoryStatus, CategoryValueItem, ChartReferenceLine, CkModelStateWidgetConfig, CkQueryResult, CkQueryTarget, CkTypeAttributeInfo, CockpitAdapterState, CockpitAdapterStates, CockpitBlueprintStatus, CockpitBlueprintUpdate, CockpitChildTenants, CockpitCkModelCounts, CockpitDataFlowExecutions, CockpitDataFlowRow, CockpitExecutionCounts, CockpitExplainHandler, CockpitExplainTarget, CockpitKpi, CockpitKpiConfigResult, CockpitKpiKind, CockpitKpiResult, CockpitKpiStatus, CockpitKpiWidgetConfig, CockpitKpiWidgetOptions, CockpitLinkQueryParams, CockpitLinkResolver, CockpitLinkTarget, CockpitRecentItem, CockpitRecentItemKind, CockpitRecentItemsSource, CockpitResolvedLink, CockpitRouteLinkTarget, CockpitServiceHealth, CockpitServiceHealthStatus, CockpitServiceKey, CockpitVersionEntry, CockpitVersionSource, CockpitViewerAccess, CockpitWidgetHost, CockpitWidgetMessages, CockpitWidgetMessagesSource, CockpitWidgetType, ConfigDialogResult, ConfigResultApplier, ConstructionKitQueryDataSource, DashboardConfig, DashboardWidget, DataSource, DataSourceType, DiagramPropertyMapping, EncodedDescription, EntityAssociation, EntityAttribute, EntityCardConfigResult, EntityCardWidgetConfig, EntityListWidget, EntitySelectorAttributeMapping, EntitySelectorChildScope, EntitySelectorClearEvent, EntitySelectorConfig, EntitySelectorEvent, EntitySelectorScopeHop, EntitySelectorScopeSource, EntitySelectorScopeState, EntityWidget, EntityWithAssociationsWidgetConfig, FailedExecutionsAttentionOptions, GaugeConfigResult, GaugeRange, GaugeType, GaugeWidgetConfig, GridCell, GridPosition, GroupChildWidgetType, GroupedDataItem, HeatmapAggregation, HeatmapColorMode, HeatmapColorScheme, HeatmapConfigResult, HeatmapTimeWindow, HeatmapWidgetConfig, HostTimeRangeState, HourlyExecutionBucket, HourlyHistogramOptions, KpiConfigResult, KpiDataSourceType, KpiQueryMode, KpiValueMode, KpiWidgetConfig, LatestExecutionInput, LineChartConfigResult, LineChartType, LineChartWidgetConfig, MarkdownConfigResult, MarkdownTextAlign, MarkdownWidgetConfig, MeshBoardChrome, MeshBoardConfig, MeshBoardHeaderMode, MeshBoardHostTimeRange, MeshBoardLabelKind, MeshBoardLabelRequest, MeshBoardLabelResolver, MeshBoardLanguageSource, MeshBoardMessages, MeshBoardMessagesSource, MeshBoardNavigationConfig, MeshBoardOptions, MeshBoardTimeFilterConfig, MeshBoardTimeFilterControl, MeshBoardTimeZoneMode, MeshBoardVariable, MeshBoardVariableSource, MeshBoardVariableType, ParentAssociationMode, PersistedDashboard, PersistedMeshBoard, PersistedWidget, PersistedWidgetData, PersistentQueryCellMode, PersistentQueryCellSource, PersistentQueryDataSource, PersistentQueryItem, PieChartConfigResult, PieChartLabelPosition, PieChartType, PieChartWidgetConfig, PipelineExecutionCounts, PipelineExecutionInput, PipelineExecutionsWidgetConfig, PipelineStatisticsInput, ProcessWidgetConfig, Quarter, QueryCell, QueryClassification, QueryColumn, QueryColumnInfo, QueryColumnItem, QueryExecutionOptions, QueryExecutionResult, QueryFamily, QueryKind, QueryResultRow, RawHourBucket, RecentItemsConfigResult, RecentItemsWidgetConfig, RelativeTimeUnit, RepeaterDataItem, RepeaterQueryDataSource, RuntimeEntityData, RuntimeEntityDataSource, RuntimeEntitySelectorValue, SeriesAggregationFunction, SeriesResolutionResult, ServiceCallDataSource, ServiceCallType, ServiceHealthConfigResult, ServiceHealthWidgetConfig, ServicesHealthWidgetConfig, SparklineGeometry, StatColor, StatItem, StaticDataSource, StatsGridConfigResult, StatsGridWidgetConfig, StatusIndicatorConfigResult, StatusIndicatorWidgetConfig, StatusListConfigResult, StatusListWidgetConfig, StreamDataExecutionArgs, StreamDataScope, SummaryCardConfigResult, SummaryCardTile, SummaryCardWidgetConfig, TableColumn, TableColumnStatusIconMapping, TableColumnValueLabel, TableConfigResult, TableFilterConfig, TableSortConfig, TableWidgetConfig, TargetEntityWithAttributes, TenantCountWidgetConfig, TimeRangePickerConfig, TimeRangeSelection, TimeRangeType, UpdateDashboardResult, VariableResolutionError, VersionInfoWidgetConfig, WidgetConfig, WidgetConfigDialog, WidgetConfigDialogSize, WidgetConfigResult, WidgetCreationOptions, WidgetDataSource, WidgetFilterConfig, WidgetGroupAttributeMappings, WidgetGroupChildTemplate, WidgetGroupConfig, WidgetGroupConfigResult, WidgetGroupLayout, WidgetPersistenceData, WidgetPositionUpdate, WidgetRegistration, WidgetType, WidgetZone };