@c8y/ngx-components 1021.49.6 → 1021.50.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 (121) hide show
  1. package/LICENSE +1 -1
  2. package/alarms/alarms.component.d.ts +1 -1
  3. package/alarms/alarms.component.d.ts.map +1 -1
  4. package/context-dashboard/context-dashboard.component.d.ts +3 -2
  5. package/context-dashboard/context-dashboard.component.d.ts.map +1 -1
  6. package/core/i18n/pattern-messages.data.d.ts +18 -0
  7. package/core/i18n/pattern-messages.data.d.ts.map +1 -1
  8. package/core/select/typeahead.component.d.ts.map +1 -1
  9. package/esm2022/alarms/alarms-type-filter.component.mjs +3 -3
  10. package/esm2022/alarms/alarms.component.mjs +2 -2
  11. package/esm2022/context-dashboard/context-dashboard.component.mjs +11 -8
  12. package/esm2022/context-dashboard/device-info-dashboard/device-info-dashboard.component.mjs +3 -3
  13. package/esm2022/core/i18n/pattern-messages.data.mjs +19 -1
  14. package/esm2022/core/search/search-input.component.mjs +3 -3
  15. package/esm2022/core/select/typeahead.component.mjs +2 -2
  16. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +2 -2
  17. package/esm2022/device-list/add-smart-group.component.mjs +3 -3
  18. package/esm2022/operations/bulk-operation-list-item/bulk-operation-list-item.service.mjs +5 -4
  19. package/esm2022/operations/operation-details/operation-details.module.mjs +7 -7
  20. package/esm2022/operations/operations-list/device-control.feature.mjs +20 -0
  21. package/esm2022/operations/operations-list/index.mjs +4 -3
  22. package/esm2022/operations/operations-list/operations-list-item.component.mjs +11 -9
  23. package/esm2022/operations/operations-list/operations-list.component.mjs +15 -10
  24. package/esm2022/operations/operations-list/operations-list.module.mjs +16 -41
  25. package/esm2022/operations/operations-list/operations-list.service.mjs +4 -3
  26. package/esm2022/operations/operations.module.mjs +21 -14
  27. package/esm2022/operations/shared/operations.service.mjs +4 -3
  28. package/esm2022/services/index.mjs +14 -3
  29. package/esm2022/services/service-command-tab/c8y-ngx-components-services-service-command-tab.mjs +5 -0
  30. package/esm2022/services/service-command-tab/index.mjs +3 -0
  31. package/esm2022/services/service-command-tab/service-command-tab.component.mjs +33 -0
  32. package/esm2022/services/service-command-tab/service-command.feature.mjs +14 -0
  33. package/esm2022/services/services-device-tab/index.mjs +9 -3
  34. package/esm2022/services/services-device-tab/services-device-tab.component.mjs +3 -4
  35. package/esm2022/services/services-device-tab/services-device-tab.guard.mjs +2 -2
  36. package/esm2022/services/services-device-tab/services.breadcrumb-factory.mjs +13 -1
  37. package/esm2022/services/services.module.mjs +4 -2
  38. package/esm2022/services/shared/c8y-ngx-components-services-shared.mjs +5 -0
  39. package/esm2022/services/shared/index.mjs +3 -0
  40. package/esm2022/services/shared/service-command.service.mjs +118 -0
  41. package/esm2022/services/shared/services.model.mjs +23 -0
  42. package/fesm2022/c8y-ngx-components-alarms.mjs +3 -3
  43. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  44. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +12 -9
  45. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  46. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +1 -1
  47. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  48. package/fesm2022/c8y-ngx-components-device-list.mjs +2 -2
  49. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  50. package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs +3 -2
  51. package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
  52. package/fesm2022/c8y-ngx-components-operations-operation-details.mjs +5 -5
  53. package/fesm2022/c8y-ngx-components-operations-operation-details.mjs.map +1 -1
  54. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +57 -52
  55. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
  56. package/fesm2022/c8y-ngx-components-operations-shared.mjs +3 -2
  57. package/fesm2022/c8y-ngx-components-operations-shared.mjs.map +1 -1
  58. package/fesm2022/c8y-ngx-components-operations.mjs +42 -35
  59. package/fesm2022/c8y-ngx-components-operations.mjs.map +1 -1
  60. package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs +49 -0
  61. package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs.map +1 -0
  62. package/fesm2022/c8y-ngx-components-services-shared.mjs +145 -0
  63. package/fesm2022/c8y-ngx-components-services-shared.mjs.map +1 -0
  64. package/fesm2022/c8y-ngx-components-services.mjs +20 -113
  65. package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
  66. package/fesm2022/c8y-ngx-components.mjs +21 -3
  67. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  68. package/locales/de.po +12 -14
  69. package/locales/es.po +12 -14
  70. package/locales/fr.po +11 -13
  71. package/locales/ja_JP.po +13 -17
  72. package/locales/ko.po +13 -10
  73. package/locales/locales.pot +19 -6
  74. package/locales/nl.po +12 -14
  75. package/locales/pl.po +12 -14
  76. package/locales/pt_BR.po +11 -13
  77. package/locales/zh_CN.po +12 -9
  78. package/locales/zh_TW.po +12 -9
  79. package/operations/bulk-operation-list-item/bulk-operation-list-item.service.d.ts +2 -2
  80. package/operations/bulk-operation-list-item/bulk-operation-list-item.service.d.ts.map +1 -1
  81. package/operations/operation-details/operation-details.module.d.ts +1 -1
  82. package/operations/operations-list/device-control.feature.d.ts +4 -0
  83. package/operations/operations-list/device-control.feature.d.ts.map +1 -0
  84. package/operations/operations-list/index.d.ts +3 -2
  85. package/operations/operations-list/index.d.ts.map +1 -1
  86. package/operations/operations-list/operations-list-item.component.d.ts +1 -1
  87. package/operations/operations-list/operations-list-item.component.d.ts.map +1 -1
  88. package/operations/operations-list/operations-list.component.d.ts +3 -1
  89. package/operations/operations-list/operations-list.component.d.ts.map +1 -1
  90. package/operations/operations-list/operations-list.module.d.ts +3 -9
  91. package/operations/operations-list/operations-list.module.d.ts.map +1 -1
  92. package/operations/operations.module.d.ts +1 -2
  93. package/operations/operations.module.d.ts.map +1 -1
  94. package/package.json +1 -1
  95. package/services/index.d.ts +13 -2
  96. package/services/index.d.ts.map +1 -1
  97. package/services/service-command-tab/c8y-ngx-components-services-service-command-tab.d.ts.map +1 -0
  98. package/services/service-command-tab/index.d.ts +3 -0
  99. package/services/service-command-tab/index.d.ts.map +1 -0
  100. package/services/service-command-tab/service-command-tab.component.d.ts +12 -0
  101. package/services/service-command-tab/service-command-tab.component.d.ts.map +1 -0
  102. package/services/service-command-tab/service-command.feature.d.ts +3 -0
  103. package/services/service-command-tab/service-command.feature.d.ts.map +1 -0
  104. package/services/services-device-tab/index.d.ts +8 -2
  105. package/services/services-device-tab/index.d.ts.map +1 -1
  106. package/services/services-device-tab/services-device-tab.component.d.ts +2 -2
  107. package/services/services-device-tab/services-device-tab.component.d.ts.map +1 -1
  108. package/services/services-device-tab/services.breadcrumb-factory.d.ts.map +1 -1
  109. package/services/services.module.d.ts.map +1 -1
  110. package/services/shared/c8y-ngx-components-services-shared.d.ts.map +1 -0
  111. package/services/shared/index.d.ts +3 -0
  112. package/services/shared/index.d.ts.map +1 -0
  113. package/services/{services-device-tab → shared}/service-command.service.d.ts +10 -7
  114. package/services/shared/service-command.service.d.ts.map +1 -0
  115. package/services/shared/services.model.d.ts +31 -0
  116. package/services/shared/services.model.d.ts.map +1 -0
  117. package/esm2022/services/services-device-tab/service-command.service.mjs +0 -113
  118. package/esm2022/services/services-device-tab/service-device-tab.model.mjs +0 -2
  119. package/services/services-device-tab/service-command.service.d.ts.map +0 -1
  120. package/services/services-device-tab/service-device-tab.model.d.ts +0 -11
  121. package/services/services-device-tab/service-device-tab.model.d.ts.map +0 -1
@@ -0,0 +1,118 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { OperationService } from '@c8y/client';
3
+ import { AlertService, gettext } from '@c8y/ngx-components';
4
+ import { map } from 'lodash-es';
5
+ import { SERVICE_COMMANDS_MAP } from './services.model';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@c8y/client";
8
+ import * as i2 from "@c8y/ngx-components";
9
+ export class ServiceCommandService {
10
+ constructor(operationService, alertService) {
11
+ this.operationService = operationService;
12
+ this.alertService = alertService;
13
+ }
14
+ /**
15
+ * Check if the service supports service commands.
16
+ * @param service The service object containing supported operations.
17
+ * @returns boolean indicating if the service supports service commands.
18
+ */
19
+ isServiceCommandSupported(service) {
20
+ return service.c8y_SupportedOperations?.includes('c8y_ServiceCommand');
21
+ }
22
+ /**
23
+ * Get the list of supported service commands for the given service object.
24
+ * @param service The service object containing the c8y_SupportedServiceCommands fragment.
25
+ * @returns Array of supported commands.
26
+ */
27
+ getSupportedCommands(service) {
28
+ return service.c8y_SupportedServiceCommands || map(SERVICE_COMMANDS_MAP, 'command');
29
+ }
30
+ /**
31
+ * Check if a specific command is supported for the given service.
32
+ * @param service The service object.
33
+ * @param command The command to check (e.g., START, STOP).
34
+ * @returns boolean indicating if the command is supported.
35
+ */
36
+ isCommandSupported(service, command) {
37
+ const supportedCommands = this.getSupportedCommands(service);
38
+ return supportedCommands.includes(command);
39
+ }
40
+ /**
41
+ * Get all supported commands for a list of services.
42
+ * @param services The list of service objects to evaluate.
43
+ * @returns Array of all unique supported commands.
44
+ */
45
+ getAllSupportedCommands(services) {
46
+ const allCommands = services
47
+ .filter(service => this.isServiceCommandSupported(service))
48
+ .flatMap(service => this.getSupportedCommands(service));
49
+ return Array.from(new Set(allCommands));
50
+ }
51
+ /**
52
+ * Create an operation for the selected service command.
53
+ * @param service The service object the operation should target.
54
+ * @param command The command to execute (e.g., START, STOP).
55
+ * @returns Promise of the created operation.
56
+ */
57
+ createOperation({ id, name, serviceType }, command) {
58
+ const operation = {
59
+ deviceId: id,
60
+ description: `${command} ${name}`,
61
+ c8y_ServiceCommand: {
62
+ command,
63
+ serviceName: name,
64
+ serviceType: serviceType
65
+ }
66
+ };
67
+ return this.operationService.create(operation);
68
+ }
69
+ /**
70
+ * Generate a static list of action controls.
71
+ * The specific logic for each service is handled dynamically in showIf and callback.
72
+ * @returns Array of ActionControl objects.
73
+ */
74
+ generateActionControls(commands) {
75
+ return commands.map(command => ({
76
+ type: command.toLowerCase(),
77
+ icon: this.getCommandIcon(command),
78
+ iconClasses: this.getCommandIconClass(command),
79
+ text: command,
80
+ showIf: (service) => this.isServiceCommandSupported(service) && this.isCommandSupported(service, command),
81
+ callback: async (service) => {
82
+ try {
83
+ await this.createOperation(service, command);
84
+ this.alertService.success(gettext('Operation created.'));
85
+ }
86
+ catch (error) {
87
+ const alertMessage = gettext('Could not create operation.');
88
+ this.alertService.danger(alertMessage, error);
89
+ }
90
+ }
91
+ }));
92
+ }
93
+ /**
94
+ * Get the icon for a specific command.
95
+ * @param command The command name.
96
+ * @returns Icon string for the command.
97
+ */
98
+ getCommandIcon(command) {
99
+ return SERVICE_COMMANDS_MAP[command]?.icon || 'console';
100
+ }
101
+ /**
102
+ * Get the icon class for a specific command.
103
+ * @param command The command name.
104
+ * @returns Icon class string for the command.
105
+ */
106
+ getCommandIconClass(command) {
107
+ return SERVICE_COMMANDS_MAP[command]?.styleClass;
108
+ }
109
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ServiceCommandService, deps: [{ token: i1.OperationService }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Injectable }); }
110
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ServiceCommandService, providedIn: 'root' }); }
111
+ }
112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ServiceCommandService, decorators: [{
113
+ type: Injectable,
114
+ args: [{
115
+ providedIn: 'root'
116
+ }]
117
+ }], ctorParameters: () => [{ type: i1.OperationService }, { type: i2.AlertService }] });
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1jb21tYW5kLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zaGFyZWQvc2VydmljZS1jb21tYW5kLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQXVCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BFLE9BQU8sRUFBaUIsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFXLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFLakUsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUNVLGdCQUFrQyxFQUNsQyxZQUEwQjtRQUQxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUFjO0lBQ2pDLENBQUM7SUFFSjs7OztPQUlHO0lBQ0gseUJBQXlCLENBQUMsT0FBZ0I7UUFDeEMsT0FBTyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxvQkFBb0IsQ0FBQyxPQUFnQjtRQUNuQyxPQUFPLE9BQU8sQ0FBQyw0QkFBNEIsSUFBSSxHQUFHLENBQUMsb0JBQW9CLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0JBQWtCLENBQUMsT0FBZ0IsRUFBRSxPQUFlO1FBQ2xELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELE9BQU8saUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsdUJBQXVCLENBQUMsUUFBbUI7UUFDekMsTUFBTSxXQUFXLEdBQUcsUUFBUTthQUN6QixNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDMUQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFMUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUNiLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQVcsRUFDbEMsT0FBZTtRQUVmLE1BQU0sU0FBUyxHQUFlO1lBQzVCLFFBQVEsRUFBRSxFQUFFO1lBQ1osV0FBVyxFQUFFLEdBQUcsT0FBTyxJQUFJLElBQUksRUFBRTtZQUNqQyxrQkFBa0IsRUFBRTtnQkFDbEIsT0FBTztnQkFDUCxXQUFXLEVBQUUsSUFBSTtnQkFDakIsV0FBVyxFQUFFLFdBQVc7YUFDekI7U0FDRixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsc0JBQXNCLENBQUMsUUFBa0I7UUFDdkMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QixJQUFJLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7WUFDbEMsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7WUFDOUMsSUFBSSxFQUFFLE9BQU87WUFDYixNQUFNLEVBQUUsQ0FBQyxPQUFnQixFQUFFLEVBQUUsQ0FDM0IsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO1lBQ3RGLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO2dCQUNuQyxJQUFJLENBQUM7b0JBQ0gsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO29CQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2hELENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGNBQWMsQ0FBQyxPQUFlO1FBQ3BDLE9BQU8sb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLG1CQUFtQixDQUFDLE9BQWU7UUFDekMsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLENBQUM7SUFDbkQsQ0FBQzs4R0FoSFUscUJBQXFCO2tIQUFyQixxQkFBcUIsY0FGcEIsTUFBTTs7MkZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElPcGVyYXRpb24sIElSZXN1bHQsIE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBY3Rpb25Db250cm9sLCBBbGVydFNlcnZpY2UsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBTZXJ2aWNlLCBTRVJWSUNFX0NPTU1BTkRTX01BUCB9IGZyb20gJy4vc2VydmljZXMubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlQ29tbWFuZFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG9wZXJhdGlvblNlcnZpY2U6IE9wZXJhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBzZXJ2aWNlIHN1cHBvcnRzIHNlcnZpY2UgY29tbWFuZHMuXG4gICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIG9iamVjdCBjb250YWluaW5nIHN1cHBvcnRlZCBvcGVyYXRpb25zLlxuICAgKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHNlcnZpY2Ugc3VwcG9ydHMgc2VydmljZSBjb21tYW5kcy5cbiAgICovXG4gIGlzU2VydmljZUNvbW1hbmRTdXBwb3J0ZWQoc2VydmljZTogU2VydmljZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzZXJ2aWNlLmM4eV9TdXBwb3J0ZWRPcGVyYXRpb25zPy5pbmNsdWRlcygnYzh5X1NlcnZpY2VDb21tYW5kJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzZXJ2aWNlIGNvbW1hbmRzIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBvYmplY3QuXG4gICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIG9iamVjdCBjb250YWluaW5nIHRoZSBjOHlfU3VwcG9ydGVkU2VydmljZUNvbW1hbmRzIGZyYWdtZW50LlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBzdXBwb3J0ZWQgY29tbWFuZHMuXG4gICAqL1xuICBnZXRTdXBwb3J0ZWRDb21tYW5kcyhzZXJ2aWNlOiBTZXJ2aWNlKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBzZXJ2aWNlLmM4eV9TdXBwb3J0ZWRTZXJ2aWNlQ29tbWFuZHMgfHwgbWFwKFNFUlZJQ0VfQ09NTUFORFNfTUFQLCAnY29tbWFuZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgc3BlY2lmaWMgY29tbWFuZCBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlLlxuICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSBvYmplY3QuXG4gICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHRvIGNoZWNrIChlLmcuLCBTVEFSVCwgU1RPUCkuXG4gICAqIEByZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY29tbWFuZCBpcyBzdXBwb3J0ZWQuXG4gICAqL1xuICBpc0NvbW1hbmRTdXBwb3J0ZWQoc2VydmljZTogU2VydmljZSwgY29tbWFuZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3VwcG9ydGVkQ29tbWFuZHMgPSB0aGlzLmdldFN1cHBvcnRlZENvbW1hbmRzKHNlcnZpY2UpO1xuICAgIHJldHVybiBzdXBwb3J0ZWRDb21tYW5kcy5pbmNsdWRlcyhjb21tYW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHN1cHBvcnRlZCBjb21tYW5kcyBmb3IgYSBsaXN0IG9mIHNlcnZpY2VzLlxuICAgKiBAcGFyYW0gc2VydmljZXMgVGhlIGxpc3Qgb2Ygc2VydmljZSBvYmplY3RzIHRvIGV2YWx1YXRlLlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBhbGwgdW5pcXVlIHN1cHBvcnRlZCBjb21tYW5kcy5cbiAgICovXG4gIGdldEFsbFN1cHBvcnRlZENvbW1hbmRzKHNlcnZpY2VzOiBTZXJ2aWNlW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYWxsQ29tbWFuZHMgPSBzZXJ2aWNlc1xuICAgICAgLmZpbHRlcihzZXJ2aWNlID0+IHRoaXMuaXNTZXJ2aWNlQ29tbWFuZFN1cHBvcnRlZChzZXJ2aWNlKSlcbiAgICAgIC5mbGF0TWFwKHNlcnZpY2UgPT4gdGhpcy5nZXRTdXBwb3J0ZWRDb21tYW5kcyhzZXJ2aWNlKSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGFsbENvbW1hbmRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIG9wZXJhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UgY29tbWFuZC5cbiAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2Ugb2JqZWN0IHRoZSBvcGVyYXRpb24gc2hvdWxkIHRhcmdldC5cbiAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSAoZS5nLiwgU1RBUlQsIFNUT1ApLlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHRoZSBjcmVhdGVkIG9wZXJhdGlvbi5cbiAgICovXG4gIGNyZWF0ZU9wZXJhdGlvbihcbiAgICB7IGlkLCBuYW1lLCBzZXJ2aWNlVHlwZSB9OiBTZXJ2aWNlLFxuICAgIGNvbW1hbmQ6IHN0cmluZ1xuICApOiBQcm9taXNlPElSZXN1bHQ8SU9wZXJhdGlvbj4+IHtcbiAgICBjb25zdCBvcGVyYXRpb246IElPcGVyYXRpb24gPSB7XG4gICAgICBkZXZpY2VJZDogaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7Y29tbWFuZH0gJHtuYW1lfWAsXG4gICAgICBjOHlfU2VydmljZUNvbW1hbmQ6IHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgc2VydmljZU5hbWU6IG5hbWUsXG4gICAgICAgIHNlcnZpY2VUeXBlOiBzZXJ2aWNlVHlwZVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25TZXJ2aWNlLmNyZWF0ZShvcGVyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgc3RhdGljIGxpc3Qgb2YgYWN0aW9uIGNvbnRyb2xzLlxuICAgKiBUaGUgc3BlY2lmaWMgbG9naWMgZm9yIGVhY2ggc2VydmljZSBpcyBoYW5kbGVkIGR5bmFtaWNhbGx5IGluIHNob3dJZiBhbmQgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIEFjdGlvbkNvbnRyb2wgb2JqZWN0cy5cbiAgICovXG4gIGdlbmVyYXRlQWN0aW9uQ29udHJvbHMoY29tbWFuZHM6IHN0cmluZ1tdKTogQWN0aW9uQ29udHJvbFtdIHtcbiAgICByZXR1cm4gY29tbWFuZHMubWFwKGNvbW1hbmQgPT4gKHtcbiAgICAgIHR5cGU6IGNvbW1hbmQudG9Mb3dlckNhc2UoKSxcbiAgICAgIGljb246IHRoaXMuZ2V0Q29tbWFuZEljb24oY29tbWFuZCksXG4gICAgICBpY29uQ2xhc3NlczogdGhpcy5nZXRDb21tYW5kSWNvbkNsYXNzKGNvbW1hbmQpLFxuICAgICAgdGV4dDogY29tbWFuZCxcbiAgICAgIHNob3dJZjogKHNlcnZpY2U6IFNlcnZpY2UpID0+XG4gICAgICAgIHRoaXMuaXNTZXJ2aWNlQ29tbWFuZFN1cHBvcnRlZChzZXJ2aWNlKSAmJiB0aGlzLmlzQ29tbWFuZFN1cHBvcnRlZChzZXJ2aWNlLCBjb21tYW5kKSxcbiAgICAgIGNhbGxiYWNrOiBhc3luYyAoc2VydmljZTogU2VydmljZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlT3BlcmF0aW9uKHNlcnZpY2UsIGNvbW1hbmQpO1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnT3BlcmF0aW9uIGNyZWF0ZWQuJykpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGFsZXJ0TWVzc2FnZSA9IGdldHRleHQoJ0NvdWxkIG5vdCBjcmVhdGUgb3BlcmF0aW9uLicpO1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmRhbmdlcihhbGVydE1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGljb24gZm9yIGEgc3BlY2lmaWMgY29tbWFuZC5cbiAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgbmFtZS5cbiAgICogQHJldHVybnMgSWNvbiBzdHJpbmcgZm9yIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb21tYW5kSWNvbihjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBTRVJWSUNFX0NPTU1BTkRTX01BUFtjb21tYW5kXT8uaWNvbiB8fCAnY29uc29sZSc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBpY29uIGNsYXNzIGZvciBhIHNwZWNpZmljIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIG5hbWUuXG4gICAqIEByZXR1cm5zIEljb24gY2xhc3Mgc3RyaW5nIGZvciB0aGUgY29tbWFuZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q29tbWFuZEljb25DbGFzcyhjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBTRVJWSUNFX0NPTU1BTkRTX01BUFtjb21tYW5kXT8uc3R5bGVDbGFzcztcbiAgfVxufVxuIl19
@@ -0,0 +1,23 @@
1
+ import { gettext } from '@c8y/ngx-components';
2
+ export const SERVICE_FRAGMENT = 'c8y_Service';
3
+ export const SERVICE_COMMANDS_MAP = {
4
+ START: {
5
+ label: gettext('Start'),
6
+ command: 'START',
7
+ icon: 'play-circle',
8
+ styleClass: 'text-success'
9
+ },
10
+ STOP: {
11
+ label: gettext('Stop'),
12
+ command: 'STOP',
13
+ icon: 'stop-circle',
14
+ styleClass: 'text-danger'
15
+ },
16
+ RESTART: {
17
+ label: gettext('Restart'),
18
+ command: 'RESTART',
19
+ icon: 'refresh',
20
+ styleClass: 'text-info'
21
+ }
22
+ };
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zaGFyZWQvc2VydmljZXMubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztBQUU5QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRztJQUNsQyxLQUFLLEVBQUU7UUFDTCxLQUFLLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUN2QixPQUFPLEVBQUUsT0FBTztRQUNoQixJQUFJLEVBQUUsYUFBYTtRQUNuQixVQUFVLEVBQUUsY0FBYztLQUMzQjtJQUNELElBQUksRUFBRTtRQUNKLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3RCLE9BQU8sRUFBRSxNQUFNO1FBQ2YsSUFBSSxFQUFFLGFBQWE7UUFDbkIsVUFBVSxFQUFFLGFBQWE7S0FDMUI7SUFDRCxPQUFPLEVBQUU7UUFDUCxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUN6QixPQUFPLEVBQUUsU0FBUztRQUNsQixJQUFJLEVBQUUsU0FBUztRQUNmLFVBQVUsRUFBRSxXQUFXO0tBQ3hCO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcblxuZXhwb3J0IGNvbnN0IFNFUlZJQ0VfRlJBR01FTlQgPSAnYzh5X1NlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgU0VSVklDRV9DT01NQU5EU19NQVAgPSB7XG4gIFNUQVJUOiB7XG4gICAgbGFiZWw6IGdldHRleHQoJ1N0YXJ0JyksXG4gICAgY29tbWFuZDogJ1NUQVJUJyxcbiAgICBpY29uOiAncGxheS1jaXJjbGUnLFxuICAgIHN0eWxlQ2xhc3M6ICd0ZXh0LXN1Y2Nlc3MnXG4gIH0sXG4gIFNUT1A6IHtcbiAgICBsYWJlbDogZ2V0dGV4dCgnU3RvcCcpLFxuICAgIGNvbW1hbmQ6ICdTVE9QJyxcbiAgICBpY29uOiAnc3RvcC1jaXJjbGUnLFxuICAgIHN0eWxlQ2xhc3M6ICd0ZXh0LWRhbmdlcidcbiAgfSxcbiAgUkVTVEFSVDoge1xuICAgIGxhYmVsOiBnZXR0ZXh0KCdSZXN0YXJ0JyksXG4gICAgY29tbWFuZDogJ1JFU1RBUlQnLFxuICAgIGljb246ICdyZWZyZXNoJyxcbiAgICBzdHlsZUNsYXNzOiAndGV4dC1pbmZvJ1xuICB9XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2Uge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNlcnZpY2VUeXBlOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBjOHlfU3VwcG9ydGVkT3BlcmF0aW9ucz86IHN0cmluZ1tdO1xuICBjOHlfU3VwcG9ydGVkU2VydmljZUNvbW1hbmRzPzogc3RyaW5nW107XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG4iXX0=
@@ -1979,11 +1979,11 @@ class AlarmsTypeFilterComponent {
1979
1979
  return activeFilters.map(filter => filter.filters.type).join(',');
1980
1980
  }
1981
1981
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmsTypeFilterComponent, deps: [{ token: i1$3.AlarmEventSelectorService }, { token: i1$1.ActivatedRoute }, { token: i1$1.Router }, { token: i3.ColorService }], target: i0.ɵɵFactoryTarget.Component }); }
1982
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AlarmsTypeFilterComponent, selector: "c8y-alarms-type-filter", inputs: { alarms: "alarms", possibleFilters: "possibleFilters", activeFilters: "activeFilters" }, outputs: { onFilterChanged: "onFilterChanged" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex a-i-center\">\n <div\n class=\"dropdown\"\n title=\"{{ 'Filter by Alarm types' | translate }}\"\n dropdown\n #filtersDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"filtersDropdown.isOpen\"\n (onHidden)=\"resetFilters()\"\n [insideClick]=\"true\"\n >\n <div class=\"input-group fit-w\">\n <div class=\"form-control d-flex a-i-center inner-scroll\">\n <ng-container *ngIf=\"activeFilters.length > 0; else allTypes\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let filter of activeFilters\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n (click)=\"$event.stopPropagation(); deselect(filter)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small\"\n [ngStyle]=\"{ 'background-color': filter.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n {{ filter.filters.type }}\n </span>\n </ng-container>\n <ng-template #allTypes>\n <span class=\"text-nowrap\">\n {{ 'All alarm types' | translate }}\n </span>\n </ng-template>\n </div>\n <div class=\"input-group-btn input-group-btn--last text-center\">\n <button\n class=\"btn-default btn\"\n [title]=\"'Clear filters' | translate\"\n *ngIf=\"activeFilters.length\"\n (click)=\"deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn-default btn btn--caret\"\n [title]=\"'Alarm types' | translate\"\n data-cy=\"c8y-alarm-type-filter\"\n dropdownToggle\n >\n <i class=\"caret\"></i>\n </button>\n </div>\n </div>\n <div\n class=\"dropdown-menu dropdown-menu-action-bar\"\n style=\"max-width: unset; min-width: 250px\"\n *dropdownMenu\n >\n <div class=\"p-16 bg-level-2\">\n <div>\n <p>\n <i\n class=\"text-info m-r-4\"\n [c8yIcon]=\"'info-circle'\"\n ></i>\n <strong tanslate>The list below may not be complete.</strong>\n </p>\n <p tanslate>\n Recent alarms are displayed below. Past alarms might not be shown. Optionally you can\n add a custom alarm.\n </p>\n </div>\n </div>\n <c8y-list-group>\n <div class=\"input-group p-t-16 p-b-16 p-r-32 p-l-32 separator-bottom\">\n <input\n class=\"form-control\"\n placeholder=\"'Custom alarm type' | translate\"\n type=\"text\"\n [(ngModel)]=\"customAlarmTypeInput\"\n (keydown)=\"confirmWithEnter($event)\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot text-primary\"\n [attr.aria-label]=\"'Add custom alarm' | translate\"\n tooltip=\"'Add' | translate\"\n placement=\"top\"\n [delay]=\"500\"\n (click)=\"addCustomAlarmType()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n </div>\n\n <c8y-li\n class=\"c8y-list__item__collapse--container-small cdk-drag\"\n style=\"cursor: pointer\"\n *ngFor=\"let alarmType of possibleFilters\"\n (click)=\"toggleAlarmType(alarmType)\"\n >\n <c8y-li-checkbox\n class=\"a-s-center m-t-4 p-r-0 p-l-0\"\n [selected]=\"alarmType.__active\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleAlarmType(alarmType); $event.stopPropagation()\"\n ></c8y-li-checkbox>\n <div class=\"d-flex a-i-center p-l-4\">\n <div class=\"c8y-list__item__colorpicker p-t-0 p-b-0 p-l-0\">\n <div class=\"c8y-colorpicker c8y-colorpicker--alarm\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': alarmType.color }\"\n >\n <i\n class=\"stroked-icon\"\n [c8yIcon]=\"'bell'\"\n ></i>\n </span>\n </div>\n </div>\n <span class=\"text-truncate text-12 flex-grow\">\n {{ alarmType.label }}\n </span>\n <button\n class=\"btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"'Remove' | translate\"\n placement=\"top\"\n *ngIf=\"alarmType.__target === null\"\n [delay]=\"500\"\n (click)=\"removeCustomAlarm(alarmType); $event.stopPropagation()\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li>\n <c8y-li *ngIf=\"possibleFilters.length === 0\">\n <c8y-ui-empty-state\n class=\"p-t-8\"\n icon=\"c8y-alarm\"\n [title]=\"'No alarm found' | translate\"\n [subtitle]=\"\n 'There is no alarm to filter. You can still add a custom alarm.' | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </c8y-li>\n <div class=\"sticky-bottom p-16\">\n <button\n class=\"btn btn-block btn-primary\"\n [disabled]=\"possibleFilters.length === 0\"\n (click)=\"applyFilterChange(); $event.stopPropagation(); filtersDropdown.hide()\"\n translate\n >\n Apply\n </button>\n </div>\n </c8y-list-group>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i5.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i6.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i6.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i6.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { 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: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { 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: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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.ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "directive", type: i5$1.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
1982
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AlarmsTypeFilterComponent, selector: "c8y-alarms-type-filter", inputs: { alarms: "alarms", possibleFilters: "possibleFilters", activeFilters: "activeFilters" }, outputs: { onFilterChanged: "onFilterChanged" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex a-i-center\">\n <div\n class=\"dropdown\"\n title=\"{{ 'Filter by alarm types' | translate }}\"\n dropdown\n #filtersDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"filtersDropdown.isOpen\"\n (onHidden)=\"resetFilters()\"\n [insideClick]=\"true\"\n >\n <div class=\"input-group fit-w\">\n <div class=\"form-control d-flex a-i-center inner-scroll\">\n <ng-container *ngIf=\"activeFilters.length > 0; else allTypes\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let filter of activeFilters\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n (click)=\"$event.stopPropagation(); deselect(filter)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small\"\n [ngStyle]=\"{ 'background-color': filter.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n {{ filter.filters.type }}\n </span>\n </ng-container>\n <ng-template #allTypes>\n <span class=\"text-nowrap\">\n {{ 'All alarm types' | translate }}\n </span>\n </ng-template>\n </div>\n <div class=\"input-group-btn input-group-btn--last text-center\">\n <button\n class=\"btn-default btn\"\n [title]=\"'Clear filters' | translate\"\n *ngIf=\"activeFilters.length\"\n (click)=\"deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn-default btn btn--caret\"\n [title]=\"'Alarm types' | translate\"\n data-cy=\"c8y-alarm-type-filter\"\n dropdownToggle\n >\n <i class=\"caret\"></i>\n </button>\n </div>\n </div>\n <div\n class=\"dropdown-menu dropdown-menu-action-bar\"\n style=\"max-width: unset; min-width: 250px\"\n *dropdownMenu\n >\n <div class=\"p-16 bg-level-2\">\n <div>\n <p>\n <i\n class=\"text-info m-r-4\"\n [c8yIcon]=\"'info-circle'\"\n ></i>\n <strong tanslate>The list below may not be complete.</strong>\n </p>\n <p tanslate>\n Recent alarms are displayed below. Past alarms might not be shown. Optionally you can\n add a custom alarm.\n </p>\n </div>\n </div>\n <c8y-list-group>\n <div class=\"input-group p-t-16 p-b-16 p-r-32 p-l-32 separator-bottom\">\n <input\n class=\"form-control\"\n placeholder=\"'Custom alarm type' | translate\"\n type=\"text\"\n [(ngModel)]=\"customAlarmTypeInput\"\n (keydown)=\"confirmWithEnter($event)\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot text-primary\"\n [attr.aria-label]=\"'Add custom alarm' | translate\"\n tooltip=\"'Add' | translate\"\n placement=\"top\"\n [delay]=\"500\"\n (click)=\"addCustomAlarmType()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n </div>\n\n <c8y-li\n class=\"c8y-list__item__collapse--container-small cdk-drag\"\n style=\"cursor: pointer\"\n *ngFor=\"let alarmType of possibleFilters\"\n (click)=\"toggleAlarmType(alarmType)\"\n >\n <c8y-li-checkbox\n class=\"a-s-center m-t-4 p-r-0 p-l-0\"\n [selected]=\"alarmType.__active\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleAlarmType(alarmType); $event.stopPropagation()\"\n ></c8y-li-checkbox>\n <div class=\"d-flex a-i-center p-l-4\">\n <div class=\"c8y-list__item__colorpicker p-t-0 p-b-0 p-l-0\">\n <div class=\"c8y-colorpicker c8y-colorpicker--alarm\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': alarmType.color }\"\n >\n <i\n class=\"stroked-icon\"\n [c8yIcon]=\"'bell'\"\n ></i>\n </span>\n </div>\n </div>\n <span class=\"text-truncate text-12 flex-grow\">\n {{ alarmType.label }}\n </span>\n <button\n class=\"btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"'Remove' | translate\"\n placement=\"top\"\n *ngIf=\"alarmType.__target === null\"\n [delay]=\"500\"\n (click)=\"removeCustomAlarm(alarmType); $event.stopPropagation()\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li>\n <c8y-li *ngIf=\"possibleFilters.length === 0\">\n <c8y-ui-empty-state\n class=\"p-t-8\"\n icon=\"c8y-alarm\"\n [title]=\"'No alarm found' | translate\"\n [subtitle]=\"\n 'There is no alarm to filter. You can still add a custom alarm.' | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </c8y-li>\n <div class=\"sticky-bottom p-16\">\n <button\n class=\"btn btn-block btn-primary\"\n [disabled]=\"possibleFilters.length === 0\"\n (click)=\"applyFilterChange(); $event.stopPropagation(); filtersDropdown.hide()\"\n translate\n >\n Apply\n </button>\n </div>\n </c8y-list-group>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i5.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i6.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i6.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i6.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { 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: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { 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: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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.ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "directive", type: i5$1.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
1983
1983
  }
1984
1984
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AlarmsTypeFilterComponent, decorators: [{
1985
1985
  type: Component,
1986
- args: [{ selector: 'c8y-alarms-type-filter', template: "<div class=\"d-flex a-i-center\">\n <div\n class=\"dropdown\"\n title=\"{{ 'Filter by Alarm types' | translate }}\"\n dropdown\n #filtersDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"filtersDropdown.isOpen\"\n (onHidden)=\"resetFilters()\"\n [insideClick]=\"true\"\n >\n <div class=\"input-group fit-w\">\n <div class=\"form-control d-flex a-i-center inner-scroll\">\n <ng-container *ngIf=\"activeFilters.length > 0; else allTypes\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let filter of activeFilters\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n (click)=\"$event.stopPropagation(); deselect(filter)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small\"\n [ngStyle]=\"{ 'background-color': filter.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n {{ filter.filters.type }}\n </span>\n </ng-container>\n <ng-template #allTypes>\n <span class=\"text-nowrap\">\n {{ 'All alarm types' | translate }}\n </span>\n </ng-template>\n </div>\n <div class=\"input-group-btn input-group-btn--last text-center\">\n <button\n class=\"btn-default btn\"\n [title]=\"'Clear filters' | translate\"\n *ngIf=\"activeFilters.length\"\n (click)=\"deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn-default btn btn--caret\"\n [title]=\"'Alarm types' | translate\"\n data-cy=\"c8y-alarm-type-filter\"\n dropdownToggle\n >\n <i class=\"caret\"></i>\n </button>\n </div>\n </div>\n <div\n class=\"dropdown-menu dropdown-menu-action-bar\"\n style=\"max-width: unset; min-width: 250px\"\n *dropdownMenu\n >\n <div class=\"p-16 bg-level-2\">\n <div>\n <p>\n <i\n class=\"text-info m-r-4\"\n [c8yIcon]=\"'info-circle'\"\n ></i>\n <strong tanslate>The list below may not be complete.</strong>\n </p>\n <p tanslate>\n Recent alarms are displayed below. Past alarms might not be shown. Optionally you can\n add a custom alarm.\n </p>\n </div>\n </div>\n <c8y-list-group>\n <div class=\"input-group p-t-16 p-b-16 p-r-32 p-l-32 separator-bottom\">\n <input\n class=\"form-control\"\n placeholder=\"'Custom alarm type' | translate\"\n type=\"text\"\n [(ngModel)]=\"customAlarmTypeInput\"\n (keydown)=\"confirmWithEnter($event)\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot text-primary\"\n [attr.aria-label]=\"'Add custom alarm' | translate\"\n tooltip=\"'Add' | translate\"\n placement=\"top\"\n [delay]=\"500\"\n (click)=\"addCustomAlarmType()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n </div>\n\n <c8y-li\n class=\"c8y-list__item__collapse--container-small cdk-drag\"\n style=\"cursor: pointer\"\n *ngFor=\"let alarmType of possibleFilters\"\n (click)=\"toggleAlarmType(alarmType)\"\n >\n <c8y-li-checkbox\n class=\"a-s-center m-t-4 p-r-0 p-l-0\"\n [selected]=\"alarmType.__active\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleAlarmType(alarmType); $event.stopPropagation()\"\n ></c8y-li-checkbox>\n <div class=\"d-flex a-i-center p-l-4\">\n <div class=\"c8y-list__item__colorpicker p-t-0 p-b-0 p-l-0\">\n <div class=\"c8y-colorpicker c8y-colorpicker--alarm\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': alarmType.color }\"\n >\n <i\n class=\"stroked-icon\"\n [c8yIcon]=\"'bell'\"\n ></i>\n </span>\n </div>\n </div>\n <span class=\"text-truncate text-12 flex-grow\">\n {{ alarmType.label }}\n </span>\n <button\n class=\"btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"'Remove' | translate\"\n placement=\"top\"\n *ngIf=\"alarmType.__target === null\"\n [delay]=\"500\"\n (click)=\"removeCustomAlarm(alarmType); $event.stopPropagation()\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li>\n <c8y-li *ngIf=\"possibleFilters.length === 0\">\n <c8y-ui-empty-state\n class=\"p-t-8\"\n icon=\"c8y-alarm\"\n [title]=\"'No alarm found' | translate\"\n [subtitle]=\"\n 'There is no alarm to filter. You can still add a custom alarm.' | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </c8y-li>\n <div class=\"sticky-bottom p-16\">\n <button\n class=\"btn btn-block btn-primary\"\n [disabled]=\"possibleFilters.length === 0\"\n (click)=\"applyFilterChange(); $event.stopPropagation(); filtersDropdown.hide()\"\n translate\n >\n Apply\n </button>\n </div>\n </c8y-list-group>\n </div>\n </div>\n</div>\n" }]
1986
+ args: [{ selector: 'c8y-alarms-type-filter', template: "<div class=\"d-flex a-i-center\">\n <div\n class=\"dropdown\"\n title=\"{{ 'Filter by alarm types' | translate }}\"\n dropdown\n #filtersDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"filtersDropdown.isOpen\"\n (onHidden)=\"resetFilters()\"\n [insideClick]=\"true\"\n >\n <div class=\"input-group fit-w\">\n <div class=\"form-control d-flex a-i-center inner-scroll\">\n <ng-container *ngIf=\"activeFilters.length > 0; else allTypes\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let filter of activeFilters\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n (click)=\"$event.stopPropagation(); deselect(filter)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small\"\n [ngStyle]=\"{ 'background-color': filter.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n {{ filter.filters.type }}\n </span>\n </ng-container>\n <ng-template #allTypes>\n <span class=\"text-nowrap\">\n {{ 'All alarm types' | translate }}\n </span>\n </ng-template>\n </div>\n <div class=\"input-group-btn input-group-btn--last text-center\">\n <button\n class=\"btn-default btn\"\n [title]=\"'Clear filters' | translate\"\n *ngIf=\"activeFilters.length\"\n (click)=\"deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn-default btn btn--caret\"\n [title]=\"'Alarm types' | translate\"\n data-cy=\"c8y-alarm-type-filter\"\n dropdownToggle\n >\n <i class=\"caret\"></i>\n </button>\n </div>\n </div>\n <div\n class=\"dropdown-menu dropdown-menu-action-bar\"\n style=\"max-width: unset; min-width: 250px\"\n *dropdownMenu\n >\n <div class=\"p-16 bg-level-2\">\n <div>\n <p>\n <i\n class=\"text-info m-r-4\"\n [c8yIcon]=\"'info-circle'\"\n ></i>\n <strong tanslate>The list below may not be complete.</strong>\n </p>\n <p tanslate>\n Recent alarms are displayed below. Past alarms might not be shown. Optionally you can\n add a custom alarm.\n </p>\n </div>\n </div>\n <c8y-list-group>\n <div class=\"input-group p-t-16 p-b-16 p-r-32 p-l-32 separator-bottom\">\n <input\n class=\"form-control\"\n placeholder=\"'Custom alarm type' | translate\"\n type=\"text\"\n [(ngModel)]=\"customAlarmTypeInput\"\n (keydown)=\"confirmWithEnter($event)\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot text-primary\"\n [attr.aria-label]=\"'Add custom alarm' | translate\"\n tooltip=\"'Add' | translate\"\n placement=\"top\"\n [delay]=\"500\"\n (click)=\"addCustomAlarmType()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n </div>\n\n <c8y-li\n class=\"c8y-list__item__collapse--container-small cdk-drag\"\n style=\"cursor: pointer\"\n *ngFor=\"let alarmType of possibleFilters\"\n (click)=\"toggleAlarmType(alarmType)\"\n >\n <c8y-li-checkbox\n class=\"a-s-center m-t-4 p-r-0 p-l-0\"\n [selected]=\"alarmType.__active\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleAlarmType(alarmType); $event.stopPropagation()\"\n ></c8y-li-checkbox>\n <div class=\"d-flex a-i-center p-l-4\">\n <div class=\"c8y-list__item__colorpicker p-t-0 p-b-0 p-l-0\">\n <div class=\"c8y-colorpicker c8y-colorpicker--alarm\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': alarmType.color }\"\n >\n <i\n class=\"stroked-icon\"\n [c8yIcon]=\"'bell'\"\n ></i>\n </span>\n </div>\n </div>\n <span class=\"text-truncate text-12 flex-grow\">\n {{ alarmType.label }}\n </span>\n <button\n class=\"btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"'Remove' | translate\"\n placement=\"top\"\n *ngIf=\"alarmType.__target === null\"\n [delay]=\"500\"\n (click)=\"removeCustomAlarm(alarmType); $event.stopPropagation()\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li>\n <c8y-li *ngIf=\"possibleFilters.length === 0\">\n <c8y-ui-empty-state\n class=\"p-t-8\"\n icon=\"c8y-alarm\"\n [title]=\"'No alarm found' | translate\"\n [subtitle]=\"\n 'There is no alarm to filter. You can still add a custom alarm.' | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </c8y-li>\n <div class=\"sticky-bottom p-16\">\n <button\n class=\"btn btn-block btn-primary\"\n [disabled]=\"possibleFilters.length === 0\"\n (click)=\"applyFilterChange(); $event.stopPropagation(); filtersDropdown.hide()\"\n translate\n >\n Apply\n </button>\n </div>\n </c8y-list-group>\n </div>\n </div>\n</div>\n" }]
1987
1987
  }], ctorParameters: () => [{ type: i1$3.AlarmEventSelectorService }, { type: i1$1.ActivatedRoute }, { type: i1$1.Router }, { type: i3.ColorService }], propDecorators: { alarms: [{
1988
1988
  type: Input
1989
1989
  }], possibleFilters: [{
@@ -2154,7 +2154,7 @@ class AlarmsComponent {
2154
2154
  return;
2155
2155
  }
2156
2156
  const { context, contextData } = routeContext;
2157
- if ([ViewContext.Device, ViewContext.Group, ViewContext.Simulators].includes(context)) {
2157
+ if ([ViewContext.Device, ViewContext.Group, ViewContext.Service, ViewContext.Simulators].includes(context)) {
2158
2158
  this.contextSourceId = contextData?.id;
2159
2159
  }
2160
2160
  }