@c8y/ngx-components 1021.55.2 → 1021.56.4

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 (229) hide show
  1. package/context-dashboard/context-dashboard.model.d.ts +22 -22
  2. package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
  3. package/core/common/interval-based-reload.abstract.d.ts +13 -3
  4. package/core/common/interval-based-reload.abstract.d.ts.map +1 -1
  5. package/core/dashboard/dashboard.model.d.ts +3 -1
  6. package/core/dashboard/dashboard.model.d.ts.map +1 -1
  7. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +3 -4
  8. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -1
  9. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +1 -0
  10. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -1
  11. package/core/dashboard/widgets-dashboard-event.service.d.ts +7 -0
  12. package/core/dashboard/widgets-dashboard-event.service.d.ts.map +1 -1
  13. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +6 -2
  14. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  15. package/core/dynamic-component/dynamic-component.model.d.ts +15 -1
  16. package/core/dynamic-component/dynamic-component.model.d.ts.map +1 -1
  17. package/core/login/login.component.d.ts.map +1 -1
  18. package/core/login/login.model.d.ts +8 -0
  19. package/core/login/login.model.d.ts.map +1 -1
  20. package/core/login/login.service.d.ts +2 -1
  21. package/core/login/login.service.d.ts.map +1 -1
  22. package/datapoint-selector/datapoint-selection.model.d.ts +18 -18
  23. package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
  24. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -1
  25. package/datapoints-export-selector/datapoints-export-selector.component.d.ts +3 -1
  26. package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -1
  27. package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts +5 -1
  28. package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts.map +1 -1
  29. package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
  30. package/esm2022/core/aggregation/aggregation.model.mjs +2 -2
  31. package/esm2022/core/common/interval-based-reload.abstract.mjs +13 -13
  32. package/esm2022/core/dashboard/dashboard-child.component.mjs +3 -3
  33. package/esm2022/core/dashboard/dashboard.model.mjs +1 -1
  34. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +6 -8
  35. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +9 -1
  36. package/esm2022/core/dashboard/widgets-dashboard-event.service.mjs +19 -2
  37. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +3 -3
  38. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +3 -3
  39. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +48 -23
  40. package/esm2022/core/dynamic-component/dynamic-component.model.mjs +1 -1
  41. package/esm2022/core/login/login.component.mjs +4 -4
  42. package/esm2022/core/login/login.model.mjs +1 -1
  43. package/esm2022/core/login/login.service.mjs +7 -3
  44. package/esm2022/datapoint-explorer/view/datapoint-explorer.component.mjs +2 -2
  45. package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
  46. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +1 -3
  47. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +9 -5
  48. package/esm2022/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.mjs +23 -9
  49. package/esm2022/map/map.model.mjs +1 -1
  50. package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +2 -1
  51. package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +2 -1
  52. package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +2 -1
  53. package/esm2022/widgets/definitions/applications/index.mjs +1 -1
  54. package/esm2022/widgets/definitions/asset-notes/index.mjs +2 -1
  55. package/esm2022/widgets/definitions/cockpit-legacy-welcome/index.mjs +1 -1
  56. package/esm2022/widgets/definitions/cockpit-welcome/index.mjs +1 -1
  57. package/esm2022/widgets/definitions/datapoints-graph/index.mjs +1 -1
  58. package/esm2022/widgets/definitions/datapoints-table/index.mjs +6 -4
  59. package/esm2022/widgets/definitions/device-control-message/index.mjs +2 -1
  60. package/esm2022/widgets/definitions/device-management-welcome/index.mjs +1 -1
  61. package/esm2022/widgets/definitions/help-and-service/index.mjs +1 -1
  62. package/esm2022/widgets/definitions/image/index.mjs +2 -1
  63. package/esm2022/widgets/definitions/info-gauge/index.mjs +2 -1
  64. package/esm2022/widgets/definitions/kpi/index.mjs +2 -1
  65. package/esm2022/widgets/definitions/linear-gauge/index.mjs +4 -3
  66. package/esm2022/widgets/definitions/map/index.mjs +2 -1
  67. package/esm2022/widgets/definitions/markdown/index.mjs +2 -1
  68. package/esm2022/widgets/definitions/silo/index.mjs +4 -3
  69. package/esm2022/widgets/definitions/three-d-rotation/index.mjs +2 -1
  70. package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +3 -3
  71. package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +1 -1
  72. package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +17 -100
  73. package/esm2022/widgets/implementations/asset-notes/asset-notes-widget.component.mjs +1 -1
  74. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +47 -34
  75. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +35 -13
  76. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +3 -3
  77. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +75 -35
  78. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +3 -5
  79. package/esm2022/widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.mjs +1 -1
  80. package/esm2022/widgets/implementations/info-gauge/index.mjs +2 -1
  81. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.mjs +1 -1
  82. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.mjs +1 -1
  83. package/esm2022/widgets/implementations/info-gauge/info-gauge.model.mjs +2 -0
  84. package/esm2022/widgets/implementations/kpi/kpi-widget.model.mjs +1 -1
  85. package/esm2022/widgets/implementations/linear-gauge/index.mjs +2 -1
  86. package/esm2022/widgets/implementations/linear-gauge/linear-gauge-widget-config/linear-gauge-widget-config.component.mjs +1 -1
  87. package/esm2022/widgets/implementations/linear-gauge/linear-gauge-widget-view/linear-gauge-widget-view.component.mjs +1 -1
  88. package/esm2022/widgets/implementations/linear-gauge/linear-gauge.model.mjs +2 -0
  89. package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
  90. package/esm2022/widgets/implementations/markdown/markdown-widget.model.mjs +1 -1
  91. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  92. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +1 -1
  93. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  94. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  95. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +7 -6
  96. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  97. package/fesm2022/c8y-ngx-components-ecosystem.mjs +16 -4
  98. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  99. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  100. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +1 -0
  101. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
  102. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +1 -0
  103. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
  104. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +1 -0
  105. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
  106. package/fesm2022/c8y-ngx-components-widgets-definitions-applications.mjs.map +1 -1
  107. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-notes.mjs +1 -0
  108. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-notes.mjs.map +1 -1
  109. package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-legacy-welcome.mjs.map +1 -1
  110. package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-welcome.mjs.map +1 -1
  111. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
  112. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -3
  113. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -1
  114. package/fesm2022/c8y-ngx-components-widgets-definitions-device-control-message.mjs +1 -0
  115. package/fesm2022/c8y-ngx-components-widgets-definitions-device-control-message.mjs.map +1 -1
  116. package/fesm2022/c8y-ngx-components-widgets-definitions-device-management-welcome.mjs.map +1 -1
  117. package/fesm2022/c8y-ngx-components-widgets-definitions-help-and-service.mjs.map +1 -1
  118. package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs +1 -0
  119. package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs.map +1 -1
  120. package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs +1 -0
  121. package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs.map +1 -1
  122. package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs +1 -0
  123. package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs.map +1 -1
  124. package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs +3 -2
  125. package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs.map +1 -1
  126. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +1 -0
  127. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
  128. package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs +1 -0
  129. package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs.map +1 -1
  130. package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs +3 -2
  131. package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs.map +1 -1
  132. package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs +1 -0
  133. package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs.map +1 -1
  134. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +18 -101
  135. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  136. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs.map +1 -1
  137. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +147 -76
  138. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  139. package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs.map +1 -1
  140. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
  141. package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
  142. package/fesm2022/c8y-ngx-components.mjs +218 -167
  143. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  144. package/locales/locales.pot +7 -8
  145. package/map/map.model.d.ts +1 -1
  146. package/map/map.model.d.ts.map +1 -1
  147. package/package.json +1 -1
  148. package/widgets/cockpit/index.d.ts +327 -17
  149. package/widgets/cockpit/index.d.ts.map +1 -1
  150. package/widgets/definitions/alarms/alarm-list/index.d.ts +25 -2
  151. package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
  152. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +24 -2
  153. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
  154. package/widgets/definitions/alarms/recent-alarms/index.d.ts +24 -2
  155. package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
  156. package/widgets/definitions/applications/index.d.ts +11 -2
  157. package/widgets/definitions/applications/index.d.ts.map +1 -1
  158. package/widgets/definitions/asset-notes/index.d.ts +18 -2
  159. package/widgets/definitions/asset-notes/index.d.ts.map +1 -1
  160. package/widgets/definitions/cockpit-legacy-welcome/index.d.ts +11 -2
  161. package/widgets/definitions/cockpit-legacy-welcome/index.d.ts.map +1 -1
  162. package/widgets/definitions/cockpit-welcome/index.d.ts +15 -2
  163. package/widgets/definitions/cockpit-welcome/index.d.ts.map +1 -1
  164. package/widgets/definitions/datapoints-graph/index.d.ts +16 -2
  165. package/widgets/definitions/datapoints-graph/index.d.ts.map +1 -1
  166. package/widgets/definitions/datapoints-table/index.d.ts +26 -2
  167. package/widgets/definitions/datapoints-table/index.d.ts.map +1 -1
  168. package/widgets/definitions/device-control-message/index.d.ts +18 -2
  169. package/widgets/definitions/device-control-message/index.d.ts.map +1 -1
  170. package/widgets/definitions/device-management-welcome/index.d.ts +15 -2
  171. package/widgets/definitions/device-management-welcome/index.d.ts.map +1 -1
  172. package/widgets/definitions/help-and-service/index.d.ts +15 -2
  173. package/widgets/definitions/help-and-service/index.d.ts.map +1 -1
  174. package/widgets/definitions/image/index.d.ts +19 -2
  175. package/widgets/definitions/image/index.d.ts.map +1 -1
  176. package/widgets/definitions/info-gauge/index.d.ts +19 -2
  177. package/widgets/definitions/info-gauge/index.d.ts.map +1 -1
  178. package/widgets/definitions/kpi/index.d.ts +19 -2
  179. package/widgets/definitions/kpi/index.d.ts.map +1 -1
  180. package/widgets/definitions/linear-gauge/index.d.ts +19 -2
  181. package/widgets/definitions/linear-gauge/index.d.ts.map +1 -1
  182. package/widgets/definitions/map/index.d.ts +25 -2
  183. package/widgets/definitions/map/index.d.ts.map +1 -1
  184. package/widgets/definitions/markdown/index.d.ts +19 -2
  185. package/widgets/definitions/markdown/index.d.ts.map +1 -1
  186. package/widgets/definitions/silo/index.d.ts +19 -2
  187. package/widgets/definitions/silo/index.d.ts.map +1 -1
  188. package/widgets/definitions/three-d-rotation/index.d.ts +19 -2
  189. package/widgets/definitions/three-d-rotation/index.d.ts.map +1 -1
  190. package/widgets/device-management/index.d.ts +15 -1
  191. package/widgets/device-management/index.d.ts.map +1 -1
  192. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +4 -0
  193. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
  194. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +18 -63
  195. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  196. package/widgets/implementations/asset-notes/asset-notes-widget.component.d.ts +4 -3
  197. package/widgets/implementations/asset-notes/asset-notes-widget.component.d.ts.map +1 -1
  198. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +4 -2
  199. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -1
  200. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +16 -8
  201. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -1
  202. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +21 -4
  203. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -1
  204. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +8 -4
  205. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -1
  206. package/widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.d.ts +4 -3
  207. package/widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.d.ts.map +1 -1
  208. package/widgets/implementations/info-gauge/index.d.ts +1 -0
  209. package/widgets/implementations/info-gauge/index.d.ts.map +1 -1
  210. package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts +3 -6
  211. package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts.map +1 -1
  212. package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts +2 -5
  213. package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts.map +1 -1
  214. package/widgets/implementations/info-gauge/info-gauge.model.d.ts +7 -0
  215. package/widgets/implementations/info-gauge/info-gauge.model.d.ts.map +1 -0
  216. package/widgets/implementations/kpi/kpi-widget.model.d.ts +6 -6
  217. package/widgets/implementations/kpi/kpi-widget.model.d.ts.map +1 -1
  218. package/widgets/implementations/linear-gauge/index.d.ts +1 -0
  219. package/widgets/implementations/linear-gauge/index.d.ts.map +1 -1
  220. package/widgets/implementations/linear-gauge/linear-gauge-widget-config/linear-gauge-widget-config.component.d.ts +3 -5
  221. package/widgets/implementations/linear-gauge/linear-gauge-widget-config/linear-gauge-widget-config.component.d.ts.map +1 -1
  222. package/widgets/implementations/linear-gauge/linear-gauge-widget-view/linear-gauge-widget-view.component.d.ts +2 -6
  223. package/widgets/implementations/linear-gauge/linear-gauge-widget-view/linear-gauge-widget-view.component.d.ts.map +1 -1
  224. package/widgets/implementations/linear-gauge/linear-gauge.model.d.ts +7 -0
  225. package/widgets/implementations/linear-gauge/linear-gauge.model.d.ts.map +1 -0
  226. package/widgets/implementations/map/map-widget.model.d.ts +5 -0
  227. package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
  228. package/widgets/implementations/markdown/markdown-widget.model.d.ts +2 -2
  229. package/widgets/implementations/markdown/markdown-widget.model.d.ts.map +1 -1
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, Input, Injector, InjectionToken, Injectable, Optional, Inject, isDevMode, inject, Pipe, EventEmitter, NgModule, LOCALE_ID, EnvironmentInjector, HostListener, NgModuleRef, createNgModule, Component, Output, HostBinding, forwardRef, SecurityContext, TemplateRef, APP_INITIALIZER, runInInjectionContext, effect, Self, SkipSelf, ViewChild, Attribute, ContentChild, ViewContainerRef, ContentChildren, ElementRef, ViewChildren, createComponent, importProvidersFrom, ChangeDetectionStrategy, SimpleChange, reflectComponentType, signal, Type, DestroyRef } from '@angular/core';
2
+ import { Directive, Input, Injector, InjectionToken, Injectable, Optional, Inject, isDevMode, inject, Pipe, EventEmitter, NgModule, LOCALE_ID, EnvironmentInjector, HostListener, NgModuleRef, createNgModule, Component, Output, HostBinding, forwardRef, SecurityContext, TemplateRef, APP_INITIALIZER, Self, SkipSelf, ViewChild, Attribute, ContentChild, ViewContainerRef, ContentChildren, ElementRef, ViewChildren, createComponent, runInInjectionContext, importProvidersFrom, ChangeDetectionStrategy, SimpleChange, reflectComponentType, signal, effect, Type, DestroyRef } from '@angular/core';
3
3
  import * as i1$4 from 'ngx-bootstrap/dropdown';
4
4
  import { BsDropdownModule, BsDropdownDirective } from 'ngx-bootstrap/dropdown';
5
5
  import * as i3 from '@angular/cdk/a11y';
6
6
  import { A11yModule, CdkTrapFocus } from '@angular/cdk/a11y';
7
- import { castArray, flatten, uniq, sortBy, groupBy, camelCase, isEqual, isUndefined, throttle as throttle$1, keys, get, isNaN as isNaN$1, isFinite, each, mapValues, mapKeys, forEach, reduce, union, cloneDeep, uniqBy, assign, min, every, first, map as map$2, find, negate, upperFirst, memoize as memoize$1, property, some, entries, omitBy, isDate, orderBy, flatMap, isEmpty, filter as filter$1, snakeCase, matches, isString, clone, toNumber, isEqualWith, escape as escape$1, escapeRegExp, assignWith, set, omit, pick, has, transform, identity, flow, isNil, chunk, values, without, indexOf, parseInt as parseInt$1, kebabCase, forOwn } from 'lodash-es';
8
- import { merge, of, defer, combineLatest, race, isObservable, from, Subject, BehaviorSubject, NEVER, Observable, firstValueFrom, map as map$1, distinctUntilChanged as distinctUntilChanged$1, fromEvent, pipe, throwError, concat, EMPTY, timer, fromEventPattern, startWith as startWith$1, switchMap as switchMap$1, takeUntil as takeUntil$1, empty, forkJoin, ReplaySubject, interval, shareReplay as shareReplay$1, mergeMap as mergeMap$1 } from 'rxjs';
7
+ import { castArray, flatten, uniq, sortBy, groupBy, camelCase, isEqual, isUndefined, throttle as throttle$1, keys, get, isNaN as isNaN$1, isFinite, each, mapValues, mapKeys, forEach, reduce, union, cloneDeep, uniqBy, assign, min, every, first, map as map$2, find, negate, upperFirst, memoize as memoize$1, property, some, entries, omitBy, isDate, orderBy, flatMap, isEmpty, filter as filter$2, snakeCase, matches, isString, clone, toNumber, isEqualWith, escape as escape$1, escapeRegExp, assignWith, set, omit, pick, has, transform, identity, flow, isNil, chunk, values, without, indexOf, parseInt as parseInt$1, kebabCase, forOwn } from 'lodash-es';
8
+ import { merge, of, defer, combineLatest, race, isObservable, from, Subject, BehaviorSubject, NEVER, Observable, firstValueFrom, map as map$1, distinctUntilChanged as distinctUntilChanged$1, fromEvent, pipe, throwError, concat, filter as filter$1, tap as tap$1, EMPTY, timer, fromEventPattern, startWith as startWith$1, switchMap as switchMap$1, takeUntil as takeUntil$1, empty, forkJoin, ReplaySubject, interval, shareReplay as shareReplay$1, mergeMap as mergeMap$1 } from 'rxjs';
9
9
  import { map, distinctUntilChanged, filter, startWith, switchMap, take, shareReplay, scan, debounceTime, share, takeUntil, tap, catchError, first as first$1, retryWhen, delay, concatMap, debounce, sample, withLatestFrom, mergeMap, every as every$1, toArray, merge as merge$1, expand, skip, mapTo, finalize, reduce as reduce$1, combineLatestWith } from 'rxjs/operators';
10
10
  import * as i1 from '@c8y/client';
11
11
  import { ApplicationAvailability, OperationStatus, TenantLoginOptionType, UserManagementSource, GrantType, ApplicationType, BearerAuthFromSessionStorage, FetchClient, Client, PasswordStrength, QueriesUtil, InventoryService, UserService, ApplicationService, TenantService, AlarmService, aggregationType, Service } from '@c8y/client';
@@ -9429,7 +9429,7 @@ class IntervalBasedReload {
9429
9429
  return;
9430
9430
  }
9431
9431
  // Checks if the user has stopped scrolling and the countdown is currently hidden
9432
- const onUserScrollTopShow = !this.isScrolling && this.hideCountdown;
9432
+ const onUserScrollTopShow = !this.isScrolling && this.countdownSubscription?.closed && this.hideCountdown;
9433
9433
  if (onUserScrollTopShow) {
9434
9434
  this.isIntervalRefreshToggleOn = true;
9435
9435
  this.enableCountdown();
@@ -9452,14 +9452,15 @@ class IntervalBasedReload {
9452
9452
  */
9453
9453
  onToggleCountdownButtonState($event) {
9454
9454
  $event.preventDefault();
9455
- this.isIntervalRefreshToggleOn = !this.isIntervalRefreshToggleOn;
9455
+ this.isIntervalRefreshToggleOn = !this.isRefreshDisabled && !this.isIntervalRefreshToggleOn;
9456
9456
  this.updateCountdownButtonTooltipText();
9457
9457
  if (!this.isIntervalRefreshToggleOn) {
9458
9458
  this.disableCountdown();
9459
9459
  this.manuallyDisabledCountdown = true;
9460
9460
  return;
9461
9461
  }
9462
- if (this.isIntervalRefreshToggleOn) {
9462
+ const onRefreshToggleOn = this.isIntervalRefreshToggleOn && this.countdownSubscription.closed;
9463
+ if (onRefreshToggleOn) {
9463
9464
  this.enableCountdown();
9464
9465
  this.manuallyDisabledCountdown = false;
9465
9466
  }
@@ -9474,14 +9475,12 @@ class IntervalBasedReload {
9474
9475
  * @param injector - The injector used to provide necessary dependencies
9475
9476
  * within the `runInInjectionContext`.
9476
9477
  */
9477
- startCountdown(injector) {
9478
- runInInjectionContext(injector, () => {
9479
- effect(() => {
9480
- if (!this.isLoading()) {
9481
- this.countdownIntervalComponent?.start();
9482
- }
9483
- });
9484
- });
9478
+ startCountdown() {
9479
+ this.countdownSubscription = this.isLoading
9480
+ .pipe(filter$1(isLoading => !Boolean(isLoading)), tap$1(() => {
9481
+ this.countdownIntervalComponent?.start();
9482
+ }))
9483
+ .subscribe();
9485
9484
  }
9486
9485
  /**
9487
9486
  * Disables and hides the countdown timer.
@@ -9492,6 +9491,7 @@ class IntervalBasedReload {
9492
9491
  * conceal the countdown timer.
9493
9492
  */
9494
9493
  disableCountdown() {
9494
+ this.countdownSubscription.unsubscribe();
9495
9495
  this.countdownIntervalComponent?.stop();
9496
9496
  this.hideCountdown = true;
9497
9497
  }
@@ -10901,9 +10901,9 @@ class ActionBarComponent {
10901
10901
  });
10902
10902
  }
10903
10903
  ngOnInit() {
10904
- this.right$ = this.items$.pipe(map(items => filter$1(items, { placement: 'right' })), map(items => sortBy(items, this.byPriority)));
10905
- this.left$ = this.items$.pipe(map(items => filter$1(items, { placement: 'left' })), map(items => sortBy(items, this.byPriority)));
10906
- this.more$ = this.items$.pipe(map(items => filter$1(items, { placement: 'more' })), map(items => sortBy(items, this.byPriority)));
10904
+ this.right$ = this.items$.pipe(map(items => filter$2(items, { placement: 'right' })), map(items => sortBy(items, this.byPriority)));
10905
+ this.left$ = this.items$.pipe(map(items => filter$2(items, { placement: 'left' })), map(items => sortBy(items, this.byPriority)));
10906
+ this.more$ = this.items$.pipe(map(items => filter$2(items, { placement: 'more' })), map(items => sortBy(items, this.byPriority)));
10907
10907
  this.hidden$ = this.items$.pipe(map(items => {
10908
10908
  return !(items && items.length);
10909
10909
  }));
@@ -12780,15 +12780,19 @@ class LoginService {
12780
12780
  window.location.href = `${initRequest}${originUriParam}`;
12781
12781
  }
12782
12782
  }
12783
- loginBySso(sessionState, code) {
12783
+ loginBySso({ code, sessionState }) {
12784
12784
  const params = {
12785
12785
  method: 'GET',
12786
12786
  headers: {
12787
12787
  Accept: 'text/html,application/xhtml+xml'
12788
12788
  }
12789
12789
  };
12790
+ let url = `/tenant/oauth?code=${encodeURIComponent(code)}`;
12791
+ if (sessionState) {
12792
+ url += `&session_state=${encodeURIComponent(sessionState)}`;
12793
+ }
12790
12794
  return this.client
12791
- .fetch(`/tenant/oauth?session_state=${sessionState}&code=${code}`, params)
12795
+ .fetch(url, params)
12792
12796
  .then(res => this.handleErrorStatusCodes(res))
12793
12797
  .catch(ex => {
12794
12798
  this.showSsoError(ex);
@@ -14887,7 +14891,7 @@ class PasswordService {
14887
14891
  return password.search(/[^0-9a-zA-Z]+/) !== -1;
14888
14892
  }
14889
14893
  getStrengthColor(password) {
14890
- const passwordStrength = filter$1([
14894
+ const passwordStrength = filter$2([
14891
14895
  this.hasLowerCase(password),
14892
14896
  this.hasUpperCase(password),
14893
14897
  this.hasNumbers(password),
@@ -15194,7 +15198,7 @@ class PasswordStrengthCheckerService {
15194
15198
  return password.search(/[^0-9a-zA-Z]+/) !== -1;
15195
15199
  }
15196
15200
  getStrengthColor(password) {
15197
- const passwordStrength = filter$1([
15201
+ const passwordStrength = filter$2([
15198
15202
  this.hasLowerCase(password),
15199
15203
  this.hasUpperCase(password),
15200
15204
  this.hasNumbers(password),
@@ -16887,7 +16891,7 @@ class LoginComponent {
16887
16891
  getSsoData() {
16888
16892
  const code = this.getParamAndClear('code');
16889
16893
  const sessionState = this.getParamAndClear('session_state');
16890
- if (sessionState && code) {
16894
+ if (code) {
16891
16895
  return { sessionState, code };
16892
16896
  }
16893
16897
  const ssoError = this.getParamAndClear('error');
@@ -16897,13 +16901,13 @@ class LoginComponent {
16897
16901
  }
16898
16902
  }
16899
16903
  handleSso(ssoData) {
16900
- if (ssoData.ssoError) {
16904
+ if ('ssoError' in ssoData) {
16901
16905
  this.loginService.showSsoError(decodeURIComponent(ssoData.ssoErrorDescription).replace(/\+/g, '%20'));
16902
16906
  this.reset();
16903
16907
  }
16904
16908
  else {
16905
16909
  this.loginService
16906
- .loginBySso(ssoData.sessionState, ssoData.code)
16910
+ .loginBySso(ssoData)
16907
16911
  .then(() => this.loginService.login())
16908
16912
  .catch(e => {
16909
16913
  this.reset();
@@ -28236,7 +28240,7 @@ const AGGREGATION_ICONS = {
28236
28240
  DAILY: 'calendar-o'
28237
28241
  };
28238
28242
  const AGGREGATION_TEXTS = {
28239
- disabled: gettext$1('No aggregation with realtime enabled'),
28243
+ disabled: gettext$1('No aggregation with real-time or auto-refresh enabled'),
28240
28244
  undefined: gettext$1('No aggregation'),
28241
28245
  MINUTELY: gettext$1('Minutely aggregation'),
28242
28246
  HOURLY: gettext$1('Hourly aggregation'),
@@ -28276,11 +28280,11 @@ class WidgetTimeContextIconBar {
28276
28280
  }
28277
28281
  }
28278
28282
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextIconBar, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28279
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WidgetTimeContextIconBar, selector: "c8y-widget-time-context-icon-bar", inputs: { config: "config" }, ngImport: i0, template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (config?.aggregation ? AGGREGATION_TEXTS[config.aggregation] : AGGREGATION_TEXTS.undefined)\n | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config.displaySettings.globalAggregationContext\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n config?.aggregation ? AGGREGATION_ICONS[config.aggregation] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n <button\n class=\"btn c8y-realtime btn-no-focus\"\n [attr.aria-label]=\"(config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate\"\n tooltip=\"{{ (config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: config?.realtime, inactive: !config?.realtime }\"\n ></span>\n </button>\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalContextButtonText | translate\"\n [tooltip]=\"globalContextButtonText | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"dashboard-child--global-date-context-indicator\"\n >\n <span class=\"tag tag--success chip\">\n <i c8yIcon=\"clock\"></i>\n {{ 'Realtime' | translate }}\n </span>\n </button>\n</span>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$2.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: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28283
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WidgetTimeContextIconBar, selector: "c8y-widget-time-context-icon-bar", inputs: { config: "config" }, ngImport: i0, template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (config?.aggregation ? AGGREGATION_TEXTS[config.aggregation] : AGGREGATION_TEXTS.undefined)\n | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config.displaySettings.globalAggregationContext\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n config?.aggregation ? AGGREGATION_ICONS[config.aggregation] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n <button\n class=\"btn c8y-realtime btn-no-focus\"\n [attr.aria-label]=\"(config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate\"\n tooltip=\"{{ (config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: config?.realtime, inactive: !config?.realtime }\"\n ></span>\n </button>\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalContextButtonText | translate\"\n [tooltip]=\"globalContextButtonText | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"dashboard-child--global-date-context-indicator\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span class=\"tag tag--success chip\">\n <i c8yIcon=\"clock\"></i>\n {{ 'Realtime' | translate }}\n </span>\n </button>\n</span>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$2.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: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28280
28284
  }
28281
28285
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextIconBar, decorators: [{
28282
28286
  type: Component,
28283
- args: [{ selector: 'c8y-widget-time-context-icon-bar', template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (config?.aggregation ? AGGREGATION_TEXTS[config.aggregation] : AGGREGATION_TEXTS.undefined)\n | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config.displaySettings.globalAggregationContext\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n config?.aggregation ? AGGREGATION_ICONS[config.aggregation] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n <button\n class=\"btn c8y-realtime btn-no-focus\"\n [attr.aria-label]=\"(config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate\"\n tooltip=\"{{ (config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: config?.realtime, inactive: !config?.realtime }\"\n ></span>\n </button>\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalContextButtonText | translate\"\n [tooltip]=\"globalContextButtonText | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"dashboard-child--global-date-context-indicator\"\n >\n <span class=\"tag tag--success chip\">\n <i c8yIcon=\"clock\"></i>\n {{ 'Realtime' | translate }}\n </span>\n </button>\n</span>\n" }]
28287
+ args: [{ selector: 'c8y-widget-time-context-icon-bar', template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (config?.aggregation ? AGGREGATION_TEXTS[config.aggregation] : AGGREGATION_TEXTS.undefined)\n | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config.displaySettings.globalAggregationContext\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n config?.aggregation ? AGGREGATION_ICONS[config.aggregation] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n <button\n class=\"btn c8y-realtime btn-no-focus\"\n [attr.aria-label]=\"(config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate\"\n tooltip=\"{{ (config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: config?.realtime, inactive: !config?.realtime }\"\n ></span>\n </button>\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalContextButtonText | translate\"\n [tooltip]=\"globalContextButtonText | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"dashboard-child--global-date-context-indicator\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span class=\"tag tag--success chip\">\n <i c8yIcon=\"clock\"></i>\n {{ 'Realtime' | translate }}\n </span>\n </button>\n</span>\n" }]
28284
28288
  }], propDecorators: { config: [{
28285
28289
  type: Input
28286
28290
  }] } });
@@ -28520,13 +28524,13 @@ class DashboardChildComponent {
28520
28524
  return false;
28521
28525
  }
28522
28526
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DashboardChildComponent, deps: [{ token: DashboardComponent }, { token: i1$3.DomSanitizer }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
28523
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DashboardChildComponent, selector: "c8y-dashboard-child", inputs: { x: "x", y: "y", width: "width", height: "height", data: "data", margin: "margin", useIntersection: "useIntersection", isFrozen: "isFrozen", canToggleFullscreen: "canToggleFullscreen", editMode: "editMode", class: "class" }, outputs: { changeStart: "changeStart", changeEnd: "changeEnd", toggleFullscreen: "toggleFullscreen" }, host: { properties: { "class.fullscreen": "this.fullscreen", "attr.style": "this.inlineStyle" }, classAttribute: "dashboard-grid-child" }, queries: [{ propertyName: "templateActions", predicate: DashboardChildActionComponent }], usesOnChanges: true, ngImport: i0, template: "<div cdkDropList>\n <div\n class=\"card-placeholder\"\n *ngIf=\"isResize\"\n ></div>\n <div\n [ngStyle]=\"{ width: _pxWidth, height: _pxHeight }\"\n [ngClass]=\"klasses\"\n cdkDrag\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n [cdkDragDisabled]=\"(isOneColumnView$ | async) || !editMode || fullscreen\"\n >\n <div\n class=\"card-header-actions card-header-grid\"\n [ngClass]=\"{\n 'drag-handle': editMode && !fullscreen,\n draggableCursor: editMode && !fullscreen\n }\"\n cdkDragHandle\n >\n <ng-content select=\"c8y-dashboard-child-title\"></ng-content>\n <div\n class=\"header-actions d-flex a-i-center\"\n *ngIf=\"actions.length > 0\"\n >\n <c8y-widget-time-context-icon-bar\n *ngIf=\"data?.config?.displaySettings && data?.config?.widgetInstanceGlobalTimeContext\"\n [config]=\"data.config\"\n ></c8y-widget-time-context-icon-bar>\n <c8y-widget-auto-refresh-context-icon-bar\n *ngIf=\"\n data?.config?.widgetInstanceGlobalAutoRefreshContext &&\n data?.config?.displaySettings.globalAutoRefreshContext\n \"\n ></c8y-widget-auto-refresh-context-icon-bar>\n\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Full screen' | translate\"\n [tooltip]=\"fullscreen ? ('Exit full screen' | translate) : ('Full screen' | translate)\"\n delay=\"500\"\n container=\"body\"\n [disabled]=\"editMode || !canToggleFullscreen\"\n (click)=\"toggleFullscreen.next()\"\n data-cy=\"c8y-dashboard-child--settings-fullscreen\"\n >\n <i [c8yIcon]=\"fullscreen ? 'compress' : 'expand'\"></i>\n </button>\n <div\n class=\"optionsBtn dropdown\"\n placement=\"bottom right\"\n dropdown\n [container]=\"'body'\"\n >\n <button\n class=\"btn btn-icon c8y-dropdown\"\n title=\"{{ 'Settings' | translate }}\"\n aria-haspopup=\"true\"\n *ngIf=\"editMode\"\n data-cy=\"c8y-dashboard-child--settings\"\n (click)=\"(false)\"\n dropdownToggle\n >\n <i [c8yIcon]=\"'cog'\"></i>\n </button>\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Click &quot;Edit widgets&quot; to unlock' | translate\"\n tooltip=\"{{ 'Click &quot;Edit widgets&quot; to unlock' | translate }}\"\n container=\"body\"\n *ngIf=\"!editMode\"\n (click)=\"(false)\"\n data-cy=\"c8y-dashboard-child--settings-locked\"\n >\n <i [c8yIcon]=\"'lock'\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n data-cy=\"c8y-dashboard-child--actions-dropdown\"\n style=\"right: -1px\"\n *dropdownMenu\n >\n <ng-container *ngFor=\"let action of actions\">\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n </ng-container>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"card-inner-scroll\">\n <ng-content></ng-content>\n </div>\n <div\n class=\"resize-handle hidden-xs\"\n *ngIf=\"editMode && !isDragging && !fullscreen\"\n cdkDrag\n [cdkDragDisabled]=\"!editMode || fullscreen\"\n (cdkDragStarted)=\"resizeStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n ></div>\n <div\n class=\"resize-icon hidden-xs\"\n *ngIf=\"editMode && !isDragging && !fullscreen\"\n ></div>\n\n <div\n class=\"card-placeholder\"\n *cdkDragPlaceholder\n ></div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i5$2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i5$2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "directive", type: i1$4.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$4.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$4.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i2$2.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: WidgetAutoRefreshContextIconBarComponent, selector: "c8y-widget-auto-refresh-context-icon-bar" }, { kind: "component", type: WidgetTimeContextIconBar, selector: "c8y-widget-time-context-icon-bar", inputs: ["config"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28527
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DashboardChildComponent, selector: "c8y-dashboard-child", inputs: { x: "x", y: "y", width: "width", height: "height", data: "data", margin: "margin", useIntersection: "useIntersection", isFrozen: "isFrozen", canToggleFullscreen: "canToggleFullscreen", editMode: "editMode", class: "class" }, outputs: { changeStart: "changeStart", changeEnd: "changeEnd", toggleFullscreen: "toggleFullscreen" }, host: { properties: { "class.fullscreen": "this.fullscreen", "attr.style": "this.inlineStyle" }, classAttribute: "dashboard-grid-child" }, queries: [{ propertyName: "templateActions", predicate: DashboardChildActionComponent }], usesOnChanges: true, ngImport: i0, template: "<div cdkDropList>\n <div\n class=\"card-placeholder\"\n *ngIf=\"isResize\"\n ></div>\n <div\n [ngStyle]=\"{ width: _pxWidth, height: _pxHeight }\"\n [ngClass]=\"klasses\"\n cdkDrag\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n [cdkDragDisabled]=\"(isOneColumnView$ | async) || !editMode || fullscreen\"\n >\n <div\n class=\"card-header-actions card-header-grid\"\n [ngClass]=\"{\n 'drag-handle': editMode && !fullscreen,\n draggableCursor: editMode && !fullscreen\n }\"\n cdkDragHandle\n >\n <ng-content select=\"c8y-dashboard-child-title\"></ng-content>\n <div\n class=\"header-actions d-flex a-i-center\"\n *ngIf=\"actions.length > 0\"\n >\n <c8y-widget-time-context-icon-bar\n *ngIf=\"\n data?.config?.displaySettings &&\n (data?.config?.widgetInstanceGlobalTimeContext ||\n data?.config?.widgetInstanceGlobalAutoRefreshContext)\n \"\n [config]=\"data.config\"\n ></c8y-widget-time-context-icon-bar>\n <c8y-widget-auto-refresh-context-icon-bar\n *ngIf=\"\n data?.config?.widgetInstanceGlobalAutoRefreshContext &&\n data?.config?.displaySettings.globalAutoRefreshContext\n \"\n ></c8y-widget-auto-refresh-context-icon-bar>\n\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Full screen' | translate\"\n [tooltip]=\"fullscreen ? ('Exit full screen' | translate) : ('Full screen' | translate)\"\n [delay]=\"500\"\n container=\"body\"\n [disabled]=\"editMode || !canToggleFullscreen\"\n (click)=\"toggleFullscreen.next()\"\n data-cy=\"c8y-dashboard-child--settings-fullscreen\"\n >\n <i [c8yIcon]=\"fullscreen ? 'compress' : 'expand'\"></i>\n </button>\n <div\n class=\"optionsBtn dropdown\"\n placement=\"bottom right\"\n dropdown\n [container]=\"'body'\"\n >\n <button\n class=\"btn btn-icon c8y-dropdown\"\n title=\"{{ 'Settings' | translate }}\"\n aria-haspopup=\"true\"\n *ngIf=\"editMode\"\n data-cy=\"c8y-dashboard-child--settings\"\n (click)=\"(false)\"\n dropdownToggle\n >\n <i [c8yIcon]=\"'cog'\"></i>\n </button>\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Click &quot;Edit widgets&quot; to unlock' | translate\"\n tooltip=\"{{ 'Click &quot;Edit widgets&quot; to unlock' | translate }}\"\n container=\"body\"\n *ngIf=\"!editMode\"\n (click)=\"(false)\"\n data-cy=\"c8y-dashboard-child--settings-locked\"\n >\n <i [c8yIcon]=\"'lock'\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n style=\"right: -1px\"\n data-cy=\"c8y-dashboard-child--actions-dropdown\"\n *dropdownMenu\n >\n <ng-container *ngFor=\"let action of actions\">\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n </ng-container>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"card-inner-scroll\">\n <ng-content></ng-content>\n </div>\n <div\n class=\"resize-handle hidden-xs\"\n *ngIf=\"editMode && !isDragging && !fullscreen\"\n cdkDrag\n [cdkDragDisabled]=\"!editMode || fullscreen\"\n (cdkDragStarted)=\"resizeStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n ></div>\n <div\n class=\"resize-icon hidden-xs\"\n *ngIf=\"editMode && !isDragging && !fullscreen\"\n ></div>\n\n <div\n class=\"card-placeholder\"\n *cdkDragPlaceholder\n ></div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i5$2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i5$2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "directive", type: i1$4.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$4.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$4.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i2$2.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: WidgetAutoRefreshContextIconBarComponent, selector: "c8y-widget-auto-refresh-context-icon-bar" }, { kind: "component", type: WidgetTimeContextIconBar, selector: "c8y-widget-time-context-icon-bar", inputs: ["config"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28524
28528
  }
28525
28529
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DashboardChildComponent, decorators: [{
28526
28530
  type: Component,
28527
28531
  args: [{ selector: 'c8y-dashboard-child', host: {
28528
28532
  class: 'dashboard-grid-child'
28529
- }, template: "<div cdkDropList>\n <div\n class=\"card-placeholder\"\n *ngIf=\"isResize\"\n ></div>\n <div\n [ngStyle]=\"{ width: _pxWidth, height: _pxHeight }\"\n [ngClass]=\"klasses\"\n cdkDrag\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n [cdkDragDisabled]=\"(isOneColumnView$ | async) || !editMode || fullscreen\"\n >\n <div\n class=\"card-header-actions card-header-grid\"\n [ngClass]=\"{\n 'drag-handle': editMode && !fullscreen,\n draggableCursor: editMode && !fullscreen\n }\"\n cdkDragHandle\n >\n <ng-content select=\"c8y-dashboard-child-title\"></ng-content>\n <div\n class=\"header-actions d-flex a-i-center\"\n *ngIf=\"actions.length > 0\"\n >\n <c8y-widget-time-context-icon-bar\n *ngIf=\"data?.config?.displaySettings && data?.config?.widgetInstanceGlobalTimeContext\"\n [config]=\"data.config\"\n ></c8y-widget-time-context-icon-bar>\n <c8y-widget-auto-refresh-context-icon-bar\n *ngIf=\"\n data?.config?.widgetInstanceGlobalAutoRefreshContext &&\n data?.config?.displaySettings.globalAutoRefreshContext\n \"\n ></c8y-widget-auto-refresh-context-icon-bar>\n\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Full screen' | translate\"\n [tooltip]=\"fullscreen ? ('Exit full screen' | translate) : ('Full screen' | translate)\"\n delay=\"500\"\n container=\"body\"\n [disabled]=\"editMode || !canToggleFullscreen\"\n (click)=\"toggleFullscreen.next()\"\n data-cy=\"c8y-dashboard-child--settings-fullscreen\"\n >\n <i [c8yIcon]=\"fullscreen ? 'compress' : 'expand'\"></i>\n </button>\n <div\n class=\"optionsBtn dropdown\"\n placement=\"bottom right\"\n dropdown\n [container]=\"'body'\"\n >\n <button\n class=\"btn btn-icon c8y-dropdown\"\n title=\"{{ 'Settings' | translate }}\"\n aria-haspopup=\"true\"\n *ngIf=\"editMode\"\n data-cy=\"c8y-dashboard-child--settings\"\n (click)=\"(false)\"\n dropdownToggle\n >\n <i [c8yIcon]=\"'cog'\"></i>\n </button>\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Click &quot;Edit widgets&quot; to unlock' | translate\"\n tooltip=\"{{ 'Click &quot;Edit widgets&quot; to unlock' | translate }}\"\n container=\"body\"\n *ngIf=\"!editMode\"\n (click)=\"(false)\"\n data-cy=\"c8y-dashboard-child--settings-locked\"\n >\n <i [c8yIcon]=\"'lock'\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n data-cy=\"c8y-dashboard-child--actions-dropdown\"\n style=\"right: -1px\"\n *dropdownMenu\n >\n <ng-container *ngFor=\"let action of actions\">\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n </ng-container>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"card-inner-scroll\">\n <ng-content></ng-content>\n </div>\n <div\n class=\"resize-handle hidden-xs\"\n *ngIf=\"editMode && !isDragging && !fullscreen\"\n cdkDrag\n [cdkDragDisabled]=\"!editMode || fullscreen\"\n (cdkDragStarted)=\"resizeStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n ></div>\n <div\n class=\"resize-icon hidden-xs\"\n *ngIf=\"editMode && !isDragging && !fullscreen\"\n ></div>\n\n <div\n class=\"card-placeholder\"\n *cdkDragPlaceholder\n ></div>\n </div>\n</div>\n" }]
28533
+ }, template: "<div cdkDropList>\n <div\n class=\"card-placeholder\"\n *ngIf=\"isResize\"\n ></div>\n <div\n [ngStyle]=\"{ width: _pxWidth, height: _pxHeight }\"\n [ngClass]=\"klasses\"\n cdkDrag\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n [cdkDragDisabled]=\"(isOneColumnView$ | async) || !editMode || fullscreen\"\n >\n <div\n class=\"card-header-actions card-header-grid\"\n [ngClass]=\"{\n 'drag-handle': editMode && !fullscreen,\n draggableCursor: editMode && !fullscreen\n }\"\n cdkDragHandle\n >\n <ng-content select=\"c8y-dashboard-child-title\"></ng-content>\n <div\n class=\"header-actions d-flex a-i-center\"\n *ngIf=\"actions.length > 0\"\n >\n <c8y-widget-time-context-icon-bar\n *ngIf=\"\n data?.config?.displaySettings &&\n (data?.config?.widgetInstanceGlobalTimeContext ||\n data?.config?.widgetInstanceGlobalAutoRefreshContext)\n \"\n [config]=\"data.config\"\n ></c8y-widget-time-context-icon-bar>\n <c8y-widget-auto-refresh-context-icon-bar\n *ngIf=\"\n data?.config?.widgetInstanceGlobalAutoRefreshContext &&\n data?.config?.displaySettings.globalAutoRefreshContext\n \"\n ></c8y-widget-auto-refresh-context-icon-bar>\n\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Full screen' | translate\"\n [tooltip]=\"fullscreen ? ('Exit full screen' | translate) : ('Full screen' | translate)\"\n [delay]=\"500\"\n container=\"body\"\n [disabled]=\"editMode || !canToggleFullscreen\"\n (click)=\"toggleFullscreen.next()\"\n data-cy=\"c8y-dashboard-child--settings-fullscreen\"\n >\n <i [c8yIcon]=\"fullscreen ? 'compress' : 'expand'\"></i>\n </button>\n <div\n class=\"optionsBtn dropdown\"\n placement=\"bottom right\"\n dropdown\n [container]=\"'body'\"\n >\n <button\n class=\"btn btn-icon c8y-dropdown\"\n title=\"{{ 'Settings' | translate }}\"\n aria-haspopup=\"true\"\n *ngIf=\"editMode\"\n data-cy=\"c8y-dashboard-child--settings\"\n (click)=\"(false)\"\n dropdownToggle\n >\n <i [c8yIcon]=\"'cog'\"></i>\n </button>\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Click &quot;Edit widgets&quot; to unlock' | translate\"\n tooltip=\"{{ 'Click &quot;Edit widgets&quot; to unlock' | translate }}\"\n container=\"body\"\n *ngIf=\"!editMode\"\n (click)=\"(false)\"\n data-cy=\"c8y-dashboard-child--settings-locked\"\n >\n <i [c8yIcon]=\"'lock'\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n style=\"right: -1px\"\n data-cy=\"c8y-dashboard-child--actions-dropdown\"\n *dropdownMenu\n >\n <ng-container *ngFor=\"let action of actions\">\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n </ng-container>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"card-inner-scroll\">\n <ng-content></ng-content>\n </div>\n <div\n class=\"resize-handle hidden-xs\"\n *ngIf=\"editMode && !isDragging && !fullscreen\"\n cdkDrag\n [cdkDragDisabled]=\"!editMode || fullscreen\"\n (cdkDragStarted)=\"resizeStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n ></div>\n <div\n class=\"resize-icon hidden-xs\"\n *ngIf=\"editMode && !isDragging && !fullscreen\"\n ></div>\n\n <div\n class=\"card-placeholder\"\n *cdkDragPlaceholder\n ></div>\n </div>\n</div>\n" }]
28530
28534
  }], ctorParameters: () => [{ type: DashboardComponent }, { type: i1$3.DomSanitizer }, { type: i0.ElementRef }], propDecorators: { templateActions: [{
28531
28535
  type: ContentChildren,
28532
28536
  args: [DashboardChildActionComponent]
@@ -28650,6 +28654,8 @@ class WidgetsDashboardEventService {
28650
28654
  */
28651
28655
  this.events$ = new Subject();
28652
28656
  this.lastValueByEvent = {};
28657
+ this.autoRefresh$ = new ReplaySubject(1);
28658
+ this.onAutoRefresh$ = this.autoRefresh$.asObservable();
28653
28659
  }
28654
28660
  /**
28655
28661
  * Returns a subscribable event observable of specific event type if eventType is passed, or observable of
@@ -28676,6 +28682,21 @@ class WidgetsDashboardEventService {
28676
28682
  this.lastValueByEvent[event.type] = event.data;
28677
28683
  this.events$.next(event);
28678
28684
  }
28685
+ /**
28686
+ * @ignore
28687
+ */
28688
+ emitAutoRefresh(value) {
28689
+ this.autoRefresh$.next(value);
28690
+ }
28691
+ // When a dashboard has a multiple tabs, and not all of them has a realtime global context control
28692
+ // we need to set the realtime to false when switching between tabs to make aggregation selector not to be always disabled
28693
+ // while global auto-refresh context control is available.
28694
+ setRealtimeTimeContextSetting(value = false) {
28695
+ this.lastValueByEvent.TIME_CONTEXT = {
28696
+ ...this.lastValueByEvent.TIME_CONTEXT,
28697
+ realtime: value
28698
+ };
28699
+ }
28679
28700
  /**
28680
28701
  * @ignore
28681
28702
  */
@@ -28689,6 +28710,133 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28689
28710
  type: Injectable
28690
28711
  }] });
28691
28712
 
28713
+ class AggregationPickerComponent {
28714
+ constructor() {
28715
+ /**
28716
+ * Configuration for disabling specific types of aggregation.
28717
+ * By default no aggregation type is disabled.
28718
+ */
28719
+ this.disabledAggregations = {};
28720
+ this.AGGREGATIONS = AGGREGATIONS;
28721
+ this.AGGREGATION_ICONS = AGGREGATION_ICONS;
28722
+ this.AGGREGATION_TEXTS = AGGREGATION_TEXTS;
28723
+ this.touched = false;
28724
+ this.disabled = false;
28725
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
28726
+ this.onChange = _ => { };
28727
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
28728
+ this.onTouched = () => { };
28729
+ }
28730
+ writeValue(value) {
28731
+ this.value = value;
28732
+ }
28733
+ registerOnChange(fn) {
28734
+ this.onChange = fn;
28735
+ }
28736
+ registerOnTouched(onTouched) {
28737
+ this.onTouched = onTouched;
28738
+ }
28739
+ markAsTouched() {
28740
+ if (!this.touched) {
28741
+ this.onTouched();
28742
+ this.touched = true;
28743
+ }
28744
+ }
28745
+ setDisabledState(disabled) {
28746
+ this.disabled = disabled;
28747
+ }
28748
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AggregationPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28749
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AggregationPickerComponent, isStandalone: true, selector: "c8y-aggregation-picker", inputs: { disabledAggregations: "disabledAggregations" }, providers: [
28750
+ {
28751
+ provide: NG_VALUE_ACCESSOR,
28752
+ useExisting: forwardRef(() => AggregationPickerComponent),
28753
+ multi: true
28754
+ }
28755
+ ], ngImport: i0, template: "<div\n class=\"dropdown\"\n style=\"border: 0; margin-left: -1px\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n [isDisabled]=\"disabled\"\n>\n <button\n class=\"dropdown-toggle form-control p-t-0 p-b-0 l-h-1 d-flex a-i-center\"\n [attr.aria-label]=\"(value ? AGGREGATION_TEXTS[value] : AGGREGATION_TEXTS.undefined) | translate\"\n tooltip=\"{{\n (value\n ? AGGREGATION_TEXTS[value]\n : disabled\n ? AGGREGATION_TEXTS.disabled\n : AGGREGATION_TEXTS.undefined\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"value ? AGGREGATION_ICONS[value] : AGGREGATION_ICONS.undefined\"\n ></i>\n <span class=\"caret m-r-8 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu-right--xs\"\n *dropdownMenu\n >\n <li\n *ngFor=\"let aggregation of AGGREGATIONS\"\n [ngClass]=\"{\n active: aggregation.id === value,\n disabled: disabledAggregations[aggregation.id]\n }\"\n >\n <button\n class=\"\"\n (click)=\"onChange(aggregation.id); dropdown.isOpen = false\"\n [disabled]=\"disabledAggregations[aggregation.id]\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n aggregation.id ? AGGREGATION_ICONS[aggregation.id] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <span>{{ aggregation.title | translate }}</span>\n </button>\n </li>\n </ul>\n</div>\n", dependencies: [{ kind: "ngmodule", type: BsDropdownModule }, { kind: "directive", type: i1$4.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$4.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$4.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2$2.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: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
28756
+ }
28757
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AggregationPickerComponent, decorators: [{
28758
+ type: Component,
28759
+ args: [{ selector: 'c8y-aggregation-picker', providers: [
28760
+ {
28761
+ provide: NG_VALUE_ACCESSOR,
28762
+ useExisting: forwardRef(() => AggregationPickerComponent),
28763
+ multi: true
28764
+ }
28765
+ ], standalone: true, imports: [BsDropdownModule, TooltipModule, IconDirective, NgFor, NgClass, C8yTranslatePipe], template: "<div\n class=\"dropdown\"\n style=\"border: 0; margin-left: -1px\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n [isDisabled]=\"disabled\"\n>\n <button\n class=\"dropdown-toggle form-control p-t-0 p-b-0 l-h-1 d-flex a-i-center\"\n [attr.aria-label]=\"(value ? AGGREGATION_TEXTS[value] : AGGREGATION_TEXTS.undefined) | translate\"\n tooltip=\"{{\n (value\n ? AGGREGATION_TEXTS[value]\n : disabled\n ? AGGREGATION_TEXTS.disabled\n : AGGREGATION_TEXTS.undefined\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"value ? AGGREGATION_ICONS[value] : AGGREGATION_ICONS.undefined\"\n ></i>\n <span class=\"caret m-r-8 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu-right--xs\"\n *dropdownMenu\n >\n <li\n *ngFor=\"let aggregation of AGGREGATIONS\"\n [ngClass]=\"{\n active: aggregation.id === value,\n disabled: disabledAggregations[aggregation.id]\n }\"\n >\n <button\n class=\"\"\n (click)=\"onChange(aggregation.id); dropdown.isOpen = false\"\n [disabled]=\"disabledAggregations[aggregation.id]\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n aggregation.id ? AGGREGATION_ICONS[aggregation.id] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <span>{{ aggregation.title | translate }}</span>\n </button>\n </li>\n </ul>\n</div>\n" }]
28766
+ }], propDecorators: { disabledAggregations: [{
28767
+ type: Input
28768
+ }] } });
28769
+
28770
+ class RealtimeControlComponent {
28771
+ constructor() {
28772
+ this.disableRealtimeLabel = gettext$1('Disable realtime');
28773
+ this.enableRealtimeLabel = gettext$1('Enable realtime');
28774
+ this.touched = false;
28775
+ this.disabled = false;
28776
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
28777
+ this.onChange = _ => { };
28778
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
28779
+ this.onTouched = () => { };
28780
+ }
28781
+ writeValue(value) {
28782
+ this.value = value;
28783
+ }
28784
+ registerOnChange(fn) {
28785
+ this.onChange = fn;
28786
+ }
28787
+ registerOnTouched(onTouched) {
28788
+ this.onTouched = onTouched;
28789
+ }
28790
+ markAsTouched() {
28791
+ if (!this.touched) {
28792
+ this.onTouched();
28793
+ this.touched = true;
28794
+ }
28795
+ }
28796
+ setDisabledState(disabled) {
28797
+ this.disabled = disabled;
28798
+ }
28799
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RealtimeControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28800
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RealtimeControlComponent, isStandalone: true, selector: "c8y-realtime-control", providers: [
28801
+ {
28802
+ provide: NG_VALUE_ACCESSOR,
28803
+ useExisting: forwardRef(() => RealtimeControlComponent),
28804
+ multi: true
28805
+ }
28806
+ ], ngImport: i0, template: " <button\n class=\"btn btn-icon c8y-realtime\"\n [attr.aria-label]=\"(value ? disableRealtimeLabel : enableRealtimeLabel) | translate\"\n tooltip=\"{{ (value ? disableRealtimeLabel : enableRealtimeLabel) | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n (click)=\"onChange(!value)\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"disabled\"\n>\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: value, inactive: !value }\"\n ></span>\n</button>\n", dependencies: [{ kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2$2.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: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
28807
+ }
28808
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RealtimeControlComponent, decorators: [{
28809
+ type: Component,
28810
+ args: [{ selector: 'c8y-realtime-control', providers: [
28811
+ {
28812
+ provide: NG_VALUE_ACCESSOR,
28813
+ useExisting: forwardRef(() => RealtimeControlComponent),
28814
+ multi: true
28815
+ }
28816
+ ], standalone: true, imports: [TooltipModule, NgClass, C8yTranslatePipe], template: " <button\n class=\"btn btn-icon c8y-realtime\"\n [attr.aria-label]=\"(value ? disableRealtimeLabel : enableRealtimeLabel) | translate\"\n tooltip=\"{{ (value ? disableRealtimeLabel : enableRealtimeLabel) | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n (click)=\"onChange(!value)\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"disabled\"\n>\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: value, inactive: !value }\"\n ></span>\n</button>\n" }]
28817
+ }] });
28818
+
28819
+ class WidgetTimeContextDateRangeService {
28820
+ constructor() {
28821
+ this.timeContextChange = signal(null);
28822
+ this.initialTimeRange = signal(null);
28823
+ }
28824
+ emitPropertyUpdate(data) {
28825
+ this.timeContextChange.set(data);
28826
+ }
28827
+ updateInitialTimeRange(data) {
28828
+ this.initialTimeRange.set(data);
28829
+ }
28830
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextDateRangeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
28831
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextDateRangeService, providedIn: 'root' }); }
28832
+ }
28833
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextDateRangeService, decorators: [{
28834
+ type: Injectable,
28835
+ args: [{
28836
+ providedIn: 'root'
28837
+ }]
28838
+ }] });
28839
+
28692
28840
  var DateContextQueryParamNames;
28693
28841
  (function (DateContextQueryParamNames) {
28694
28842
  DateContextQueryParamNames["DATE_CONTEXT_FROM"] = "dateContextFrom";
@@ -28949,133 +29097,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28949
29097
  args: [{ providedIn: 'root' }]
28950
29098
  }], ctorParameters: () => [{ type: i1$5.ActivatedRoute }, { type: WidgetTimeContextHelperService }, { type: i1$5.Router }] });
28951
29099
 
28952
- class WidgetTimeContextDateRangeService {
28953
- constructor() {
28954
- this.timeContextChange = signal(null);
28955
- this.initialTimeRange = signal(null);
28956
- }
28957
- emitPropertyUpdate(data) {
28958
- this.timeContextChange.set(data);
28959
- }
28960
- updateInitialTimeRange(data) {
28961
- this.initialTimeRange.set(data);
28962
- }
28963
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextDateRangeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
28964
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextDateRangeService, providedIn: 'root' }); }
28965
- }
28966
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextDateRangeService, decorators: [{
28967
- type: Injectable,
28968
- args: [{
28969
- providedIn: 'root'
28970
- }]
28971
- }] });
28972
-
28973
- class RealtimeControlComponent {
28974
- constructor() {
28975
- this.disableRealtimeLabel = gettext$1('Disable realtime');
28976
- this.enableRealtimeLabel = gettext$1('Enable realtime');
28977
- this.touched = false;
28978
- this.disabled = false;
28979
- // eslint-disable-next-line @typescript-eslint/no-empty-function
28980
- this.onChange = _ => { };
28981
- // eslint-disable-next-line @typescript-eslint/no-empty-function
28982
- this.onTouched = () => { };
28983
- }
28984
- writeValue(value) {
28985
- this.value = value;
28986
- }
28987
- registerOnChange(fn) {
28988
- this.onChange = fn;
28989
- }
28990
- registerOnTouched(onTouched) {
28991
- this.onTouched = onTouched;
28992
- }
28993
- markAsTouched() {
28994
- if (!this.touched) {
28995
- this.onTouched();
28996
- this.touched = true;
28997
- }
28998
- }
28999
- setDisabledState(disabled) {
29000
- this.disabled = disabled;
29001
- }
29002
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RealtimeControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29003
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RealtimeControlComponent, isStandalone: true, selector: "c8y-realtime-control", providers: [
29004
- {
29005
- provide: NG_VALUE_ACCESSOR,
29006
- useExisting: forwardRef(() => RealtimeControlComponent),
29007
- multi: true
29008
- }
29009
- ], ngImport: i0, template: " <button\n class=\"btn btn-icon c8y-realtime\"\n [attr.aria-label]=\"(value ? disableRealtimeLabel : enableRealtimeLabel) | translate\"\n tooltip=\"{{ (value ? disableRealtimeLabel : enableRealtimeLabel) | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n (click)=\"onChange(!value)\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"disabled\"\n>\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: value, inactive: !value }\"\n ></span>\n</button>\n", dependencies: [{ kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2$2.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: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
29010
- }
29011
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RealtimeControlComponent, decorators: [{
29012
- type: Component,
29013
- args: [{ selector: 'c8y-realtime-control', providers: [
29014
- {
29015
- provide: NG_VALUE_ACCESSOR,
29016
- useExisting: forwardRef(() => RealtimeControlComponent),
29017
- multi: true
29018
- }
29019
- ], standalone: true, imports: [TooltipModule, NgClass, C8yTranslatePipe], template: " <button\n class=\"btn btn-icon c8y-realtime\"\n [attr.aria-label]=\"(value ? disableRealtimeLabel : enableRealtimeLabel) | translate\"\n tooltip=\"{{ (value ? disableRealtimeLabel : enableRealtimeLabel) | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n (click)=\"onChange(!value)\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"disabled\"\n>\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: value, inactive: !value }\"\n ></span>\n</button>\n" }]
29020
- }] });
29021
-
29022
- class AggregationPickerComponent {
29023
- constructor() {
29024
- /**
29025
- * Configuration for disabling specific types of aggregation.
29026
- * By default no aggregation type is disabled.
29027
- */
29028
- this.disabledAggregations = {};
29029
- this.AGGREGATIONS = AGGREGATIONS;
29030
- this.AGGREGATION_ICONS = AGGREGATION_ICONS;
29031
- this.AGGREGATION_TEXTS = AGGREGATION_TEXTS;
29032
- this.touched = false;
29033
- this.disabled = false;
29034
- // eslint-disable-next-line @typescript-eslint/no-empty-function
29035
- this.onChange = _ => { };
29036
- // eslint-disable-next-line @typescript-eslint/no-empty-function
29037
- this.onTouched = () => { };
29038
- }
29039
- writeValue(value) {
29040
- this.value = value;
29041
- }
29042
- registerOnChange(fn) {
29043
- this.onChange = fn;
29044
- }
29045
- registerOnTouched(onTouched) {
29046
- this.onTouched = onTouched;
29047
- }
29048
- markAsTouched() {
29049
- if (!this.touched) {
29050
- this.onTouched();
29051
- this.touched = true;
29052
- }
29053
- }
29054
- setDisabledState(disabled) {
29055
- this.disabled = disabled;
29056
- }
29057
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AggregationPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29058
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AggregationPickerComponent, isStandalone: true, selector: "c8y-aggregation-picker", inputs: { disabledAggregations: "disabledAggregations" }, providers: [
29059
- {
29060
- provide: NG_VALUE_ACCESSOR,
29061
- useExisting: forwardRef(() => AggregationPickerComponent),
29062
- multi: true
29063
- }
29064
- ], ngImport: i0, template: "<div\n class=\"dropdown\"\n style=\"border: 0; margin-left: -1px\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n [isDisabled]=\"disabled\"\n>\n <button\n class=\"dropdown-toggle form-control p-t-0 p-b-0 l-h-1 d-flex a-i-center\"\n [attr.aria-label]=\"(value ? AGGREGATION_TEXTS[value] : AGGREGATION_TEXTS.undefined) | translate\"\n tooltip=\"{{\n (value\n ? AGGREGATION_TEXTS[value]\n : disabled\n ? AGGREGATION_TEXTS.disabled\n : AGGREGATION_TEXTS.undefined\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"value ? AGGREGATION_ICONS[value] : AGGREGATION_ICONS.undefined\"\n ></i>\n <span class=\"caret m-r-8 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu-right--xs\"\n *dropdownMenu\n >\n <li\n *ngFor=\"let aggregation of AGGREGATIONS\"\n [ngClass]=\"{\n active: aggregation.id === value,\n disabled: disabledAggregations[aggregation.id]\n }\"\n >\n <button\n class=\"\"\n (click)=\"onChange(aggregation.id); dropdown.isOpen = false\"\n [disabled]=\"disabledAggregations[aggregation.id]\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n aggregation.id ? AGGREGATION_ICONS[aggregation.id] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <span>{{ aggregation.title | translate }}</span>\n </button>\n </li>\n </ul>\n</div>\n", dependencies: [{ kind: "ngmodule", type: BsDropdownModule }, { kind: "directive", type: i1$4.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$4.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$4.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2$2.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: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
29065
- }
29066
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AggregationPickerComponent, decorators: [{
29067
- type: Component,
29068
- args: [{ selector: 'c8y-aggregation-picker', providers: [
29069
- {
29070
- provide: NG_VALUE_ACCESSOR,
29071
- useExisting: forwardRef(() => AggregationPickerComponent),
29072
- multi: true
29073
- }
29074
- ], standalone: true, imports: [BsDropdownModule, TooltipModule, IconDirective, NgFor, NgClass, C8yTranslatePipe], template: "<div\n class=\"dropdown\"\n style=\"border: 0; margin-left: -1px\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n [isDisabled]=\"disabled\"\n>\n <button\n class=\"dropdown-toggle form-control p-t-0 p-b-0 l-h-1 d-flex a-i-center\"\n [attr.aria-label]=\"(value ? AGGREGATION_TEXTS[value] : AGGREGATION_TEXTS.undefined) | translate\"\n tooltip=\"{{\n (value\n ? AGGREGATION_TEXTS[value]\n : disabled\n ? AGGREGATION_TEXTS.disabled\n : AGGREGATION_TEXTS.undefined\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"value ? AGGREGATION_ICONS[value] : AGGREGATION_ICONS.undefined\"\n ></i>\n <span class=\"caret m-r-8 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu-right--xs\"\n *dropdownMenu\n >\n <li\n *ngFor=\"let aggregation of AGGREGATIONS\"\n [ngClass]=\"{\n active: aggregation.id === value,\n disabled: disabledAggregations[aggregation.id]\n }\"\n >\n <button\n class=\"\"\n (click)=\"onChange(aggregation.id); dropdown.isOpen = false\"\n [disabled]=\"disabledAggregations[aggregation.id]\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n aggregation.id ? AGGREGATION_ICONS[aggregation.id] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <span>{{ aggregation.title | translate }}</span>\n </button>\n </li>\n </ul>\n</div>\n" }]
29075
- }], propDecorators: { disabledAggregations: [{
29076
- type: Input
29077
- }] } });
29078
-
29079
29100
  class WidgetTimeContextComponent {
29080
29101
  /**
29081
29102
  * @ignore only DI.
@@ -29151,6 +29172,16 @@ class WidgetTimeContextComponent {
29151
29172
  this.subscribeToIntervalChange();
29152
29173
  this.subscribeToRealtimeChange();
29153
29174
  this.subscribeToAggregationChange();
29175
+ this.widgetEventService.onAutoRefresh$
29176
+ .pipe(takeUntil(this.destroy$), tap(autoRefresh => (this.isAutoRefreshEnabled = autoRefresh)))
29177
+ .subscribe(autoRefresh => {
29178
+ // Fix for:
29179
+ // 1. Make a group with dashboard having a widget with with auto-refresh time context enabled.
29180
+ // 2. When you route to e.g. home page and back to the group dashboard, none of a groups will be routable again.
29181
+ queueMicrotask(() => {
29182
+ autoRefresh ? this.onDisableAutoRefresh() : this.enableDateRangeAndAggregation();
29183
+ });
29184
+ });
29154
29185
  if (initialContext.realtime) {
29155
29186
  this.onRealtimeValueChange(initialContext.realtime);
29156
29187
  this.startRealtime();
@@ -29214,6 +29245,8 @@ class WidgetTimeContextComponent {
29214
29245
  ngOnDestroy() {
29215
29246
  this.unsubscribeFromGlobalContext();
29216
29247
  this.clearQueryParamsIfNeeded();
29248
+ this.widgetEventService.setRealtimeTimeContextSetting();
29249
+ this.widgetEventService.emitAutoRefresh(false);
29217
29250
  this.destroy$.next();
29218
29251
  this.destroy$.complete();
29219
29252
  }
@@ -29428,9 +29461,7 @@ class WidgetTimeContextComponent {
29428
29461
  };
29429
29462
  }
29430
29463
  startRealtime() {
29431
- this.form.controls.temporaryUserSelectedFromDate.disable();
29432
- this.form.controls.temporaryUserSelectedToDate.disable();
29433
- this.form.controls.aggregation.disable();
29464
+ this.disableDateRangeAndAggregation();
29434
29465
  this.realtimeSubscription = interval(this.REALTIME_INTERVAL)
29435
29466
  .pipe(takeUntil(this.destroy$))
29436
29467
  .subscribe(() => {
@@ -29444,11 +29475,26 @@ class WidgetTimeContextComponent {
29444
29475
  });
29445
29476
  });
29446
29477
  }
29478
+ onDisableAutoRefresh() {
29479
+ this.form.controls.aggregation.setValue(null);
29480
+ this.disableDateRangeAndAggregation();
29481
+ }
29482
+ disableDateRangeAndAggregation() {
29483
+ this.form.controls.temporaryUserSelectedFromDate.disable();
29484
+ this.form.controls.temporaryUserSelectedToDate.disable();
29485
+ this.form.controls.aggregation.disable();
29486
+ }
29487
+ enableDateRangeAndAggregation() {
29488
+ if (this.form.controls.realtime.value || this.isAutoRefreshEnabled) {
29489
+ return;
29490
+ }
29491
+ this.form.controls.temporaryUserSelectedFromDate.enable();
29492
+ this.form.controls.temporaryUserSelectedToDate.enable();
29493
+ this.form.controls.aggregation.enable();
29494
+ }
29447
29495
  stopRealtime() {
29448
29496
  this.realtimeSubscription?.unsubscribe();
29449
- this.form?.controls.temporaryUserSelectedFromDate.enable();
29450
- this.form?.controls.temporaryUserSelectedToDate.enable();
29451
- this.form?.controls.aggregation.enable();
29497
+ this.enableDateRangeAndAggregation();
29452
29498
  }
29453
29499
  onRealtimeValueChange(realtime) {
29454
29500
  let dateTimeContext;
@@ -29908,13 +29954,11 @@ class AutoRefreshControlComponent {
29908
29954
  this.DEFAULT_INTERVAL_VALUE = DEFAULT_INTERVAL_VALUE;
29909
29955
  this.loading = new EventEmitter();
29910
29956
  this.widgetGlobalAutoRefresh = inject(WidgetGlobalAutoRefreshService);
29957
+ this.showIntervalRefresh$ = new BehaviorSubject(this.widgetGlobalAutoRefresh.autoRefreshSettings.isEnabled$.getValue());
29911
29958
  this.destroy$ = new Subject();
29912
29959
  // eslint-disable-next-line @typescript-eslint/no-empty-function
29913
29960
  this.onTouched = () => { };
29914
29961
  }
29915
- ngOnInit() {
29916
- this.showIntervalRefresh$ = this.widgetGlobalAutoRefresh.autoRefreshSettings.isEnabled$;
29917
- }
29918
29962
  ngAfterViewInit() {
29919
29963
  this.subscribeOnCountdownChangeState();
29920
29964
  this.setUpOnCountdownEndedListener();
@@ -30037,6 +30081,7 @@ class WidgetAutoRefreshContextComponent {
30037
30081
  this.destroy$ = new Subject();
30038
30082
  this.fb = inject(FormBuilder);
30039
30083
  this.widgetGlobalAutoRefresh = inject(WidgetGlobalAutoRefreshService);
30084
+ this.widgetEventService = inject(WidgetsDashboardEventService);
30040
30085
  }
30041
30086
  ngOnInit() {
30042
30087
  this.widgetGlobalAutoRefresh.globalRefreshWidgetsCount.update(count => count + 1);
@@ -30044,6 +30089,11 @@ class WidgetAutoRefreshContextComponent {
30044
30089
  this.subscribeOnAutoRefreshSecondsChange();
30045
30090
  this.subscribeOnAutoRefreshChange();
30046
30091
  this.subscribeOnRouterEvents();
30092
+ this.form.controls.autoRefresh.valueChanges
30093
+ .pipe(takeUntil(this.destroy$))
30094
+ .subscribe(autorefresh => {
30095
+ this.widgetEventService.emitAutoRefresh(autorefresh);
30096
+ });
30047
30097
  }
30048
30098
  ngAfterViewInit() {
30049
30099
  this.initializeWidgetSubscriptions();
@@ -30057,6 +30107,7 @@ class WidgetAutoRefreshContextComponent {
30057
30107
  .pipe(takeUntil(this.destroy$))
30058
30108
  .subscribe();
30059
30109
  this.listenOnDashboardSaveOperation();
30110
+ this.widgetEventService.emitAutoRefresh(this.form.controls.autoRefresh.value);
30060
30111
  }
30061
30112
  ngOnDestroy() {
30062
30113
  this.onContextDestroy();
@@ -30364,7 +30415,7 @@ class WidgetsDashboardComponent {
30364
30415
  return widgets;
30365
30416
  }
30366
30417
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetsDashboardComponent, deps: [{ token: DynamicComponentService }, { token: i1$1.TranslateService }, { token: i1$5.ActivatedRoute }, { token: ModalService }, { token: WidgetGlobalAutoRefreshService }], target: i0.ɵɵFactoryTarget.Component }); }
30367
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WidgetsDashboardComponent, selector: "c8y-widgets-dashboard", inputs: { widgets: "widgets", context: "context", contextDashboard: "contextDashboard", _settings: ["settings", "_settings"], isCopyDisabled: "isCopyDisabled", breadcrumb: "breadcrumb", editModeButtons: "editModeButtons" }, outputs: { onAddWidget: "onAddWidget", onEditWidget: "onEditWidget", onDeleteWidget: "onDeleteWidget", onChangeDashboard: "onChangeDashboard", onResize: "onResize", onEditDashboard: "onEditDashboard", onCopyDashboard: "onCopyDashboard", onDeleteDashboard: "onDeleteDashboard", onChangeStart: "onChangeStart", onChangeEnd: "onChangeEnd", onSaveDashboard: "onSaveDashboard", onCancelDashboard: "onCancelDashboard", revertChange: "revertChange" }, host: { styleAttribute: "\n display: block;\n ", classAttribute: "dashboard c8y-grid-dashboard" }, providers: [WidgetsDashboardEventService], usesOnChanges: true, ngImport: i0, template: "<c8y-title *ngIf=\"!!settings.title\">\n {{ settings.title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!!breadcrumb\">\n <c8y-breadcrumb-item\n [icon]=\"breadcrumb.icon\"\n [label]=\"breadcrumb.label\"\n [path]=\"breadcrumb.path\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n [priority]=\"ACTION_BAR_EDIT_WIDGETS_PRIORITY\"\n *ngIf=\"!(editMode$ | async)\"\n>\n <button\n class=\"btn btn-link animated fadeIn hidden-xs\"\n title=\"{{ 'Edit widgets' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled\"\n (click)=\"enableEditMode()\"\n data-cy=\"c8y-widget-dashboard--edit-widgets\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"editMode$ | async\"\n>\n <button\n class=\"btn btn-link animated fadeIn\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"widget-dashboard--Add-widget\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"d-flex a-i-center gap-8\"\n *ngIf=\"editMode$ | async\"\n>\n <div class=\"input-group input-group-sm animated fadeIn\">\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Undo' | translate\"\n [tooltip]=\"\n editModeButtons.undoButtonDisabled\n ? ''\n : (undoMessage\n | translate: { changeToUndo: editModeButtons.changeToUndoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('undo')\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n >\n <i [c8yIcon]=\"'undo'\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Redo' | translate\"\n [tooltip]=\"\n editModeButtons.redoButtonDisabled\n ? ''\n : (redoMessage\n | translate: { changeToRedo: editModeButtons.changeToRedoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('redo')\"\n [disabled]=\"editModeButtons.redoButtonDisabled\"\n >\n <i [c8yIcon]=\"'redo'\"></i>\n </button>\n </div>\n <span></span>\n </div>\n <div class=\"btn-group animated fadeIn\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancelDashboardSave()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm m-l-8\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n (click)=\"saveDashboard()\"\n data-cy=\"c8y-widgets-dashboard--save\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"onEditDashboard.observers.length\"\n>\n <button\n class=\"btn btn-link hidden-xs m-l-0\"\n title=\"{{ 'Dashboard settings' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || (editMode$ | async)\"\n (click)=\"onEditDashboard.emit()\"\n data-cy=\"c8y-widgets-dashboard--edit-dashboard\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"settings.allowFullscreen\"\n [priority]=\"-5000\"\n itemClass=\"pull-right\"\n>\n <button\n class=\"btn btn-link\"\n [attr.aria-label]=\"'Full screen' | translate\"\n tooltip=\"{{ 'Full screen' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"toggleFullscreen()\"\n data-cy=\"widgets-dashboard--Full-screen\"\n >\n <i [c8yIcon]=\"(inFullScreen$ | async) ? 'compress' : 'expand'\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visibile-lg-inline\">\n {{ 'Full screen' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n *ngIf=\"settings.canCopy\"\n>\n <div\n [ngStyle]=\"{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center'\n }\"\n >\n <button\n class=\"hidden-xs\"\n title=\"{{\n (isCopyDisabled === true || !isCopyDisabled?.state ? 'Disabled' : copyDashboardLabel) | translate\n }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"onCopyDashboard.emit()\"\n [disabled]=\"isCopyDisabled === true || !isCopyDisabled?.state || (editMode$ | async)\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n <button\n class=\"btn-help btn-help--sm m-r-16 hidden-xs\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"copyDisabledPopoverMsg | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"!isCopyDisabled?.state && copyDisabledPopoverMsg\"\n data-cy=\"widgets-dashboard--info-copy-dashboard\"\n (click)=\"$event.stopPropagation()\"\n ></button>\n </div>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-3000\"\n *ngIf=\"settings.canDelete && onDeleteDashboard.observers.length\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--delete-dashboard\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isDisabled || (editMode$ | async)\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Delete dashboard</span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--delete-dashboard-mobile\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading\n class=\"col-xs-12 text-center\"\n *ngIf=\"isLoadingWidgets$ | async\"\n ></c8y-loading>\n</ng-template>\n\n<ng-container *ngIf=\"!(isLoadingWidgets$ | async); else loadingIndicator\">\n <ng-container *ngIf=\"resolvedWidgets$ | async as widgetsToDisplay\">\n <!-- empty state -->\n <c8y-ui-empty-state\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n *ngIf=\"widgetsToDisplay?.length === 0\"\n >\n <div *ngIf=\"onAddWidget.observers.length\">\n <p\n translate\n *ngIf=\"editMode$ | async\"\n >\n Add widgets to this dashboard.\n </p>\n <p\n translate\n *ngIf=\"!(editMode$ | async)\"\n >\n Click \"Edit widgets\" to unlock\n </p>\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || !(editMode$ | async)\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"c8y-widgets-dashboard--add-widget\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/working-with-dashboards\">user documentation</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n [columns]=\"settings.columns\"\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n [class]=\"widget.classes\"\n *ngFor=\"let widget of widgetsToDisplay\"\n [x]=\"widget._x\"\n [y]=\"widget._y\"\n [width]=\"widget._width || settings.defaultWidth\"\n [height]=\"widget._height || settings.defaultHeight\"\n [margin]=\"settings.widgetMargin\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n [editMode]=\"editMode$ | async\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (toggleFullscreen)=\"toggleFullscreenOnWidget(child)\"\n [canToggleFullscreen]=\"!(inFullScreen$ | async) || widgetInFullscreenMode\"\n #child\n >\n <c8y-dashboard-child-title>\n <span\n data-cy=\"c8y-dashboard-list--device-widget\"\n *ngIf=\"settings.translateWidgetTitle\"\n >\n {{ widget.title | translate }}\n </span>\n <span *ngIf=\"!settings.translateWidgetTitle\">\n {{ widget.title }}\n </span>\n </c8y-dashboard-child-title>\n <c8y-dashboard-child-action *ngIf=\"onEditWidget.observers.length\">\n <button\n title=\"{{ 'Edit widget' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--Edit-widget\"\n (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span translate>Edit</span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dashboard-child-action *ngIf=\"onDeleteWidget.observers.length\">\n <button\n title=\"{{ 'Remove widget' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-widgets-dashboard--remove-widget\"\n (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n (widget.config?.displaySettings?.globalTimeContext ||\n widget.config?.displaySettings?.globalRealtimeContext) &&\n widget.config.widgetInstanceGlobalTimeContext\n \"\n (dateContextChange)=\"updateWidgetConfig($event, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\n [displaySettings]=\"widget.config.displaySettings\"\n [hidden]=\"(editMode$ | async)\"\n ></c8y-widget-time-context>\n\n <c8y-widget-auto-refresh-context\n *ngIf=\"\n widget?.config?.widgetInstanceGlobalAutoRefreshContext &&\n widget.config?.displaySettings.globalAutoRefreshContext\n \"\n [editMode$]=\"editMode$\"\n ></c8y-widget-auto-refresh-context>\n\n <c8y-dynamic-component\n [componentId]=\"widget.componentId || widget.name\"\n [config]=\"\n widget.templateUrl || widget.widgetComponent\n ? { child: widget, dashboard: contextDashboard, context: context }\n : widget.config\n \"\n *ngIf=\"child.intersected\"\n (updateWidgetClasses)=\"updateWidgetClasses(widget, $event)\"\n ></c8y-dynamic-component>\n </c8y-dashboard-child>\n </c8y-dashboard>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: DynamicComponentComponent, selector: "c8y-dynamic-component", inputs: ["componentId", "config", "mode", "notFoundError", "executeResolvers"], outputs: ["updateWidgetClasses"] }, { kind: "directive", type: i2$2.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: TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i2$4.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: ["canDecouple", "displaySettings", "hidden"], outputs: ["dateContextChange"] }, { kind: "component", type: DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: DashboardChildComponent, selector: "c8y-dashboard-child", inputs: ["x", "y", "width", "height", "data", "margin", "useIntersection", "isFrozen", "canToggleFullscreen", "editMode", "class"], outputs: ["changeStart", "changeEnd", "toggleFullscreen"] }, { kind: "component", type: DashboardComponent, selector: "c8y-dashboard", inputs: ["columns", "gap", "rows"], outputs: ["dashboardChange"] }, { kind: "component", type: DashboardChildTitleComponent, selector: "c8y-dashboard-child-title" }, { kind: "component", type: WidgetAutoRefreshContextComponent, selector: "c8y-widget-auto-refresh-context", inputs: ["editMode$"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
30418
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WidgetsDashboardComponent, selector: "c8y-widgets-dashboard", inputs: { widgets: "widgets", context: "context", contextDashboard: "contextDashboard", _settings: ["settings", "_settings"], isCopyDisabled: "isCopyDisabled", breadcrumb: "breadcrumb", editModeButtons: "editModeButtons" }, outputs: { onAddWidget: "onAddWidget", onEditWidget: "onEditWidget", onDeleteWidget: "onDeleteWidget", onChangeDashboard: "onChangeDashboard", onResize: "onResize", onEditDashboard: "onEditDashboard", onCopyDashboard: "onCopyDashboard", onDeleteDashboard: "onDeleteDashboard", onChangeStart: "onChangeStart", onChangeEnd: "onChangeEnd", onSaveDashboard: "onSaveDashboard", onCancelDashboard: "onCancelDashboard", revertChange: "revertChange" }, host: { styleAttribute: "\n display: block;\n ", classAttribute: "dashboard c8y-grid-dashboard" }, providers: [WidgetsDashboardEventService], usesOnChanges: true, ngImport: i0, template: "<c8y-title *ngIf=\"!!settings.title\">\n {{ settings.title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!!breadcrumb\">\n <c8y-breadcrumb-item\n [icon]=\"breadcrumb.icon\"\n [label]=\"breadcrumb.label\"\n [path]=\"breadcrumb.path\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n [priority]=\"ACTION_BAR_EDIT_WIDGETS_PRIORITY\"\n *ngIf=\"!(editMode$ | async)\"\n>\n <button\n class=\"btn btn-link animated fadeIn hidden-xs\"\n title=\"{{ 'Edit widgets' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled\"\n (click)=\"enableEditMode()\"\n data-cy=\"c8y-widget-dashboard--edit-widgets\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"editMode$ | async\"\n>\n <button\n class=\"btn btn-link animated fadeIn\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"widget-dashboard--Add-widget\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"d-flex a-i-center gap-8\"\n *ngIf=\"editMode$ | async\"\n>\n <div class=\"input-group input-group-sm animated fadeIn\">\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Undo' | translate\"\n [tooltip]=\"\n editModeButtons.undoButtonDisabled\n ? ''\n : (undoMessage\n | translate: { changeToUndo: editModeButtons.changeToUndoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('undo')\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n >\n <i [c8yIcon]=\"'undo'\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Redo' | translate\"\n [tooltip]=\"\n editModeButtons.redoButtonDisabled\n ? ''\n : (redoMessage\n | translate: { changeToRedo: editModeButtons.changeToRedoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('redo')\"\n [disabled]=\"editModeButtons.redoButtonDisabled\"\n >\n <i [c8yIcon]=\"'redo'\"></i>\n </button>\n </div>\n <span></span>\n </div>\n <div class=\"btn-group animated fadeIn\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancelDashboardSave()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm m-l-8\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n (click)=\"saveDashboard()\"\n data-cy=\"c8y-widgets-dashboard--save\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"onEditDashboard.observers.length\"\n>\n <button\n class=\"btn btn-link hidden-xs m-l-0\"\n title=\"{{ 'Dashboard settings' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || (editMode$ | async)\"\n (click)=\"onEditDashboard.emit()\"\n data-cy=\"c8y-widgets-dashboard--edit-dashboard\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"settings.allowFullscreen\"\n [priority]=\"-5000\"\n itemClass=\"pull-right\"\n>\n <button\n class=\"btn btn-link\"\n [attr.aria-label]=\"'Full screen' | translate\"\n tooltip=\"{{ 'Full screen' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"toggleFullscreen()\"\n data-cy=\"widgets-dashboard--Full-screen\"\n >\n <i [c8yIcon]=\"(inFullScreen$ | async) ? 'compress' : 'expand'\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visibile-lg-inline\">\n {{ 'Full screen' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n *ngIf=\"settings.canCopy\"\n>\n <div\n [ngStyle]=\"{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center'\n }\"\n >\n <button\n class=\"hidden-xs\"\n title=\"{{\n (isCopyDisabled === true || !isCopyDisabled?.state ? 'Disabled' : copyDashboardLabel)\n | translate\n }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"onCopyDashboard.emit()\"\n [disabled]=\"isCopyDisabled === true || !isCopyDisabled?.state || (editMode$ | async)\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n <button\n class=\"btn-help btn-help--sm m-r-16 hidden-xs\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"copyDisabledPopoverMsg | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"!isCopyDisabled?.state && copyDisabledPopoverMsg\"\n data-cy=\"widgets-dashboard--info-copy-dashboard\"\n (click)=\"$event.stopPropagation()\"\n ></button>\n </div>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-3000\"\n *ngIf=\"settings.canDelete && onDeleteDashboard.observers.length\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--delete-dashboard\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isDisabled || (editMode$ | async)\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Delete dashboard</span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--delete-dashboard-mobile\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading\n class=\"col-xs-12 text-center\"\n *ngIf=\"isLoadingWidgets$ | async\"\n ></c8y-loading>\n</ng-template>\n\n<ng-container *ngIf=\"!(isLoadingWidgets$ | async); else loadingIndicator\">\n <ng-container *ngIf=\"resolvedWidgets$ | async as widgetsToDisplay\">\n <!-- empty state -->\n <c8y-ui-empty-state\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n *ngIf=\"widgetsToDisplay?.length === 0\"\n >\n <div *ngIf=\"onAddWidget.observers.length\">\n <p\n translate\n *ngIf=\"editMode$ | async\"\n >\n Add widgets to this dashboard.\n </p>\n <p\n translate\n *ngIf=\"!(editMode$ | async)\"\n >\n Click \"Edit widgets\" to unlock\n </p>\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || !(editMode$ | async)\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"c8y-widgets-dashboard--add-widget\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/working-with-dashboards\">user documentation</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n [columns]=\"settings.columns\"\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n [class]=\"widget.classes\"\n *ngFor=\"let widget of widgetsToDisplay\"\n [x]=\"widget._x\"\n [y]=\"widget._y\"\n [width]=\"widget._width || settings.defaultWidth\"\n [height]=\"widget._height || settings.defaultHeight\"\n [margin]=\"settings.widgetMargin\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n [editMode]=\"editMode$ | async\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (toggleFullscreen)=\"toggleFullscreenOnWidget(child)\"\n [canToggleFullscreen]=\"!(inFullScreen$ | async) || widgetInFullscreenMode\"\n #child\n >\n <c8y-dashboard-child-title>\n <span\n data-cy=\"c8y-dashboard-list--device-widget\"\n *ngIf=\"settings.translateWidgetTitle\"\n >\n {{ widget.title | translate }}\n </span>\n <span *ngIf=\"!settings.translateWidgetTitle\">\n {{ widget.title }}\n </span>\n </c8y-dashboard-child-title>\n <c8y-dashboard-child-action *ngIf=\"onEditWidget.observers.length\">\n <button\n title=\"{{ 'Edit widget' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--Edit-widget\"\n (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span translate>Edit</span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dashboard-child-action *ngIf=\"onDeleteWidget.observers.length\">\n <button\n title=\"{{ 'Remove widget' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-widgets-dashboard--remove-widget\"\n (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n (widget.config?.displaySettings?.globalTimeContext ||\n widget.config?.displaySettings?.globalRealtimeContext) &&\n (widget.config.widgetInstanceGlobalTimeContext ||\n widget.config.widgetInstanceGlobalAutoRefreshContext)\n \"\n (dateContextChange)=\"updateWidgetConfig($event, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\n [displaySettings]=\"widget.config.displaySettings\"\n [hidden]=\"editMode$ | async\"\n ></c8y-widget-time-context>\n\n <c8y-widget-auto-refresh-context\n *ngIf=\"\n widget?.config?.widgetInstanceGlobalAutoRefreshContext &&\n widget.config?.displaySettings.globalAutoRefreshContext\n \"\n [editMode$]=\"editMode$\"\n ></c8y-widget-auto-refresh-context>\n\n <c8y-dynamic-component\n [componentId]=\"widget.componentId || widget.name\"\n [config]=\"\n widget.templateUrl || widget.widgetComponent\n ? { child: widget, dashboard: contextDashboard, context: context }\n : widget.config\n \"\n *ngIf=\"child.intersected\"\n (updateWidgetClasses)=\"updateWidgetClasses(widget, $event)\"\n ></c8y-dynamic-component>\n </c8y-dashboard-child>\n </c8y-dashboard>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: DynamicComponentComponent, selector: "c8y-dynamic-component", inputs: ["componentId", "config", "mode", "notFoundError", "executeResolvers"], outputs: ["updateWidgetClasses"] }, { kind: "directive", type: i2$2.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: TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i2$4.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: ["canDecouple", "displaySettings", "hidden"], outputs: ["dateContextChange"] }, { kind: "component", type: DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: DashboardChildComponent, selector: "c8y-dashboard-child", inputs: ["x", "y", "width", "height", "data", "margin", "useIntersection", "isFrozen", "canToggleFullscreen", "editMode", "class"], outputs: ["changeStart", "changeEnd", "toggleFullscreen"] }, { kind: "component", type: DashboardComponent, selector: "c8y-dashboard", inputs: ["columns", "gap", "rows"], outputs: ["dashboardChange"] }, { kind: "component", type: DashboardChildTitleComponent, selector: "c8y-dashboard-child-title" }, { kind: "component", type: WidgetAutoRefreshContextComponent, selector: "c8y-widget-auto-refresh-context", inputs: ["editMode$"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
30368
30419
  }
30369
30420
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetsDashboardComponent, decorators: [{
30370
30421
  type: Component,
@@ -30373,7 +30424,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30373
30424
  display: block;
30374
30425
  `,
30375
30426
  class: 'dashboard c8y-grid-dashboard'
30376
- }, providers: [WidgetsDashboardEventService], template: "<c8y-title *ngIf=\"!!settings.title\">\n {{ settings.title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!!breadcrumb\">\n <c8y-breadcrumb-item\n [icon]=\"breadcrumb.icon\"\n [label]=\"breadcrumb.label\"\n [path]=\"breadcrumb.path\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n [priority]=\"ACTION_BAR_EDIT_WIDGETS_PRIORITY\"\n *ngIf=\"!(editMode$ | async)\"\n>\n <button\n class=\"btn btn-link animated fadeIn hidden-xs\"\n title=\"{{ 'Edit widgets' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled\"\n (click)=\"enableEditMode()\"\n data-cy=\"c8y-widget-dashboard--edit-widgets\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"editMode$ | async\"\n>\n <button\n class=\"btn btn-link animated fadeIn\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"widget-dashboard--Add-widget\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"d-flex a-i-center gap-8\"\n *ngIf=\"editMode$ | async\"\n>\n <div class=\"input-group input-group-sm animated fadeIn\">\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Undo' | translate\"\n [tooltip]=\"\n editModeButtons.undoButtonDisabled\n ? ''\n : (undoMessage\n | translate: { changeToUndo: editModeButtons.changeToUndoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('undo')\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n >\n <i [c8yIcon]=\"'undo'\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Redo' | translate\"\n [tooltip]=\"\n editModeButtons.redoButtonDisabled\n ? ''\n : (redoMessage\n | translate: { changeToRedo: editModeButtons.changeToRedoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('redo')\"\n [disabled]=\"editModeButtons.redoButtonDisabled\"\n >\n <i [c8yIcon]=\"'redo'\"></i>\n </button>\n </div>\n <span></span>\n </div>\n <div class=\"btn-group animated fadeIn\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancelDashboardSave()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm m-l-8\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n (click)=\"saveDashboard()\"\n data-cy=\"c8y-widgets-dashboard--save\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"onEditDashboard.observers.length\"\n>\n <button\n class=\"btn btn-link hidden-xs m-l-0\"\n title=\"{{ 'Dashboard settings' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || (editMode$ | async)\"\n (click)=\"onEditDashboard.emit()\"\n data-cy=\"c8y-widgets-dashboard--edit-dashboard\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"settings.allowFullscreen\"\n [priority]=\"-5000\"\n itemClass=\"pull-right\"\n>\n <button\n class=\"btn btn-link\"\n [attr.aria-label]=\"'Full screen' | translate\"\n tooltip=\"{{ 'Full screen' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"toggleFullscreen()\"\n data-cy=\"widgets-dashboard--Full-screen\"\n >\n <i [c8yIcon]=\"(inFullScreen$ | async) ? 'compress' : 'expand'\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visibile-lg-inline\">\n {{ 'Full screen' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n *ngIf=\"settings.canCopy\"\n>\n <div\n [ngStyle]=\"{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center'\n }\"\n >\n <button\n class=\"hidden-xs\"\n title=\"{{\n (isCopyDisabled === true || !isCopyDisabled?.state ? 'Disabled' : copyDashboardLabel) | translate\n }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"onCopyDashboard.emit()\"\n [disabled]=\"isCopyDisabled === true || !isCopyDisabled?.state || (editMode$ | async)\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n <button\n class=\"btn-help btn-help--sm m-r-16 hidden-xs\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"copyDisabledPopoverMsg | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"!isCopyDisabled?.state && copyDisabledPopoverMsg\"\n data-cy=\"widgets-dashboard--info-copy-dashboard\"\n (click)=\"$event.stopPropagation()\"\n ></button>\n </div>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-3000\"\n *ngIf=\"settings.canDelete && onDeleteDashboard.observers.length\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--delete-dashboard\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isDisabled || (editMode$ | async)\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Delete dashboard</span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--delete-dashboard-mobile\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading\n class=\"col-xs-12 text-center\"\n *ngIf=\"isLoadingWidgets$ | async\"\n ></c8y-loading>\n</ng-template>\n\n<ng-container *ngIf=\"!(isLoadingWidgets$ | async); else loadingIndicator\">\n <ng-container *ngIf=\"resolvedWidgets$ | async as widgetsToDisplay\">\n <!-- empty state -->\n <c8y-ui-empty-state\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n *ngIf=\"widgetsToDisplay?.length === 0\"\n >\n <div *ngIf=\"onAddWidget.observers.length\">\n <p\n translate\n *ngIf=\"editMode$ | async\"\n >\n Add widgets to this dashboard.\n </p>\n <p\n translate\n *ngIf=\"!(editMode$ | async)\"\n >\n Click \"Edit widgets\" to unlock\n </p>\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || !(editMode$ | async)\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"c8y-widgets-dashboard--add-widget\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/working-with-dashboards\">user documentation</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n [columns]=\"settings.columns\"\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n [class]=\"widget.classes\"\n *ngFor=\"let widget of widgetsToDisplay\"\n [x]=\"widget._x\"\n [y]=\"widget._y\"\n [width]=\"widget._width || settings.defaultWidth\"\n [height]=\"widget._height || settings.defaultHeight\"\n [margin]=\"settings.widgetMargin\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n [editMode]=\"editMode$ | async\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (toggleFullscreen)=\"toggleFullscreenOnWidget(child)\"\n [canToggleFullscreen]=\"!(inFullScreen$ | async) || widgetInFullscreenMode\"\n #child\n >\n <c8y-dashboard-child-title>\n <span\n data-cy=\"c8y-dashboard-list--device-widget\"\n *ngIf=\"settings.translateWidgetTitle\"\n >\n {{ widget.title | translate }}\n </span>\n <span *ngIf=\"!settings.translateWidgetTitle\">\n {{ widget.title }}\n </span>\n </c8y-dashboard-child-title>\n <c8y-dashboard-child-action *ngIf=\"onEditWidget.observers.length\">\n <button\n title=\"{{ 'Edit widget' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--Edit-widget\"\n (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span translate>Edit</span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dashboard-child-action *ngIf=\"onDeleteWidget.observers.length\">\n <button\n title=\"{{ 'Remove widget' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-widgets-dashboard--remove-widget\"\n (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n (widget.config?.displaySettings?.globalTimeContext ||\n widget.config?.displaySettings?.globalRealtimeContext) &&\n widget.config.widgetInstanceGlobalTimeContext\n \"\n (dateContextChange)=\"updateWidgetConfig($event, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\n [displaySettings]=\"widget.config.displaySettings\"\n [hidden]=\"(editMode$ | async)\"\n ></c8y-widget-time-context>\n\n <c8y-widget-auto-refresh-context\n *ngIf=\"\n widget?.config?.widgetInstanceGlobalAutoRefreshContext &&\n widget.config?.displaySettings.globalAutoRefreshContext\n \"\n [editMode$]=\"editMode$\"\n ></c8y-widget-auto-refresh-context>\n\n <c8y-dynamic-component\n [componentId]=\"widget.componentId || widget.name\"\n [config]=\"\n widget.templateUrl || widget.widgetComponent\n ? { child: widget, dashboard: contextDashboard, context: context }\n : widget.config\n \"\n *ngIf=\"child.intersected\"\n (updateWidgetClasses)=\"updateWidgetClasses(widget, $event)\"\n ></c8y-dynamic-component>\n </c8y-dashboard-child>\n </c8y-dashboard>\n </ng-container>\n</ng-container>\n" }]
30427
+ }, providers: [WidgetsDashboardEventService], template: "<c8y-title *ngIf=\"!!settings.title\">\n {{ settings.title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!!breadcrumb\">\n <c8y-breadcrumb-item\n [icon]=\"breadcrumb.icon\"\n [label]=\"breadcrumb.label\"\n [path]=\"breadcrumb.path\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n [priority]=\"ACTION_BAR_EDIT_WIDGETS_PRIORITY\"\n *ngIf=\"!(editMode$ | async)\"\n>\n <button\n class=\"btn btn-link animated fadeIn hidden-xs\"\n title=\"{{ 'Edit widgets' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled\"\n (click)=\"enableEditMode()\"\n data-cy=\"c8y-widget-dashboard--edit-widgets\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"editMode$ | async\"\n>\n <button\n class=\"btn btn-link animated fadeIn\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"widget-dashboard--Add-widget\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"d-flex a-i-center gap-8\"\n *ngIf=\"editMode$ | async\"\n>\n <div class=\"input-group input-group-sm animated fadeIn\">\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Undo' | translate\"\n [tooltip]=\"\n editModeButtons.undoButtonDisabled\n ? ''\n : (undoMessage\n | translate: { changeToUndo: editModeButtons.changeToUndoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('undo')\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n >\n <i [c8yIcon]=\"'undo'\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Redo' | translate\"\n [tooltip]=\"\n editModeButtons.redoButtonDisabled\n ? ''\n : (redoMessage\n | translate: { changeToRedo: editModeButtons.changeToRedoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('redo')\"\n [disabled]=\"editModeButtons.redoButtonDisabled\"\n >\n <i [c8yIcon]=\"'redo'\"></i>\n </button>\n </div>\n <span></span>\n </div>\n <div class=\"btn-group animated fadeIn\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancelDashboardSave()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm m-l-8\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n (click)=\"saveDashboard()\"\n data-cy=\"c8y-widgets-dashboard--save\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"onEditDashboard.observers.length\"\n>\n <button\n class=\"btn btn-link hidden-xs m-l-0\"\n title=\"{{ 'Dashboard settings' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || (editMode$ | async)\"\n (click)=\"onEditDashboard.emit()\"\n data-cy=\"c8y-widgets-dashboard--edit-dashboard\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"settings.allowFullscreen\"\n [priority]=\"-5000\"\n itemClass=\"pull-right\"\n>\n <button\n class=\"btn btn-link\"\n [attr.aria-label]=\"'Full screen' | translate\"\n tooltip=\"{{ 'Full screen' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"toggleFullscreen()\"\n data-cy=\"widgets-dashboard--Full-screen\"\n >\n <i [c8yIcon]=\"(inFullScreen$ | async) ? 'compress' : 'expand'\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visibile-lg-inline\">\n {{ 'Full screen' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n *ngIf=\"settings.canCopy\"\n>\n <div\n [ngStyle]=\"{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center'\n }\"\n >\n <button\n class=\"hidden-xs\"\n title=\"{{\n (isCopyDisabled === true || !isCopyDisabled?.state ? 'Disabled' : copyDashboardLabel)\n | translate\n }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"onCopyDashboard.emit()\"\n [disabled]=\"isCopyDisabled === true || !isCopyDisabled?.state || (editMode$ | async)\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n <button\n class=\"btn-help btn-help--sm m-r-16 hidden-xs\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"copyDisabledPopoverMsg | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"!isCopyDisabled?.state && copyDisabledPopoverMsg\"\n data-cy=\"widgets-dashboard--info-copy-dashboard\"\n (click)=\"$event.stopPropagation()\"\n ></button>\n </div>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-3000\"\n *ngIf=\"settings.canDelete && onDeleteDashboard.observers.length\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--delete-dashboard\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isDisabled || (editMode$ | async)\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Delete dashboard</span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--delete-dashboard-mobile\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading\n class=\"col-xs-12 text-center\"\n *ngIf=\"isLoadingWidgets$ | async\"\n ></c8y-loading>\n</ng-template>\n\n<ng-container *ngIf=\"!(isLoadingWidgets$ | async); else loadingIndicator\">\n <ng-container *ngIf=\"resolvedWidgets$ | async as widgetsToDisplay\">\n <!-- empty state -->\n <c8y-ui-empty-state\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n *ngIf=\"widgetsToDisplay?.length === 0\"\n >\n <div *ngIf=\"onAddWidget.observers.length\">\n <p\n translate\n *ngIf=\"editMode$ | async\"\n >\n Add widgets to this dashboard.\n </p>\n <p\n translate\n *ngIf=\"!(editMode$ | async)\"\n >\n Click \"Edit widgets\" to unlock\n </p>\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || !(editMode$ | async)\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"c8y-widgets-dashboard--add-widget\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/working-with-dashboards\">user documentation</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n [columns]=\"settings.columns\"\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n [class]=\"widget.classes\"\n *ngFor=\"let widget of widgetsToDisplay\"\n [x]=\"widget._x\"\n [y]=\"widget._y\"\n [width]=\"widget._width || settings.defaultWidth\"\n [height]=\"widget._height || settings.defaultHeight\"\n [margin]=\"settings.widgetMargin\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n [editMode]=\"editMode$ | async\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (toggleFullscreen)=\"toggleFullscreenOnWidget(child)\"\n [canToggleFullscreen]=\"!(inFullScreen$ | async) || widgetInFullscreenMode\"\n #child\n >\n <c8y-dashboard-child-title>\n <span\n data-cy=\"c8y-dashboard-list--device-widget\"\n *ngIf=\"settings.translateWidgetTitle\"\n >\n {{ widget.title | translate }}\n </span>\n <span *ngIf=\"!settings.translateWidgetTitle\">\n {{ widget.title }}\n </span>\n </c8y-dashboard-child-title>\n <c8y-dashboard-child-action *ngIf=\"onEditWidget.observers.length\">\n <button\n title=\"{{ 'Edit widget' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--Edit-widget\"\n (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span translate>Edit</span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dashboard-child-action *ngIf=\"onDeleteWidget.observers.length\">\n <button\n title=\"{{ 'Remove widget' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-widgets-dashboard--remove-widget\"\n (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n (widget.config?.displaySettings?.globalTimeContext ||\n widget.config?.displaySettings?.globalRealtimeContext) &&\n (widget.config.widgetInstanceGlobalTimeContext ||\n widget.config.widgetInstanceGlobalAutoRefreshContext)\n \"\n (dateContextChange)=\"updateWidgetConfig($event, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\n [displaySettings]=\"widget.config.displaySettings\"\n [hidden]=\"editMode$ | async\"\n ></c8y-widget-time-context>\n\n <c8y-widget-auto-refresh-context\n *ngIf=\"\n widget?.config?.widgetInstanceGlobalAutoRefreshContext &&\n widget.config?.displaySettings.globalAutoRefreshContext\n \"\n [editMode$]=\"editMode$\"\n ></c8y-widget-auto-refresh-context>\n\n <c8y-dynamic-component\n [componentId]=\"widget.componentId || widget.name\"\n [config]=\"\n widget.templateUrl || widget.widgetComponent\n ? { child: widget, dashboard: contextDashboard, context: context }\n : widget.config\n \"\n *ngIf=\"child.intersected\"\n (updateWidgetClasses)=\"updateWidgetClasses(widget, $event)\"\n ></c8y-dynamic-component>\n </c8y-dashboard-child>\n </c8y-dashboard>\n </ng-container>\n</ng-container>\n" }]
30377
30428
  }], ctorParameters: () => [{ type: DynamicComponentService }, { type: i1$1.TranslateService }, { type: i1$5.ActivatedRoute }, { type: ModalService }, { type: WidgetGlobalAutoRefreshService }], propDecorators: { widgets: [{
30378
30429
  type: Input
30379
30430
  }], context: [{