@c8y/ngx-components 1023.92.0 → 1023.97.3

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.
Files changed (111) hide show
  1. package/ai/agents/scada/index.d.ts +10 -0
  2. package/ai/agents/scada/index.d.ts.map +1 -0
  3. package/ai/ai-chat/index.d.ts +1 -1
  4. package/ai/ai-chat/index.d.ts.map +1 -1
  5. package/alarms/index.d.ts.map +1 -1
  6. package/computed-asset-properties/index.d.ts +89 -1
  7. package/computed-asset-properties/index.d.ts.map +1 -1
  8. package/context-dashboard/device/view/index.d.ts +24 -1
  9. package/context-dashboard/device/view/index.d.ts.map +1 -1
  10. package/context-dashboard/index.d.ts +27 -11
  11. package/context-dashboard/index.d.ts.map +1 -1
  12. package/echart/index.d.ts.map +1 -1
  13. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs +2 -2
  14. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs.map +1 -1
  15. package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs +893 -0
  16. package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs.map +1 -0
  17. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs +1 -0
  18. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs.map +1 -1
  19. package/fesm2022/c8y-ngx-components-alarms.mjs +12 -5
  20. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-asset-properties.mjs +2 -2
  22. package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
  23. package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-Cy9R6Ixb.mjs → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CHZX7ALq.mjs} +10 -9
  24. package/fesm2022/c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CHZX7ALq.mjs.map +1 -0
  25. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-LrmlAh6V.mjs → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DgWGXzEx.mjs} +2 -2
  26. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-LrmlAh6V.mjs.map → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DgWGXzEx.mjs.map} +1 -1
  27. package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-f1u1TcCl.mjs → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-yfc45-l_.mjs} +2 -2
  28. package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-f1u1TcCl.mjs.map → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-yfc45-l_.mjs.map} +1 -1
  29. package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs +1 -1
  30. package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs +21 -3
  31. package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs.map +1 -1
  32. package/fesm2022/c8y-ngx-components-context-dashboard-devicemanagement.mjs +2 -2
  33. package/fesm2022/c8y-ngx-components-context-dashboard-devicemanagement.mjs.map +1 -1
  34. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +69 -51
  35. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  36. package/fesm2022/c8y-ngx-components-echart.mjs +52 -36
  37. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  38. package/fesm2022/c8y-ngx-components-global-context.mjs +112 -22
  39. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  40. package/fesm2022/c8y-ngx-components-map.mjs +15 -0
  41. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  42. package/fesm2022/c8y-ngx-components-repository-configuration.mjs +292 -115
  43. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  44. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +2 -2
  45. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  46. package/fesm2022/c8y-ngx-components-repository-software.mjs +1 -1
  47. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  48. package/fesm2022/c8y-ngx-components-upgrade.mjs +12 -1
  49. package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
  50. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +2 -1
  51. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
  52. package/fesm2022/c8y-ngx-components-widgets-definitions-scada.mjs +169 -0
  53. package/fesm2022/c8y-ngx-components-widgets-definitions-scada.mjs.map +1 -0
  54. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +2 -1
  55. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  56. package/fesm2022/c8y-ngx-components-widgets-exports.mjs +8 -1
  57. package/fesm2022/c8y-ngx-components-widgets-exports.mjs.map +1 -1
  58. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +2 -2
  59. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  60. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +3 -3
  61. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  62. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs +2 -2
  63. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs.map +1 -1
  64. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +2 -2
  65. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  66. package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs +2 -2
  67. package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs.map +1 -1
  68. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +90 -32
  69. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
  70. package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs +2 -2
  71. package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
  72. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs +1698 -0
  73. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs.map +1 -0
  74. package/fesm2022/c8y-ngx-components.mjs +220 -45
  75. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  76. package/global-context/index.d.ts +58 -3
  77. package/global-context/index.d.ts.map +1 -1
  78. package/index.d.ts +79 -22
  79. package/index.d.ts.map +1 -1
  80. package/locales/de.po +165 -3
  81. package/locales/es.po +165 -3
  82. package/locales/fr.po +165 -3
  83. package/locales/ja_JP.po +165 -3
  84. package/locales/ko.po +165 -3
  85. package/locales/locales.pot +156 -3
  86. package/locales/nl.po +165 -3
  87. package/locales/pl.po +165 -3
  88. package/locales/pt_BR.po +165 -3
  89. package/locales/zh_CN.po +165 -3
  90. package/locales/zh_TW.po +165 -3
  91. package/map/index.d.ts.map +1 -1
  92. package/package.json +1 -1
  93. package/repository/configuration/index.d.ts +64 -39
  94. package/repository/configuration/index.d.ts.map +1 -1
  95. package/upgrade/index.d.ts +1 -0
  96. package/upgrade/index.d.ts.map +1 -1
  97. package/widgets/cockpit-exports/index.d.ts +6 -0
  98. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  99. package/widgets/definitions/index.d.ts +1 -0
  100. package/widgets/definitions/index.d.ts.map +1 -1
  101. package/widgets/definitions/scada/index.d.ts +6 -0
  102. package/widgets/definitions/scada/index.d.ts.map +1 -0
  103. package/widgets/device-management-exports/index.d.ts +6 -0
  104. package/widgets/device-management-exports/index.d.ts.map +1 -1
  105. package/widgets/exports/index.d.ts +8 -1
  106. package/widgets/exports/index.d.ts.map +1 -1
  107. package/widgets/implementations/html-widget/index.d.ts +30 -12
  108. package/widgets/implementations/html-widget/index.d.ts.map +1 -1
  109. package/widgets/implementations/scada/index.d.ts +415 -0
  110. package/widgets/implementations/scada/index.d.ts.map +1 -0
  111. package/fesm2022/c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-Cy9R6Ixb.mjs.map +0 -1
@@ -3559,13 +3559,18 @@ class LiveModeConfigurationControlsComponent {
3559
3559
  if (!value) {
3560
3560
  return;
3561
3561
  }
3562
+ // fillMissingDefaults already returns a fresh top-level object, and
3563
+ // patchFormFromContext clones `dateTimeContext` before handing it to
3564
+ // the form control — so we don't need to deep-clone the whole tree.
3565
+ // Skipping the clone also avoids a `structuredClone` throw when the
3566
+ // config contains non-cloneable values (e.g. SCADA stores function
3567
+ // references in widget settings).
3562
3568
  const normalized = fillMissingDefaults({
3563
3569
  ...value,
3564
3570
  refreshOption: REFRESH_OPTION.LIVE
3565
3571
  });
3566
- const cloned = structuredClone(normalized);
3567
- this.currentContext.set(cloned);
3568
- this.patchFormFromContext(cloned);
3572
+ this.currentContext.set(normalized);
3573
+ this.patchFormFromContext(normalized);
3569
3574
  }
3570
3575
  constructor() {
3571
3576
  // Popover messages for translation extraction
@@ -11010,7 +11015,7 @@ const CONTROL_PRESETS = {
11010
11015
  /**
11011
11016
  * For auto-refresh-only widgets (no history mode, no live time range support).
11012
11017
  * The `config` mode is intentionally empty so the widget renders no controls in
11013
- * the configuration sidebar (used by the HTML widget).
11018
+ * the widget title bar.
11014
11019
  */
11015
11020
  [PRESET_NAME.AUTO_REFRESH_ONLY]: {
11016
11021
  dashboard: [CONTEXT_FEATURE.AUTO_REFRESH, CONTEXT_FEATURE.REFRESH],
@@ -11454,8 +11459,37 @@ class ContextControlsComponent {
11454
11459
  this.displayMode = input(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD, ...(ngDevMode ? [{ debugName: "displayMode" }] : []));
11455
11460
  this.config = input.required(...(ngDevMode ? [{ debugName: "config" }] : []));
11456
11461
  this.isLoading = input(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
11457
- this.emitRefresh = input(true, ...(ngDevMode ? [{ debugName: "emitRefresh" }] : []));
11462
+ /**
11463
+ * Controls whether dashboard-wide auto-refresh cycles are forwarded as `configChange` events.
11464
+ *
11465
+ * When `true` (default), global `REFRESH` events emitted by the dashboard are translated
11466
+ * into `configChange` emissions with updated date/time context — allowing the widget to
11467
+ * react to automatic refresh intervals set in the dashboard controls.
11468
+ *
11469
+ * When `false`, those global refresh cycles are ignored and only actual user-initiated
11470
+ * context state changes (e.g. date range selection) trigger `configChange`.
11471
+ *
11472
+ * **This input does not affect the `refresh` output.**
11473
+ */
11474
+ this.propagateAutoRefresh = input(true, ...(ngDevMode ? [{ debugName: "propagateAutoRefresh" }] : []));
11475
+ /**
11476
+ * @deprecated Use `propagateAutoRefresh` instead. Will be removed in a future version.
11477
+ *
11478
+ * Controls whether dashboard-wide auto-refresh cycles are forwarded as `configChange` events.
11479
+ * When set, takes precedence over `propagateAutoRefresh` for backward compatibility.
11480
+ */
11481
+ this.emitRefresh = input(undefined, ...(ngDevMode ? [{ debugName: "emitRefresh" }] : []));
11482
+ /** @internal Resolves the effective value of `propagateAutoRefresh`, respecting the deprecated `emitRefresh` alias. */
11483
+ this._propagateAutoRefresh = computed(() => this.emitRefresh() ?? this.propagateAutoRefresh(), ...(ngDevMode ? [{ debugName: "_propagateAutoRefresh" }] : []));
11458
11484
  this.configChange = output();
11485
+ /**
11486
+ * Emitted when the user manually triggers a refresh via the local context controls,
11487
+ * but the resulting context state did not change — so no `configChange` was emitted.
11488
+ *
11489
+ * The parent widget should react by reloading its data without updating the context.
11490
+ *
11491
+ * **This output does not depend on the `propagateAutoRefresh` and `emitRefresh` inputs.**
11492
+ */
11459
11493
  this.refresh = output();
11460
11494
  this.lastEmittedState = signal({}, ...(ngDevMode ? [{ debugName: "lastEmittedState" }] : []));
11461
11495
  this.visibleControls = computed(() => {
@@ -11512,7 +11546,7 @@ class ContextControlsComponent {
11512
11546
  this.emitInitialNonDashboardState();
11513
11547
  }
11514
11548
  onAutoRefresh() {
11515
- if (this.emitRefresh()) {
11549
+ if (this._propagateAutoRefresh()) {
11516
11550
  this.onRefresh();
11517
11551
  }
11518
11552
  }
@@ -11596,7 +11630,7 @@ class ContextControlsComponent {
11596
11630
  return [from, to];
11597
11631
  }
11598
11632
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ContextControlsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11599
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: ContextControlsComponent, isStandalone: true, selector: "c8y-context-controls", inputs: { controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: false, transformFunction: null }, displayMode: { classPropertyName: "displayMode", publicName: "displayMode", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, emitRefresh: { classPropertyName: "emitRefresh", publicName: "emitRefresh", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { configChange: "configChange", refresh: "refresh" }, ngImport: i0, template: `
11633
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: ContextControlsComponent, isStandalone: true, selector: "c8y-context-controls", inputs: { controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: false, transformFunction: null }, displayMode: { classPropertyName: "displayMode", publicName: "displayMode", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, propagateAutoRefresh: { classPropertyName: "propagateAutoRefresh", publicName: "propagateAutoRefresh", isSignal: true, isRequired: false, transformFunction: null }, emitRefresh: { classPropertyName: "emitRefresh", publicName: "emitRefresh", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { configChange: "configChange", refresh: "refresh" }, ngImport: i0, template: `
11600
11634
  <form class="d-flex gap-16 h-auto min-width-0 widget-controls" [formGroup]="form">
11601
11635
  <div class="input-group w-auto min-width-0">
11602
11636
  @if (visibleControls()?.includes('aggregation')) {
@@ -11722,7 +11756,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
11722
11756
  </form>
11723
11757
  `
11724
11758
  }]
11725
- }], ctorParameters: () => [], propDecorators: { controls: [{ type: i0.Input, args: [{ isSignal: true, alias: "controls", required: false }] }], displayMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayMode", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], emitRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitRefresh", required: false }] }], configChange: [{ type: i0.Output, args: ["configChange"] }], refresh: [{ type: i0.Output, args: ["refresh"] }] } });
11759
+ }], ctorParameters: () => [], propDecorators: { controls: [{ type: i0.Input, args: [{ isSignal: true, alias: "controls", required: false }] }], displayMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayMode", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], propagateAutoRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "propagateAutoRefresh", required: false }] }], emitRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitRefresh", required: false }] }], configChange: [{ type: i0.Output, args: ["configChange"] }], refresh: [{ type: i0.Output, args: ["refresh"] }] } });
11726
11760
 
11727
11761
  class HeaderTemplateService {
11728
11762
  /**
@@ -11886,7 +11920,7 @@ class LinkButtonsComponent {
11886
11920
  </div>
11887
11921
  <ng-template #masterTooltipTemplate>{{ masterTooltipText() }}</ng-template>
11888
11922
  </ng-template>
11889
- `, isInline: true, dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: ContextControlsComponent, selector: "c8y-context-controls", inputs: ["controls", "displayMode", "config", "isLoading", "emitRefresh"], outputs: ["configChange", "refresh"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11923
+ `, isInline: true, dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: ContextControlsComponent, selector: "c8y-context-controls", inputs: ["controls", "displayMode", "config", "isLoading", "propagateAutoRefresh", "emitRefresh"], outputs: ["configChange", "refresh"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11890
11924
  }
11891
11925
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: LinkButtonsComponent, decorators: [{
11892
11926
  type: Component,
@@ -11959,9 +11993,37 @@ class GlobalContextConnectorComponent {
11959
11993
  this.dashboardChildInput = input(undefined, ...(ngDevMode ? [{ debugName: "dashboardChildInput", alias: 'dashboardChild' }] : [{ alias: 'dashboardChild' }]));
11960
11994
  this.dashboardChild = computed(() => this.dashboardChildInput() ?? this.injectedDashboardChild, ...(ngDevMode ? [{ debugName: "dashboardChild" }] : []));
11961
11995
  this.linked = input(undefined, ...(ngDevMode ? [{ debugName: "linked" }] : []));
11962
- /** When false, refresh events are not emitted as configChange - only user-initiated state changes */
11963
- this.emitRefresh = input(true, ...(ngDevMode ? [{ debugName: "emitRefresh" }] : []));
11996
+ /**
11997
+ * Controls whether dashboard-wide auto-refresh cycles are forwarded as `configChange` events.
11998
+ *
11999
+ * When `true` (default), global `REFRESH` events emitted by the dashboard are translated
12000
+ * into `configChange` emissions with updated date/time context — allowing the widget to
12001
+ * react to automatic refresh intervals set in the dashboard controls.
12002
+ *
12003
+ * When `false`, those global refresh cycles are ignored and only actual user-initiated
12004
+ * context state changes (e.g. date range selection) trigger `configChange`.
12005
+ *
12006
+ * **This input does not affect the `refresh` output.**
12007
+ */
12008
+ this.propagateAutoRefresh = input(true, ...(ngDevMode ? [{ debugName: "propagateAutoRefresh" }] : []));
12009
+ /**
12010
+ * @deprecated Use `propagateAutoRefresh` instead. Will be removed in a future version.
12011
+ *
12012
+ * Controls whether dashboard-wide auto-refresh cycles are forwarded as `configChange` events.
12013
+ * When set, takes precedence over `propagateAutoRefresh` for backward compatibility.
12014
+ */
12015
+ this.emitRefresh = input(undefined, ...(ngDevMode ? [{ debugName: "emitRefresh" }] : []));
12016
+ /** @internal Resolves the effective value of `propagateAutoRefresh`, respecting the deprecated `emitRefresh` alias. */
12017
+ this._propagateAutoRefresh = computed(() => this.emitRefresh() ?? this.propagateAutoRefresh(), ...(ngDevMode ? [{ debugName: "_propagateAutoRefresh" }] : []));
11964
12018
  this.configChange = output();
12019
+ /**
12020
+ * Emitted when the user manually triggers a refresh via the local context controls,
12021
+ * but the resulting context state did not change — so no `configChange` was emitted.
12022
+ *
12023
+ * The parent widget should react by reloading its data without updating the context.
12024
+ *
12025
+ * **This output does not depend on the `propagateAutoRefresh` and `emitRefresh` inputs.**
12026
+ */
11965
12027
  this.refresh = output();
11966
12028
  this.linkedChange = output();
11967
12029
  this.isLinked = signal(true, ...(ngDevMode ? [{ debugName: "isLinked" }] : []));
@@ -12046,8 +12108,9 @@ class GlobalContextConnectorComponent {
12046
12108
  if (cached)
12047
12109
  this.emitIfChanged(cached);
12048
12110
  const stateChanges$ = this.eventService.on(GLOBAL_CONTEXT_EVENTS.STATE_CHANGE);
12111
+ // Only include refresh events if propagateAutoRefresh is true
12049
12112
  let source$ = stateChanges$;
12050
- if (this.emitRefresh()) {
12113
+ if (this._propagateAutoRefresh()) {
12051
12114
  const refresh$ = this.eventService.on(GLOBAL_CONTEXT_EVENTS.REFRESH).pipe(map$1(data => ({
12052
12115
  ...this.config(),
12053
12116
  dateTimeContext: {
@@ -12096,7 +12159,7 @@ class GlobalContextConnectorComponent {
12096
12159
  });
12097
12160
  }
12098
12161
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: GlobalContextConnectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12099
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: GlobalContextConnectorComponent, isStandalone: true, selector: "c8y-global-context-connector", inputs: { controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, dashboardChildInput: { classPropertyName: "dashboardChildInput", publicName: "dashboardChild", isSignal: true, isRequired: false, transformFunction: null }, linked: { classPropertyName: "linked", publicName: "linked", isSignal: true, isRequired: false, transformFunction: null }, emitRefresh: { classPropertyName: "emitRefresh", publicName: "emitRefresh", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { configChange: "configChange", refresh: "refresh", linkedChange: "linkedChange" }, ngImport: i0, template: `
12162
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: GlobalContextConnectorComponent, isStandalone: true, selector: "c8y-global-context-connector", inputs: { controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, dashboardChildInput: { classPropertyName: "dashboardChildInput", publicName: "dashboardChild", isSignal: true, isRequired: false, transformFunction: null }, linked: { classPropertyName: "linked", publicName: "linked", isSignal: true, isRequired: false, transformFunction: null }, propagateAutoRefresh: { classPropertyName: "propagateAutoRefresh", publicName: "propagateAutoRefresh", isSignal: true, isRequired: false, transformFunction: null }, emitRefresh: { classPropertyName: "emitRefresh", publicName: "emitRefresh", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { configChange: "configChange", refresh: "refresh", linkedChange: "linkedChange" }, ngImport: i0, template: `
12100
12163
  @if (hasActiveControls()) {
12101
12164
  <c8y-link-buttons
12102
12165
  [dashboardChild]="dashboardChild()"
@@ -12134,7 +12197,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
12134
12197
  }
12135
12198
  `
12136
12199
  }]
12137
- }], ctorParameters: () => [], propDecorators: { controls: [{ type: i0.Input, args: [{ isSignal: true, alias: "controls", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], dashboardChildInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "dashboardChild", required: false }] }], linked: [{ type: i0.Input, args: [{ isSignal: true, alias: "linked", required: false }] }], emitRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitRefresh", required: false }] }], configChange: [{ type: i0.Output, args: ["configChange"] }], refresh: [{ type: i0.Output, args: ["refresh"] }], linkedChange: [{ type: i0.Output, args: ["linkedChange"] }] } });
12200
+ }], ctorParameters: () => [], propDecorators: { controls: [{ type: i0.Input, args: [{ isSignal: true, alias: "controls", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], dashboardChildInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "dashboardChild", required: false }] }], linked: [{ type: i0.Input, args: [{ isSignal: true, alias: "linked", required: false }] }], propagateAutoRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "propagateAutoRefresh", required: false }] }], emitRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitRefresh", required: false }] }], configChange: [{ type: i0.Output, args: ["configChange"] }], refresh: [{ type: i0.Output, args: ["refresh"] }], linkedChange: [{ type: i0.Output, args: ["linkedChange"] }] } });
12138
12201
 
12139
12202
  class LocalControlsComponent {
12140
12203
  constructor() {
@@ -12146,11 +12209,38 @@ class LocalControlsComponent {
12146
12209
  this.config = input.required(...(ngDevMode ? [{ debugName: "config" }] : []));
12147
12210
  this.isLoading = input(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
12148
12211
  this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
12149
- this.emitRefresh = input(true, ...(ngDevMode ? [{ debugName: "emitRefresh" }] : []));
12212
+ /**
12213
+ * Controls whether dashboard-wide auto-refresh cycles are forwarded as `configChange` events.
12214
+ *
12215
+ * When `true` (default), global `REFRESH` events emitted by the dashboard are translated
12216
+ * into `configChange` emissions with updated date/time context — allowing the widget to
12217
+ * react to automatic refresh intervals set in the dashboard controls.
12218
+ *
12219
+ * When `false`, those global refresh cycles are ignored and only actual user-initiated
12220
+ * context state changes (e.g. date range selection) trigger `configChange`.
12221
+ *
12222
+ * **This input does not affect the `refresh` output.**
12223
+ */
12224
+ this.propagateAutoRefresh = input(true, ...(ngDevMode ? [{ debugName: "propagateAutoRefresh" }] : []));
12225
+ /**
12226
+ * @deprecated Use `propagateAutoRefresh` instead. Will be removed in a future version.
12227
+ *
12228
+ * Controls whether dashboard-wide auto-refresh cycles are forwarded as `configChange` events.
12229
+ * When set, takes precedence over `propagateAutoRefresh` for backward compatibility.
12230
+ */
12231
+ this.emitRefresh = input(undefined, ...(ngDevMode ? [{ debugName: "emitRefresh" }] : []));
12150
12232
  /** Explicit override; falls back to DI-injected DashboardChildComponent. */
12151
12233
  this.dashboardChildInput = input(undefined, ...(ngDevMode ? [{ debugName: "dashboardChildInput", alias: 'dashboardChild' }] : [{ alias: 'dashboardChild' }]));
12152
12234
  this.resolvedDashboardChild = computed(() => this.dashboardChildInput() ?? this.injectedDashboardChild ?? null, ...(ngDevMode ? [{ debugName: "resolvedDashboardChild" }] : []));
12153
12235
  this.configChange = output();
12236
+ /**
12237
+ * Emitted when the user manually triggers a refresh via the local context controls,
12238
+ * but the resulting context state did not change — so no `configChange` was emitted.
12239
+ *
12240
+ * The parent widget should react by reloading its data without updating the context.
12241
+ *
12242
+ * **This output does not depend on the `propagateAutoRefresh` and `emitRefresh` inputs.**
12243
+ */
12154
12244
  this.refresh = output();
12155
12245
  this.headerTemplate.register({
12156
12246
  getDashboardChild: () => this.resolvedDashboardChild(),
@@ -12159,7 +12249,7 @@ class LocalControlsComponent {
12159
12249
  });
12160
12250
  }
12161
12251
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: LocalControlsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12162
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: LocalControlsComponent, isStandalone: true, selector: "c8y-local-controls", inputs: { controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: false, transformFunction: null }, displayMode: { classPropertyName: "displayMode", publicName: "displayMode", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, emitRefresh: { classPropertyName: "emitRefresh", publicName: "emitRefresh", isSignal: true, isRequired: false, transformFunction: null }, dashboardChildInput: { classPropertyName: "dashboardChildInput", publicName: "dashboardChild", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { configChange: "configChange", refresh: "refresh" }, host: { attributes: { "data-local-controls": "true" }, properties: { "class.disabled": "disabled()" } }, providers: [HeaderTemplateService], viewQueries: [{ propertyName: "headerTemplateRef", first: true, predicate: ["headerContent"], descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: `
12252
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: LocalControlsComponent, isStandalone: true, selector: "c8y-local-controls", inputs: { controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: false, transformFunction: null }, displayMode: { classPropertyName: "displayMode", publicName: "displayMode", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, propagateAutoRefresh: { classPropertyName: "propagateAutoRefresh", publicName: "propagateAutoRefresh", isSignal: true, isRequired: false, transformFunction: null }, emitRefresh: { classPropertyName: "emitRefresh", publicName: "emitRefresh", isSignal: true, isRequired: false, transformFunction: null }, dashboardChildInput: { classPropertyName: "dashboardChildInput", publicName: "dashboardChild", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { configChange: "configChange", refresh: "refresh" }, host: { attributes: { "data-local-controls": "true" }, properties: { "class.disabled": "disabled()" } }, providers: [HeaderTemplateService], viewQueries: [{ propertyName: "headerTemplateRef", first: true, predicate: ["headerContent"], descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: `
12163
12253
  <ng-template #headerContent>
12164
12254
  <div class="c8y-header-controls-group">
12165
12255
  <c8y-context-controls
@@ -12167,7 +12257,7 @@ class LocalControlsComponent {
12167
12257
  [displayMode]="displayMode()"
12168
12258
  [config]="config()"
12169
12259
  [isLoading]="isLoading()"
12170
- [emitRefresh]="emitRefresh()"
12260
+ [propagateAutoRefresh]="emitRefresh() ?? propagateAutoRefresh()"
12171
12261
  (configChange)="configChange.emit($event)"
12172
12262
  (refresh)="refresh.emit()"
12173
12263
  ></c8y-context-controls>
@@ -12181,13 +12271,13 @@ class LocalControlsComponent {
12181
12271
  [displayMode]="displayMode()"
12182
12272
  [config]="config()"
12183
12273
  [isLoading]="isLoading()"
12184
- [emitRefresh]="emitRefresh()"
12274
+ [propagateAutoRefresh]="emitRefresh() ?? propagateAutoRefresh()"
12185
12275
  (configChange)="configChange.emit($event)"
12186
12276
  (refresh)="refresh.emit()"
12187
12277
  ></c8y-context-controls>
12188
12278
  </div>
12189
12279
  }
12190
- `, isInline: true, styles: [".disabled-overlay{position:relative;cursor:not-allowed}.disabled-overlay:after{content:\"\";position:absolute;inset:0;z-index:10}\n"], dependencies: [{ kind: "component", type: ContextControlsComponent, selector: "c8y-context-controls", inputs: ["controls", "displayMode", "config", "isLoading", "emitRefresh"], outputs: ["configChange", "refresh"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12280
+ `, isInline: true, styles: [".disabled-overlay{position:relative;cursor:not-allowed}.disabled-overlay:after{content:\"\";position:absolute;inset:0;z-index:10}\n"], dependencies: [{ kind: "component", type: ContextControlsComponent, selector: "c8y-context-controls", inputs: ["controls", "displayMode", "config", "isLoading", "propagateAutoRefresh", "emitRefresh"], outputs: ["configChange", "refresh"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12191
12281
  }
12192
12282
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: LocalControlsComponent, decorators: [{
12193
12283
  type: Component,
@@ -12202,7 +12292,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
12202
12292
  [displayMode]="displayMode()"
12203
12293
  [config]="config()"
12204
12294
  [isLoading]="isLoading()"
12205
- [emitRefresh]="emitRefresh()"
12295
+ [propagateAutoRefresh]="emitRefresh() ?? propagateAutoRefresh()"
12206
12296
  (configChange)="configChange.emit($event)"
12207
12297
  (refresh)="refresh.emit()"
12208
12298
  ></c8y-context-controls>
@@ -12216,14 +12306,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
12216
12306
  [displayMode]="displayMode()"
12217
12307
  [config]="config()"
12218
12308
  [isLoading]="isLoading()"
12219
- [emitRefresh]="emitRefresh()"
12309
+ [propagateAutoRefresh]="emitRefresh() ?? propagateAutoRefresh()"
12220
12310
  (configChange)="configChange.emit($event)"
12221
12311
  (refresh)="refresh.emit()"
12222
12312
  ></c8y-context-controls>
12223
12313
  </div>
12224
12314
  }
12225
12315
  `, styles: [".disabled-overlay{position:relative;cursor:not-allowed}.disabled-overlay:after{content:\"\";position:absolute;inset:0;z-index:10}\n"] }]
12226
- }], ctorParameters: () => [], propDecorators: { headerTemplateRef: [{ type: i0.ViewChild, args: ['headerContent', { ...{ read: TemplateRef }, isSignal: true }] }], controls: [{ type: i0.Input, args: [{ isSignal: true, alias: "controls", required: false }] }], displayMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayMode", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], emitRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitRefresh", required: false }] }], dashboardChildInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "dashboardChild", required: false }] }], configChange: [{ type: i0.Output, args: ["configChange"] }], refresh: [{ type: i0.Output, args: ["refresh"] }] } });
12316
+ }], ctorParameters: () => [], propDecorators: { headerTemplateRef: [{ type: i0.ViewChild, args: ['headerContent', { ...{ read: TemplateRef }, isSignal: true }] }], controls: [{ type: i0.Input, args: [{ isSignal: true, alias: "controls", required: false }] }], displayMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayMode", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], propagateAutoRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "propagateAutoRefresh", required: false }] }], emitRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitRefresh", required: false }] }], dashboardChildInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "dashboardChild", required: false }] }], configChange: [{ type: i0.Output, args: ["configChange"] }], refresh: [{ type: i0.Output, args: ["refresh"] }] } });
12227
12317
 
12228
12318
  /** @deprecated Use LocalControlsComponent or GlobalContextConnectorComponent instead */
12229
12319