@c8y/ngx-components 1021.25.5 → 1021.29.0

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 (113) hide show
  1. package/alarms/alarm-details.component.d.ts +8 -13
  2. package/alarms/alarm-details.component.d.ts.map +1 -1
  3. package/alarms/alarm-details.service.d.ts +3 -20
  4. package/alarms/alarm-details.service.d.ts.map +1 -1
  5. package/alarms/alarm-info.component.d.ts +0 -1
  6. package/alarms/alarm-info.component.d.ts.map +1 -1
  7. package/branding/shared/data/branding-version.service.d.ts.map +1 -1
  8. package/branding/shared/lazy/branding-theme-form/branding-theme-form.component.d.ts.map +1 -1
  9. package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
  10. package/core/common/geo.service.d.ts.map +1 -1
  11. package/core/common/inter-app.service.d.ts +1 -0
  12. package/core/common/inter-app.service.d.ts.map +1 -1
  13. package/core/plugins/plugins.model.d.ts +3 -1
  14. package/core/plugins/plugins.model.d.ts.map +1 -1
  15. package/core/plugins/plugins.service.d.ts.map +1 -1
  16. package/device-map/bounds-resolver.service.d.ts +12 -0
  17. package/device-map/bounds-resolver.service.d.ts.map +1 -0
  18. package/device-map/c8y-ngx-components-device-map.d.ts.map +1 -0
  19. package/device-map/device-map-navigation.factory.d.ts +9 -0
  20. package/device-map/device-map-navigation.factory.d.ts.map +1 -0
  21. package/device-map/device-map.component.d.ts +10 -0
  22. package/device-map/device-map.component.d.ts.map +1 -0
  23. package/device-map/device-map.feature.d.ts +3 -0
  24. package/device-map/device-map.feature.d.ts.map +1 -0
  25. package/device-map/index.d.ts +6 -0
  26. package/device-map/index.d.ts.map +1 -0
  27. package/device-map/location-resolver.service.d.ts +8 -0
  28. package/device-map/location-resolver.service.d.ts.map +1 -0
  29. package/ecosystem/application-plugins/application-plugins.component.d.ts.map +1 -1
  30. package/ecosystem/application-plugins/orphaned-status-cell-renderer.component.d.ts.map +1 -1
  31. package/esm2022/alarms/alarm-details.component.mjs +14 -30
  32. package/esm2022/alarms/alarm-details.service.mjs +5 -25
  33. package/esm2022/alarms/alarm-info.component.mjs +1 -1
  34. package/esm2022/branding/shared/data/branding-version.service.mjs +9 -5
  35. package/esm2022/branding/shared/lazy/branding-theme-form/branding-theme-form.component.mjs +5 -2
  36. package/esm2022/core/bootstrap/bootstrap.component.mjs +4 -3
  37. package/esm2022/core/common/geo.service.mjs +2 -5
  38. package/esm2022/core/common/inter-app.service.mjs +3 -2
  39. package/esm2022/core/plugins/plugins.model.mjs +2 -1
  40. package/esm2022/core/plugins/plugins.service.mjs +7 -5
  41. package/esm2022/core/version/websdk-plugin-version.factory.mjs +2 -2
  42. package/esm2022/device-map/bounds-resolver.service.mjs +21 -0
  43. package/esm2022/device-map/c8y-ngx-components-device-map.mjs +5 -0
  44. package/esm2022/device-map/device-map-navigation.factory.mjs +25 -0
  45. package/esm2022/device-map/device-map.component.mjs +30 -0
  46. package/esm2022/device-map/device-map.feature.mjs +15 -0
  47. package/esm2022/device-map/index.mjs +6 -0
  48. package/esm2022/device-map/location-resolver.service.mjs +25 -0
  49. package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +66 -22
  50. package/esm2022/ecosystem/application-plugins/orphaned-status-cell-renderer.component.mjs +7 -1
  51. package/esm2022/location/location.component.mjs +3 -3
  52. package/esm2022/map/map-status.component.mjs +20 -7
  53. package/esm2022/map/map.component.mjs +15 -7
  54. package/esm2022/map/map.model.mjs +2 -2
  55. package/esm2022/map/map.module.mjs +25 -4
  56. package/esm2022/map/map.service.mjs +73 -7
  57. package/esm2022/repository/firmware/list/firmware-list.component.mjs +10 -10
  58. package/esm2022/repository/software/list/software-list.component.mjs +10 -10
  59. package/esm2022/tracking/tracking-marker-popup.component.mjs +10 -3
  60. package/esm2022/tracking/tracking.component.mjs +3 -4
  61. package/esm2022/tracking/tracking.service.mjs +6 -3
  62. package/fesm2022/c8y-ngx-components-alarms.mjs +18 -54
  63. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  64. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +8 -4
  65. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs.map +1 -1
  66. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +4 -1
  67. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  68. package/fesm2022/c8y-ngx-components-device-map.mjs +106 -0
  69. package/fesm2022/c8y-ngx-components-device-map.mjs.map +1 -0
  70. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +71 -21
  71. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  72. package/fesm2022/c8y-ngx-components-ecosystem.mjs +71 -21
  73. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  74. package/fesm2022/c8y-ngx-components-location.mjs +2 -2
  75. package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
  76. package/fesm2022/c8y-ngx-components-map.mjs +122 -14
  77. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  78. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +9 -9
  79. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  80. package/fesm2022/c8y-ngx-components-repository-software.mjs +9 -9
  81. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  82. package/fesm2022/c8y-ngx-components-tracking.mjs +16 -7
  83. package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
  84. package/fesm2022/c8y-ngx-components.mjs +14 -12
  85. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  86. package/locales/de.po +13 -1
  87. package/locales/es.po +13 -1
  88. package/locales/fr.po +13 -1
  89. package/locales/ja_JP.po +15 -3
  90. package/locales/ko.po +13 -1
  91. package/locales/locales.pot +12 -0
  92. package/locales/nl.po +13 -1
  93. package/locales/pl.po +13 -1
  94. package/locales/pt_BR.po +13 -1
  95. package/locales/zh_CN.po +13 -1
  96. package/locales/zh_TW.po +13 -1
  97. package/map/map-status.component.d.ts +3 -1
  98. package/map/map-status.component.d.ts.map +1 -1
  99. package/map/map.component.d.ts +2 -1
  100. package/map/map.component.d.ts.map +1 -1
  101. package/map/map.model.d.ts +1 -0
  102. package/map/map.model.d.ts.map +1 -1
  103. package/map/map.module.d.ts +2 -1
  104. package/map/map.module.d.ts.map +1 -1
  105. package/map/map.service.d.ts +27 -2
  106. package/map/map.service.d.ts.map +1 -1
  107. package/package.json +1 -1
  108. package/repository/firmware/list/firmware-list.component.d.ts.map +1 -1
  109. package/repository/software/list/software-list.component.d.ts.map +1 -1
  110. package/tracking/tracking-marker-popup.component.d.ts +5 -1
  111. package/tracking/tracking-marker-popup.component.d.ts.map +1 -1
  112. package/tracking/tracking.component.d.ts.map +1 -1
  113. package/tracking/tracking.service.d.ts.map +1 -1
@@ -40,7 +40,6 @@ export class TrackingComponent {
40
40
  this.device = contextData;
41
41
  }
42
42
  async ngAfterViewInit() {
43
- this.service.setDeviceId(this.device.id);
44
43
  this.togglePositionRealtime(this.realtime.active);
45
44
  }
46
45
  toggleMarker(event) {
@@ -70,7 +69,7 @@ export class TrackingComponent {
70
69
  }
71
70
  }
72
71
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TrackingComponent, deps: [{ token: i1.TrackingService }, { token: i2.EventRealtimeService }, { token: i2.ContextRouteService }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
73
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: TrackingComponent, isStandalone: true, selector: "c8y-tracking", providers: [TrackingService, EventRealtimeService], viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div class=\"bg-white p-relative\">\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n *ngIf=\"!service.hasEvents\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n\n <div *ngIf=\"loadMoreComponent?.hasMore\">\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: MapModule }, { kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "directive", type: i4.MapPopupDirective, selector: "[c8yMapPopup]" }, { kind: "ngmodule", type: ActionBarModule }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "ngmodule", type: CoreModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.JsonPipe, name: "json" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2.RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "component", type: i2.TimeIntervalComponent, selector: "c8y-time-interval", inputs: ["minCustomDate", "maxCustomDate", "dateRangePickerConfig", "selectedInterval"], outputs: ["interval"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: TrackingMarkerPopupComponent, selector: "c8y-tracking-marker-popup", inputs: ["context"] }] }); }
72
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: TrackingComponent, isStandalone: true, selector: "c8y-tracking", providers: [EventRealtimeService], viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div class=\"bg-white p-relative\">\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n *ngIf=\"!service.hasEvents\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n\n <div *ngIf=\"loadMoreComponent?.hasMore\">\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: MapModule }, { kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "directive", type: i4.MapPopupDirective, selector: "[c8yMapPopup]" }, { kind: "ngmodule", type: ActionBarModule }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "ngmodule", type: CoreModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i5.JsonPipe, name: "json" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2.RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "component", type: i2.TimeIntervalComponent, selector: "c8y-time-interval", inputs: ["minCustomDate", "maxCustomDate", "dateRangePickerConfig", "selectedInterval"], outputs: ["interval"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: TrackingMarkerPopupComponent, selector: "c8y-tracking-marker-popup", inputs: ["context", "showTrackingLink"] }] }); }
74
73
  }
75
74
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TrackingComponent, decorators: [{
76
75
  type: Component,
@@ -82,9 +81,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
82
81
  TimeIntervalComponent,
83
82
  FormsModule,
84
83
  TrackingMarkerPopupComponent
85
- ], providers: [TrackingService, EventRealtimeService], selector: 'c8y-tracking', template: "<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div class=\"bg-white p-relative\">\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n *ngIf=\"!service.hasEvents\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n\n <div *ngIf=\"loadMoreComponent?.hasMore\">\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n" }]
84
+ ], providers: [EventRealtimeService], selector: 'c8y-tracking', template: "<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div class=\"bg-white p-relative\">\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n *ngIf=\"!service.hasEvents\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n\n <div *ngIf=\"loadMoreComponent?.hasMore\">\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n" }]
86
85
  }], ctorParameters: () => [{ type: i1.TrackingService }, { type: i2.EventRealtimeService }, { type: i2.ContextRouteService }, { type: i3.ActivatedRoute }], propDecorators: { map: [{
87
86
  type: ViewChild,
88
87
  args: [MapComponent]
89
88
  }] } });
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tpbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJhY2tpbmcvdHJhY2tpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vdHJhY2tpbmcvdHJhY2tpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBaUIsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFDTCxlQUFlLEVBQ2YsbUJBQW1CLEVBQ25CLFVBQVUsRUFFVixvQkFBb0IsRUFHcEIscUJBQXFCLEVBQ3RCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFlBQVksRUFBYSxTQUFTLEVBQXlCLE1BQU0seUJBQXlCLENBQUM7QUFDcEcsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7O0FBaUJyRCxNQUFNLE9BQU8saUJBQWlCO0lBeUI1QixZQUNTLE9BQXdCLEVBQ3hCLFFBQThCLEVBQzdCLG1CQUF3QyxFQUN4QyxjQUE4QjtRQUgvQixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQUN4QixhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUM3Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXpCeEMsMEJBQXFCLEdBQTBCO1lBQzdDLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2Qix3QkFBd0IsRUFBRSxJQUFJO1NBQy9CLENBQUM7UUFFRixXQUFNLEdBQWM7WUFDbEIsUUFBUSxFQUFFLEtBQUs7WUFDZixNQUFNLEVBQUUsS0FBSztZQUNiLFNBQVMsRUFBRSxFQUFFO1lBQ2IsZ0JBQWdCLEVBQUU7Z0JBQ2hCLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7YUFDbEI7U0FDRixDQUFDO1FBRUYsWUFBTyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDckIsa0JBQWEsR0FBK0IsRUFBRSxDQUFDO1FBQy9DLHFCQUFnQixHQUFHLEtBQUssQ0FBQztJQVN0QixDQUFDO0lBRUosS0FBSyxDQUFDLFFBQVE7UUFDWixNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFvQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxZQUFZLENBQUMsS0FBYTtRQUN4QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsTUFBZTtRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRUQsY0FBYyxDQUFDLFFBQXNCO1FBQ25DLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDckUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsa0JBQWtCLENBQUM7UUFFNUMsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDOzhHQXJFVSxpQkFBaUI7a0dBQWpCLGlCQUFpQiwyREFIakIsQ0FBQyxlQUFlLEVBQUUsb0JBQW9CLENBQUMsK0RBSXZDLFlBQVksZ0RDbkN6Qix5c0hBc0hBLDJDRC9GSSxTQUFTLGtWQUVULGVBQWUsaU5BQ2YsVUFBVSxzakVBRVYsV0FBVywrQkFDWCw0QkFBNEI7OzJGQUtuQixpQkFBaUI7a0JBZjdCLFNBQVM7aUNBQ0ksSUFBSSxXQUVQO3dCQUNQLFNBQVM7d0JBQ1QsU0FBUzt3QkFDVCxlQUFlO3dCQUNmLFVBQVU7d0JBQ1YscUJBQXFCO3dCQUNyQixXQUFXO3dCQUNYLDRCQUE0QjtxQkFDN0IsYUFDVSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxZQUN4QyxjQUFjO3NMQUl4QixHQUFHO3NCQURGLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElFdmVudCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIEFjdGlvbkJhck1vZHVsZSxcbiAgQ29udGV4dFJvdXRlU2VydmljZSxcbiAgQ29yZU1vZHVsZSxcbiAgRGF0ZVJhbmdlUGlja2VyQ29uZmlnLFxuICBFdmVudFJlYWx0aW1lU2VydmljZSxcbiAgTG9hZE1vcmVDb21wb25lbnQsXG4gIFRpbWVJbnRlcnZhbCxcbiAgVGltZUludGVydmFsQ29tcG9uZW50XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgTWFwQ29tcG9uZW50LCBNYXBDb25maWcsIE1hcE1vZHVsZSwgUG9zaXRpb25NYW5hZ2VkT2JqZWN0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9tYXAnO1xuaW1wb3J0IHsgVHJhY2tpbmdNYXJrZXJQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vdHJhY2tpbmctbWFya2VyLXBvcHVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmFja2luZ1NlcnZpY2UgfSBmcm9tICcuL3RyYWNraW5nLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RyYWNraW5nLmNvbXBvbmVudC5odG1sJyxcbiAgaW1wb3J0czogW1xuICAgIE1hcE1vZHVsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgQWN0aW9uQmFyTW9kdWxlLFxuICAgIENvcmVNb2R1bGUsXG4gICAgVGltZUludGVydmFsQ29tcG9uZW50LFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFRyYWNraW5nTWFya2VyUG9wdXBDb21wb25lbnRcbiAgXSxcbiAgcHJvdmlkZXJzOiBbVHJhY2tpbmdTZXJ2aWNlLCBFdmVudFJlYWx0aW1lU2VydmljZV0sXG4gIHNlbGVjdG9yOiAnYzh5LXRyYWNraW5nJ1xufSlcbmV4cG9ydCBjbGFzcyBUcmFja2luZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoTWFwQ29tcG9uZW50KVxuICBtYXA6IE1hcENvbXBvbmVudDtcblxuICBkYXRlUmFuZ2VQaWNrZXJDb25maWc6IERhdGVSYW5nZVBpY2tlckNvbmZpZyA9IHtcbiAgICBhZGFwdGl2ZVBvc2l0aW9uOiB0cnVlLFxuICAgIHNob3dQcmV2aW91c01vbnRoOiB0cnVlLFxuICAgIHByZXZlbnRDaGFuZ2VUb05leHRNb250aDogdHJ1ZVxuICB9O1xuXG4gIGNvbmZpZzogTWFwQ29uZmlnID0ge1xuICAgIHJlYWx0aW1lOiBmYWxzZSxcbiAgICBmb2xsb3c6IGZhbHNlLFxuICAgIHpvb21MZXZlbDogMTIsXG4gICAgZml0Qm91bmRzT3B0aW9uczoge1xuICAgICAgcGFkZGluZzogWzUwLCA1MF1cbiAgICB9XG4gIH07XG5cbiAgbWF4RGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGFjdGl2ZU1hcmtlcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIHJlYWx0aW1lRGlzYWJsZWQgPSBmYWxzZTtcbiAgZGV2aWNlOiBQb3NpdGlvbk1hbmFnZWRPYmplY3Q7XG4gIGxvYWRNb3JlQ29tcG9uZW50OiBMb2FkTW9yZUNvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc2VydmljZTogVHJhY2tpbmdTZXJ2aWNlLFxuICAgIHB1YmxpYyByZWFsdGltZTogRXZlbnRSZWFsdGltZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZXh0Um91dGVTZXJ2aWNlOiBDb250ZXh0Um91dGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCB7IGNvbnRleHREYXRhIH0gPSB0aGlzLmNvbnRleHRSb3V0ZVNlcnZpY2UuZ2V0Q29udGV4dERhdGEodGhpcy5hY3RpdmF0ZWRSb3V0ZSk7XG4gICAgdGhpcy5kZXZpY2UgPSBjb250ZXh0RGF0YSBhcyBQb3NpdGlvbk1hbmFnZWRPYmplY3Q7XG4gIH1cblxuICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLnNldERldmljZUlkKHRoaXMuZGV2aWNlLmlkKTtcbiAgICB0aGlzLnRvZ2dsZVBvc2l0aW9uUmVhbHRpbWUodGhpcy5yZWFsdGltZS5hY3RpdmUpO1xuICB9XG5cbiAgdG9nZ2xlTWFya2VyKGV2ZW50OiBJRXZlbnQpIHtcbiAgICBsZXQgbWFya2VyID0gdGhpcy5tYXAuZmluZE1hcmtlcihldmVudCk7XG5cbiAgICBpZiAobWFya2VyKSB7XG4gICAgICB0aGlzLm1hcC5yZW1vdmVNYXJrZXIobWFya2VyKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZU1hcmtlcnNbYHAke2V2ZW50LmlkfWBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXJrZXIgPSB0aGlzLm1hcC5nZXRUcmFja2luZ01hcmtlcihldmVudCk7XG4gICAgICB0aGlzLm1hcC5hZGRNYXJrZXJUb01hcChtYXJrZXIpO1xuICAgICAgdGhpcy5hY3RpdmVNYXJrZXJzW2BwJHtldmVudC5pZH1gXSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlUG9zaXRpb25SZWFsdGltZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4udGhpcy5jb25maWcsIHJlYWx0aW1lOiBhY3RpdmUgfTtcbiAgfVxuXG4gIHRvZ2dsZVJlYWx0aW1lKGludGVydmFsOiBUaW1lSW50ZXJ2YWwpIHtcbiAgICBjb25zdCBjdXJyZW50VGltZUluUmFuZ2UgPSBEYXRlLm5vdygpIDw9IGludGVydmFsPy5kYXRlVG8/LmdldFRpbWUoKTtcbiAgICB0aGlzLnRvZ2dsZVBvc2l0aW9uUmVhbHRpbWUoY3VycmVudFRpbWVJblJhbmdlKTtcbiAgICB0aGlzLnJlYWx0aW1lRGlzYWJsZWQgPSAhY3VycmVudFRpbWVJblJhbmdlO1xuXG4gICAgaWYgKGN1cnJlbnRUaW1lSW5SYW5nZSkge1xuICAgICAgdGhpcy5yZWFsdGltZS5zdGFydCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlYWx0aW1lLnN0b3AoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiXG4gIFtwcmlvcml0eV09XCIxMDBcIlxuPlxuICA8Yzh5LXJlYWx0aW1lLWJ0blxuICAgIFtzZXJ2aWNlXT1cInJlYWx0aW1lXCJcbiAgICBbZGlzYWJsZWRdPVwicmVhbHRpbWVEaXNhYmxlZFwiXG4gICAgKG9uVG9nZ2xlKT1cInRvZ2dsZVBvc2l0aW9uUmVhbHRpbWUoJGV2ZW50KVwiXG4gID48L2M4eS1yZWFsdGltZS1idG4+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG48Yzh5LWFjdGlvbi1iYXItaXRlbVxuICBbcGxhY2VtZW50XT1cIidyaWdodCdcIlxuICBbcHJpb3JpdHldPVwiNjBcIlxuPlxuICA8Yzh5LXRpbWUtaW50ZXJ2YWxcbiAgICBbbWF4Q3VzdG9tRGF0ZV09XCJtYXhEYXRlXCJcbiAgICBbZGF0ZVJhbmdlUGlja2VyQ29uZmlnXT1cImRhdGVSYW5nZVBpY2tlckNvbmZpZ1wiXG4gICAgKGludGVydmFsKT1cInNlcnZpY2Uuc2V0SW50ZXJ2YWwoJGV2ZW50KTsgdG9nZ2xlUmVhbHRpbWUoJGV2ZW50KVwiXG4gID48L2M4eS10aW1lLWludGVydmFsPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLS1ncmlkIGNvbnRlbnQtZnVsbHBhZ2UgZC1ncmlkIGdyaWRfX2NvbC0tOC00LS1tZFwiPlxuICA8ZGl2IGNsYXNzPVwiYmctd2hpdGUgcC1yZWxhdGl2ZVwiPlxuICAgIDxjOHktbWFwXG4gICAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgICBbYXNzZXRzXT1cImRldmljZVwiXG4gICAgICBbcG9seWxpbmUkXT1cInNlcnZpY2UucG9seWxpbmUkXCJcbiAgICAgIFtwb2x5bGluZU9wdGlvbnNdPVwieyBjb2xvcjogJ2RhcmtibHVlJyB9XCJcbiAgICA+XG4gICAgICA8ZGl2ICpjOHlNYXBQb3B1cD1cImxldCBjb250ZXh0XCI+XG4gICAgICAgIDxjOHktdHJhY2tpbmctbWFya2VyLXBvcHVwIFtjb250ZXh0XT1cImNvbnRleHRcIj48L2M4eS10cmFja2luZy1tYXJrZXItcG9wdXA+XG4gICAgICA8L2Rpdj5cbiAgICA8L2M4eS1tYXA+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggZC1jb2wgYmctaW5oZXJpdCBjb250ZW50LWZ1bGxwYWdlIGJnLWdyYXktd2hpdGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgbGFyZ2UtcGFkZGluZyBzZXBhcmF0b3Igc3RpY2t5LXRvcFwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJjYXJkLXRpdGxlXCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICA+XG4gICAgICAgIFRyYWNraW5nIGV2ZW50c1xuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpbm5lci1zY3JvbGxcIj5cbiAgICAgIDxjOHktbGlzdC1ncm91cCBjbGFzcz1cImM4eS1saXN0X19ncm91cC0tc3RyaXBcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgYzh5Rm9yXG4gICAgICAgICAgbGV0LWV2ZW50XG4gICAgICAgICAgW2M4eUZvck9mXT1cInNlcnZpY2UuZXZlbnRzJFwiXG4gICAgICAgICAgW2M4eUZvclBpcGVdPVwic2VydmljZS5waXBlXCJcbiAgICAgICAgICBbYzh5Rm9yUmVhbHRpbWVdPVwicmVhbHRpbWVcIlxuICAgICAgICAgIFtjOHlGb3JSZWFsdGltZU9wdGlvbnNdPVwieyBlbnRpdHlPcklkOiBkZXZpY2UgfVwiXG4gICAgICAgICAgW2M4eUZvckxvYWRNb3JlXT1cIidoaWRkZW4nXCJcbiAgICAgICAgICBbYzh5Rm9yTm90Rm91bmRdPVwiZW1wdHlcIlxuICAgICAgICAgIChjOHlGb3JMb2FkTW9yZUNvbXBvbmVudCk9XCJcbiAgICAgICAgICAgIGxvYWRNb3JlQ29tcG9uZW50ID0gJGV2ZW50OyBsb2FkTW9yZUNvbXBvbmVudC51c2VJbnRlcnNlY3Rpb24gPSBmYWxzZVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8Yzh5LWxpXG4gICAgICAgICAgICBjbGFzcz1cInBvaW50ZXJcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAndGV4dC1wcmltYXJ5IHRleHQtYm9sZCc6IGFjdGl2ZU1hcmtlcnNbJ3AnICsgZXZlbnQ/LmlkXSB9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNYXJrZXIoZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Yzh5LWxpLWljb24gW25nQ2xhc3NdPVwieyAndGV4dC1wcmltYXJ5JzogYWN0aXZlTWFya2Vyc1sncCcgKyBldmVudD8uaWRdIH1cIj5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImM4eS1sb2NhdGlvblwiPjwvaT5cbiAgICAgICAgICAgIDwvYzh5LWxpLWljb24+XG4gICAgICAgICAgICA8Yzh5LWxpLWJvZHk+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgIHt7IGV2ZW50LnRpbWUgfCBkYXRlOiAnbWVkaXVtRGF0ZScgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAge3sgZXZlbnQudGltZSB8IGRhdGU6ICdtZWRpdW1UaW1lJyB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2M4eS1saS1ib2R5PlxuICAgICAgICAgIDwvYzh5LWxpPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9jOHktbGlzdC1ncm91cD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gZW1wdHkgc3RhdGUgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNlbXB0eT5cbiAgICAgIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICAgICAgaWNvbj1cImM4eS1sb2NhdGlvblwiXG4gICAgICAgIFt0aXRsZV09XCInTm8gdHJhY2tpbmcgZXZlbnRzIGZvdW5kLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbc3VidGl0bGVdPVwiJ1NlbGVjdCBhbm90aGVyIHRpbWUgcmFuZ2UuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICpuZ0lmPVwiIXNlcnZpY2UuaGFzRXZlbnRzXCJcbiAgICAgICAgW2hvcml6b250YWxdPVwidHJ1ZVwiXG4gICAgICA+PC9jOHktdWktZW1wdHktc3RhdGU+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxkaXYgKm5nSWY9XCJsb2FkTW9yZUNvbXBvbmVudD8uaGFzTW9yZVwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGluayBmaXQtdyBzdGlja3ktYm90dG9tIHNlcGFyYXRvci10b3BcIlxuICAgICAgICBbdGl0bGVdPVwiJ0xvYWQgbW9yZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRNb3JlQ29tcG9uZW50Py5pc0xvYWRpbmdcIlxuICAgICAgICAoY2xpY2spPVwibG9hZE1vcmVDb21wb25lbnQubG9hZE1vcmUoKVwiXG4gICAgICA+XG4gICAgICAgIHt7ICdMb2FkIG1vcmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBzZXBhcmF0b3JcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICBbdGl0bGVdPVwiJ0Rlc2VsZWN0IGFsbCBtYXJrZXJzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiKGFjdGl2ZU1hcmtlcnMgfCBqc29uKSA9PT0gJ3t9J1wiXG4gICAgICAgIChjbGljayk9XCJtYXAuY2xlYXJNYXJrZXJzKCdldmVudCcpOyBhY3RpdmVNYXJrZXJzID0ge31cIlxuICAgICAgPlxuICAgICAgICB7eyAnRGVzZWxlY3QgYWxsIG1hcmtlcnMnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tpbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJhY2tpbmcvdHJhY2tpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vdHJhY2tpbmcvdHJhY2tpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBaUIsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFDTCxlQUFlLEVBQ2YsbUJBQW1CLEVBQ25CLFVBQVUsRUFFVixvQkFBb0IsRUFHcEIscUJBQXFCLEVBQ3RCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFlBQVksRUFBYSxTQUFTLEVBQXlCLE1BQU0seUJBQXlCLENBQUM7QUFDcEcsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7O0FBaUJyRCxNQUFNLE9BQU8saUJBQWlCO0lBeUI1QixZQUNTLE9BQXdCLEVBQ3hCLFFBQThCLEVBQzdCLG1CQUF3QyxFQUN4QyxjQUE4QjtRQUgvQixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQUN4QixhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUM3Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXpCeEMsMEJBQXFCLEdBQTBCO1lBQzdDLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2Qix3QkFBd0IsRUFBRSxJQUFJO1NBQy9CLENBQUM7UUFFRixX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YXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSUV2ZW50IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWN0aW9uQmFyTW9kdWxlLFxuICBDb250ZXh0Um91dGVTZXJ2aWNlLFxuICBDb3JlTW9kdWxlLFxuICBEYXRlUmFuZ2VQaWNrZXJDb25maWcsXG4gIEV2ZW50UmVhbHRpbWVTZXJ2aWNlLFxuICBMb2FkTW9yZUNvbXBvbmVudCxcbiAgVGltZUludGVydmFsLFxuICBUaW1lSW50ZXJ2YWxDb21wb25lbnRcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBNYXBDb21wb25lbnQsIE1hcENvbmZpZywgTWFwTW9kdWxlLCBQb3NpdGlvbk1hbmFnZWRPYmplY3QgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQgeyBUcmFja2luZ01hcmtlclBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi90cmFja2luZy1tYXJrZXItcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFRyYWNraW5nU2VydmljZSB9IGZyb20gJy4vdHJhY2tpbmcuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vdHJhY2tpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBpbXBvcnRzOiBbXG4gICAgTWFwTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBBY3Rpb25CYXJNb2R1bGUsXG4gICAgQ29yZU1vZHVsZSxcbiAgICBUaW1lSW50ZXJ2YWxDb21wb25lbnQsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgVHJhY2tpbmdNYXJrZXJQb3B1cENvbXBvbmVudFxuICBdLFxuICBwcm92aWRlcnM6IFtFdmVudFJlYWx0aW1lU2VydmljZV0sXG4gIHNlbGVjdG9yOiAnYzh5LXRyYWNraW5nJ1xufSlcbmV4cG9ydCBjbGFzcyBUcmFja2luZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoTWFwQ29tcG9uZW50KVxuICBtYXA6IE1hcENvbXBvbmVudDtcblxuICBkYXRlUmFuZ2VQaWNrZXJDb25maWc6IERhdGVSYW5nZVBpY2tlckNvbmZpZyA9IHtcbiAgICBhZGFwdGl2ZVBvc2l0aW9uOiB0cnVlLFxuICAgIHNob3dQcmV2aW91c01vbnRoOiB0cnVlLFxuICAgIHByZXZlbnRDaGFuZ2VUb05leHRNb250aDogdHJ1ZVxuICB9O1xuXG4gIGNvbmZpZzogTWFwQ29uZmlnID0ge1xuICAgIHJlYWx0aW1lOiBmYWxzZSxcbiAgICBmb2xsb3c6IGZhbHNlLFxuICAgIHpvb21MZXZlbDogMTIsXG4gICAgZml0Qm91bmRzT3B0aW9uczoge1xuICAgICAgcGFkZGluZzogWzUwLCA1MF1cbiAgICB9XG4gIH07XG5cbiAgbWF4RGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGFjdGl2ZU1hcmtlcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIHJlYWx0aW1lRGlzYWJsZWQgPSBmYWxzZTtcbiAgZGV2aWNlOiBQb3NpdGlvbk1hbmFnZWRPYmplY3Q7XG4gIGxvYWRNb3JlQ29tcG9uZW50OiBMb2FkTW9yZUNvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc2VydmljZTogVHJhY2tpbmdTZXJ2aWNlLFxuICAgIHB1YmxpYyByZWFsdGltZTogRXZlbnRSZWFsdGltZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZXh0Um91dGVTZXJ2aWNlOiBDb250ZXh0Um91dGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCB7IGNvbnRleHREYXRhIH0gPSB0aGlzLmNvbnRleHRSb3V0ZVNlcnZpY2UuZ2V0Q29udGV4dERhdGEodGhpcy5hY3RpdmF0ZWRSb3V0ZSk7XG4gICAgdGhpcy5kZXZpY2UgPSBjb250ZXh0RGF0YSBhcyBQb3NpdGlvbk1hbmFnZWRPYmplY3Q7XG4gIH1cblxuICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy50b2dnbGVQb3NpdGlvblJlYWx0aW1lKHRoaXMucmVhbHRpbWUuYWN0aXZlKTtcbiAgfVxuXG4gIHRvZ2dsZU1hcmtlcihldmVudDogSUV2ZW50KSB7XG4gICAgbGV0IG1hcmtlciA9IHRoaXMubWFwLmZpbmRNYXJrZXIoZXZlbnQpO1xuXG4gICAgaWYgKG1hcmtlcikge1xuICAgICAgdGhpcy5tYXAucmVtb3ZlTWFya2VyKG1hcmtlcik7XG4gICAgICBkZWxldGUgdGhpcy5hY3RpdmVNYXJrZXJzW2BwJHtldmVudC5pZH1gXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFya2VyID0gdGhpcy5tYXAuZ2V0VHJhY2tpbmdNYXJrZXIoZXZlbnQpO1xuICAgICAgdGhpcy5tYXAuYWRkTWFya2VyVG9NYXAobWFya2VyKTtcbiAgICAgIHRoaXMuYWN0aXZlTWFya2Vyc1tgcCR7ZXZlbnQuaWR9YF0gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVBvc2l0aW9uUmVhbHRpbWUoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCByZWFsdGltZTogYWN0aXZlIH07XG4gIH1cblxuICB0b2dnbGVSZWFsdGltZShpbnRlcnZhbDogVGltZUludGVydmFsKSB7XG4gICAgY29uc3QgY3VycmVudFRpbWVJblJhbmdlID0gRGF0ZS5ub3coKSA8PSBpbnRlcnZhbD8uZGF0ZVRvPy5nZXRUaW1lKCk7XG4gICAgdGhpcy50b2dnbGVQb3NpdGlvblJlYWx0aW1lKGN1cnJlbnRUaW1lSW5SYW5nZSk7XG4gICAgdGhpcy5yZWFsdGltZURpc2FibGVkID0gIWN1cnJlbnRUaW1lSW5SYW5nZTtcblxuICAgIGlmIChjdXJyZW50VGltZUluUmFuZ2UpIHtcbiAgICAgIHRoaXMucmVhbHRpbWUuc3RhcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWFsdGltZS5zdG9wKCk7XG4gICAgfVxuICB9XG59XG4iLCI8Yzh5LWFjdGlvbi1iYXItaXRlbVxuICBbcGxhY2VtZW50XT1cIidyaWdodCdcIlxuICBbcHJpb3JpdHldPVwiMTAwXCJcbj5cbiAgPGM4eS1yZWFsdGltZS1idG5cbiAgICBbc2VydmljZV09XCJyZWFsdGltZVwiXG4gICAgW2Rpc2FibGVkXT1cInJlYWx0aW1lRGlzYWJsZWRcIlxuICAgIChvblRvZ2dsZSk9XCJ0b2dnbGVQb3NpdGlvblJlYWx0aW1lKCRldmVudClcIlxuICA+PC9jOHktcmVhbHRpbWUtYnRuPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuPGM4eS1hY3Rpb24tYmFyLWl0ZW1cbiAgW3BsYWNlbWVudF09XCIncmlnaHQnXCJcbiAgW3ByaW9yaXR5XT1cIjYwXCJcbj5cbiAgPGM4eS10aW1lLWludGVydmFsXG4gICAgW21heEN1c3RvbURhdGVdPVwibWF4RGF0ZVwiXG4gICAgW2RhdGVSYW5nZVBpY2tlckNvbmZpZ109XCJkYXRlUmFuZ2VQaWNrZXJDb25maWdcIlxuICAgIChpbnRlcnZhbCk9XCJzZXJ2aWNlLnNldEludGVydmFsKCRldmVudCk7IHRvZ2dsZVJlYWx0aW1lKCRldmVudClcIlxuICA+PC9jOHktdGltZS1pbnRlcnZhbD5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdiBjbGFzcz1cImNhcmQgY2FyZC0tZ3JpZCBjb250ZW50LWZ1bGxwYWdlIGQtZ3JpZCBncmlkX19jb2wtLTgtNC0tbWRcIj5cbiAgPGRpdiBjbGFzcz1cImJnLXdoaXRlIHAtcmVsYXRpdmVcIj5cbiAgICA8Yzh5LW1hcFxuICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgW2Fzc2V0c109XCJkZXZpY2VcIlxuICAgICAgW3BvbHlsaW5lJF09XCJzZXJ2aWNlLnBvbHlsaW5lJFwiXG4gICAgICBbcG9seWxpbmVPcHRpb25zXT1cInsgY29sb3I6ICdkYXJrYmx1ZScgfVwiXG4gICAgPlxuICAgICAgPGRpdiAqYzh5TWFwUG9wdXA9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8Yzh5LXRyYWNraW5nLW1hcmtlci1wb3B1cCBbY29udGV4dF09XCJjb250ZXh0XCI+PC9jOHktdHJhY2tpbmctbWFya2VyLXBvcHVwPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktbWFwPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGQtY29sIGJnLWluaGVyaXQgY29udGVudC1mdWxscGFnZSBiZy1ncmF5LXdoaXRlXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGxhcmdlLXBhZGRpbmcgc2VwYXJhdG9yIHN0aWNreS10b3BcIj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiY2FyZC10aXRsZVwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICBUcmFja2luZyBldmVudHNcbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5uZXItc2Nyb2xsXCI+XG4gICAgICA8Yzh5LWxpc3QtZ3JvdXAgY2xhc3M9XCJjOHktbGlzdF9fZ3JvdXAtLXN0cmlwXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGM4eUZvclxuICAgICAgICAgIGxldC1ldmVudFxuICAgICAgICAgIFtjOHlGb3JPZl09XCJzZXJ2aWNlLmV2ZW50cyRcIlxuICAgICAgICAgIFtjOHlGb3JQaXBlXT1cInNlcnZpY2UucGlwZVwiXG4gICAgICAgICAgW2M4eUZvclJlYWx0aW1lXT1cInJlYWx0aW1lXCJcbiAgICAgICAgICBbYzh5Rm9yUmVhbHRpbWVPcHRpb25zXT1cInsgZW50aXR5T3JJZDogZGV2aWNlIH1cIlxuICAgICAgICAgIFtjOHlGb3JMb2FkTW9yZV09XCInaGlkZGVuJ1wiXG4gICAgICAgICAgW2M4eUZvck5vdEZvdW5kXT1cImVtcHR5XCJcbiAgICAgICAgICAoYzh5Rm9yTG9hZE1vcmVDb21wb25lbnQpPVwiXG4gICAgICAgICAgICBsb2FkTW9yZUNvbXBvbmVudCA9ICRldmVudDsgbG9hZE1vcmVDb21wb25lbnQudXNlSW50ZXJzZWN0aW9uID0gZmFsc2VcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGM4eS1saVxuICAgICAgICAgICAgY2xhc3M9XCJwb2ludGVyXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3RleHQtcHJpbWFyeSB0ZXh0LWJvbGQnOiBhY3RpdmVNYXJrZXJzWydwJyArIGV2ZW50Py5pZF0gfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTWFya2VyKGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGM4eS1saS1pY29uIFtuZ0NsYXNzXT1cInsgJ3RleHQtcHJpbWFyeSc6IGFjdGl2ZU1hcmtlcnNbJ3AnICsgZXZlbnQ/LmlkXSB9XCI+XG4gICAgICAgICAgICAgIDxpIGM4eUljb249XCJjOHktbG9jYXRpb25cIj48L2k+XG4gICAgICAgICAgICA8L2M4eS1saS1pY29uPlxuICAgICAgICAgICAgPGM4eS1saS1ib2R5PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICB7eyBldmVudC50aW1lIHwgZGF0ZTogJ21lZGl1bURhdGUnIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIHt7IGV2ZW50LnRpbWUgfCBkYXRlOiAnbWVkaXVtVGltZScgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9jOHktbGktYm9keT5cbiAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvYzh5LWxpc3QtZ3JvdXA+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGVtcHR5IHN0YXRlIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHk+XG4gICAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICAgIGljb249XCJjOHktbG9jYXRpb25cIlxuICAgICAgICBbdGl0bGVdPVwiJ05vIHRyYWNraW5nIGV2ZW50cyBmb3VuZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3N1YnRpdGxlXT1cIidTZWxlY3QgYW5vdGhlciB0aW1lIHJhbmdlLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAqbmdJZj1cIiFzZXJ2aWNlLmhhc0V2ZW50c1wiXG4gICAgICAgIFtob3Jpem9udGFsXT1cInRydWVcIlxuICAgICAgPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibG9hZE1vcmVDb21wb25lbnQ/Lmhhc01vcmVcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgZml0LXcgc3RpY2t5LWJvdHRvbSBzZXBhcmF0b3ItdG9wXCJcbiAgICAgICAgW3RpdGxlXT1cIidMb2FkIG1vcmUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkTW9yZUNvbXBvbmVudD8uaXNMb2FkaW5nXCJcbiAgICAgICAgKGNsaWNrKT1cImxvYWRNb3JlQ29tcG9uZW50LmxvYWRNb3JlKClcIlxuICAgICAgPlxuICAgICAgICB7eyAnTG9hZCBtb3JlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgW3RpdGxlXT1cIidEZXNlbGVjdCBhbGwgbWFya2VycycgfCB0cmFuc2xhdGVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIihhY3RpdmVNYXJrZXJzIHwganNvbikgPT09ICd7fSdcIlxuICAgICAgICAoY2xpY2spPVwibWFwLmNsZWFyTWFya2VycygnZXZlbnQnKTsgYWN0aXZlTWFya2VycyA9IHt9XCJcbiAgICAgID5cbiAgICAgICAge3sgJ0Rlc2VsZWN0IGFsbCBtYXJrZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -85,9 +85,12 @@ export class TrackingService {
85
85
  return Date.parse(a?.time) - Date.parse(b?.time);
86
86
  }
87
87
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TrackingService, deps: [{ token: i1.EventService }, { token: i2.GeoService }], target: i0.ɵɵFactoryTarget.Injectable }); }
88
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TrackingService }); }
88
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TrackingService, providedIn: 'root' }); }
89
89
  }
90
90
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TrackingService, decorators: [{
91
- type: Injectable
91
+ type: Injectable,
92
+ args: [{
93
+ providedIn: 'root'
94
+ }]
92
95
  }], ctorParameters: () => [{ type: i1.EventService }, { type: i2.GeoService }] });
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RyYWNraW5nL3RyYWNraW5nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUF1QixNQUFNLGFBQWEsQ0FBQztBQUNoRSxPQUFPLEVBQW1CLFVBQVUsRUFBZ0IsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRixPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakYsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBRTVELE1BQU0sMEJBQTBCLEdBQUcsb0JBQW9CLENBQUM7QUFHeEQsTUFBTSxPQUFPLGVBQWU7YUFDRixnQkFBVyxHQUFHO1FBQ3BDLFFBQVEsRUFBRSxJQUFJO1FBQ2QsY0FBYyxFQUFFLElBQUk7UUFDcEIsSUFBSSxFQUFFLDBCQUEwQjtLQUNqQyxBQUprQyxDQUlqQztJQWNGLFlBQ1UsWUFBMEIsRUFDMUIsR0FBZTtRQURmLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFYekIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVWLDRCQUF1QixHQUFHLElBQUksZUFBZSxDQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRTVELGNBQVMsR0FBNkIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNwRCxrQkFBYSxHQUEwQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3JELFlBQU8sR0FB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O0lBQzNDLENBQUM7SUFFTyxhQUFhLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDeEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDOzhHQTNHVSxlQUFlO2tIQUFmLGVBQWU7OzJGQUFmLGVBQWU7a0JBRDNCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFdmVudFNlcnZpY2UsIElFdmVudCwgSVJlc3VsdExpc3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBGb3JPZkZpbHRlclBpcGUsIEdlb1NlcnZpY2UsIFRpbWVJbnRlcnZhbCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgUG9zaXRpb25NYW5hZ2VkT2JqZWN0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9tYXAnO1xuaW1wb3J0IHsgZmlyc3QsIGlkZW50aXR5LCBpc0VtcHR5LCBsYXN0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY29tYmluZUxhdGVzdCwgcGlwZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmNvbnN0IExPQ0FUSU9OX1VQREFURV9FVkVOVF9UWVBFID0gJ2M4eV9Mb2NhdGlvblVwZGF0ZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUcmFja2luZ1NlcnZpY2Uge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBCQVNFX0ZJTFRFUiA9IHtcbiAgICBwYWdlU2l6ZTogMTAwMCxcbiAgICB3aXRoVG90YWxQYWdlczogdHJ1ZSxcbiAgICB0eXBlOiBMT0NBVElPTl9VUERBVEVfRVZFTlRfVFlQRVxuICB9O1xuXG4gIGV2ZW50cyQ6IE9ic2VydmFibGU8SVJlc3VsdExpc3Q8SUV2ZW50Pj47XG4gIHBvbHlsaW5lJDogT2JzZXJ2YWJsZTxMLkxhdExuZ0V4cHJlc3Npb25bXT47XG4gIHBpcGU6IEZvck9mRmlsdGVyUGlwZTtcbiAgdHJhY2tWaXNpYmxlID0gdHJ1ZTtcbiAgaGFzRXZlbnRzID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfcG9seWxpbmVFdmVudHNTdWJqZWN0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SUV2ZW50W10+KFtdKTtcblxuICBwcml2YXRlIGRldmljZUlkJDogU3ViamVjdDxzdHJpbmcgfCBudW1iZXI+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSB0aW1lSW50ZXJ2YWwkOiBTdWJqZWN0PFRpbWVJbnRlcnZhbD4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHJlbG9hZCQ6IEJlaGF2aW9yU3ViamVjdDx2b2lkPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGdlbzogR2VvU2VydmljZVxuICApIHtcbiAgICB0aGlzLnBvbHlsaW5lJCA9IHRoaXMuX3BvbHlsaW5lRXZlbnRzU3ViamVjdCQuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgIG1hcChldmVudHMgPT4gKGV2ZW50cyB8fCBbXSkubWFwKGV2ZW50ID0+IHRoaXMuZ2VvLmdldExhdExvbmcoZXZlbnQpKS5maWx0ZXIoaWRlbnRpdHkpKSxcbiAgICAgIHNoYXJlKClcbiAgICApO1xuXG4gICAgdGhpcy5ldmVudHMkID0gY29tYmluZUxhdGVzdChbdGhpcy5kZXZpY2VJZCQsIHRoaXMudGltZUludGVydmFsJCwgdGhpcy5yZWxvYWQkXSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoW3NvdXJjZSwgaW50ZXJ2YWxdKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZGF0ZUZyb20sIGRhdGVUbyB9ID0gaW50ZXJ2YWw7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50U2VydmljZS5saXN0KHtcbiAgICAgICAgICAuLi5UcmFja2luZ1NlcnZpY2UuQkFTRV9GSUxURVIsXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICAgIGRhdGVGcm9tOiBkYXRlRnJvbS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRhdGVUbzogZGF0ZVRvLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLl9wb2x5bGluZUV2ZW50c1N1YmplY3QkLm5leHQoW10pKSxcbiAgICAgIHNoYXJlKClcbiAgICApO1xuXG4gICAgdGhpcy5waXBlID0gcGlwZShcbiAgICAgIHRhcChldmVudHMgPT4gKHRoaXMuaGFzRXZlbnRzID0gIWlzRW1wdHkoZXZlbnRzKSkpLFxuICAgICAgbWFwKChldmVudHM6IElFdmVudFtdKSA9PiAoZXZlbnRzIHx8IFtdKS5maWx0ZXIoZXZlbnQgPT4gdGhpcy5pc01hdGNoaW5nRXZlbnQoZXZlbnQpKSksXG4gICAgICB0YXAoKGV2ZW50czogSUV2ZW50W10pID0+IHtcbiAgICAgICAgY29uc3QgcHJlcGVuZCA9XG4gICAgICAgICAgdGhpcy5jb21wYXJlRXZlbnRzKGxhc3QodGhpcy5fcG9seWxpbmVFdmVudHNTdWJqZWN0JC52YWx1ZSksIGZpcnN0KGV2ZW50cykpIDwgMDtcbiAgICAgICAgY29uc3QgcG9seWxpbmU6IElFdmVudFtdID0gcHJlcGVuZFxuICAgICAgICAgID8gWy4uLmV2ZW50cywgLi4udGhpcy5fcG9seWxpbmVFdmVudHNTdWJqZWN0JC52YWx1ZV1cbiAgICAgICAgICA6IFsuLi50aGlzLl9wb2x5bGluZUV2ZW50c1N1YmplY3QkLnZhbHVlLCAuLi5ldmVudHNdO1xuXG4gICAgICAgIHRoaXMuX3BvbHlsaW5lRXZlbnRzU3ViamVjdCQubmV4dChwb2x5bGluZSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzZXREZXZpY2VJZChkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy5kZXZpY2VJZCQubmV4dChkZXZpY2VJZCk7XG4gIH1cblxuICBzZXRJbnRlcnZhbChpbnRlcnZhbDogVGltZUludGVydmFsKSB7XG4gICAgdGhpcy50aW1lSW50ZXJ2YWwkLm5leHQoaW50ZXJ2YWwpO1xuICB9XG5cbiAgY2xlYXJUcmFjaygpIHtcbiAgICB0aGlzLl9wb2x5bGluZUV2ZW50c1N1YmplY3QkLm5leHQoW10pO1xuICB9XG5cbiAgcmVsb2FkKCkge1xuICAgIHRoaXMucmVsb2FkJC5uZXh0KCk7XG4gIH1cblxuICBhc3luYyBsYXRlc3RQb3NpdGlvblVwZGF0ZShtbzogUG9zaXRpb25NYW5hZ2VkT2JqZWN0KTogUHJvbWlzZTxEYXRlPiB7XG4gICAgY29uc3QgZGF0ZVRvID0gbmV3IERhdGUoKTtcbiAgICBkYXRlVG8uc2V0RGF0ZShkYXRlVG8uZ2V0RGF0ZSgpICsgMSk7XG5cbiAgICBjb25zdCBmaWx0ZXJzID0ge1xuICAgICAgZnJhZ21lbnRUeXBlOiAnYzh5X1Bvc2l0aW9uJyxcbiAgICAgIGRhdGVGcm9tOiBuZXcgRGF0ZSgwKS50b0lTT1N0cmluZygpLFxuICAgICAgZGF0ZVRvOiBkYXRlVG8udG9JU09TdHJpbmcoKSxcbiAgICAgIHBhZ2VTaXplOiAxLFxuICAgICAgc291cmNlOiBtby5pZFxuICAgIH07XG4gICAgY29uc3QgZXZlbnRzID0gYXdhaXQgdGhpcy5ldmVudFNlcnZpY2UubGlzdChmaWx0ZXJzKTtcbiAgICByZXR1cm4gZXZlbnRzPy5kYXRhPy5sZW5ndGggPyBuZXcgRGF0ZShldmVudHMuZGF0YVswXS50aW1lKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRvZ2dsZVRyYWNrKCkge1xuICAgIGlmICh0aGlzLnRyYWNrVmlzaWJsZSkge1xuICAgICAgdGhpcy5jbGVhclRyYWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgfVxuICAgIHRoaXMudHJhY2tWaXNpYmxlID0gIXRoaXMudHJhY2tWaXNpYmxlO1xuICB9XG5cbiAgaXNMb2NhdGlvblVwZGF0ZUV2ZW50KGV2ZW50OiBJRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gTE9DQVRJT05fVVBEQVRFX0VWRU5UX1RZUEU7XG4gIH1cblxuICBwcml2YXRlIGlzTWF0Y2hpbmdFdmVudChldmVudDogSUV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2NhdGlvblVwZGF0ZUV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGFyZUV2ZW50cyhhOiBJRXZlbnQsIGI6IElFdmVudCk6IG51bWJlciB7XG4gICAgcmV0dXJuIERhdGUucGFyc2UoYT8udGltZSkgLSBEYXRlLnBhcnNlKGI/LnRpbWUpO1xuICB9XG59XG4iXX0=
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RyYWNraW5nL3RyYWNraW5nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUF1QixNQUFNLGFBQWEsQ0FBQztBQUNoRSxPQUFPLEVBQW1CLFVBQVUsRUFBZ0IsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRixPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakYsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBRTVELE1BQU0sMEJBQTBCLEdBQUcsb0JBQW9CLENBQUM7QUFLeEQsTUFBTSxPQUFPLGVBQWU7YUFDRixnQkFBVyxHQUFHO1FBQ3BDLFFBQVEsRUFBRSxJQUFJO1FBQ2QsY0FBYyxFQUFFLElBQUk7UUFDcEIsSUFBSSxFQUFFLDBCQUEwQjtLQUNqQyxBQUprQyxDQUlqQztJQWNGLFlBQ1UsWUFBMEIsRUFDMUIsR0FBZTtRQURmLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFYekIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVWLDRCQUF1QixHQUFHLElBQUksZUFBZSxDQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRTVELGNBQVMsR0FBNkIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNwRCxrQkFBYSxHQUEwQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3JELFlBQU8sR0FB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O0lBQzNDLENBQUM7SUFFTyxhQUFhLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDeEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDOzhHQTNHVSxlQUFlO2tIQUFmLGVBQWUsY0FGZCxNQUFNOzsyRkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSwgSUV2ZW50LCBJUmVzdWx0TGlzdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEZvck9mRmlsdGVyUGlwZSwgR2VvU2VydmljZSwgVGltZUludGVydmFsIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBQb3NpdGlvbk1hbmFnZWRPYmplY3QgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQgeyBmaXJzdCwgaWRlbnRpdHksIGlzRW1wdHksIGxhc3QgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBwaXBlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHNoYXJlLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuY29uc3QgTE9DQVRJT05fVVBEQVRFX0VWRU5UX1RZUEUgPSAnYzh5X0xvY2F0aW9uVXBkYXRlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVHJhY2tpbmdTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQkFTRV9GSUxURVIgPSB7XG4gICAgcGFnZVNpemU6IDEwMDAsXG4gICAgd2l0aFRvdGFsUGFnZXM6IHRydWUsXG4gICAgdHlwZTogTE9DQVRJT05fVVBEQVRFX0VWRU5UX1RZUEVcbiAgfTtcblxuICBldmVudHMkOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElFdmVudD4+O1xuICBwb2x5bGluZSQ6IE9ic2VydmFibGU8TC5MYXRMbmdFeHByZXNzaW9uW10+O1xuICBwaXBlOiBGb3JPZkZpbHRlclBpcGU7XG4gIHRyYWNrVmlzaWJsZSA9IHRydWU7XG4gIGhhc0V2ZW50cyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3BvbHlsaW5lRXZlbnRzU3ViamVjdCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElFdmVudFtdPihbXSk7XG5cbiAgcHJpdmF0ZSBkZXZpY2VJZCQ6IFN1YmplY3Q8c3RyaW5nIHwgbnVtYmVyPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgdGltZUludGVydmFsJDogU3ViamVjdDxUaW1lSW50ZXJ2YWw+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSByZWxvYWQkOiBCZWhhdmlvclN1YmplY3Q8dm9pZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZXZlbnRTZXJ2aWNlOiBFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnZW86IEdlb1NlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5wb2x5bGluZSQgPSB0aGlzLl9wb2x5bGluZUV2ZW50c1N1YmplY3QkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICBtYXAoZXZlbnRzID0+IChldmVudHMgfHwgW10pLm1hcChldmVudCA9PiB0aGlzLmdlby5nZXRMYXRMb25nKGV2ZW50KSkuZmlsdGVyKGlkZW50aXR5KSksXG4gICAgICBzaGFyZSgpXG4gICAgKTtcblxuICAgIHRoaXMuZXZlbnRzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGV2aWNlSWQkLCB0aGlzLnRpbWVJbnRlcnZhbCQsIHRoaXMucmVsb2FkJF0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKFtzb3VyY2UsIGludGVydmFsXSkgPT4ge1xuICAgICAgICBjb25zdCB7IGRhdGVGcm9tLCBkYXRlVG8gfSA9IGludGVydmFsO1xuICAgICAgICByZXR1cm4gdGhpcy5ldmVudFNlcnZpY2UubGlzdCh7XG4gICAgICAgICAgLi4uVHJhY2tpbmdTZXJ2aWNlLkJBU0VfRklMVEVSLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBkYXRlRnJvbTogZGF0ZUZyb20udG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBkYXRlVG86IGRhdGVUby50b0lTT1N0cmluZygpXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5fcG9seWxpbmVFdmVudHNTdWJqZWN0JC5uZXh0KFtdKSksXG4gICAgICBzaGFyZSgpXG4gICAgKTtcblxuICAgIHRoaXMucGlwZSA9IHBpcGUoXG4gICAgICB0YXAoZXZlbnRzID0+ICh0aGlzLmhhc0V2ZW50cyA9ICFpc0VtcHR5KGV2ZW50cykpKSxcbiAgICAgIG1hcCgoZXZlbnRzOiBJRXZlbnRbXSkgPT4gKGV2ZW50cyB8fCBbXSkuZmlsdGVyKGV2ZW50ID0+IHRoaXMuaXNNYXRjaGluZ0V2ZW50KGV2ZW50KSkpLFxuICAgICAgdGFwKChldmVudHM6IElFdmVudFtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXBlbmQgPVxuICAgICAgICAgIHRoaXMuY29tcGFyZUV2ZW50cyhsYXN0KHRoaXMuX3BvbHlsaW5lRXZlbnRzU3ViamVjdCQudmFsdWUpLCBmaXJzdChldmVudHMpKSA8IDA7XG4gICAgICAgIGNvbnN0IHBvbHlsaW5lOiBJRXZlbnRbXSA9IHByZXBlbmRcbiAgICAgICAgICA/IFsuLi5ldmVudHMsIC4uLnRoaXMuX3BvbHlsaW5lRXZlbnRzU3ViamVjdCQudmFsdWVdXG4gICAgICAgICAgOiBbLi4udGhpcy5fcG9seWxpbmVFdmVudHNTdWJqZWN0JC52YWx1ZSwgLi4uZXZlbnRzXTtcblxuICAgICAgICB0aGlzLl9wb2x5bGluZUV2ZW50c1N1YmplY3QkLm5leHQocG9seWxpbmUpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc2V0RGV2aWNlSWQoZGV2aWNlSWQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHRoaXMuZGV2aWNlSWQkLm5leHQoZGV2aWNlSWQpO1xuICB9XG5cbiAgc2V0SW50ZXJ2YWwoaW50ZXJ2YWw6IFRpbWVJbnRlcnZhbCkge1xuICAgIHRoaXMudGltZUludGVydmFsJC5uZXh0KGludGVydmFsKTtcbiAgfVxuXG4gIGNsZWFyVHJhY2soKSB7XG4gICAgdGhpcy5fcG9seWxpbmVFdmVudHNTdWJqZWN0JC5uZXh0KFtdKTtcbiAgfVxuXG4gIHJlbG9hZCgpIHtcbiAgICB0aGlzLnJlbG9hZCQubmV4dCgpO1xuICB9XG5cbiAgYXN5bmMgbGF0ZXN0UG9zaXRpb25VcGRhdGUobW86IFBvc2l0aW9uTWFuYWdlZE9iamVjdCk6IFByb21pc2U8RGF0ZT4ge1xuICAgIGNvbnN0IGRhdGVUbyA9IG5ldyBEYXRlKCk7XG4gICAgZGF0ZVRvLnNldERhdGUoZGF0ZVRvLmdldERhdGUoKSArIDEpO1xuXG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIGZyYWdtZW50VHlwZTogJ2M4eV9Qb3NpdGlvbicsXG4gICAgICBkYXRlRnJvbTogbmV3IERhdGUoMCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGRhdGVUbzogZGF0ZVRvLnRvSVNPU3RyaW5nKCksXG4gICAgICBwYWdlU2l6ZTogMSxcbiAgICAgIHNvdXJjZTogbW8uaWRcbiAgICB9O1xuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHRoaXMuZXZlbnRTZXJ2aWNlLmxpc3QoZmlsdGVycyk7XG4gICAgcmV0dXJuIGV2ZW50cz8uZGF0YT8ubGVuZ3RoID8gbmV3IERhdGUoZXZlbnRzLmRhdGFbMF0udGltZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICB0b2dnbGVUcmFjaygpIHtcbiAgICBpZiAodGhpcy50cmFja1Zpc2libGUpIHtcbiAgICAgIHRoaXMuY2xlYXJUcmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgICB0aGlzLnRyYWNrVmlzaWJsZSA9ICF0aGlzLnRyYWNrVmlzaWJsZTtcbiAgfVxuXG4gIGlzTG9jYXRpb25VcGRhdGVFdmVudChldmVudDogSUV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZW50LnR5cGUgPT09IExPQ0FUSU9OX1VQREFURV9FVkVOVF9UWVBFO1xuICB9XG5cbiAgcHJpdmF0ZSBpc01hdGNoaW5nRXZlbnQoZXZlbnQ6IElFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9jYXRpb25VcGRhdGVFdmVudChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGNvbXBhcmVFdmVudHMoYTogSUV2ZW50LCBiOiBJRXZlbnQpOiBudW1iZXIge1xuICAgIHJldHVybiBEYXRlLnBhcnNlKGE/LnRpbWUpIC0gRGF0ZS5wYXJzZShiPy50aW1lKTtcbiAgfVxufVxuIl19
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injectable, Pipe, InjectionToken, Component, Optional, Input, EventEmitter, Output, ViewChild, forwardRef, NgModule } from '@angular/core';
3
- import { combineLatest, firstValueFrom, map as map$1, shareReplay, Subject, BehaviorSubject, of, from, forkJoin, EMPTY, Observable, pipe, fromEvent, take, takeUntil as takeUntil$1 } from 'rxjs';
4
- import { filter, map, switchMap, startWith, takeUntil, catchError, finalize, tap, debounceTime, distinctUntilChanged, shareReplay as shareReplay$1, throttleTime } from 'rxjs/operators';
3
+ import { combineLatest, Subject, BehaviorSubject, firstValueFrom, of, from, forkJoin, EMPTY, Observable, pipe, fromEvent, take, takeUntil as takeUntil$1, map as map$1 } from 'rxjs';
4
+ import { filter, map, switchMap, startWith, takeUntil, catchError, finalize, tap, debounceTime, distinctUntilChanged, shareReplay, throttleTime } from 'rxjs/operators';
5
5
  import * as i3 from '@c8y/ngx-components';
6
- import { Permissions, gettext, ViewContext, CountdownIntervalComponent, DynamicComponentAlertAggregator, DynamicComponentAlert, AlarmWithChildrenRealtimeService, ContextRouteComponent, ContextRouteGuard, RouterTabsResolver, hookNavigator, hookRoute, CommonModule, CoreModule, HeaderModule, DynamicComponentModule, RelativeTimePipe } from '@c8y/ngx-components';
6
+ import { Permissions, gettext, ViewContext, SupportedApps, CountdownIntervalComponent, DynamicComponentAlertAggregator, DynamicComponentAlert, AlarmWithChildrenRealtimeService, ContextRouteComponent, ContextRouteGuard, RouterTabsResolver, hookNavigator, hookRoute, CommonModule, CoreModule, HeaderModule, DynamicComponentModule, RelativeTimePipe } from '@c8y/ngx-components';
7
7
  import { sortBy, cloneDeep } from 'lodash-es';
8
8
  import * as i2 from '@c8y/client';
9
9
  import { AlarmStatus, Severity, ALARM_STATUS_LABELS, SEVERITY_LABELS } from '@c8y/client';
@@ -85,11 +85,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
85
85
  }], ctorParameters: () => [{ type: AlarmDetailsButtonService }] });
86
86
 
87
87
  class AlarmDetailsService {
88
- constructor(stateService, permissions) {
89
- this.stateService = stateService;
88
+ constructor(permissions) {
90
89
  this.permissions = permissions;
91
- this.SMART_RULES_APPLICATION_KEY = 'smartrule-key';
92
- this.DEVICE_MANAGEMENT_APPLICATION_KEY = 'devicemanagement-application-key';
93
90
  this.STATUS_ATTRIBUTE = 'status';
94
91
  }
95
92
  /**
@@ -192,22 +189,6 @@ class AlarmDetailsService {
192
189
  }
193
190
  return latestClearedAuditTime || auditLog[0].creationTime;
194
191
  }
195
- /**
196
- * Retrieves a specified application based on the provided application key.
197
- *
198
- * This method first checks if the requested application, identified by its key (which could belong to Device Management
199
- * or Smart Rules Microservice), is present in the user's current applications cache. If not found in the cache,
200
- * it fetches the application from the list of current user's applications, which is maintained by the state service.
201
- *
202
- * The application is searched by its key, and this method returns a promise that either resolves to the found application
203
- * or undefined if the application with the specified key does not exist.
204
- *
205
- * @param applicationKey The key of the application to retrieve.
206
- * @returns A promise that resolves to the requested application or undefined if the application is not found.
207
- */
208
- async getApplication(applicationKey) {
209
- return await firstValueFrom(this.stateService.currentAppsOfUser.pipe(map$1(apps => apps.find(app => app.key === applicationKey)), shareReplay(1)));
210
- }
211
192
  checkIfHasAnyRoleAllowingToCreateSmartRule() {
212
193
  const ROLES_ALLOWING_SMART_RULE_CREATION = [
213
194
  [
@@ -221,7 +202,7 @@ class AlarmDetailsService {
221
202
  return (this.permissions.hasAnyRole(ROLES_ALLOWING_SMART_RULE_CREATION[0]) &&
222
203
  this.permissions.hasAnyRole(ROLES_ALLOWING_SMART_RULE_CREATION[1]));
223
204
  }
224
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsService, deps: [{ token: i3.AppStateService }, { token: i3.Permissions }], target: i0.ɵɵFactoryTarget.Injectable }); }
205
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsService, deps: [{ token: i3.Permissions }], target: i0.ɵɵFactoryTarget.Injectable }); }
225
206
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsService, providedIn: 'root' }); }
226
207
  }
227
208
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsService, decorators: [{
@@ -229,7 +210,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
229
210
  args: [{
230
211
  providedIn: 'root'
231
212
  }]
232
- }], ctorParameters: () => [{ type: i3.AppStateService }, { type: i3.Permissions }] });
213
+ }], ctorParameters: () => [{ type: i3.Permissions }] });
233
214
 
234
215
  const ALARMS_MODULE_CONFIG = new InjectionToken('AlarmsModuleConfig');
235
216
  const ALARM_STATUS_ICON = {
@@ -680,7 +661,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
680
661
  }], ctorParameters: () => [{ type: i1.TranslateService }] });
681
662
 
682
663
  class AlarmDetailsComponent {
683
- constructor(alarmDetailsService, alarmService, alertService, appState, auditService, relativeTime, ng1SmartRulesUpgradeService, translateService, inventoryService, alarmsViewService, colorService) {
664
+ constructor(alarmDetailsService, alarmService, alertService, appState, auditService, relativeTime, ng1SmartRulesUpgradeService, translateService, inventoryService, alarmsViewService, colorService, interAppService) {
684
665
  this.alarmDetailsService = alarmDetailsService;
685
666
  this.alarmService = alarmService;
686
667
  this.alertService = alertService;
@@ -692,6 +673,7 @@ class AlarmDetailsComponent {
692
673
  this.inventoryService = inventoryService;
693
674
  this.alarmsViewService = alarmsViewService;
694
675
  this.colorService = colorService;
676
+ this.interAppService = interAppService;
695
677
  this.ACKNOWLEDGED_STATUS_VALUE = AlarmStatus.ACKNOWLEDGED;
696
678
  this.ACTIVE_STATUS_VALUE = AlarmStatus.ACTIVE;
697
679
  this.CLEARED_STATUS_VALUE = AlarmStatus.CLEARED;
@@ -700,11 +682,7 @@ class AlarmDetailsComponent {
700
682
  this.SEVERITY_LABELS = SEVERITY_LABELS;
701
683
  this.BELL_SLASH_ICON = ALARM_STATUS_ICON.BELL_SLASH;
702
684
  this.BELL_ICON = ALARM_STATUS_ICON.BELL;
703
- /**
704
- * Manages the visibility of the navigation link.
705
- * If set to true, the link is visible, otherwise, it remains hidden.
706
- */
707
- this.showSourceNavigationLink = false;
685
+ this.deviceManagementAppKey = SupportedApps.devicemanagement;
708
686
  this.linkTitle = gettext('Open in {{ appName }}');
709
687
  this.PAGE_SIZE = 100;
710
688
  /**
@@ -717,15 +695,14 @@ class AlarmDetailsComponent {
717
695
  this.customFragments = null;
718
696
  }
719
697
  async ngOnInit() {
720
- const isSmartRulesServiceSubscribed = !!(await this.alarmDetailsService.getApplication(this.alarmDetailsService.SMART_RULES_APPLICATION_KEY));
698
+ const isSmartRulesServiceSubscribed = !!(await firstValueFrom(this.interAppService.getApp$(SupportedApps.smartrules)));
721
699
  const hasAnyRoleAllowingToCreateSmartRule = this.alarmDetailsService.checkIfHasAnyRoleAllowingToCreateSmartRule();
722
700
  this.isCreateSmartRulesButtonAvailable =
723
701
  !!this.ng1SmartRulesUpgradeService &&
724
702
  isSmartRulesServiceSubscribed &&
725
703
  hasAnyRoleAllowingToCreateSmartRule;
726
- this.userDeviceManagementApp = await this.alarmDetailsService.getApplication(this.alarmDetailsService.DEVICE_MANAGEMENT_APPLICATION_KEY);
727
- this.showSourceNavigationLink =
728
- !!this.userDeviceManagementApp && !this.isDeviceManagementView();
704
+ this.userDeviceManagementApp$ = this.interAppService.getApp$(this.deviceManagementAppKey);
705
+ this.showSourceNavigationLink$ = this.interAppService.shouldShowAppLink$(this.deviceManagementAppKey);
729
706
  this.typeColor = await this.colorService.generateColor(this.selectedAlarm.type);
730
707
  }
731
708
  async ngOnChanges(changes) {
@@ -751,10 +728,7 @@ class AlarmDetailsComponent {
751
728
  */
752
729
  async goToAlarmSource(sourceId) {
753
730
  const { data } = await this.alarmService.detail(sourceId);
754
- const baseUrl = `/apps/${this.userDeviceManagementApp.contextPath}`;
755
- const path = `#/device/${data.source.id}/alarms`;
756
- const url = `${baseUrl}/${path}`;
757
- window.open(url, '_blank');
731
+ await this.interAppService.navigateToApp(this.deviceManagementAppKey, `#/device/${data.source.id}/alarms`);
758
732
  }
759
733
  /**
760
734
  * Reloads audit log data asynchronously.
@@ -974,16 +948,6 @@ class AlarmDetailsComponent {
974
948
  hasReachedOrExceededPageSizeLimit() {
975
949
  return this.auditLog.data.length >= this.PAGE_SIZE;
976
950
  }
977
- /**
978
- * This method checks if the current URL includes the context path of the
979
- * device management application, indicating whether the user is in the
980
- * device management view.
981
- *
982
- * @returns Returns `true` if the current view is in device management, otherwise, returns `false`.
983
- */
984
- isDeviceManagementView() {
985
- return window.location.href.includes(this.userDeviceManagementApp.contextPath);
986
- }
987
951
  getCustomFragments(selectedAlarm) {
988
952
  let customProperties = null;
989
953
  for (const key in selectedAlarm) {
@@ -996,15 +960,15 @@ class AlarmDetailsComponent {
996
960
  }
997
961
  return customProperties;
998
962
  }
999
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsComponent, deps: [{ token: AlarmDetailsService }, { token: i2.AlarmService }, { token: i3.AlertService }, { token: i3.AppStateService }, { token: i2.AuditService }, { token: i3.RelativeTimePipe }, { token: Ng1SmartRulesUpgradeService, optional: true }, { token: i1.TranslateService }, { token: i2.InventoryService }, { token: AlarmsViewService }, { token: i3.ColorService }], target: i0.ɵɵFactoryTarget.Component }); }
1000
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AlarmDetailsComponent, selector: "c8y-alarm-details", inputs: { selectedAlarm: "selectedAlarm" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate: { appName: userDeviceManagementApp | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"calendar\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div class=\"col-4 p-b-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last updated' | translate }}</p>\n <p class=\"small\">\n {{ lastUpdated | c8yDate: 'medium' }}\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n class=\"btn btn-default btn-sm\"\n [ngClass]=\"button.additionalButtonClasses\"\n [title]=\"button.title | translate\"\n type=\"button\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i [ngClass]=\"button.additionalIconClasses\" [c8yIcon]=\"button.icon\"></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i3.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i3.ListItemTimelineComponent, selector: "c8y-list-item-timeline, c8y-li-timeline" }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.LowerCasePipe, name: "lowercase" }, { kind: "pipe", type: i7.JsonPipe, name: "json" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: i3.HumanizeAppNamePipe, name: "humanizeAppName" }, { kind: "pipe", type: i3.DatePipe, name: "c8yDate" }, { kind: "pipe", type: i3.AssetLinkPipe, name: "assetLink" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AlarmDetailsButtonPipe, name: "alarmDetailsButton" }, { kind: "pipe", type: AlarmSeverityToIconPipe, name: "AlarmSeverityToIcon" }, { kind: "pipe", type: AlarmStatusToIconPipe, name: "AlarmStatusToIcon" }, { kind: "pipe", type: AuditChangesMessagePipe, name: "auditChangesMessage" }] }); }
963
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsComponent, deps: [{ token: AlarmDetailsService }, { token: i2.AlarmService }, { token: i3.AlertService }, { token: i3.AppStateService }, { token: i2.AuditService }, { token: i3.RelativeTimePipe }, { token: Ng1SmartRulesUpgradeService, optional: true }, { token: i1.TranslateService }, { token: i2.InventoryService }, { token: AlarmsViewService }, { token: i3.ColorService }, { token: i3.InterAppService }], target: i0.ɵɵFactoryTarget.Component }); }
964
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AlarmDetailsComponent, selector: "c8y-alarm-details", inputs: { selectedAlarm: "selectedAlarm" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink$ | async\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate: { appName: userDeviceManagementApp$ | async | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp$ | async | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"calendar\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div class=\"col-4 p-b-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last updated' | translate }}</p>\n <p class=\"small\">\n {{ lastUpdated | c8yDate: 'medium' }}\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n class=\"btn btn-default btn-sm\"\n [ngClass]=\"button.additionalButtonClasses\"\n [title]=\"button.title | translate\"\n type=\"button\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i [ngClass]=\"button.additionalIconClasses\" [c8yIcon]=\"button.icon\"></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i3.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i3.ListItemTimelineComponent, selector: "c8y-list-item-timeline, c8y-li-timeline" }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.LowerCasePipe, name: "lowercase" }, { kind: "pipe", type: i7.JsonPipe, name: "json" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: i3.HumanizeAppNamePipe, name: "humanizeAppName" }, { kind: "pipe", type: i3.DatePipe, name: "c8yDate" }, { kind: "pipe", type: i3.AssetLinkPipe, name: "assetLink" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AlarmDetailsButtonPipe, name: "alarmDetailsButton" }, { kind: "pipe", type: AlarmSeverityToIconPipe, name: "AlarmSeverityToIcon" }, { kind: "pipe", type: AlarmStatusToIconPipe, name: "AlarmStatusToIcon" }, { kind: "pipe", type: AuditChangesMessagePipe, name: "auditChangesMessage" }] }); }
1001
965
  }
1002
966
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmDetailsComponent, decorators: [{
1003
967
  type: Component,
1004
- args: [{ selector: 'c8y-alarm-details', template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate: { appName: userDeviceManagementApp | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"calendar\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div class=\"col-4 p-b-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last updated' | translate }}</p>\n <p class=\"small\">\n {{ lastUpdated | c8yDate: 'medium' }}\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n class=\"btn btn-default btn-sm\"\n [ngClass]=\"button.additionalButtonClasses\"\n [title]=\"button.title | translate\"\n type=\"button\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i [ngClass]=\"button.additionalIconClasses\" [c8yIcon]=\"button.icon\"></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n" }]
968
+ args: [{ selector: 'c8y-alarm-details', template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink$ | async\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate: { appName: userDeviceManagementApp$ | async | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp$ | async | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"calendar\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div class=\"col-4 p-b-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last updated' | translate }}</p>\n <p class=\"small\">\n {{ lastUpdated | c8yDate: 'medium' }}\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n class=\"btn btn-default btn-sm\"\n [ngClass]=\"button.additionalButtonClasses\"\n [title]=\"button.title | translate\"\n type=\"button\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i [ngClass]=\"button.additionalIconClasses\" [c8yIcon]=\"button.icon\"></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n" }]
1005
969
  }], ctorParameters: () => [{ type: AlarmDetailsService }, { type: i2.AlarmService }, { type: i3.AlertService }, { type: i3.AppStateService }, { type: i2.AuditService }, { type: i3.RelativeTimePipe }, { type: Ng1SmartRulesUpgradeService, decorators: [{
1006
970
  type: Optional
1007
- }] }, { type: i1.TranslateService }, { type: i2.InventoryService }, { type: AlarmsViewService }, { type: i3.ColorService }], propDecorators: { selectedAlarm: [{
971
+ }] }, { type: i1.TranslateService }, { type: i2.InventoryService }, { type: AlarmsViewService }, { type: i3.ColorService }, { type: i3.InterAppService }], propDecorators: { selectedAlarm: [{
1008
972
  type: Input
1009
973
  }] } });
1010
974
 
@@ -1677,7 +1641,7 @@ class AlarmsListComponent {
1677
1641
  return scrollTopPixels > this.HIDE_INTERVAL_COUNTDOWN_SCROLL;
1678
1642
  }
1679
1643
  verifyIfFiltersMatchingAlarm() {
1680
- this.activeChildParam$ = this.router.events.pipe(filter(e => e instanceof NavigationEnd && this.activatedRoute.children.length > 0), switchMap(() => this.activatedRoute.children[0].params), map(params => params.id), distinctUntilChanged(), shareReplay$1(), takeUntil(this.destroy$));
1644
+ this.activeChildParam$ = this.router.events.pipe(filter(e => e instanceof NavigationEnd && this.activatedRoute.children.length > 0), switchMap(() => this.activatedRoute.children[0].params), map(params => params.id), distinctUntilChanged(), shareReplay(), takeUntil(this.destroy$));
1681
1645
  // done to get the first navigation
1682
1646
  this.activeChildParam$.subscribe();
1683
1647
  }