@c8y/ngx-components 1023.12.0 → 1023.14.8
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.
- package/datapoint-explorer/index.d.ts +78 -1
- package/datapoint-explorer/index.d.ts.map +1 -1
- package/datapoint-explorer/view/index.d.ts +150 -14
- package/datapoint-explorer/view/index.d.ts.map +1 -1
- package/echart/index.d.ts +12 -2
- package/echart/index.d.ts.map +1 -1
- package/echart/models/index.d.ts +12 -2
- package/echart/models/index.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +2 -2
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +388 -64
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +329 -4
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart-models.mjs +6 -1
- package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +14 -4
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-global-context.mjs +4 -3
- package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +129 -17
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +10 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +16078 -15972
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/global-context/index.d.ts.map +1 -1
- package/index.d.ts +10838 -10770
- package/index.d.ts.map +1 -1
- package/locales/de.po +71 -50
- package/locales/es.po +60 -39
- package/locales/fr.po +52 -31
- package/locales/ja_JP.po +46 -25
- package/locales/ko.po +57 -38
- package/locales/locales.pot +29 -8
- package/locales/nl.po +56 -34
- package/locales/pl.po +73 -52
- package/locales/pt_BR.po +57 -36
- package/locales/zh_CN.po +54 -33
- package/locales/zh_TW.po +66 -44
- package/package.json +1 -1
- package/widgets/implementations/datapoints-graph/index.d.ts +19 -5
- package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-alarms.mjs","sources":["../../alarms/alarm-details-custom-button/alarm-details-button.service.ts","../../alarms/alarm-details-custom-button/alarm-details-button.pipe.ts","../../alarms/alarm-details.service.ts","../../alarms/alarms.model.ts","../../alarms/ng1-smart-rules-upgrade.service.ts","../../alarms/alarms-view.service.ts","../../alarms/alarms-activity-tracker.service.ts","../../alarms/alarm-severity-to-icon.pipe.ts","../../alarms/alarm-status-to-icon.pipe.ts","../../alarms/audit-changes-message.pipe.ts","../../alarms/alarm-details.component.ts","../../alarms/alarm-details.component.html","../../alarms/alarm-empty.component.ts","../../alarms/alarm-empty.component.html","../../alarms/alarm-info.component.ts","../../alarms/alarm-info.component.html","../../alarms/alarm-list-custom-indicator/alarm-list-indicator.service.ts","../../alarms/alarm-list-custom-indicator/alarm-list-indicator.pipe.ts","../../alarms/alarm-severities-to-title.pipe.ts","../../alarms/alarm-severity-to-icon-class.pipe.ts","../../alarms/alarm-severity-to-label.pipe.ts","../../alarms/alarm-status-to-label.pipe.ts","../../alarms/alarms-filter.component.ts","../../alarms/alarms-filter.component.html","../../alarms/alarms-icon.component.ts","../../alarms/alarms-icon.component.html","../../alarms/alarms-interval-refresh.component.ts","../../alarms/alarms-interval-refresh.component.html","../../alarms/alarms-list.component.ts","../../alarms/alarms-list.component.html","../../alarms/alarms-date-filter.component.ts","../../alarms/alarms-date-filter.component.html","../../alarms/alarms-type-filter.component.ts","../../alarms/alarms-type-filter.component.html","../../alarms/alarms.component.ts","../../alarms/alarms.component.html","../../alarms/alarms.helper.ts","../../alarms/alarms.module.ts","../../alarms/c8y-ngx-components-alarms.ts"],"sourcesContent":["import { IAlarm, IManagedObject } from '@c8y/client';\nimport { combineLatest, Observable } from 'rxjs';\nimport { filter, map, startWith, switchMap } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { PluginsResolveService, ServiceRegistry } from '@c8y/ngx-components';\nimport { AlarmDetailsButton } from '../alarms.model';\nimport { sortBy } from 'lodash-es';\n\n@Injectable({ providedIn: 'root' })\n/**\n * A service to retrieve custom buttons for the alarm details view.\n */\nexport class AlarmDetailsButtonService {\n constructor(\n private serviceRegistry: ServiceRegistry,\n private pluginsResolver: PluginsResolveService\n ) {}\n\n get$(alarm: IAlarm, source: IManagedObject): Observable<AlarmDetailsButton[]> {\n const providers$ = this.pluginsResolver.allPluginsLoaded$.pipe(\n filter(Boolean),\n map(() => {\n return this.serviceRegistry.get('alarmDetailsButton');\n })\n );\n\n return providers$.pipe(\n switchMap(providers => {\n const observables$ = providers.map(provider =>\n provider.getAlarmDetailsButton$(alarm, source).pipe(startWith(false))\n );\n return combineLatest(observables$);\n }),\n map(indicators => {\n return indicators.filter(Boolean) as AlarmDetailsButton[];\n }),\n map(indicators => sortBy(indicators, this.byPriority))\n );\n }\n\n private byPriority(item: AlarmDetailsButton) {\n if (item.priority === undefined) {\n return 0;\n }\n return -item.priority;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { IAlarm, IManagedObject } from '@c8y/client';\nimport { Observable } from 'rxjs';\nimport { AlarmDetailsButtonService } from './alarm-details-button.service';\nimport { AlarmDetailsButton } from '../alarms.model';\n\n@Pipe({\n standalone: true,\n name: 'alarmDetailsButton',\n pure: true\n})\n/**\n * A pipe to provide custom buttons for the alarm details view.\n *\n * Will call `get$()` method of `AlarmDetailsButtonService` to get the custom buttons for the provided alarm.\n */\nexport class AlarmDetailsButtonPipe implements PipeTransform {\n constructor(private alarmDetailsButtonService: AlarmDetailsButtonService) {}\n\n transform(alarm: IAlarm, source: IManagedObject): Observable<AlarmDetailsButton[]> {\n return this.alarmDetailsButtonService.get$(alarm, source);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AlarmStatus, AlarmStatusType, IAuditRecord, IChange } from '@c8y/client';\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AlarmDetailsService {\n private readonly STATUS_ATTRIBUTE = 'status';\n\n constructor(private permissions: Permissions) {}\n\n /**\n * Retrieves the username of the user who acknowledged an alarm status.\n *\n * This method checks if the provided status is equal to the acknowledged\n * status. If it is not, or if the\n * audit log is empty or the first log item does not contain a user, the\n * method returns a default value ('--').\n *\n * If the status is the acknowledged status and the audit log contains valid\n * records, the method iterates over the audit records in reverse order\n * (starting from the most recent). It finds the first record where the\n * status attribute (defined by this.STATUS_ATTRIBUTE) has been changed to\n * the acknowledged status. The method then returns the username of the user\n * who made this change.\n *\n * If no such change is found in the audit records, it returns the username\n * from the first record of the audit log.\n *\n * There can be multiple audit logs with ACKNOWLEDGED status.\n *\n * @param status - The current status of the alarm.\n * @param auditLog - An array of audit records to process.\n * @returns The username of the user who acknowledged the status\n * or '--' if the status is not acknowledged or audit log is invalid.\n */\n getAcknowledgedBy(status: AlarmStatusType, auditLog: IAuditRecord[]): string {\n let acknowledgedBy = '--';\n\n if (status !== AlarmStatus.ACKNOWLEDGED || !auditLog || !auditLog[0]?.user) {\n return acknowledgedBy;\n }\n\n acknowledgedBy = auditLog[0].user;\n\n return auditLog.reduceRight((acc, auditLogItem) => {\n const changes = Array.from(auditLogItem.changes || []);\n const acknowledgedStatusChange = changes.find(\n (change: IChange) =>\n change.attribute === this.STATUS_ATTRIBUTE && change.newValue === AlarmStatus.ACKNOWLEDGED\n );\n return (acknowledgedStatusChange && auditLogItem.user) || acc;\n }, acknowledgedBy);\n }\n\n /**\n * Calculates the acknowledge time from a list of audit records.\n *\n * This method iterates over the provided audit records in reverse order\n * (starting from the most recent) and finds the first record where a\n * specific status attribute (defined by this.STATUS_ATTRIBUTE) has been\n * acknowledged. It then returns the creation time of that record.\n *\n * If no such record is found, the method returns the creation time of the\n * first audit record. If the audit record list is empty, it returns null.\n *\n * There can be multiple audit logs with ACKNOWLEDGED status.\n *\n * @param auditLog - An array of audit records to process.\n * @returns The creation time of the acknowledged record,\n * the creation time of the first record if no acknowledged record is found,\n * or null if the audit log is empty.\n */\n getAcknowledgeTime(auditLog: IAuditRecord[]): string | null {\n const initialValue = auditLog.length ? auditLog[0].creationTime : null;\n\n return auditLog.reduceRight((acc, auditLogItem) => {\n const changes = Array.from(auditLogItem.changes || []);\n const acknowledgedStatusChange = changes.find(\n (change: IChange) =>\n change.attribute === this.STATUS_ATTRIBUTE && change.newValue === AlarmStatus.ACKNOWLEDGED\n );\n return acknowledgedStatusChange ? auditLogItem.creationTime : acc;\n }, initialValue);\n }\n\n /**\n * Retrieves the end time of an event from an audit log.\n *\n * The method processes the provided audit log to find the first instance\n * (starting from the most recent record) where the status was changed to 'CLEARED'.\n * It iterates over the audit records and\n * checks the changes in each record to find this status change.\n *\n * If a record with the CLEARED status is found, the method returns the creation time\n * of that record. If the entire audit log is processed without finding a CLEARED status,\n * the creation time of the first audit log record is returned.\n *\n * If the audit log is empty or null, the method returns null.\n *\n * There can be only one audit log with CLEARED status.\n *\n * @param auditLog - An array of audit records to process.\n * @returns The creation time of the record with the CLEARED status,\n * the creation time of the first record if no CLEARED status is found,\n * or null if the audit log is empty or null.\n */\n getEndTime(auditLog: IAuditRecord[]): string | null {\n if (!auditLog || auditLog.length === 0) {\n return null;\n }\n\n let latestClearedAuditTime = null;\n\n for (const auditLogItem of auditLog) {\n const changes = Array.from(auditLogItem.changes || []);\n const clearedStatusChange = changes.find(\n change =>\n change.attribute === this.STATUS_ATTRIBUTE && change.newValue === AlarmStatus.CLEARED\n );\n\n if (clearedStatusChange) {\n if (!latestClearedAuditTime || auditLogItem.creationTime > latestClearedAuditTime) {\n latestClearedAuditTime = auditLogItem.creationTime;\n }\n }\n }\n\n return latestClearedAuditTime || auditLog[0].creationTime;\n }\n\n checkIfHasAnyRoleAllowingToCreateSmartRule(): boolean {\n const ROLES_ALLOWING_SMART_RULE_CREATION = [\n [\n Permissions.ROLE_INVENTORY_ADMIN,\n Permissions.ROLE_INVENTORY_CREATE,\n Permissions.ROLE_MANAGED_OBJECT_ADMIN,\n Permissions.ROLE_MANAGED_OBJECT_CREATE\n ],\n [Permissions.ROLE_CEP_MANAGEMENT_ADMIN, Permissions.ROLE_SMARTRULE_ADMIN]\n ];\n\n return (\n this.permissions.hasAnyRole(ROLES_ALLOWING_SMART_RULE_CREATION[0]) &&\n this.permissions.hasAnyRole(ROLES_ALLOWING_SMART_RULE_CREATION[1])\n );\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport {\n AlarmStatus,\n AlarmStatusSettings,\n AlarmStatusType,\n IAlarm,\n IManagedObject,\n Severity,\n SeverityFilter,\n SeverityType\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { DateTimeContext, NavigatorNode, NavigatorNodeData, Route } from '@c8y/ngx-components';\nimport { QueryParamsHandling } from '@angular/router';\nimport type { SupportedIcons } from '@c8y/ngx-components/icon-selector/icons';\nimport { Observable } from 'rxjs';\nimport {\n INTERVALS,\n INTERVAL_TITLES,\n AlarmFilterInterval\n} from '@c8y/ngx-components/interval-picker';\n\nexport interface AlarmsModuleConfig {\n /**\n * Indicates whether the application is a combination of Angular and AngularJS.\n * @optional\n */\n hybrid?: boolean;\n\n /**\n * The root node of the navigator, which can be either a `NavigatorNode` or `NavigatorNodeData`.\n * This serves as the entry point for navigation structure for Alarms views.\n * @optional\n */\n rootNavigatorNode?: NavigatorNode | NavigatorNodeData;\n\n /**\n * An array of `Route` objects representing the navigation routes available.\n * Each route defines a navigation path and its associated components related to Alarms.\n * @optional\n */\n route?: Route[];\n}\n\nexport const ALARMS_MODULE_CONFIG = new InjectionToken('AlarmsModuleConfig');\n\nexport type AlarmCount = { [key in SeverityType]: number };\n\nexport const ALARM_STATUS_ICON = {\n ALERT_IDLE: 'c8y-alert-idle',\n BELL_SLASH: 'bell-slash',\n BELL: 'bell'\n} as const;\n\nexport type AlarmStatusIcon = (typeof ALARM_STATUS_ICON)[keyof typeof ALARM_STATUS_ICON];\n\n/**\n * A lookup table to map alarm statuses to corresponding icons.\n */\nexport const AlarmIconMap: Record<AlarmStatusType, AlarmStatusIcon> = {\n [AlarmStatus.CLEARED]: ALARM_STATUS_ICON.ALERT_IDLE,\n [AlarmStatus.ACKNOWLEDGED]: ALARM_STATUS_ICON.BELL_SLASH,\n [AlarmStatus.ACTIVE]: ALARM_STATUS_ICON.BELL\n} as const;\n\nexport const ALARM_SEVERITY_ICON = {\n CIRCLE: 'circle',\n HIGH_PRIORITY: 'high-priority',\n WARNING: 'warning',\n EXCLAMATION_CIRCLE: 'exclamation-circle'\n} as const;\n\nexport const HELP_ICON = 'help';\n\nexport type AlarmSeverityIcon = (typeof ALARM_SEVERITY_ICON)[keyof typeof ALARM_SEVERITY_ICON];\n/**\n * A lookup table to map alarm severity types to corresponding icons.\n */\nexport const ALARM_SEVERITY_ICON_MAP: Record<SeverityType, AlarmSeverityIcon> = {\n [Severity.CRITICAL]: ALARM_SEVERITY_ICON.EXCLAMATION_CIRCLE,\n [Severity.MAJOR]: ALARM_SEVERITY_ICON.WARNING,\n [Severity.MINOR]: ALARM_SEVERITY_ICON.HIGH_PRIORITY,\n [Severity.WARNING]: ALARM_SEVERITY_ICON.CIRCLE\n} as const;\n\nexport type AlarmListFormFilters = {\n showCleared: boolean;\n severityOptions: SeverityFilter;\n selectedDates?: DateTimeContext;\n};\n\n/**\n * Extended interval titles with an additional title for the case when no date is selected.\n */\nexport const INTERVAL_TITLES_EXTENDED: Record<AlarmFilterInterval['id'], string> = {\n ...INTERVAL_TITLES,\n none: gettext('No date filter')\n};\n\nexport const INTERVALS_EXTENDED: AlarmFilterInterval[] = [\n {\n id: 'none',\n title: gettext('No date filter')\n },\n ...INTERVALS\n];\n\nexport type WidgetTimeContextStateExtended = {\n date: DateTimeContext;\n interval: AlarmFilterInterval['id'];\n};\n\nexport type SelectedAlarm = IAlarm | null;\n\nexport const DEFAULT_ALARM_COUNTS: AlarmCount = { CRITICAL: 0, MAJOR: 0, MINOR: 0, WARNING: 0 };\n\nexport const DEFAULT_SEVERITY_VALUES: SeverityFilter = {\n [Severity.CRITICAL]: true,\n [Severity.MAJOR]: true,\n [Severity.MINOR]: true,\n [Severity.WARNING]: true\n};\n\nexport const DEFAULT_STATUS_VALUES: AlarmStatusSettings = {\n [AlarmStatus.ACTIVE]: true,\n [AlarmStatus.ACKNOWLEDGED]: true,\n [AlarmStatus.CLEARED]: true\n};\n\nexport const ALARMS_PATH = 'alarms';\n\nexport type CustomFragment = {\n [key: string]: unknown;\n};\n\n/**\n * Default properties of a alarm. Used to extract the custom properties from a Alarm object.\n */\nexport const ALARM_DEFAULT_PROPERTIES = [\n 'severity',\n 'source',\n 'type',\n 'time',\n 'text',\n 'id',\n 'status',\n 'count',\n 'name',\n 'history',\n 'self',\n 'creationTime',\n 'firstOccurrenceTime',\n 'lastUpdated'\n] as const satisfies ReadonlyArray<keyof IAlarm>;\n\nexport const THROTTLE_REALTIME_REFRESH = 1_000;\n\n/**\n * Represents the navigation options for an alarm component.\n */\nexport type AlarmNavigationOptions = {\n /**\n * Defines if the alarm should navigate to a detail view when clicked.\n */\n allowNavigationToAlarmsView: boolean;\n /**\n * Defines if the component should try to determine the context to navigate\n * to the correct alarm detail view or not. If set to true, the component will\n * not try to determine the context and will always navigate to the all alarms view.\n */\n alwaysNavigateToAllAlarms: boolean;\n /**\n * Defines if the cleared query parameter should be included in the navigation if\n * the alarm is cleared.\n */\n includeClearedQueryParams: boolean;\n /**\n * Determines how query parameters should be handled during navigation.\n * This property can be set to one of three values:\n *\n * - `\"merge\"` : Merge new parameters with current parameters.\n * - `\"preserve\"` : Preserve current parameters.\n * - `\"\"` : Replace current parameters with new parameters. This is the default behavior.\n */\n queryParamsHandling: QueryParamsHandling;\n};\n\nexport interface AlarmDetailsButton {\n additionalButtonClasses?: string;\n title: string;\n icon: SupportedIcons;\n additionalIconClasses?: string;\n label?: string;\n disabled?: boolean;\n /**\n * Action to be executed when the button is clicked.\n * @param alarm The alarm to apply this action to\n * @returns A boolean or a promise that resolves to a boolean or to the updated alarm. If the result is true, a reload will be triggered. If the result is an alarm, the alarm will be updated with the new values.\n */\n action: (alarm: IAlarm) => boolean | Promise<boolean | IAlarm>;\n priority?: number;\n}\n\nexport interface AlarmListIndicatorBase {\n priority?: number;\n}\n\nexport interface AlarmListIndicatorIcon extends AlarmListIndicatorBase {\n icon: SupportedIcons;\n title: string;\n class?: string;\n}\n\nexport type AlarmListIndicator = AlarmListIndicatorIcon;\n\nexport const PRODUCT_EXPERIENCE_ALARMS = {\n EVENTS: {\n ALARMS: 'Alarms'\n },\n COMPONENTS: {\n ALARMS_FILTER: 'alarms-filter',\n ALARMS_INTERVAL_REFRESH: 'alarms-interval-refresh',\n ALARMS: 'alarms',\n ALARMS_TYPE_FILTER: 'alarms-type-filter',\n ALARM_DETAILS: 'alarm-details'\n },\n ACTIONS: {\n APPLY_FILTER: 'applyFilter',\n REMOVE_CHIP_FILTER: 'removeChipFilter',\n APPLY_TYPE_FILTER: 'applyTypeFilter',\n CREATE_SMART_RULE: 'createSmartRule',\n ACKNOWLEDGE_ALARM: 'acknowledgeAlarm',\n REACTIVATE_ALARM: 'reactivateAlarm',\n CLEAR_ALARM: 'clearAlarm',\n RELOAD_AUDIT_LOGS: 'reloadAuditLogs',\n USER_SPEND_TIME_ON_COMPONENT: 'userSpendTimeOnComponent'\n }\n} as const;\n\nexport type ReloadAlarmsListType = 'gainsightTypeFilters' | null;\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace CumulocityServiceRegistry {\n interface SpecificExtensionKeys {\n alarmDetailsButton: AlarmDetailsButtonProvider;\n alarmListIndicator: AlarmListIndicatorProvider;\n }\n\n interface AlarmDetailsButtonProvider {\n /**\n * Determines whether the button should be shown for a given alarm.\n * @param alarm The alarm for which to determine button visibility.\n * @param source The managed object associated with the alarm.\n * @returns The button details or false.\n */\n getAlarmDetailsButton$(\n alarm: IAlarm,\n source: IManagedObject\n ): Observable<AlarmDetailsButton | false>;\n }\n\n interface AlarmListIndicatorProvider {\n /**\n * Determines whether the indicator should be shown for a given alarm.\n * @param alarm The alarm for which to determine indicator visibility.\n * @returns The indicator details or false.\n */\n getAlarmListIndicator$(alarm: IAlarm): Observable<AlarmListIndicator | false>;\n }\n }\n}\n","/**\n * This service is a duplicate of smart-rules-service with slight name change.\n * Duplicating allows to pass 'Verify App tutorial' job.\n * Name renames allows to pass 'Reusable build codex' job.\n * Overall this service is considered as a workaround.\n * In ticket MTM-58985 we will investigate if it's possible to remove this service\n * along with making failing jobs pass.\n */\nexport abstract class Ng1SmartRulesUpgradeService {\n abstract permissionsCfgs;\n abstract addNewForOutputOperationWithUI(operation);\n abstract addNewForInputAlarmAndOutputUserWithUI(alarm, user);\n}\n\nexport function SmartRulesUpgradeServiceFactory(injector: any) {\n return injector.get('smartRulesSvc');\n}\n\nexport const smartRulesUpgradeServiceProvider = {\n provide: Ng1SmartRulesUpgradeService,\n useFactory: SmartRulesUpgradeServiceFactory,\n deps: ['$injector']\n};\n","import { Injectable } from '@angular/core';\nimport { ActivatedRoute, ActivatedRouteSnapshot, Router } from '@angular/router';\nimport {\n ALARM_STATUS_LABELS,\n AlarmQueryFilter,\n AlarmService,\n AlarmStatus,\n AlarmStatusType,\n IAlarm,\n IResultList,\n Severity,\n SeverityFilter,\n SeverityType\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ApplicationOptions,\n ContextData,\n ContextRouteService,\n DateTimeContext,\n OptionsService,\n ViewContext\n} from '@c8y/ngx-components';\nimport { DateTimeContextPickerService, TimeInterval } from '@c8y/ngx-components/global-context';\nimport { AlarmFilterInterval } from '@c8y/ngx-components/interval-picker';\nimport { Observable, Subject } from 'rxjs';\nimport { ALARMS_PATH, ReloadAlarmsListType } from './alarms.model';\n\n/**\n * Service for managing and retrieving alarms data within the alarms view.\n *\n * The `AlarmsViewService` provides functionality to interact with alarms,\n * including filtering, counting, and translation-related operations in an alarms view.\n *\n * This service relies on the `AlarmService` for fetching alarm data and the `OptionsService`\n * for configuring alarms view options.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AlarmsViewService {\n readonly ALARM_REFRESH_TYPE_KEY: keyof ApplicationOptions = 'alarmsRefreshType';\n readonly DEFAULT_INTERVAL_VALUE = 30_000;\n readonly DEFAULT_REFRESH_OPTION_VALUE = 'interval';\n readonly DEFAULT_INTERVAL_VALUES = [5_000, 10_000, 15_000, 30_000, 60_000];\n readonly REALTIME_UPDATE_ALARMS_MESSAGE = gettext('The list was updated, click to refresh.');\n\n isIntervalEnabled$: Observable<boolean>;\n reloadAlarmsList$ = new Subject<ReloadAlarmsListType>();\n closeDetailsView$ = new Subject<void>();\n\n private _isIntervalEnabled: Subject<boolean>;\n\n constructor(\n private alarmService: AlarmService,\n private optionsService: OptionsService,\n private dateTimeContextPickerService: DateTimeContextPickerService,\n private router: Router,\n private contextRouteService: ContextRouteService\n ) {\n if (this.isIntervalRefresh()) {\n this._isIntervalEnabled = new Subject<boolean>();\n this.isIntervalEnabled$ = this._isIntervalEnabled.asObservable();\n }\n }\n\n /**\n * Emits a subject to initialize the alarms reloading.\n */\n updateAlarmList(value: ReloadAlarmsListType = null): void {\n this.reloadAlarmsList$.next(value);\n }\n\n /**\n * Retrieves a list of alarms filtered by specified severities and other optional query filters.\n *\n * @param severities an array of severities to filter the alarms.\n * @param showCleared flag indicating whether to show cleared alarms. Defaults to false.\n * @param selectedDates an array of two dates to filter alarms by creation and last update dates.\n * @param filter additional query filters for retrieving alarms.\n *\n * @returns A promise that resolves to a list of alarms satisfying the specified filters.\n */\n retrieveFilteredAlarms(\n severities: SeverityType[],\n showCleared = false,\n selectedDates?: [Date, Date],\n filter?: AlarmQueryFilter\n ): Promise<IResultList<IAlarm>> {\n const severitiesQuery = this.getSeverityQueryParameter(severities);\n const statusesQuery = this.getStatusQueryParameter(showCleared);\n\n const _filter: AlarmQueryFilter = {\n pageSize: 50,\n withTotalPages: true,\n ...(severitiesQuery && { severity: severitiesQuery }),\n ...(statusesQuery && { status: statusesQuery }),\n ...(selectedDates && {\n lastUpdatedFrom: selectedDates[0].toISOString(),\n createdTo: selectedDates[1].toISOString()\n }),\n ...filter\n };\n return this.alarmService.list(_filter);\n }\n\n retrieveAlarmsByDate(dates: DateTimeContext) {\n return this.alarmService.list({\n lastUpdatedFrom: dates[0].toISOString(),\n createdTo: dates[1].toISOString(),\n pageSize: 50,\n withTotalPages: true\n });\n }\n\n /**\n * Updates the state to enable or disable intervals.\n * @param value - A boolean value to indicate whether to enable intervals.\n */\n updateIntervalState(value: boolean): void {\n this._isIntervalEnabled?.next(value);\n }\n\n /**\n * Fetches the count of alarms filtered by severity and clearance status.\n *\n * @param severity - The severity level to filter by (e.g., CRITICAL, MAJOR, etc.).\n * @param showCleared - Whether or not to include cleared alarms in the count.\n * @param filter - Additional filter criteria for alarms.\n *\n * @returns A promise that resolves to the number of alarms that match the filter criteria.\n *\n */\n async getAlarmsCountBySeverity(\n severity: SeverityType,\n showCleared: boolean,\n filter?: AlarmQueryFilter\n ): Promise<number> {\n const statusesQuery = this.getStatusQueryParameter(showCleared);\n const _filter: AlarmQueryFilter = {\n ...(severity && { severity: severity }),\n ...(statusesQuery && { status: statusesQuery }),\n ...filter\n };\n const { data } = await this.alarmService.count(_filter);\n\n return data;\n }\n\n /**\n * Retrieves the current alarms refresh type from the OptionsService\n * and determines whether it is set to \"interval\".\n *\n * @returns `true` if the alarms refresh type is \"interval,\" otherwise `false`.\n */\n isIntervalRefresh(): boolean {\n const value = this.optionsService.get(this.ALARM_REFRESH_TYPE_KEY, 'interval');\n return value === 'interval';\n }\n\n /**\n * Updates the list of selected severities based on the new severity filter.\n *\n * @param severityUpdates - The object representing the updates to each severity.\n *\n * @returns An array representing the updated selected severities.\n */\n updateSelectedSeverities(severityUpdates: SeverityFilter): SeverityType[] {\n return (Object.keys(severityUpdates) as SeverityType[])\n .filter(key => severityUpdates[key])\n .map(key => key.toUpperCase() as SeverityType);\n }\n\n /**\n * Clears all active alarms of the selected severities.\n *\n * This method clears all active alarms for the given list of severities by making bulk update calls. If no severities are selected, it defaults to using all available severities.\n * It works by sending a series of update requests for each severity and returns a Promise that resolves with an object indicating if all alarms were resolved immediately.\n *\n * @param selectedSeverities An array of severities to be cleared. If not provided, all severities will be cleared.\n * @param sourceId - Identifier for the source associated with the alarms to be cleared.\n *\n * @returns A Promise that resolves with an object with a flag `resolvedImmediately`. The flag is true if all alarms for all selected severities were cleared successfully; otherwise false.\n *\n * **Example**\n * ```typescript\n * const severitiesToClear: SeverityType[] = [Severity.MAJOR, Severity.MINOR];\n *\n * clearAllActiveAlarms(severitiesToClear).then(({ resolvedImmediately }) => {\n * if (resolvedImmediately) {\n * console.log('All selected alarms were cleared successfully.');\n * } else {\n * console.log('Some alarms could not be cleared.');\n * }\n * });\n * ```\n *\n * **Note**\n * - The method uses the `alarmService.updateBulk` for each severity to clear the active alarms.\n * - It may fetch the `sourceId` based on the view (if applicable) and include it as a query parameter in the update calls.\n * - The method returns immediately but the returned Promise needs to have a `then` or `catch` method call to handle the result or error respectively.\n * - Uses `Promise.all` to wait for all update requests to complete before resolving the final result.\n */\n async clearAllActiveAlarms(\n selectedSeverities: SeverityType[],\n sourceId: string | number\n ): Promise<{ resolvedImmediately: boolean }> {\n const severitiesToUpdate = selectedSeverities || Severity;\n\n const promises = Object.values(severitiesToUpdate).map((severity: SeverityType) => {\n const commonParams = { resolved: false, severity };\n\n const parameters = sourceId\n ? {\n ...commonParams,\n source: sourceId,\n withSourceAssets: true,\n withSourceDevices: true\n }\n : commonParams;\n\n return this.alarmService.updateBulk({ status: AlarmStatus.CLEARED }, parameters);\n });\n\n const responses = await Promise.all(promises);\n return {\n resolvedImmediately: responses.every(res => res)\n };\n }\n\n /**\n * Returns the correct link based on the provided context data.\n * @param contextData The context the navigation was triggered from.\n * @param alarm The alarm to navigate to.\n * @returns A link to be used as an url navigation.\n */\n getRouterLink(contextData?: ContextData, alarm?: IAlarm): string {\n let detailUrl = `/${ALARMS_PATH}`;\n if (alarm) {\n detailUrl = `/${ALARMS_PATH}/${alarm.id}`;\n }\n if (!contextData) {\n return detailUrl;\n }\n\n switch (contextData.context) {\n case ViewContext.Device:\n return `/device/${contextData.contextData.id}${detailUrl}`;\n case ViewContext.Group:\n return `/group/${contextData.contextData.id}${detailUrl}`;\n case ViewContext.Simulators:\n return `/simulators/${contextData.contextData.id}${detailUrl}`;\n default:\n return detailUrl;\n }\n }\n\n /**\n * Returns the correct array navigation.\n * @param contextData The context the navigation was triggered from.\n * @param alarm The alarm to navigate to.\n * @returns A link to be used as a router.navigation.\n */\n getRouterNavigationArray(contextData?: ContextData, alarm?: IAlarm): string[] {\n return this.getRouterLink(contextData, alarm).split('/').filter(Boolean);\n }\n\n /**\n * Closes the details view and navigates based on the current route context,\n * preserving existing query parameters.\n */\n async closeDetailsView(activatedRoute: ActivatedRoute | ActivatedRouteSnapshot): Promise<void> {\n const contextData = this.contextRouteService.getContextData(activatedRoute);\n await this.router.navigate(this.getRouterNavigationArray(contextData), {\n queryParamsHandling: 'merge'\n });\n this.updateIntervalState(true);\n }\n\n /**\n * Returns the correct from and to dates based on the selected interval\n * @param intervalId the selected interval. E.g. 'none', 'hours', 'custom' ...\n * @returns The calculated date context based on the selected interval.\n */\n getDateTimeContextByInterval(intervalId: AlarmFilterInterval['id']): DateTimeContext {\n return this.dateTimeContextPickerService.getDateTimeContextByInterval(\n intervalId as TimeInterval\n );\n }\n\n /**\n * Converts a given number of seconds into a formatted string representing hours, minutes, and seconds.\n *\n * @param totalSeconds - The total number of seconds to convert.\n * @returns A string in the format \"HH:MM:SS\", where HH is hours, MM is minutes, and SS is seconds.\n */\n convertSecondsToTime(totalSeconds: number): string {\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = Math.floor(totalSeconds % 60);\n\n const paddedHours = hours.toString().padStart(2, '0');\n const paddedMinutes = minutes.toString().padStart(2, '0');\n const paddedSeconds = seconds.toString().padStart(2, '0');\n\n return `${paddedHours}:${paddedMinutes}:${paddedSeconds}`;\n }\n\n /**\n * Creates a value for query parameter for filtering alarms by severity based on array of selected severities.\n *\n * @param severities - An array of alarm severity types to include in the filter.\n * If the array is empty or undefined, no severity filter will be applied.\n *\n * @returns A comma-separated string of selected alarm severities,\n * or null if no severities are provided.\n */\n private getSeverityQueryParameter(severities: SeverityType[]): string | null {\n if (!severities || severities.length === 0) {\n return;\n }\n if (severities.length === Object.keys(Severity).length) {\n return;\n }\n\n return severities.join(',');\n }\n\n /**\n * Creates a value for query parameter for filtering alarms by statuses based on showCleared option.\n *\n * @param showCleared - A flag indicating whether to include cleared statuses.\n * If true, all statuses, including 'CLEARED', will be included; if false, 'CLEARED' will be excluded.\n *\n * @returns A comma-separated string of alarm statuses.\n */\n private getStatusQueryParameter(showCleared: boolean): string {\n const statuses = Object.keys(ALARM_STATUS_LABELS) as AlarmStatusType[];\n const filteredStatuses = showCleared\n ? statuses\n : statuses.filter(status => status !== 'CLEARED');\n return filteredStatuses.join(',');\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, fromEvent, Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\n\n@Injectable()\nexport class AlarmsActivityTrackerService implements OnDestroy {\n isUserActive$ = new BehaviorSubject(true);\n userSecondsSpendOnPage = 0;\n\n private gainsightTimerId: ReturnType<typeof setInterval>;\n private readonly INACTIVITY_THRESHOLD_SECONDS = 10;\n private readonly ONE_SECOND_IN_MILLISECONDS = 1_000;\n private gainsightInactivityTimeoutId: ReturnType<typeof setTimeout>;\n private destroy$ = new Subject<void>();\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n setGainsightInterval(): void {\n this.gainsightTimerId = setInterval(\n () => this.userSecondsSpendOnPage++,\n this.ONE_SECOND_IN_MILLISECONDS\n );\n }\n\n clearGainsightInterval(): void {\n clearInterval(this.gainsightTimerId);\n }\n\n resetInactivityTimer(): void {\n this.isUserActive$.next(true);\n clearTimeout(this.gainsightInactivityTimeoutId);\n this.gainsightInactivityTimeoutId = setTimeout(() => {\n this.isUserActive$.next(false); // Pause counting if the user is inactive\n }, this.INACTIVITY_THRESHOLD_SECONDS * this.ONE_SECOND_IN_MILLISECONDS);\n }\n\n setupEventListenersForGainsight() {\n const events = ['mousemove', 'keydown', 'click'];\n\n events.forEach(event => {\n fromEvent(window, event)\n .pipe(debounceTime(30), takeUntil(this.destroy$))\n .subscribe(() => this.resetInactivityTimer());\n });\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Severity, SeverityType } from '@c8y/client';\nimport { ALARM_SEVERITY_ICON_MAP, AlarmSeverityIcon, HELP_ICON } from './alarms.model';\n\n/**\n * Pipe for transforming alarm severity types into corresponding icons.\n *\n * @example\n * Usage in an Angular template:\n * {{ 'CRITICAL' | AlarmSeverityToIcon }}\n * Result: 'exclamation-circle'\n */\n@Pipe({\n name: 'AlarmSeverityToIcon',\n standalone: true\n})\nexport class AlarmSeverityToIconPipe implements PipeTransform {\n /**\n * Transforms an alarm severity type into a corresponding icon.\n *\n * @param alarmSeverity - The severity type of the alarm.\n * @returns The corresponding icon for the given alarm severity type.\n */\n transform(alarmSeverity: SeverityType): AlarmSeverityIcon | typeof HELP_ICON {\n const alarmSeverityMapped = Severity[alarmSeverity?.toUpperCase()];\n return ALARM_SEVERITY_ICON_MAP[alarmSeverityMapped] || HELP_ICON;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { AlarmIconMap, AlarmStatusIcon, HELP_ICON } from './alarms.model';\nimport { AlarmStatusType } from '@c8y/client';\n/**\n * Angular pipe for transforming alarm statuses into corresponding icons.\n *\n * @example\n * Usage in an Angular template:\n * {{ 'ACTIVE' | AlarmStatusToIcon }}\n * Result: 'bell'\n */\n@Pipe({ name: 'AlarmStatusToIcon' })\nexport class AlarmStatusToIconPipe implements PipeTransform {\n /**\n * Transforms an alarm status into a corresponding icon.\n *\n * @param alarmStatus - The status of the alarm.\n * @returns - The corresponding icon for the given alarm status.\n */\n transform(alarmStatus: AlarmStatusType): AlarmStatusIcon | typeof HELP_ICON {\n return AlarmIconMap[alarmStatus?.toUpperCase()] || HELP_ICON;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { IAuditRecord } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TranslateService } from '@ngx-translate/core';\n\n/**\n * A pipe for transforming audit record data into localized messages.\n * It specifically addresses changes in the audit records, with an emphasis on status changes.\n */\n@Pipe({ name: 'auditChangesMessage' })\nexport class AuditChangesMessagePipe implements PipeTransform {\n constructor(private translateService: TranslateService) {}\n\n /**\n * Transforms an IAuditRecord into a localized string message.\n * If the record contains changes, and if the first change is related to the 'status' attribute,\n * it formats a message indicating the status change. Otherwise, it returns a general activity message.\n * Example when there is a status change: \"Alarm status changed from ACKNOWLEDGED to ACTIVE\".\n * Example when record does not have a status attribute: \"Alarm updated\".\n *\n * @param record - The audit record to be transformed.\n * @returns The localized message describing the audit record,\n * particularly focusing on status changes if applicable.\n */\n transform(record: IAuditRecord): string {\n const firstItem = !!record.changes && Array.from(record.changes)[0];\n if (!firstItem || firstItem.attribute !== 'status') {\n const activityString = gettext(record.activity);\n return this.translateService.instant(activityString);\n }\n\n const { newValue, previousValue } = firstItem;\n\n const message = gettext(`Alarm status changed from {{ previousValue }} to {{ newValue }}`);\n\n return this.translateService.instant(message, {\n previousValue: this.translateService.instant(previousValue),\n newValue: this.translateService.instant(newValue)\n });\n }\n}\n","import {\n Component,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n SimpleChanges\n} from '@angular/core';\nimport {\n ALARM_STATUS_LABELS,\n AlarmStatus,\n AlarmService,\n AlarmStatusType,\n AuditService,\n IAlarm,\n IApplication,\n IAuditRecord,\n IManagedObject,\n IResultList,\n InventoryService,\n SEVERITY_LABELS\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n AppStateService,\n ColorService,\n RelativeTimePipe,\n SupportedAppKey,\n InterAppService,\n SupportedApps,\n GainsightService,\n DatePipe,\n IconDirective,\n ProductExperienceDirective,\n EmptyStateComponent,\n LoadingComponent,\n ListGroupComponent,\n ForOfDirective,\n ListItemTimelineComponent,\n ListItemComponent,\n ListItemBodyComponent,\n C8yTranslatePipe,\n HumanizeAppNamePipe,\n AssetLinkPipe\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { cloneDeep } from 'lodash-es';\nimport { AlarmDetailsService } from './alarm-details.service';\nimport {\n ALARM_DEFAULT_PROPERTIES,\n ALARM_STATUS_ICON,\n AlarmDetailsButton,\n CustomFragment,\n PRODUCT_EXPERIENCE_ALARMS\n} from './alarms.model';\nimport { Ng1SmartRulesUpgradeService } from './ng1-smart-rules-upgrade.service';\nimport { AlarmsViewService } from './alarms-view.service';\nimport { firstValueFrom, Observable, Subject } from 'rxjs';\nimport { distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { AlarmsActivityTrackerService } from './alarms-activity-tracker.service';\nimport { NgClass, NgIf, NgStyle, NgFor, AsyncPipe, LowerCasePipe, JsonPipe } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { AlarmDetailsButtonPipe } from './alarm-details-custom-button/alarm-details-button.pipe';\nimport { AlarmSeverityToIconPipe } from './alarm-severity-to-icon.pipe';\nimport { AlarmStatusToIconPipe } from './alarm-status-to-icon.pipe';\nimport { AuditChangesMessagePipe } from './audit-changes-message.pipe';\n\n@Component({\n selector: 'c8y-alarm-details',\n templateUrl: './alarm-details.component.html',\n providers: [AlarmsActivityTrackerService],\n imports: [\n IconDirective,\n NgClass,\n RouterLink,\n NgIf,\n NgStyle,\n PopoverDirective,\n ProductExperienceDirective,\n NgFor,\n EmptyStateComponent,\n LoadingComponent,\n ListGroupComponent,\n ForOfDirective,\n ListItemTimelineComponent,\n ListItemComponent,\n ListItemBodyComponent,\n C8yTranslatePipe,\n AsyncPipe,\n LowerCasePipe,\n JsonPipe,\n DatePipe,\n HumanizeAppNamePipe,\n AssetLinkPipe,\n AlarmDetailsButtonPipe,\n AlarmSeverityToIconPipe,\n AlarmStatusToIconPipe,\n AuditChangesMessagePipe\n ]\n})\nexport class AlarmDetailsComponent implements OnInit, OnChanges, OnDestroy {\n @Input() selectedAlarm: IAlarm;\n\n readonly ACKNOWLEDGED_STATUS_VALUE = AlarmStatus.ACKNOWLEDGED;\n readonly ACTIVE_STATUS_VALUE = AlarmStatus.ACTIVE;\n readonly CLEARED_STATUS_VALUE = AlarmStatus.CLEARED;\n readonly ACKNOWLEDGE_LABEL = gettext('Acknowledge');\n readonly REACTIVATE_LABEL = gettext('Reactivate');\n readonly SEVERITY_LABELS = SEVERITY_LABELS;\n readonly BELL_SLASH_ICON = ALARM_STATUS_ICON.BELL_SLASH;\n readonly BELL_ICON = ALARM_STATUS_ICON.BELL;\n readonly PRODUCT_EXPERIENCE_ALARMS = PRODUCT_EXPERIENCE_ALARMS;\n\n /**\n * Represents a Device Management application used by the user.\n * Determines the accurate name and context path required for navigating to alarms of the current device\n */\n userDeviceManagementApp$: Observable<IApplication>;\n /**\n * Manages the visibility of the navigation link.\n * If set to true, the link is visible, otherwise, it remains hidden.\n */\n showSourceNavigationLink$: Observable<boolean>;\n deviceManagementAppKey: SupportedAppKey = SupportedApps.devicemanagement;\n readonly linkTitle = gettext('Open in {{ appName }}');\n /**\n * Contains audit logs, including the very first audit log record in the alarms' history.\n * This ensures that the historical starting point of the audit logs is always included in the data set.\n * Usually it's an 'Alarm created' audit log.\n *\n * Only used when audit logs exceed PAGE_SIZE.\n *\n * @private\n */\n private extendedAuditLogs: IResultList<IAuditRecord>;\n private readonly PAGE_SIZE = 100;\n\n /**\n * Prevents the pipeline from failing for a tutorial application\n * because it's a pure Angular application and doesn't support any\n * AngularJS services.\n */\n isCreateSmartRulesButtonAvailable: boolean;\n /**\n * Property contains a 100 (see PAGE_SIZE) of most recent audit logs records.\n */\n auditLog: IResultList<IAuditRecord>;\n\n isLoading: boolean;\n /**\n * Indicates when alarms status change was started (Acknowledge/Reactivate)\n */\n isAlarmStatusChanging = false;\n /**\n * Represents a value for a 'Status' section in details.\n */\n statusMessage: string;\n /**\n * The color of the alarm type.\n */\n typeColor: string;\n /**\n * Custom fragments of the selected alarm. If none exist, null is returned.\n */\n customFragments: CustomFragment = null;\n\n selectedAlarmMO: IManagedObject;\n\n private readonly USER_MINIMUM_SPEND_TIME_SECONDS_TO_TRIGGER_EVENT = 1;\n\n private destroy$ = new Subject<void>();\n constructor(\n private alarmDetailsService: AlarmDetailsService,\n private alarmService: AlarmService,\n private alertService: AlertService,\n private appState: AppStateService,\n private auditService: AuditService,\n private relativeTime: RelativeTimePipe,\n @Optional() private ng1SmartRulesUpgradeService: Ng1SmartRulesUpgradeService,\n private translateService: TranslateService,\n private inventoryService: InventoryService,\n private alarmsViewService: AlarmsViewService,\n private colorService: ColorService,\n private interAppService: InterAppService,\n private gainsightService: GainsightService,\n private alarmsActivityTrackerService: AlarmsActivityTrackerService\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.alarmsActivityTrackerService.setupEventListenersForGainsight();\n this.alarmsActivityTrackerService.resetInactivityTimer();\n\n this.alarmsActivityTrackerService.isUserActive$\n .pipe(distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe(isActive =>\n isActive\n ? this.alarmsActivityTrackerService.setGainsightInterval()\n : this.alarmsActivityTrackerService.clearGainsightInterval()\n );\n\n const isSmartRulesServiceSubscribed = !!(await firstValueFrom(\n this.interAppService.getApp$(SupportedApps.smartrules)\n ));\n const hasAnyRoleAllowingToCreateSmartRule =\n this.alarmDetailsService.checkIfHasAnyRoleAllowingToCreateSmartRule();\n this.isCreateSmartRulesButtonAvailable =\n !!this.ng1SmartRulesUpgradeService &&\n isSmartRulesServiceSubscribed &&\n hasAnyRoleAllowingToCreateSmartRule;\n this.userDeviceManagementApp$ = this.interAppService.getApp$(this.deviceManagementAppKey);\n this.showSourceNavigationLink$ = this.interAppService.shouldShowAppLink$(\n this.deviceManagementAppKey\n );\n this.typeColor = await this.colorService.generateColor(this.selectedAlarm.type);\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes.selectedAlarm && changes.selectedAlarm.currentValue) {\n await this.reloadAuditLog(true, true);\n await this.updateStatusMessage();\n const { data } = await this.inventoryService.detail(this.selectedAlarm.source.id);\n this.selectedAlarmMO = data;\n this.customFragments = this.getCustomFragments(this.selectedAlarm);\n }\n }\n\n ngOnDestroy(): void {\n if (\n this.alarmsActivityTrackerService.userSecondsSpendOnPage >=\n this.USER_MINIMUM_SPEND_TIME_SECONDS_TO_TRIGGER_EVENT\n ) {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS, {\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARM_DETAILS,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.USER_SPEND_TIME_ON_COMPONENT,\n userSpendTime: this.alarmsViewService.convertSecondsToTime(\n this.alarmsActivityTrackerService.userSecondsSpendOnPage\n )\n });\n }\n this.alarmsActivityTrackerService.clearGainsightInterval();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n @HostListener('document:visibilitychange')\n visibilityChange() {\n if (document.hidden) {\n this.alarmsActivityTrackerService.clearGainsightInterval();\n return;\n }\n this.alarmsActivityTrackerService.setGainsightInterval();\n }\n\n createSmartRule(): void {\n if (!this.isCreateSmartRulesButtonAvailable) {\n return;\n }\n this.ng1SmartRulesUpgradeService.addNewForInputAlarmAndOutputUserWithUI(\n this.selectedAlarm,\n this.appState.currentUser.value\n );\n }\n\n /**\n * Navigates to a specific alarm source device based on the provided source.\n *\n * @param sourceId - The source id.\n */\n async goToAlarmSource(sourceId: string | number): Promise<void> {\n const { data } = await this.alarmService.detail(sourceId);\n await this.interAppService.navigateToApp(\n this.deviceManagementAppKey,\n `#/device/${data.source.id}/alarms`\n );\n }\n\n /**\n * Reloads audit log data asynchronously.\n *\n * This method fetches audit records using `getAlarmAuditRecords` and optionally updates the audit logs\n * state in the component based on the `isSetAuditLogs` flag. It handles the loading state and potential\n * errors during the fetch operation.\n *\n * @param isRevert - A boolean flag indicating whether to retrieve a 100 (see PAGE_SIZE) records (true)\n * or only record, that chronologically will be the oldest one (false). Defaults to true.\n * If set to false, it will set PAGE_SIZE to 1 and trigger a logic\n * concatenating a most recent record with the very first one to\n * calculate the alarm duration (change to CLEARED status).\n * It's passed to the `getAlarmAuditRecords` method.\n * @param isSetAuditLogs - A boolean flag to determine if the fetched audit logs should be set in the component state. Defaults to `false`.\n * @returns A promise that resolves to a list of `IAuditRecord` objects.\n */\n async reloadAuditLog(\n isRevert = true,\n isSetAuditLogs = false\n ): Promise<IResultList<IAuditRecord>> {\n try {\n this.isLoading = true;\n const auditLogs = await this.getAlarmAuditRecords(isRevert);\n\n if (isSetAuditLogs) {\n this.setAuditLogs(auditLogs);\n }\n\n return auditLogs;\n } catch (error) {\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading = false;\n }\n }\n\n async onUpdateDetails(status: AlarmStatusType): Promise<void> {\n try {\n this.isAlarmStatusChanging = true;\n await this.updateAlarmStatus(status);\n await this.reloadAuditLog(true, true);\n await this.updateStatusMessage();\n this.updateLastUpdatedDate(this.auditLog.data[0]);\n if (status === AlarmStatus.CLEARED) {\n this.alarmsViewService.closeDetailsView$.next();\n }\n } catch (error) {\n this.alertService.addServerFailure(error);\n } finally {\n this.isAlarmStatusChanging = false;\n }\n }\n\n async detailsButtonAction(button: AlarmDetailsButton, alarm: IAlarm): Promise<void> {\n const result = button.action(alarm);\n let shouldReload: boolean | IAlarm = false;\n if (result instanceof Promise) {\n shouldReload = await result;\n } else {\n shouldReload = result;\n }\n\n if (shouldReload) {\n let alarm: IAlarm;\n if (shouldReload === true) {\n const { data: updatedAlarm } = await this.alarmService.detail(this.selectedAlarm.id);\n alarm = updatedAlarm;\n } else {\n alarm = shouldReload;\n }\n this.alarmsViewService.updateAlarmList();\n\n const previousValue = this.selectedAlarm;\n this.selectedAlarm = alarm;\n this.ngOnChanges({\n selectedAlarm: {\n currentValue: alarm,\n previousValue,\n firstChange: false,\n isFirstChange: () => false\n }\n });\n }\n }\n\n private async updateAlarmStatus(status: AlarmStatusType): Promise<void> {\n const partiallyUpdatedAlarm: Partial<IAlarm> = { id: this.selectedAlarm.id, status };\n await this.alarmService.update(partiallyUpdatedAlarm);\n const translatedStatusLabel = this.translateService.instant(ALARM_STATUS_LABELS[status]);\n this.alertService.success(\n this.translateService.instant(gettext('Alarm status changed to {{ status }}'), {\n status: translatedStatusLabel.toUpperCase()\n })\n );\n this.selectedAlarm.status = status;\n this.alarmsViewService.updateAlarmList();\n }\n\n /**\n * Retrieves the audit log and appends the last audit record to it.\n *\n * This method fetches the existing audit log data and makes a deep copy of it. It then\n * retrieves the last audit record and appends it to the copied audit log data. This is\n * useful for scenarios where the most recent audit record needs to be included in the\n * existing audit log data (calculating the CLEARED period).\n *\n * @returns A promise of `IResultList<IAuditRecord>`, which includes the\n * existing audit log data along with the last audit record appended.\n * @private\n */\n private async auditLogWithFirstRecord(): Promise<IResultList<IAuditRecord>> {\n const existingData = this.auditLog;\n const copiedExistingData = cloneDeep(existingData);\n\n const lastAuditRecord = await this.reloadAuditLog(false);\n const lastRecord = lastAuditRecord.data[lastAuditRecord.data.length - 1];\n copiedExistingData.data.push(lastRecord);\n return copiedExistingData;\n }\n\n private setAuditLogs(auditLogs: IResultList<IAuditRecord>): void {\n this.auditLog = auditLogs;\n }\n\n private updateLastUpdatedDate(updatedAuditRecords: IAuditRecord): void {\n if (!updatedAuditRecords) {\n return;\n }\n\n const { creationTime } = updatedAuditRecords;\n this.selectedAlarm.lastUpdated = creationTime;\n }\n\n private getActiveStatusMessage(time: string): string {\n return this.translateService.instant(gettext('ACTIVE`alarm`: triggered {{alarmTimeFromNow}}'), {\n alarmTimeFromNow: this.relativeTime.transform(new Date(time))\n });\n }\n\n private getAcknowledgedStatusMessage(status: AlarmStatusType, changeLog: IAuditRecord[]): string {\n if (changeLog.length === 0) {\n return this.translateService.instant(gettext('ACKNOWLEDGED`alarm`'));\n }\n\n const acknowledgedBy = this.alarmDetailsService.getAcknowledgedBy(status, changeLog);\n const acknowledgeTime = this.alarmDetailsService.getAcknowledgeTime(changeLog);\n\n if (acknowledgedBy) {\n return this.translateService.instant(\n gettext('ACKNOWLEDGED`alarm` by: {{ackBy}} {{ackTimeFromNow}}'),\n {\n ackBy: acknowledgedBy,\n ackTimeFromNow: this.relativeTime.transform(new Date(acknowledgeTime))\n }\n );\n }\n\n return this.translateService.instant(gettext('ACKNOWLEDGED`alarm` {{ackTimeFromNow}}'), {\n ackTimeFromNow: this.relativeTime.transform(new Date(acknowledgeTime))\n });\n }\n\n private getClearedStatusMessage(auditLog: IAuditRecord[]): string {\n if (auditLog.length === 0) {\n return this.translateService.instant(gettext('CLEARED`alarm`'));\n }\n\n const differenceInMs = this.calculateAlarmDuration(auditLog);\n\n return this.translateService.instant(\n gettext('CLEARED`alarm`: was active for {{alarmDuration}}'),\n {\n alarmDuration: this.relativeTime.transform(differenceInMs, true)\n }\n );\n }\n\n /**\n * Calculates the duration of an alarm based on audit log records.\n *\n * This method computes the duration of an alarm by finding the difference\n * between the start and end times of the alarm. The start time is determined\n * from the last record in the audit log, using the first available time field\n * (`firstOccurrenceTime`, `time`, or `creationTime`). The end time is obtained\n * from the `alarmDetailsService`.\n *\n * @param auditLog - An array of `IAuditRecord` objects representing the audit log records.\n * @returns The duration of the alarm in milliseconds, or `null` if the end time is not available.\n * @private\n */\n private calculateAlarmDuration(auditLog: IAuditRecord[]): number | null {\n const firstAlarm = auditLog[auditLog.length - 1];\n const startTime = firstAlarm.firstOccurrenceTime || firstAlarm.time || firstAlarm.creationTime;\n const endTime = this.alarmDetailsService.getEndTime(auditLog);\n\n if (!endTime) {\n return null;\n }\n\n const startTimeToDate = new Date(startTime);\n const endTimeToDate = new Date(endTime);\n\n return endTimeToDate.getTime() - startTimeToDate.getTime();\n }\n\n /**\n * Retrieves a list of audit records for a selected alarm.\n *\n * This method fetches audit records based on the specified properties, including\n * the date, page size, whether to revert, the source alarm ID, and whether to include total pages.\n *\n * @param isRevert - A boolean flag indicating whether to retrieve a 100 (see PAGE_SIZE) records (true)\n * or only record, that chronologically will be the oldest one (false). Defaults to true.\n * If set to false, it will set PAGE_SIZE to 1 and trigger a logic\n * concatenating a most recent record with the very first one to\n * calculate the alarm duration (change to CLEARED status).\n * @returns A Promise that resolves to an IResultList of IAuditRecord objects, representing the audit records.\n * @async\n * @private\n */\n private async getAlarmAuditRecords(isRevert = true): Promise<IResultList<IAuditRecord>> {\n const properties = {\n dateTo: new Date(Date.now()).toISOString(),\n pageSize: isRevert ? this.PAGE_SIZE : 1,\n revert: isRevert,\n source: this.selectedAlarm.id,\n withTotalPages: true\n };\n\n return await this.auditService.list(properties);\n }\n\n private async updateStatusMessage(): Promise<void> {\n switch (this.selectedAlarm.status) {\n case this.ACTIVE_STATUS_VALUE:\n this.statusMessage = this.getActiveStatusMessage(this.selectedAlarm.time);\n break;\n case this.ACKNOWLEDGED_STATUS_VALUE:\n this.statusMessage = this.getAcknowledgedStatusMessage(\n this.selectedAlarm.status as unknown as AlarmStatusType,\n this.auditLog.data\n );\n break;\n case this.CLEARED_STATUS_VALUE:\n if (this.hasReachedOrExceededPageSizeLimit()) {\n this.extendedAuditLogs = await this.auditLogWithFirstRecord();\n this.statusMessage = this.getClearedStatusMessage(this.extendedAuditLogs.data);\n return;\n }\n this.statusMessage = this.getClearedStatusMessage(this.auditLog.data);\n break;\n }\n }\n\n private hasReachedOrExceededPageSizeLimit(): boolean {\n return this.auditLog.data.length >= this.PAGE_SIZE;\n }\n\n private getCustomFragments(selectedAlarm: IAlarm): CustomFragment {\n let customProperties = null;\n for (const key in selectedAlarm) {\n if (!ALARM_DEFAULT_PROPERTIES.find(k => k === key)) {\n if (!customProperties) {\n customProperties = {};\n }\n customProperties[key] = selectedAlarm[key];\n }\n }\n\n return customProperties;\n }\n}\n","<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\n class=\"border-all fit-w d-flex\"\n data-cy=\"c8y-alarm-details--status-section-wrapper\"\n >\n <div\n class=\"p-8\"\n data-cy=\"c8y-alarm-details--status-icon\"\n >\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\n class=\"border-all fit-w d-flex\"\n data-cy=\"c8y-alarm-details--severity-section-wrapper\"\n >\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\n class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n data-cy=\"c8y-alarm-details--source-wrapper\"\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 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\n : { 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\n class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n data-cy=\"c8y-alarm-details--severity-type-wrapper\"\n >\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 data-cy=\"c8y-alarm-details--last-updated-icon\"\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\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n data-cy=\"c8y-alarm-details--number-of-occurrences-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span\n class=\"badge badge-info\"\n data-cy=\"c8y-alarm-details--badge\"\n >\n {{ selectedAlarm.count }}\n </span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n data-cy=\"c8y-alarm-details--first-occurrence-wrapper\"\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\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was created. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n data-cy=\"c8y-alarm-details--last-updated-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.lastUpdated | c8yDate: 'medium' }}\n\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was last updated. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\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 data-cy=\"c8y-alarm-details--custom-fragments-wrapper\"\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 data-cy=\"c8y-alarms-details--reload-audit-logs\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARM_DETAILS,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.RELOAD_AUDIT_LOGS\n }\"\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 c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARM_DETAILS,\n action:\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? PRODUCT_EXPERIENCE_ALARMS.ACTIONS.ACKNOWLEDGE_ALARM\n : PRODUCT_EXPERIENCE_ALARMS.ACTIONS.REACTIVATE_ALARM\n }\"\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 c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARM_DETAILS,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.CREATE_SMART_RULE\n }\"\n data-cy=\"c8y-alarms-details--create-smart-rule\"\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 data-cy=\"c8y-alarm-details--clear-alarm\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARM_DETAILS,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.CLEAR_ALARM\n }\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"button.title | translate\"\n type=\"button\"\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n [ngClass]=\"button.additionalButtonClasses\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i\n [c8yIcon]=\"button.icon\"\n [ngClass]=\"button.additionalIconClasses\"\n ></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 | c8yDate: 'mediumDate' }}\n {{ log.creationTime | c8yDate: '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","import { Component } from '@angular/core';\nimport { EmptyStateComponent, C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-alarms-empty',\n templateUrl: './alarm-empty.component.html',\n imports: [EmptyStateComponent, C8yTranslatePipe]\n})\nexport class AlarmEmptyComponent {}\n","<div class=\"p-24 hidden-sm\" data-cy=\"c8y-alarms-empty\">\n <c8y-ui-empty-state\n [icon]=\"'alarm'\"\n [title]=\"'No alarm selected' | translate\"\n [subtitle]=\"'Select an alarm from the list to view its details.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IAlarm } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ContextRouteService,\n ViewContext,\n TitleComponent,\n IconDirective,\n TabsOutletComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { Observable, of } from 'rxjs';\nimport { AlarmsViewService } from './alarms-view.service';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { AlarmDetailsComponent } from './alarm-details.component';\n\n@Component({\n selector: 'c8y-alarm-info',\n templateUrl: './alarm-info.component.html',\n imports: [\n NgIf,\n TitleComponent,\n IconDirective,\n TabsOutletComponent,\n AlarmDetailsComponent,\n C8yTranslatePipe,\n AsyncPipe\n ]\n})\nexport class AlarmInfoComponent implements OnInit {\n selectedAlarm$: Observable<IAlarm>;\n\n hasAnyRoleAllowingToCreateSmartRule: boolean;\n isContextRoute = false;\n readonly TITLE = gettext('Alarms');\n\n constructor(\n public activatedRoute: ActivatedRoute,\n private router: Router,\n private contextRouteService: ContextRouteService,\n private alarmsViewService: AlarmsViewService\n ) {}\n\n async ngOnInit() {\n const contextData = this.contextRouteService.getContextData(this.activatedRoute);\n this.selectedAlarm$ = of(contextData.contextData as IAlarm);\n this.isContextRoute = this.contextRouteService.isContextRoute(this.router.url, [\n ViewContext.Device,\n ViewContext.Group\n ]);\n }\n\n back(): void {\n this.alarmsViewService.closeDetailsView$.next();\n }\n}\n","<ng-container *ngIf=\"!isContextRoute\">\n <c8y-title>{{ TITLE | translate }}</c8y-title>\n</ng-container>\n\n<div\n class=\"inner-scroll split-view__detail split-view__detail--selected\"\n *ngIf=\"selectedAlarm$ | async\"\n>\n <div class=\"sticky-top bg-component\">\n <div class=\"card-header gap-16 d-block-xs d-block-sm p-l-24 p-r-24 p-t-16 separator\">\n <button\n class=\"btn btn-clean text-primary visible-sm visible-xs\"\n data-cy=\"c8y-alarms-info--back\"\n [title]=\"'Back' | translate\"\n (click)=\"back()\"\n >\n <i c8yIcon=\"chevron-left\"></i>\n <span>{{ 'Back' | translate }}</span>\n </button>\n\n <div class=\"flex-no-shrink a-s-start\"></div>\n <div class=\"flex-grow d-col\">\n <div\n class=\"text-break-word flex-grow text-16\"\n data-cy=\"c8y-alarms-info--title\"\n >\n {{ (selectedAlarm$ | async)?.text | translate }}\n </div>\n </div>\n </div>\n <div class=\"p-relative\">\n <c8y-tabs-outlet\n outletName=\"alarms\"\n orientation=\"horizontal\"\n ></c8y-tabs-outlet>\n </div>\n <div class=\"card-block overflow-visible p-l-24 p-r-24\">\n <c8y-alarm-details [selectedAlarm]=\"selectedAlarm$ | async\"></c8y-alarm-details>\n </div>\n </div>\n</div>\n","import { IAlarm } from '@c8y/client';\nimport { combineLatest, Observable } from 'rxjs';\nimport { filter, map, startWith, switchMap } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { PluginsResolveService, ServiceRegistry } from '@c8y/ngx-components';\nimport { AlarmListIndicator } from '../alarms.model';\nimport { sortBy } from 'lodash-es';\n\n@Injectable({ providedIn: 'root' })\n/**\n * A service to retrieve custom indicators for the alarm list view.\n */\nexport class AlarmListIndicatorService {\n constructor(\n private serviceRegistry: ServiceRegistry,\n private pluginsResolver: PluginsResolveService\n ) {}\n\n get$(alarm: IAlarm): Observable<AlarmListIndicator[]> {\n const providers$ = this.pluginsResolver.allPluginsLoaded$.pipe(\n filter(Boolean),\n map(() => {\n return this.serviceRegistry.get('alarmListIndicator');\n })\n );\n\n return providers$.pipe(\n switchMap(providers => {\n const observables$ = providers.map(provider =>\n provider.getAlarmListIndicator$(alarm).pipe(startWith(false))\n );\n return combineLatest(observables$);\n }),\n map(indicators => {\n return indicators.filter(Boolean) as AlarmListIndicator[];\n }),\n map(indicators => sortBy(indicators, this.byPriority))\n );\n }\n\n private byPriority(item: AlarmListIndicator) {\n if (item.priority === undefined) {\n return 0;\n }\n return -item.priority;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { IAlarm } from '@c8y/client';\nimport { Observable } from 'rxjs';\nimport { AlarmListIndicatorService } from './alarm-list-indicator.service';\nimport { AlarmListIndicator } from '../alarms.model';\n\n@Pipe({\n standalone: true,\n name: 'alarmListIndicator',\n pure: true\n})\n/**\n * A pipe to provide custom indicators for the alarm list view.\n *\n * Will call `get$()` method of `AlarmListIndicatorService` to get the custom indicators for the provided alarm.\n */\nexport class AlarmListIndicatorPipe implements PipeTransform {\n constructor(private alarmListIndicatorService: AlarmListIndicatorService) {}\n\n transform(alarm: IAlarm): Observable<AlarmListIndicator[]> {\n return this.alarmListIndicatorService.get$(alarm);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { SeverityType, SEVERITY_LABELS } from '@c8y/client';\n\n/**\n * Pipe for transforming an array of alarm severity types into a comma-separated string.\n *\n * @example\n * Usage in a template: {{ ['WARNING', 'CRITICAL'] | AlarmSeveritiesToTitle }}\n * Result: 'Warning, Critical'\n */\n@Pipe({ name: 'AlarmSeveritiesToTitle' })\nexport class AlarmSeveritiesToTitlePipe implements PipeTransform {\n private readonly severityOptionsCount = Object.keys(SEVERITY_LABELS).length;\n\n constructor(private translateService: TranslateService) {}\n /**\n * Transforms an array of alarm severity types into a comma-separated string.\n *\n * @param severities - Array of severity types.\n * @returns - Transformed human-readable title string.\n */\n transform(severities: SeverityType[]): string {\n const uniqueSeverities = [...new Set(severities)];\n\n if (uniqueSeverities.some(severity => !(severity in SEVERITY_LABELS))) {\n return null;\n }\n if (uniqueSeverities.length === this.severityOptionsCount) {\n return this.translateService.instant(gettext('All alarms'));\n }\n\n const translatedChips = uniqueSeverities.map(severity => this.translateSeverityLabel(severity));\n return translatedChips.join(', ');\n }\n /**\n * Translates and converts a severity type to title case.\n *\n * @private\n * @param chip - Severity type.\n * @returns - Translated and title-cased severity type.\n */\n private translateSeverityLabel(chip: SeverityType): string {\n return this.translateService.instant(SEVERITY_LABELS[chip]);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Severity, SeverityType } from '@c8y/client';\n\n@Pipe({\n name: 'AlarmSeverityToIconClass',\n standalone: true\n})\nexport class AlarmSeverityToIconClassPipe implements PipeTransform {\n transform(alarmSeverity: SeverityType): string {\n let severityClassName = '';\n let iconClassName = '';\n\n switch (alarmSeverity) {\n case Severity.CRITICAL:\n severityClassName = 'critical';\n iconClassName = 'exclamation-circle';\n break;\n case Severity.MAJOR:\n severityClassName = 'major';\n iconClassName = 'warning';\n break;\n case Severity.MINOR:\n severityClassName = 'minor';\n iconClassName = 'high-priority';\n break;\n case Severity.WARNING:\n severityClassName = 'warning';\n iconClassName = 'circle';\n break;\n default:\n return '';\n }\n\n return `status icon-lg stroked-icon dlt-c8y-icon-${iconClassName} ${severityClassName}`;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SEVERITY_LABELS } from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\n\n/**\n * Pipe to transform alarm severity to corresponding label.\n */\n@Pipe({ name: 'AlarmSeverityToLabel' })\nexport class AlarmSeverityToLabelPipe implements PipeTransform {\n constructor(private translateService: TranslateService) {}\n\n /**\n * Transforms an alarm severity to its corresponding label.\n * @param alarmSeverity - The alarm severity to transform.\n * @returns The translated label corresponding to the given alarm severity.\n */\n transform(alarmSeverity: string): string {\n const alarmStatusMapped = SEVERITY_LABELS[alarmSeverity?.toUpperCase()];\n return this.translateService.instant(alarmStatusMapped ?? alarmSeverity);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { AlarmStatusType, ALARM_STATUS_LABELS } from '@c8y/client';\n\n/**\n * Pipe to transform alarm status to corresponding label.\n */\n@Pipe({ name: 'AlarmStatusToLabel' })\nexport class AlarmStatusToLabelPipe implements PipeTransform {\n constructor(private translateService: TranslateService) {}\n\n /**\n * Transforms an alarm status to its corresponding label.\n * @param alarmStatus - The alarm status to transform.\n * @returns The translated label corresponding to the given alarm status.\n */\n transform(alarmStatus: AlarmStatusType): string {\n return this.translateService.instant(ALARM_STATUS_LABELS[alarmStatus?.toUpperCase()]);\n }\n}\n","import {\n AfterViewInit,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild\n} from '@angular/core';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n AlarmQueryFilter,\n Severity,\n SeverityFilter,\n SEVERITY_LABELS,\n SeverityType\n} from '@c8y/client';\nimport {\n AlertService,\n DateTimeContext,\n ProductExperienceDirective,\n IconDirective,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n BsDropdownDirective,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective\n} from 'ngx-bootstrap/dropdown';\nimport { BehaviorSubject, Observable, Subject, combineLatest, from, forkJoin, EMPTY } from 'rxjs';\nimport { catchError, filter, finalize, map, startWith, takeUntil } from 'rxjs/operators';\nimport { AlarmsViewService } from './alarms-view.service';\nimport {\n AlarmCount,\n DEFAULT_ALARM_COUNTS,\n DEFAULT_SEVERITY_VALUES,\n AlarmListFormFilters,\n PRODUCT_EXPERIENCE_ALARMS\n} from './alarms.model';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport _ from 'lodash';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgIf, NgFor, NgClass, AsyncPipe, LowerCasePipe } from '@angular/common';\nimport { AlarmSeverityToIconPipe } from './alarm-severity-to-icon.pipe';\nimport { AlarmSeveritiesToTitlePipe } from './alarm-severities-to-title.pipe';\n\n@Component({\n selector: 'c8y-alarms-filter',\n templateUrl: './alarms-filter.component.html',\n imports: [\n FormsModule,\n ReactiveFormsModule,\n BsDropdownDirective,\n CdkTrapFocus,\n NgIf,\n NgFor,\n ProductExperienceDirective,\n IconDirective,\n NgClass,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe,\n AsyncPipe,\n LowerCasePipe,\n AlarmSeverityToIconPipe,\n AlarmSeveritiesToTitlePipe\n ]\n})\nexport class AlarmsFilterComponent implements OnInit, AfterViewInit, OnDestroy {\n readonly severitiesList = Object.keys(SEVERITY_LABELS) as SeverityType[];\n\n @Input()\n contextSourceId: number | string | null;\n\n /**\n * EventEmitter to notify when filters have been applied.\n * Emits a `AlarmListFormFilters` object representing the filter criteria applied by the user.\n */\n @Output()\n onFilterApplied = new EventEmitter<AlarmListFormFilters>();\n\n @ViewChild('filtersDropdown')\n filtersDropdown: BsDropdownDirective;\n\n formGroup = this.formBuilder.group(DEFAULT_SEVERITY_VALUES);\n chips: SeverityType[] = [];\n isIndeterminate$: Observable<boolean>;\n countLoading: boolean;\n showCleared = false;\n alarmCounts: AlarmCount = DEFAULT_ALARM_COUNTS;\n selectedDates: DateTimeContext;\n shouldDisableApplyButton$: Observable<boolean>;\n isEachCheckboxSelected$: Observable<boolean>;\n protected readonly SEVERITY_LABELS = SEVERITY_LABELS;\n protected readonly PRODUCT_EXPERIENCE_ALARMS = PRODUCT_EXPERIENCE_ALARMS;\n private isNoneCheckboxSelected$ = new BehaviorSubject<boolean>(false);\n private severitiesTouched$ = new BehaviorSubject<boolean>(false);\n private currentFormGroupValues = this.formGroup.value;\n private currentShowClearedValue: boolean;\n private destroy$: Subject<void> = new Subject<void>();\n\n constructor(\n private formBuilder: FormBuilder,\n private alarmsViewService: AlarmsViewService,\n private alertService: AlertService,\n private router: Router,\n private activatedRoute: ActivatedRoute\n ) {}\n\n ngOnInit(): void {\n this.activatedRoute.queryParams.pipe(takeUntil(this.destroy$)).subscribe(params => {\n this.showCleared = params.showCleared === 'true';\n this.formGroup.setValue({\n [Severity.CRITICAL]: params[Severity.CRITICAL] === 'true',\n [Severity.MAJOR]: params[Severity.MAJOR] === 'true',\n [Severity.MINOR]: params[Severity.MINOR] === 'true',\n [Severity.WARNING]: params[Severity.WARNING] === 'true'\n });\n if (params.lastUpdatedFrom) {\n this.selectedDates = [new Date(params.lastUpdatedFrom), new Date(params.createdTo)];\n }\n this.applyFilters(true, false);\n });\n this.trackCheckboxStateWithFormChanges();\n this.currentShowClearedValue = this.showCleared;\n this.updateChipsAndDefaultValues();\n }\n\n ngAfterViewInit(): void {\n this.filtersDropdown.isOpenChange\n .pipe(takeUntil(this.destroy$), filter(Boolean))\n .subscribe(() => this.updateAlarmsCount());\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n allChanged(selected: boolean): void {\n this.formGroup.patchValue({\n [Severity.CRITICAL]: selected,\n [Severity.MAJOR]: selected,\n [Severity.MINOR]: selected,\n [Severity.WARNING]: selected\n } as SeverityFilter);\n }\n\n applyFilters(emit = true, navigate = true): void {\n this.updateChipsAndDefaultValues();\n const combinedFormEvent: AlarmListFormFilters = {\n showCleared: this.showCleared,\n severityOptions: this.formGroup.value,\n selectedDates: this.selectedDates\n };\n if (emit) {\n this.onFilterApplied.emit(combinedFormEvent);\n }\n this.currentFormGroupValues = this.formGroup.value;\n this.currentShowClearedValue = this.showCleared;\n\n if (navigate) {\n this.router.navigate([], {\n queryParams: {\n showCleared: combinedFormEvent.showCleared,\n ...combinedFormEvent.severityOptions,\n lastUpdatedFrom: combinedFormEvent.selectedDates?.[0]?.toISOString(),\n createdTo: combinedFormEvent.selectedDates?.[1]?.toISOString()\n },\n queryParamsHandling: 'merge'\n });\n }\n }\n\n deselectChip(chip: SeverityType): void {\n this.formGroup.patchValue({\n ...this.formGroup.value,\n [chip]: false\n });\n this.applyFilters(false);\n this.closeDropdown();\n }\n\n closeDropdown(): void {\n if (this.filtersDropdown.isOpen) {\n this.filtersDropdown.isOpen = false;\n }\n }\n\n resetForm(): void {\n this.formGroup.reset(this.currentFormGroupValues);\n this.severitiesTouched$.next(false);\n this.showCleared = this.currentShowClearedValue;\n }\n\n markSeveritiesAsTouched(): void {\n this.severitiesTouched$.next(true);\n }\n\n /**\n * Asynchronously fetches and updates the count of alarms for each severity level.\n *\n * @param showCleared - Whether to include cleared alarms in the count.\n * Defaults to the current value of `this.currentShowClearedValue`.\n * @returns A Promise that resolves when all alarm counts have been fetched,\n * or rejects with an error if the operation fails.\n * @throws Will throw an error if any of the alarm count fetching promises reject.\n */\n async updateAlarmsCount(showCleared = this.currentShowClearedValue): Promise<void> {\n this.countLoading = true;\n const alarmFilter: AlarmQueryFilter | null = this.contextSourceId\n ? {\n source: this.contextSourceId,\n withSourceAssets: true,\n withSourceDevices: true\n }\n : null;\n const observables: Record<SeverityType, Observable<number>> = this.severitiesList.reduce(\n (acc, severity) => {\n acc[severity] = from(\n this.alarmsViewService.getAlarmsCountBySeverity(severity, showCleared, alarmFilter)\n );\n return acc;\n },\n {\n CRITICAL: null,\n MAJOR: null,\n MINOR: null,\n WARNING: null\n }\n );\n forkJoin(observables)\n .pipe(\n catchError(err => {\n this.alarmCounts = {} as AlarmCount;\n this.alertService.addServerFailure(err);\n return EMPTY;\n }),\n finalize(() => (this.countLoading = false))\n )\n .subscribe((alarmCounts: AlarmCount) => (this.alarmCounts = alarmCounts));\n }\n\n private createFormValueWithChangesStream(): Observable<SeverityFilter> {\n return this.formGroup.valueChanges.pipe(startWith(this.formGroup.value));\n }\n\n private trackCheckboxStateWithFormChanges(): void {\n const formValue$ = this.createFormValueWithChangesStream();\n this.isEachCheckboxSelected$ = this.createAllSelectedStream(formValue$);\n this.isIndeterminate$ = this.createIndeterminateStream(formValue$);\n this.trackAllCheckboxesDisabled(formValue$);\n this.shouldDisableApplyButton$ = this.createDisableApplyButtonStream();\n }\n\n private createAllSelectedStream(formValue$: Observable<SeverityFilter>): Observable<boolean> {\n return formValue$.pipe(map(severities => Object.values(severities).every(Boolean)));\n }\n\n private createIndeterminateStream(formValue$: Observable<SeverityFilter>): Observable<boolean> {\n return formValue$.pipe(\n map(\n severities =>\n Object.values(severities).some(Boolean) && !Object.values(severities).every(Boolean)\n )\n );\n }\n\n private trackAllCheckboxesDisabled(formValue$: Observable<SeverityFilter>): void {\n formValue$.pipe(takeUntil(this.destroy$)).subscribe(severities => {\n const areAllDisabled = Object.values(severities).every(value => !value);\n this.isNoneCheckboxSelected$.next(areAllDisabled);\n });\n }\n\n private createDisableApplyButtonStream(): Observable<boolean> {\n return combineLatest([this.isNoneCheckboxSelected$, this.severitiesTouched$]).pipe(\n map(\n ([allCheckboxesAreDisabled, severitiesTouched]) =>\n allCheckboxesAreDisabled || !severitiesTouched\n )\n );\n }\n\n private updateChipsAndDefaultValues(): void {\n const severityFilter = this.formGroup;\n const seveerityValues = severityFilter.value;\n\n this.chips = Object.keys(seveerityValues).filter(key => seveerityValues[key]) as SeverityType[];\n const allChipsRemoved = this.chips.length === 0;\n if (allChipsRemoved) {\n const defaultValues = DEFAULT_SEVERITY_VALUES;\n severityFilter.setValue(defaultValues);\n this.chips = Object.keys(defaultValues) as SeverityType[];\n }\n }\n}\n","<form\n class=\"d-flex a-i-center\"\n [formGroup]=\"formGroup\"\n>\n <div\n class=\"dropdown\"\n title=\"{{ 'Filter by severity' | translate }}\"\n dropdown\n #filtersDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"filtersDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <div class=\"input-group fit-w\">\n <div class=\"form-control d-flex a-i-center inner-scroll\" style=\"min-width: 104px; padding-top: 0; padding-bottom: 0;\">\n <ng-container *ngIf=\"chips.length !== severitiesList.length; else allAlarms\">\n <span\n class=\"tag tag--info chip\"\n [attr.data-cy]=\"'c8y-alarms-filter--chip-' + chip\"\n *ngFor=\"let chip of chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-alarms-filter--remove-chip\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARMS_FILTER,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.REMOVE_CHIP_FILTER,\n filterValues: {\n severities: formGroup.value,\n showCleared: showCleared\n }\n }\"\n (click)=\"deselectChip(chip); $event.stopPropagation()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <i\n class=\"status stroked-icon icon-12\"\n [attr.data-cy]=\"'c8y-alarms-filter--icon-' + chip\"\n [c8yIcon]=\"chip | AlarmSeverityToIcon\"\n [ngClass]=\"chip | lowercase\"\n ></i>\n {{ SEVERITY_LABELS[chip] | translate }}\n </span>\n </ng-container>\n <ng-template #allAlarms>\n <span class=\"text-truncate\" title=\"{{ 'All severities' | translate }}\">\n {{ 'All severities' | translate }}\n </span>\n </ng-template>\n </div>\n <div class=\"input-group-btn input-group-btn--last\">\n <button\n class=\"btn-default btn btn--caret\"\n title=\"{{ chips | AlarmSeveritiesToTitle }}\"\n data-cy=\"c8y-alarms-filter\"\n dropdownToggle\n (click)=\"resetForm()\"\n >\n <i class=\"caret\"></i>\n </button>\n </div>\n </div>\n <ul\n class=\"dropdown-menu dropdown-menu-action-bar\"\n *dropdownMenu\n >\n <li class=\"p-l-16 p-r-16 p-t-4 p-b-4 d-flex a-i-center sticky-top separator-bottom\">\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n [title]=\"'All' | translate\"\n >\n <input\n type=\"checkbox\"\n data-cy=\"c8y-alarms-filter--all\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"allChanged($event)\"\n [ngModel]=\"isEachCheckboxSelected$ | async\"\n [indeterminate]=\"isIndeterminate$ | async\"\n (click)=\"markSeveritiesAsTouched()\"\n />\n <span></span>\n <i\n class=\"status stroked-icon m-l-8 icon-20\"\n [c8yIcon]=\"'bell'\"\n ></i>\n <span class=\"m-l-8\">{{ 'All' | translate }}</span>\n </label>\n </li>\n <li\n class=\"p-l-16 p-r-16 p-t-4 p-b-4 d-flex a-i-center\"\n *ngFor=\"let severity of severitiesList\"\n >\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n [title]=\"SEVERITY_LABELS[severity] | translate\"\n >\n <input\n type=\"checkbox\"\n [attr.data-cy]=\"'c8y-alarms-filter--' + severity\"\n [formControlName]=\"severity\"\n [value]=\"severity\"\n (click)=\"markSeveritiesAsTouched()\"\n />\n <span></span>\n <i\n class=\"status stroked-icon m-l-8 icon-20\"\n [c8yIcon]=\"severity | AlarmSeverityToIcon\"\n [ngClass]=\"severity | lowercase\"\n ></i>\n <span class=\"m-l-8\">{{ SEVERITY_LABELS[severity] | translate }}</span>\n </label>\n <!-- badge -->\n <div\n class=\"badge badge-info m-l-auto\"\n *ngIf=\"alarmCounts[severity] || alarmCounts[severity] === 0\"\n >\n <i\n class=\"icon-spin\"\n [c8yIcon]=\"'circle-o-notch'\"\n *ngIf=\"countLoading\"\n ></i>\n <span\n *ngIf=\"!countLoading\"\n [attr.data-cy]=\"'c8y-alarms-filter--' + severity + '-badge'\"\n >\n {{ alarmCounts[severity] < 99 ? alarmCounts[severity] : '99+' }}\n </span>\n </div>\n </li>\n <li class=\"p-l-16 p-r-16 p-t-4 p-b-4 d-flex a-i-center separator-top\">\n <label\n class=\"c8y-switch\"\n [attr.aria-label]=\"'Show cleared alarms' | translate\"\n [attr.data-cy]=\"'c8y-alarms-filter--cleared'\"\n >\n <input\n type=\"checkbox\"\n #showClearedCheckbox\n [ngModelOptions]=\"{ standalone: true }\"\n [(ngModel)]=\"showCleared\"\n (click)=\"markSeveritiesAsTouched(); updateAlarmsCount(showClearedCheckbox.checked)\"\n />\n <span></span>\n <span\n class=\"text-truncate\"\n title=\"{{ 'Show cleared alarms' | translate }}\"\n >\n {{ 'Show cleared alarms' | translate }}\n </span>\n </label>\n </li>\n\n <div class=\"p-16 d-flex sticky-bottom separator-top\">\n <button\n data-cy=\"c8y-alarms-filter--apply\"\n class=\"btn btn-primary btn-sm flex-grow\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARMS_FILTER,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.APPLY_FILTER,\n filterValues: {\n severities: formGroup.value,\n showCleared: showCleared\n }\n }\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyFilters(false); closeDropdown()\"\n [disabled]=\"shouldDisableApplyButton$ | async\"\n >\n {{ 'Apply' | translate }}\n </button>\n </div>\n </ul>\n </div>\n</form>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { IAlarm } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { AlarmDetails } from '@c8y/ngx-components/alarm-event-selector';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { NgClass, NgStyle, LowerCasePipe } from '@angular/common';\nimport { AlarmSeverityToIconPipe } from './alarm-severity-to-icon.pipe';\nimport { AlarmStatusToIconPipe } from './alarm-status-to-icon.pipe';\nimport { AlarmSeverityToLabelPipe } from './alarm-severity-to-label.pipe';\nimport { AlarmStatusToLabelPipe } from './alarm-status-to-label.pipe';\n\n@Component({\n selector: 'c8y-alarms-icon',\n templateUrl: 'alarms-icon.component.html',\n imports: [\n TooltipDirective,\n IconDirective,\n NgClass,\n NgStyle,\n C8yTranslatePipe,\n LowerCasePipe,\n AlarmSeverityToIconPipe,\n AlarmStatusToIconPipe,\n AlarmSeverityToLabelPipe,\n AlarmStatusToLabelPipe\n ]\n})\nexport class AlarmsIconComponent implements OnInit {\n @Input()\n alarm: IAlarm;\n\n @Input()\n typeFilters: AlarmDetails[];\n\n iconBackgroundColor = 'none';\n isFilterApplied = false;\n\n alarmSeverityLabel = gettext('Severity: {{ alarmSeverity }}');\n alarmStatusLabel = gettext('Status: {{ alarmStatus }}');\n alarmStatusType = gettext('Type: {{ alarmType }}');\n\n ngOnInit(): void {\n this.isFilterApplied = this.typeFilters.length > 0;\n this.iconBackgroundColor =\n this.typeFilters.find(filter => filter.filters.type === this.alarm.type)?.color || 'none';\n }\n}\n","<button\n class=\"btn-clean severity\"\n [attr.aria-label]=\"\n alarmSeverityLabel | translate: { alarmSeverity: alarm.severity | AlarmSeverityToLabel }\n \"\n [tooltip]=\"\n alarmSeverityLabel | translate: { alarmSeverity: alarm.severity | AlarmSeverityToLabel }\n \"\n placement=\"right\"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [delay]=\"500\"\n>\n <i\n class=\"status stroked-icon\"\n [c8yIcon]=\"alarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"alarm.severity | lowercase\"\n ></i>\n</button>\n<button\n class=\"btn-clean status\"\n [ngStyle]=\"{ 'background-color': iconBackgroundColor }\"\n [attr.aria-label]=\"\n alarmStatusLabel | translate: { alarmStatus: alarm.status | AlarmStatusToLabel }\n \"\n [tooltip]=\"\n (alarmStatusLabel | translate: { alarmStatus: alarm.status | AlarmStatusToLabel }) +\n '\\n' +\n (alarmStatusType | translate: { alarmType: alarm.type })\n \"\n placement=\"right\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ 'circle-icon-wrapper': isFilterApplied }\"\n data-cy=\"c8y-alarms-icon--status-icon\"\n (click)=\"$event.stopPropagation()\"\n [delay]=\"500\"\n>\n <i\n [c8yIcon]=\"alarm.status | AlarmStatusToIcon\"\n [ngClass]=\"{ 'stroked-icon': isFilterApplied }\"\n ></i>\n</button>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild\n} from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { filter, takeUntil, tap } from 'rxjs/operators';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n CountdownIntervalComponent,\n RequiredInputPlaceholderDirective,\n IconDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { AlarmsViewService } from './alarms-view.service';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { NgIf, NgFor, NgClass, AsyncPipe } from '@angular/common';\n\n@Component({\n selector: 'c8y-alarms-interval-refresh',\n templateUrl: './alarms-interval-refresh.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n TooltipDirective,\n RequiredInputPlaceholderDirective,\n NgIf,\n CountdownIntervalComponent,\n IconDirective,\n NgFor,\n NgClass,\n C8yTranslatePipe,\n AsyncPipe\n ]\n})\nexport class AlarmsIntervalRefreshComponent implements OnInit, AfterViewInit, OnDestroy {\n readonly refreshIntervalsInMilliseconds = this.alarmsViewService.DEFAULT_INTERVAL_VALUES;\n readonly DISABLE_AUTO_REFRESH = gettext('Disable auto refresh');\n readonly ENABLE_AUTO_REFRESH = gettext('Enable auto refresh');\n readonly SECONDS_UNTIL_REFRESH = gettext('{{ seconds }} s');\n\n @Input() isDisabled = false;\n /**\n * Controls the loading state of the alarms list reload button.\n */\n @Input()\n alarmsListLoading$: BehaviorSubject<boolean>;\n /**\n * * Set the value of `isIntervalEnabled` in response to user interactions with the alarm list scroll.\n * *\n * * This input setter allows you to control the `isIntervalEnabled` property, which is used to manage the state\n * * of a toggle button. When a user scrolls through the alarms list, you can update the `isIntervalEnabled` value\n * * using this setter.\n * *\n * * @param value - A boolean value representing the new state of the `isIntervalEnabled` property.\n * * - `true` indicates that the interval is enabled.\n * * - `false` indicates that the interval is disabled.\n */\n @Input()\n set isIntervalToggleEnabled(value: boolean) {\n const shouldSetInterval = this.isIntervalToggleEnabled || this.doesUserCheckedIntervalToggle;\n const shouldToggleInterval =\n !this.isDisabled &&\n this.isIntervalToggleEnabled &&\n this.doesUserCheckedIntervalToggle &&\n value;\n const intervalToggleControl = this.toggleIntervalForm.get('intervalToggle');\n /**\n * We check if any interactions to toggle interval button were made.\n * When user interacts with toggle button, we need to ignore assigning value to the form.\n */\n if (intervalToggleControl.dirty && !shouldSetInterval) {\n return;\n }\n /**\n * This condition checks if the interval toggle is enabled and if there has been user interaction,\n * and if the provided value is truthy.\n * If all conditions are met, the interval toggle should not be updated due to unnecessary update of countdown interval component\n */\n if (shouldToggleInterval) {\n return;\n }\n intervalToggleControl.setValue(value);\n }\n /**\n * This getter allows you to access the current state of the `isIntervalEnabled` property, which reflects\n * the state of a toggle button. It retrieves the value from the associated form control, providing the\n * current state of the toggle button.\n */\n get isIntervalToggleEnabled(): boolean {\n return !this.isDisabled && this.toggleIntervalForm.get('intervalToggle').value;\n }\n /**\n * Event emitter for notifying when a countdown timer has completed.\n */\n @Output()\n onCountdownEnded = new EventEmitter<void>();\n\n @ViewChild(CountdownIntervalComponent)\n countdownIntervalComponent: CountdownIntervalComponent;\n toggleIntervalForm = this.initForm();\n private destroy$: Subject<void> = new Subject<void>();\n /**\n * Indicates whether the user has been interacting with the interval toggle.\n * Property holds the current state of the interval toggle input element entered by the user,\n * distinguishing it from changes made programmatically (e.g. value from isIntervalToggleEnabled).\n */\n private doesUserCheckedIntervalToggle: boolean;\n\n constructor(\n private fb: FormBuilder,\n private alarmsViewService: AlarmsViewService\n ) {}\n\n ngOnInit(): void {\n this.listenToRefreshIntervalChange();\n }\n\n ngAfterViewInit(): void {\n this.onIntervalToggleChange();\n this.listenOnLoadingChanges();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n resetCountdown(): void {\n this.countdownIntervalComponent?.reset();\n }\n\n trackUserClickOnIntervalToggle(target: EventTarget): void {\n this.doesUserCheckedIntervalToggle = (target as HTMLInputElement).checked;\n }\n\n getTooltip() {\n return this.isDisabled\n ? gettext('Disabled')\n : this.isIntervalToggleEnabled\n ? this.DISABLE_AUTO_REFRESH\n : this.ENABLE_AUTO_REFRESH;\n }\n\n private startCountdown(): void {\n this.countdownIntervalComponent.start();\n }\n\n private onIntervalToggleChange(): void {\n this.toggleIntervalForm\n .get('intervalToggle')\n .valueChanges.pipe(takeUntil(this.destroy$), filter(Boolean))\n .subscribe(() => setTimeout(() => this.startCountdown()));\n }\n\n private initForm() {\n return this.fb.group({\n intervalToggle: true,\n refreshInterval: this.alarmsViewService.DEFAULT_INTERVAL_VALUE\n });\n }\n\n private listenToRefreshIntervalChange(): void {\n this.toggleIntervalForm\n .get('refreshInterval')\n .valueChanges.pipe(takeUntil(this.destroy$))\n .subscribe(() => this.resetCountdown());\n }\n\n private listenOnLoadingChanges() {\n this.alarmsListLoading$\n .pipe(tap(() => this.countdownIntervalComponent?.stop()))\n .subscribe(state => {\n !state && this.countdownIntervalComponent?.reset();\n });\n }\n}\n","<form\n class=\"d-flex a-i-center fit-w fit-h\"\n [formGroup]=\"toggleIntervalForm\"\n>\n <label class=\"m-b-0 m-r-8 text-normal text-muted flex-no-shrink\">\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isDisabled\"\n [attr.aria-label]=\"getTooltip() | translate\"\n [tooltip]=\"getTooltip() | translate\"\n placement=\"bottom\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n data-cy=\"c8y-alarms-interval-refresh--toggle-countdown\"\n >\n <input\n type=\"checkbox\"\n data-cy=\"c8y-alarms-interval-toggle\"\n formControlName=\"intervalToggle\"\n (click)=\"trackUserClickOnIntervalToggle($event.target)\"\n />\n <c8y-countdown-interval\n *ngIf=\"isIntervalToggleEnabled\"\n [countdownInterval]=\"toggleIntervalForm.value.refreshInterval\"\n (countdownEnded)=\"onCountdownEnded.emit()\"\n ></c8y-countdown-interval>\n <i\n data-cy=\"c8y-alarms-interval-refresh--pause\"\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalToggleEnabled\"\n ></i>\n </label>\n <div\n class=\"c8y-select-wrapper\"\n *ngIf=\"!isDisabled\"\n >\n <select\n class=\"form-control text-12\"\n [attr.aria-label]=\"'Refresh interval in seconds' | translate\"\n [tooltip]=\"'Refresh interval in seconds' | translate\"\n placement=\"bottom\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [container]=\"'body'\"\n formControlName=\"refreshInterval\"\n data-cy=\"c8y-alarms-interval-refresh--selector\"\n >\n <option\n [disabled]=\"isDisabled\"\n *ngFor=\"let refreshInterval of refreshIntervalsInMilliseconds\"\n [ngValue]=\"refreshInterval\"\n [attr.data-cy]=\"'c8y-interval-' + refreshInterval\"\n >\n {{ SECONDS_UNTIL_REFRESH | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n <span></span>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n style=\"border-left: 0\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"isDisabled || (alarmsListLoading$ | async)\"\n (click)=\"onCountdownEnded.emit()\"\n data-cy=\"c8y-alarms-interval-refresh--btn\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': alarmsListLoading$ | async }\"\n ></i>\n </button>\n </div>\n </div>\n</form>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport {\n ActivatedRoute,\n NavigationEnd,\n Router,\n RouterLinkActive,\n RouterLink\n} from '@angular/router';\nimport { IAlarm, IResultList } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ContextRouteService,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n ListItemComponent,\n LoadMoreMode,\n C8yTranslateDirective,\n ListGroupComponent,\n ForOfDirective,\n ListItemTimelineComponent,\n ListItemIconComponent,\n ListItemBodyComponent,\n IconDirective,\n LoadingComponent,\n EmptyStateComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n DynamicComponentAlertsComponent,\n C8yTranslatePipe,\n DatePipe\n} from '@c8y/ngx-components';\nimport { BehaviorSubject, Observable, Subject, fromEvent, pipe } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n shareReplay,\n switchMap,\n takeUntil\n} from 'rxjs/operators';\nimport { AlarmsViewService } from './alarms-view.service';\nimport { AlarmNavigationOptions } from './alarms.model';\nimport { AlarmDetails } from '@c8y/ngx-components/alarm-event-selector';\nimport { NgClass, NgIf, NgStyle, NgFor, AsyncPipe } from '@angular/common';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\nimport { AlarmsIconComponent } from './alarms-icon.component';\nimport { AlarmListIndicatorPipe } from './alarm-list-custom-indicator/alarm-list-indicator.pipe';\n\n@Component({\n selector: 'c8y-alarms-list',\n templateUrl: './alarms-list.component.html',\n imports: [\n NgClass,\n NgIf,\n C8yTranslateDirective,\n ListGroupComponent,\n NgStyle,\n ForOfDirective,\n ListItemTimelineComponent,\n RouterLinkActive,\n RouterLink,\n TooltipDirective,\n ListItemComponent,\n ListItemIconComponent,\n AlarmsIconComponent,\n ListItemBodyComponent,\n IconDirective,\n NgFor,\n LoadingComponent,\n EmptyStateComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n DynamicComponentAlertsComponent,\n C8yTranslatePipe,\n AsyncPipe,\n DatePipe,\n AlarmListIndicatorPipe\n ]\n})\nexport class AlarmsListComponent implements OnChanges, AfterViewInit, OnDestroy {\n readonly alarmBadgeTooltip = gettext(\n 'Number of occurrences`number of occurrences of alarm`. First occurrence {{ alarmFirstOccurrenceTime }} (device time).'\n );\n readonly alarmLastOccurrenceLabel = gettext('Last occurrence of this alarm (device time).');\n\n /**\n * Input property for receiving a list of alarms.\n */\n @Input()\n alarms: IResultList<IAlarm & { link?: string }>;\n\n @Input() hasPermissions = true;\n\n /**\n * Input property for the currently applied type filters.\n */\n @Input()\n typeFilters: AlarmDetails[] = [];\n\n /**\n * Input property for receiving load more mode.\n */\n @Input()\n loadMoreMode: LoadMoreMode = 'hidden';\n\n /**\n * Defines options, how the alarm list should be navigated if a user\n * clicks on an alarm.\n */\n @Input()\n navigationOptions: AlarmNavigationOptions = {\n allowNavigationToAlarmsView: true,\n alwaysNavigateToAllAlarms: false,\n includeClearedQueryParams: false,\n queryParamsHandling: 'merge'\n };\n\n /**\n * Controls the visibility of the loading bar\n * When set to `false`, the alarm list is displayed. When set to `true`, the opacity of alarms list is changed and a loading bar is shown.\n */\n @Input()\n isInitialLoading = false;\n\n /**\n * Controls the visibility and functionality of some components\n * When set to `true`, means the list is displayed in a split view layout:\n * the list on the first column and the selected record detail on the second column (the cockpit\n * alarms view for example)\n * When set to false, the list is displayed as a standalone component, opening the detail will\n * redirect to the alarms\n */\n @Input()\n splitView = false;\n\n /**\n * Indicates whether the component is in widget preview mode.\n */\n @Input() isInPreviewMode = false;\n\n /**\n * Emits an instance of a selected alarm when one is chosen from the list.\n */\n @Output()\n onSelectedAlarm = new EventEmitter<IAlarm>();\n\n /**\n * Emits a boolean value indicating the scrolling state: true when the user starts scrolling, and false when the user reaches the top of the list.\n */\n @Output()\n onScrollingStateChange = new EventEmitter<boolean>();\n\n /**\n * Current alarm or last alarm marked as active by the routerLinkActive directive.\n */\n activeAlarm$ = new BehaviorSubject<IAlarm>(null);\n activeChildParam$ = new Observable<string>();\n\n @ViewChild('scrollWrapper')\n innerScrollWrapper: ElementRef;\n\n isScrolling = false;\n /**\n * Determines whether the c8y-loading component should be displayed.\n * The loading component is shown when no alarms are displayed in the view or when the request is initial,\n * as we don't want to see empty space on alarm list during loading.\n */\n isEmptyListLoading = true;\n\n alertAggregator = new DynamicComponentAlertAggregator();\n\n mapAlarmLink = pipe(\n map((alarms: IAlarm[]) =>\n alarms.map((alarm: IAlarm) => {\n alarm.link = this.getRouterLink(alarm);\n return alarm;\n })\n )\n );\n\n private destroy$: Subject<void> = new Subject<void>();\n private HIDE_INTERVAL_COUNTDOWN_SCROLL = 50;\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private alarmsViewService: AlarmsViewService,\n private contextRouteService: ContextRouteService,\n private router: Router\n ) {\n this.verifyIfFiltersMatchingAlarm();\n }\n\n /**\n * Handles the change of the active route.\n *\n * @param isActive - A boolean indicating whether the route is active or not.\n * @param scrollAnchor - The ListItemComponent used as a scroll anchor.\n * @param alarm - The IAlarm object representing the active alarm.\n */\n activeRouteChanged(isActive: boolean, scrollAnchor: ListItemComponent, alarm: IAlarm): void {\n if (isActive) {\n scrollAnchor.element.nativeElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest'\n });\n this.activeAlarm$.next(alarm);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.alarms && changes.alarms) {\n this.activeAlarm$.next(null);\n this.isEmptyListLoading = !this.alarms?.data?.length;\n }\n\n if (changes.hasPermissions?.currentValue === false) {\n this.alertAggregator.addAlerts(\n new DynamicComponentAlert({\n type: 'system',\n text: gettext(\"You don't have permission to view alarms.\")\n })\n );\n }\n }\n\n ngAfterViewInit(): void {\n if (this.isInPreviewMode) {\n return;\n }\n\n if (this.alarmsViewService.isIntervalRefresh()) {\n const scrollElement = this.innerScrollWrapper.nativeElement;\n fromEvent(scrollElement, 'scroll')\n .pipe(takeUntil(this.destroy$), debounceTime(300))\n .subscribe((event: Event) => {\n const target = event.target as HTMLElement;\n this.isScrolling = this.shouldCountdownIntervalBeHidden(target);\n this.onScrollingStateChange.emit(this.isScrolling);\n });\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onAlarmOpen(alarm: IAlarm): void {\n this.onSelectedAlarm.emit(alarm);\n }\n\n getRouterLink(alarm: IAlarm): string {\n if (this.navigationOptions.alwaysNavigateToAllAlarms) {\n return this.alarmsViewService.getRouterLink(null, alarm);\n }\n const contextData = this.contextRouteService.getContextData(this.activatedRoute);\n return this.alarmsViewService.getRouterLink(contextData, alarm);\n }\n\n private shouldCountdownIntervalBeHidden(target: HTMLElement): boolean {\n const scrollTopPixels = target.scrollTop;\n return scrollTopPixels > this.HIDE_INTERVAL_COUNTDOWN_SCROLL;\n }\n\n private verifyIfFiltersMatchingAlarm() {\n this.activeChildParam$ = this.router.events.pipe(\n filter(e => e instanceof NavigationEnd && this.activatedRoute.children.length > 0),\n switchMap(() => this.activatedRoute.children[0].params),\n map(params => params.id),\n distinctUntilChanged(),\n shareReplay(),\n takeUntil(this.destroy$)\n );\n\n // done to get the first navigation\n this.activeChildParam$.subscribe();\n }\n}\n","<div\n class=\"inner-scroll\"\n [ngClass]=\"{ 'split-view__list bg-level-1': splitView, 'bg-component': !splitView }\"\n data-cy=\"c8y-alarms-list\"\n #scrollWrapper\n>\n <div\n class=\"flex-wrap flex-no-shrink sticky-top m-b-16\"\n [ngClass]=\"{\n 'separator-bottom card-header p-b-0': splitView,\n 'd-flex fit-w separator-top-bottom widget-bar p-l-16 p-r-16':\n !splitView && navigationOptions.allowNavigationToAlarmsView\n }\"\n >\n <div\n class=\"h4 card-title\"\n *ngIf=\"splitView\"\n >\n {{ 'Alarms list' | translate }}\n </div>\n <div\n [ngClass]=\"{ 'fit-w d-flex a-i-center gap-16': !splitView, 'fit-h-20 m-l-auto': splitView }\"\n >\n <ng-content></ng-content>\n </div>\n <!-- Loading -->\n <div\n class=\"fit-w overflow-hidden\"\n [ngClass]=\"{ 'p-t-16': splitView }\"\n >\n <div\n class=\"loading-bar\"\n data-cy=\"c8y-alarms-list--loading-bar\"\n style=\"z-index: 101\"\n [ngClass]=\"{ active: isInitialLoading && !isEmptyListLoading }\"\n ></div>\n </div>\n\n <div\n class=\"alert alert-warning\"\n role=\"alert\"\n translate\n *ngIf=\"\n !isEmptyListLoading &&\n (activeChildParam$ | async) &&\n (activeAlarm$ | async)?.id !== (activeChildParam$ | async)\n \"\n >\n The selected alarm is not currently in the list, change your filter.\n </div>\n </div>\n <c8y-list-group\n class=\"p-r-16 interactive\"\n [ngStyle]=\"{ opacity: isInitialLoading && !isEmptyListLoading ? 0.2 : 1 }\"\n style=\"transition: opacity 0.15s linear\"\n data-cy=\"c8y-alarms-list--group\"\n >\n <c8y-li-timeline\n class=\"pointer\"\n role=\"button\"\n data-cy=\"c8y-alarms-list--timeline-repeat\"\n *c8yFor=\"let alarm of alarms; let i = index; pipe: mapAlarmLink; loadMore: loadMoreMode\"\n [routerLink]=\"navigationOptions.allowNavigationToAlarmsView ? alarm.link : null\"\n routerLinkActive=\"active\"\n [queryParamsHandling]=\"navigationOptions.queryParamsHandling\"\n (isActiveChange)=\"activeRouteChanged($event, liScrollAnchor, alarm)\"\n (click)=\"onAlarmOpen(alarm)\"\n [queryParams]=\"\n navigationOptions.includeClearedQueryParams\n ? { showCleared: alarm.status === 'CLEARED' }\n : {}\n \"\n >\n <span\n [attr.aria-label]=\"alarmLastOccurrenceLabel | translate\"\n [tooltip]=\"alarmLastOccurrenceLabel | translate\"\n placement=\"right\"\n data-cy=\"c8y-alarms-list--last-occurrence-date\"\n container=\"body\"\n [delay]=\"500\"\n >\n {{ alarm.time | c8yDate: 'mediumDate' }}\n {{ alarm.time | c8yDate: 'mediumTime' }}\n </span>\n <c8y-li\n style=\"scroll-margin-top: 56px\"\n #liScrollAnchor\n >\n <c8y-li-icon class=\"a-s-start\">\n <div class=\"alarm-icons\">\n <c8y-alarms-icon [typeFilters]=\"typeFilters\" [alarm]=\"alarm\"></c8y-alarms-icon>\n </div>\n <button\n class=\"btn-clean text-center\"\n data-cy=\"c8y-alarms-list--badge\"\n [attr.aria-label]=\"\n alarmBadgeTooltip\n | translate\n : { alarmFirstOccurrenceTime: alarm.firstOccurrenceTime | c8yDate: 'medium' }\n \"\n [tooltip]=\"\n alarmBadgeTooltip\n | translate\n : { alarmFirstOccurrenceTime: alarm.firstOccurrenceTime | c8yDate: 'medium' }\n \"\n placement=\"right\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarm.firstOccurrenceTime\"\n (click)=\"$event.stopPropagation()\"\n [delay]=\"500\"\n >\n <span\n class=\"badge badge-info\"\n *ngIf=\"alarm.count > 1\"\n >\n {{ alarm.count }}\n </span>\n </button>\n </c8y-li-icon>\n <c8y-li-body class=\"a-s-stretch\">\n <div class=\"d-flex a-i-start fit-h\">\n <div class=\"min-width-0 flex-grow\">\n <p class=\"text-truncate-wrap p-b-4\" data-cy=\"c8y-alarms-list--alarm-text\">\n {{ alarm.text | translate }}\n </p>\n <div class=\"d-flex\">\n <p\n class=\"small text-muted text-truncate flex-grow\"\n [title]=\"alarm.source.name\"\n data-cy=\"c8y-alarms-list--alarm-source-name\"\n >\n <i [c8yIcon]=\"'exchange'\"></i>\n {{ alarm.source.name }}\n </p>\n <div class=\"d-flex\">\n <div\n [title]=\"item.title | translate\"\n *ngFor=\"let item of alarm | alarmListIndicator | async\"\n >\n <i\n [class]=\"item.class\"\n [c8yIcon]=\"item.icon\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n <c8y-loading\n data-cy=\"c8y-alarms-list--c8y-loading\"\n *ngIf=\"isInitialLoading && isEmptyListLoading\"></c8y-loading>\n <div\n class=\"p-relative p-l-24\"\n *ngIf=\"isEmptyListLoading && !isInitialLoading\"\n >\n <c8y-ui-empty-state\n [icon]=\"'c8y-alert-idle'\"\n [title]=\"'No alarms to display.' | translate\"\n data-cy=\"c8y-alarms-list--empty-state\"\n *ngIf=\"hasPermissions; else alertsA\"\n >\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a\n c8y-guide-href=\"/docs/device-management-application/monitoring-and-controlling-devices/#working-with-alarms\"\n >\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n </c8y-list-group>\n</div>\n\n<ng-template #alertsA>\n <c8y-dynamic-component-alerts [alerts]=\"alertAggregator\"></c8y-dynamic-component-alerts>\n</ng-template>\n","import {\n Component,\n EventEmitter,\n forwardRef,\n Input,\n OnDestroy,\n Output,\n ViewChild\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormBuilder,\n NG_VALUE_ACCESSOR,\n FormsModule,\n ReactiveFormsModule\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Severity, SeverityType } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n DateTimeContext,\n DropdownDirectionDirective,\n IconDirective,\n FormGroupComponent,\n C8yTranslateDirective,\n DateTimePickerComponent,\n MessagesComponent,\n MessageDirective,\n C8yTranslatePipe,\n DatePipe\n} from '@c8y/ngx-components';\nimport { Subject, take, takeUntil } from 'rxjs';\nimport {\n AlarmListFormFilters,\n INTERVAL_TITLES_EXTENDED,\n INTERVALS_EXTENDED,\n WidgetTimeContextStateExtended\n} from './alarms.model';\nimport {\n BsDropdownDirective,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective\n} from 'ngx-bootstrap/dropdown';\nimport { AlarmsViewService } from './alarms-view.service';\nimport { AlarmFilterInterval, IntervalPickerComponent } from '@c8y/ngx-components/interval-picker';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { NgIf, NgClass } from '@angular/common';\n\n@Component({\n selector: 'c8y-alarms-date-filter',\n templateUrl: './alarms-date-filter.component.html',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AlarmsDateFilterComponent),\n multi: true\n }\n ],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n BsDropdownDirective,\n DropdownDirectionDirective,\n BsDropdownToggleDirective,\n TooltipDirective,\n IconDirective,\n NgIf,\n BsDropdownMenuDirective,\n IntervalPickerComponent,\n FormGroupComponent,\n NgClass,\n C8yTranslateDirective,\n DateTimePickerComponent,\n MessagesComponent,\n MessageDirective,\n C8yTranslatePipe,\n DatePipe\n ]\n})\nexport class AlarmsDateFilterComponent implements OnDestroy, ControlValueAccessor {\n readonly INTERVALS = INTERVALS_EXTENDED;\n readonly INTERVAL_TITLES = INTERVAL_TITLES_EXTENDED;\n readonly DATE_FORMAT = 'short';\n\n @Input() DEFAULT_INTERVAL: AlarmFilterInterval['id'] = 'none';\n @Input() updateQueryParams = true;\n /**\n * Date range to be displayed in the date picker.\n */\n @Input() date: [string, string];\n noFilterLabel = gettext('No date filter');\n\n private showCleared: boolean;\n private severityOptions: { [key in SeverityType]: boolean };\n private typeFilters: string;\n private destroy$: Subject<void> = new Subject<void>();\n\n @Output() dateFilterChange = new EventEmitter<AlarmListFormFilters>();\n @ViewChild(BsDropdownDirective) dropdown: BsDropdownDirective;\n\n form: ReturnType<AlarmsDateFilterComponent['createForm']>;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onChange: (value: any) => void;\n\n constructor(\n private formBuilder: FormBuilder,\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private alarmsViewService: AlarmsViewService\n ) {}\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onTouched = () => {};\n\n ngOnInit() {\n const context = this.getDefaultContext();\n this.form = this.createForm(context);\n this.date = [\n this.form.value.currentDateContextFromDate,\n this.form.value.currentDateContextToDate\n ];\n this.activatedRoute.queryParams.pipe(take(1), takeUntil(this.destroy$)).subscribe(params => {\n this.showCleared = params.showCleared === 'true';\n this.severityOptions = {\n [Severity.CRITICAL]: params.critical === 'true',\n [Severity.MAJOR]: params.major === 'true',\n [Severity.MINOR]: params.minor === 'true',\n [Severity.WARNING]: params.warning === 'true'\n };\n if (params.typeFilters) {\n this.typeFilters = params.typeFilters;\n }\n if (!params.interval) {\n return;\n }\n if (params.interval !== 'custom') {\n this.updateDateTime(params.interval);\n } else {\n this.form.patchValue({\n currentDateContextInterval: params.interval,\n temporaryUserSelectedFromDate: params.lastUpdatedFrom,\n temporaryUserSelectedToDate: params.createdTo\n });\n this.date = [params.lastUpdatedFrom, params.createdTo];\n }\n });\n\n this.subscribeToIntervalChange();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n applyDateFilter(): void {\n const combinedFormEvent = {\n showCleared: this.showCleared,\n severityOptions: this.severityOptions,\n typeFilters: this.typeFilters,\n interval: this.form.value.currentDateContextInterval,\n selectedDates: [\n new Date(this.form.value.temporaryUserSelectedFromDate),\n new Date(this.form.value.temporaryUserSelectedToDate)\n ] as DateTimeContext\n };\n\n // needed for custom interval\n this.date = [\n this.form.value.temporaryUserSelectedFromDate,\n this.form.value.temporaryUserSelectedToDate\n ];\n\n this.router.navigate([], {\n relativeTo: this.activatedRoute,\n queryParams: {\n interval: this.form.value.currentDateContextInterval,\n lastUpdatedFrom: combinedFormEvent.selectedDates[0].toISOString(),\n createdTo: combinedFormEvent.selectedDates[1].toISOString()\n },\n queryParamsHandling: 'merge'\n });\n this.dateFilterChange.emit(combinedFormEvent);\n }\n\n writeValue(value: any): void {\n if (value) {\n this.form.patchValue({\n currentDateContextFromDate:\n typeof value[0] === 'string' ? value[0] : value[0].toISOString(),\n currentDateContextToDate: typeof value[1] === 'string' ? value[1] : value[1].toISOString()\n });\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(onTouched: any) {\n this.onTouched = onTouched;\n }\n\n private updateDateTime(interval: AlarmFilterInterval['id']): void {\n const date = this.alarmsViewService.getDateTimeContextByInterval(interval);\n if (this.dropdown) {\n this.dropdown.isOpen = false;\n }\n this.date = date.map(d => d.toISOString()) as [string, string];\n this.form.patchValue(\n {\n temporaryUserSelectedFromDate: date[0].toISOString(),\n temporaryUserSelectedToDate: date[1].toISOString(),\n currentDateContextInterval: interval\n },\n { emitEvent: false }\n );\n this.applyDateFilter();\n }\n\n private getDefaultContext() {\n return {\n date: this.alarmsViewService.getDateTimeContextByInterval(this.DEFAULT_INTERVAL),\n interval: this.DEFAULT_INTERVAL\n };\n }\n\n private subscribeToIntervalChange(): void {\n this.form.controls.currentDateContextInterval.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe(interval => {\n if (interval === 'custom') {\n this.form.patchValue(\n {\n temporaryUserSelectedFromDate:\n this.form.controls.temporaryUserSelectedFromDate.value === new Date(0).toISOString()\n ? this.form.controls.currentDateContextToDate.value\n : this.form.controls.temporaryUserSelectedFromDate.value,\n currentDateContextInterval: interval\n },\n { emitEvent: false }\n );\n return;\n }\n this.updateDateTime(interval);\n });\n }\n\n private createForm(context: WidgetTimeContextStateExtended) {\n return this.formBuilder.group({\n temporaryUserSelectedFromDate: context.date[0].toISOString(),\n temporaryUserSelectedToDate: context.date[1].toISOString(),\n currentDateContextFromDate: context.date[0].toISOString(),\n currentDateContextToDate: context.date[1].toISOString(),\n currentDateContextInterval: context.interval || 'custom'\n });\n }\n}\n","<form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n>\n <div\n class=\"dropdown flex-grow\"\n c8yDropdownDirection\n #dropDirection=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{\n (form.value.currentDateContextInterval === 'none'\n ? noFilterLabel\n : (date[0] | c8yDate: DATE_FORMAT) + ' — ' + (date[1] | c8yDate: DATE_FORMAT)\n ) | translate\n }}\"\n tooltip=\"{{\n (form.value.currentDateContextInterval === 'none'\n ? noFilterLabel\n : (date[0] | c8yDate: DATE_FORMAT) + ' — ' + (date[1] | c8yDate: DATE_FORMAT)\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"alarms-date-filter--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"alarms-date-filter--selected-time-range\"\n *ngIf=\"form.controls.currentDateContextInterval.value !== 'none'\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} — {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n [INTERVALS]=\"INTERVALS\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n class=\"m-b-8\"\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n class=\"m-b-8\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDateFilter(); dropdown.isOpen = false\"\n [disabled]=\"(form.pristine && form.untouched) || form.invalid\"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n</form>\n","import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IAlarm, IResultList } from '@c8y/client';\nimport {\n ColorService,\n IconDirective,\n ListGroupComponent,\n ListItemComponent,\n ListItemCheckboxComponent,\n EmptyStateComponent,\n C8yTranslateDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { AlarmDetails, AlarmEventSelectorService } from '@c8y/ngx-components/alarm-event-selector';\nimport { map, Subject, takeUntil } from 'rxjs';\nimport {\n BsDropdownDirective,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective\n} from 'ngx-bootstrap/dropdown';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgStyle } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n selector: 'c8y-alarms-type-filter',\n templateUrl: './alarms-type-filter.component.html',\n imports: [\n BsDropdownDirective,\n CdkTrapFocus,\n IconDirective,\n NgStyle,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective,\n ListGroupComponent,\n FormsModule,\n TooltipDirective,\n ListItemComponent,\n ListItemCheckboxComponent,\n EmptyStateComponent,\n C8yTranslateDirective,\n C8yTranslatePipe\n ]\n})\nexport class AlarmsTypeFilterComponent implements OnInit, OnDestroy, OnChanges {\n @Input()\n alarms: IResultList<IAlarm>;\n\n @Input()\n possibleFilters: AlarmDetails[] = [];\n\n @Input()\n activeFilters: AlarmDetails[] = [];\n\n @Output()\n onFilterChanged: EventEmitter<AlarmDetails[]> = new EventEmitter();\n\n customAlarmTypes: AlarmDetails[] = [];\n customAlarmTypeInput = '';\n\n readonly queryParamName = 'typeFilter';\n readonly STORAGE_ACCESS_KEY = 'customAlarmTypes';\n\n private destroy$ = new Subject<void>();\n private currentQueryParam = '';\n\n constructor(\n private alarmEventSelectorService: AlarmEventSelectorService,\n private activatedRoute: ActivatedRoute,\n private router: Router,\n private colorService: ColorService\n ) {}\n\n ngOnInit(): void {\n this.setQueryParameterObservable();\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes.alarms && changes.alarms.currentValue && this.activeFilters.length === 0) {\n await this.setPossibleFilters();\n this.applyFilterChange();\n }\n }\n\n setQueryParameterObservable() {\n this.activatedRoute.queryParams\n .pipe(\n map(params => {\n const alarms: AlarmDetails[] = this.possibleFilters;\n const possibleFilters = this.setActiveAlarmFiltersFromQueryParameter(\n alarms,\n params[this.queryParamName]\n );\n return possibleFilters;\n }),\n takeUntil(this.destroy$)\n )\n .subscribe((possibleFilters: AlarmDetails[]) => {\n this.possibleFilters = possibleFilters;\n this.applyFilterChange();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n toggleAlarmType(alarmType: AlarmDetails) {\n alarmType.__active = !alarmType.__active;\n }\n\n deselect(type: AlarmDetails) {\n const alarmFilter = this.possibleFilters.find(\n alarm => alarm.filters.type === type.filters.type\n );\n alarmFilter.__active = false;\n this.applyFilterChange();\n }\n\n deselectAll() {\n this.possibleFilters = this.possibleFilters.map(alarm => {\n return {\n ...alarm,\n __active: false\n };\n });\n this.applyFilterChange();\n }\n\n applyFilterChange() {\n const actives = this.possibleFilters.filter(\n (alarmFilter: AlarmDetails) => alarmFilter.__active\n );\n const newQueryParam = this.getQueryParams(actives);\n const hasChanged = newQueryParam !== this.currentQueryParam;\n if (hasChanged) {\n this.activeFilters = actives;\n this.onFilterChanged.emit(this.activeFilters);\n this.router.navigate([], {\n queryParams: {\n typeFilter: newQueryParam || null\n },\n queryParamsHandling: 'merge'\n });\n this.currentQueryParam = newQueryParam;\n }\n }\n\n resetFilters() {\n this.possibleFilters.forEach(possibleFilter => {\n possibleFilter.__active = this.activeFilters.some(\n (activeFilter: AlarmDetails) => activeFilter === possibleFilter\n );\n });\n }\n\n removeCustomAlarm(alarmDetails: AlarmDetails) {\n this.possibleFilters = this.possibleFilters.filter(filter => filter !== alarmDetails);\n this.storeCustomAlarmTypes();\n }\n\n confirmWithEnter(event: KeyboardEvent) {\n if (event.key === 'Enter') {\n this.addCustomAlarmType();\n }\n }\n\n async addCustomAlarmType() {\n if (!this.customAlarmTypeInput) {\n return;\n }\n this.possibleFilters.unshift({\n label: this.customAlarmTypeInput,\n color: await this.colorService.generateColor(this.customAlarmTypeInput),\n filters: {\n type: this.customAlarmTypeInput\n },\n timelineType: 'ALARM',\n __active: true,\n __target: null\n });\n this.customAlarmTypeInput = '';\n this.storeCustomAlarmTypes();\n }\n\n private storeCustomAlarmTypes() {\n const customTypes = this.possibleFilters.filter((filter: AlarmDetails) => !filter.__target);\n window.localStorage.setItem(this.STORAGE_ACCESS_KEY, JSON.stringify(customTypes));\n }\n\n private getCustomAlarmTypeFromStorage() {\n const types = window.localStorage.getItem(this.STORAGE_ACCESS_KEY);\n return types ? JSON.parse(types) : [];\n }\n\n private async setPossibleFilters() {\n const queryParameters = this.activatedRoute.snapshot.queryParamMap.get(this.queryParamName);\n const alarmTypesFromCurrentlyShownAlarms =\n await this.alarmEventSelectorService.getUniqueAlarmsOnly(this.alarms.data);\n const customAlarmTypesFromLocalStorage = this.getCustomAlarmTypeFromStorage();\n const selectableAlarmTypes = this.setActiveAlarmFiltersFromQueryParameter(\n [...customAlarmTypesFromLocalStorage, ...alarmTypesFromCurrentlyShownAlarms],\n queryParameters\n );\n this.possibleFilters = selectableAlarmTypes;\n }\n\n private setActiveAlarmFiltersFromQueryParameter(\n alarmFilters: AlarmDetails[],\n filterTypesQuery = ''\n ): AlarmDetails[] {\n const types = (filterTypesQuery ?? '').split(',');\n return alarmFilters.map((alarm: AlarmDetails) => ({\n ...alarm,\n __active: types.includes(alarm.filters.type)\n }));\n }\n\n private getQueryParams(activeFilters: AlarmDetails[]): string {\n return activeFilters.map(filter => filter.filters.type).join(',');\n }\n}\n","<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 @if (activeFilters.length > 0) {\n @for (filter of activeFilters; track $index) {\n <span\n class=\"tag tag--info chip\"\n style=\"max-width: 150px\"\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 <span\n class=\"text-truncate text-12 flex-grow\"\n [title]=\"filter.filters.type\"\n [attr.aria-label]=\"filter.filters.type\"\n >\n {{ filter.filters.type }}\n </span>\n </span>\n }\n } @else {\n <span class=\"text-nowrap\">\n {{ 'All alarm types' | translate }}\n </span>\n }\n </div>\n <div class=\"input-group-btn input-group-btn--last text-center\">\n @if (activeFilters.length) {\n <button\n class=\"btn-default btn\"\n [title]=\"'Clear filters' | translate\"\n (click)=\"deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n }\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=\"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 translate>The list below may not be complete.</strong>\n </p>\n <p>\n <span translate>\n Recent alarms are displayed below but older ones may not be shown.\n </span>\n <span translate>Optionally, you can add a custom alarm.</span>\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 type=\"text\"\n [placeholder]=\"'Custom alarm type' | translate\"\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 @for (alarmType of possibleFilters; track $index) {\n <c8y-li\n class=\"c8y-list__item__collapse--container-small cdk-drag\"\n style=\"cursor: pointer\"\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\n class=\"text-truncate text-12 flex-grow\"\n [title]=\"alarmType.label\"\n [attr.aria-label]=\"alarmType.label\"\n >\n {{ alarmType.label }}\n </span>\n @if (alarmType.__target === null) {\n <button\n class=\"btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"'Remove' | translate\"\n placement=\"top\"\n [delay]=\"500\"\n (click)=\"removeCustomAlarm(alarmType); $event.stopPropagation()\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n }\n </div>\n </c8y-li>\n }\n @if (possibleFilters.length === 0) {\n <c8y-li>\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 }\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","import { Component, HostListener, OnDestroy, OnInit, signal, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router, RouterOutlet } from '@angular/router';\nimport {\n AlarmQueryFilter,\n IAlarm,\n IResultList,\n SEVERITY_LABELS,\n SeverityFilter,\n SeverityType\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlarmWithChildrenRealtimeService,\n AlertService,\n ContextRouteService,\n DateTimeContext,\n ModalService,\n ViewContext,\n GainsightService,\n TitleComponent,\n ActionBarItemComponent,\n IconDirective,\n HelpComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { AlarmDetails } from '@c8y/ngx-components/alarm-event-selector';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n takeUntil,\n throttleTime\n} from 'rxjs/operators';\nimport { AlarmsIntervalRefreshComponent } from './alarms-interval-refresh.component';\nimport { AlarmsViewService } from './alarms-view.service';\nimport {\n AlarmListFormFilters,\n DEFAULT_SEVERITY_VALUES,\n PRODUCT_EXPERIENCE_ALARMS,\n ReloadAlarmsListType,\n THROTTLE_REALTIME_REFRESH\n} from './alarms.model';\nimport { AlarmsActivityTrackerService } from './alarms-activity-tracker.service';\nimport { NgIf, NgClass, AsyncPipe } from '@angular/common';\nimport { AlarmsFilterComponent } from './alarms-filter.component';\nimport { AlarmsDateFilterComponent } from './alarms-date-filter.component';\nimport { AlarmsTypeFilterComponent } from './alarms-type-filter.component';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { AlarmsListComponent } from './alarms-list.component';\n\n@Component({\n selector: 'c8y-alarms',\n templateUrl: './alarms.component.html',\n providers: [AlarmWithChildrenRealtimeService, AlarmsActivityTrackerService],\n imports: [\n NgIf,\n TitleComponent,\n ActionBarItemComponent,\n AlarmsFilterComponent,\n AlarmsDateFilterComponent,\n AlarmsTypeFilterComponent,\n IconDirective,\n TooltipDirective,\n NgClass,\n HelpComponent,\n AlarmsListComponent,\n AlarmsIntervalRefreshComponent,\n RouterOutlet,\n C8yTranslatePipe,\n AsyncPipe\n ]\n})\nexport class AlarmsComponent implements OnInit, OnDestroy {\n readonly NEW_REALTIME_ALARM_MESSAGE = this.alarmsViewService.REALTIME_UPDATE_ALARMS_MESSAGE;\n readonly TITLE = gettext('Alarms');\n readonly REFRESH_LABEL = gettext('Refresh');\n\n @ViewChild(AlarmsIntervalRefreshComponent)\n alarmIntervalRefreshComponent: AlarmsIntervalRefreshComponent;\n alarms$: BehaviorSubject<IResultList<IAlarm>> = new BehaviorSubject<IResultList<IAlarm>>(null);\n contextSourceId: number | string | null;\n /** responsible for showing either realtime button or intervals, based on 'refreshType' key in OptionsService */\n isIntervalRefresh: boolean;\n isLoading$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\n isRealtimeActive = new BehaviorSubject<boolean>(false);\n realtimeIconTitle: string;\n shouldShowIntervalToggle$ = new BehaviorSubject<boolean>(true);\n isRealtimeToggleOn = true;\n typeFilters: AlarmDetails[] = [];\n isDisabled = false;\n isListScrolled = signal(false);\n\n private destroy$: Subject<void> = new Subject<void>();\n private selectedSeverities = Object.keys(SEVERITY_LABELS) as SeverityType[];\n private severityOptions: SeverityFilter = DEFAULT_SEVERITY_VALUES;\n private showCleared = false;\n private readonly WAIT_TIME_AVOID_MULTIPLE_REQUEST_BY_PARAM_CHANGE = 100;\n private selectedDates: DateTimeContext;\n\n constructor(\n public activatedRoute: ActivatedRoute,\n private alarmsViewService: AlarmsViewService,\n private alarmWithChildrenRealtimeService: AlarmWithChildrenRealtimeService,\n private alertService: AlertService,\n private contextRouteService: ContextRouteService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private router: Router,\n private gainsightService: GainsightService,\n private alarmsActivityTrackerService: AlarmsActivityTrackerService\n ) {\n this.isIntervalRefresh = this.alarmsViewService.isIntervalRefresh();\n this.initializeContextSourceId();\n }\n\n ngOnInit() {\n this.alarmsActivityTrackerService.setupEventListenersForGainsight();\n this.alarmsActivityTrackerService.resetInactivityTimer();\n\n this.alarmsActivityTrackerService.isUserActive$\n .pipe(distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe(isActive =>\n isActive\n ? this.alarmsActivityTrackerService.setGainsightInterval()\n : this.alarmsActivityTrackerService.clearGainsightInterval()\n );\n\n const isInDetailView = !!this.activatedRoute.children[0]?.snapshot.params.id;\n if (isInDetailView) {\n this.changeInterval(false);\n }\n\n if (!this.isIntervalRefresh) {\n this.handleLegacyRealtime();\n }\n\n this.alarmsViewService.reloadAlarmsList$\n .pipe(\n debounceTime(this.WAIT_TIME_AVOID_MULTIPLE_REQUEST_BY_PARAM_CHANGE),\n takeUntil(this.destroy$)\n )\n .subscribe((value: ReloadAlarmsListType) => {\n this.updateAlarms(value);\n });\n if (this.isIntervalRefresh) {\n this.alarmsViewService.isIntervalEnabled$\n .pipe(\n takeUntil(this.destroy$),\n filter(() => !this.isListScrolled())\n )\n .subscribe(value => this.changeInterval(value));\n }\n this.alarmsViewService.closeDetailsView$.subscribe(\n async () => await this.alarmsViewService.closeDetailsView(this.activatedRoute)\n );\n }\n\n ngOnDestroy(): void {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS, {\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARMS,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.USER_SPEND_TIME_ON_COMPONENT,\n userSpendTime: this.alarmsViewService.convertSecondsToTime(\n this.alarmsActivityTrackerService.userSecondsSpendOnPage\n )\n });\n this.alarmsActivityTrackerService.clearGainsightInterval();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n @HostListener('document:visibilitychange')\n visibilityChange() {\n if (document.hidden) {\n this.alarmsActivityTrackerService.clearGainsightInterval();\n return;\n }\n this.alarmsActivityTrackerService.setGainsightInterval();\n }\n\n applyTypeFilters(typeFilters: AlarmDetails[]): void {\n this.typeFilters = typeFilters;\n setTimeout(() =>\n this.alarmsViewService.updateAlarmList(typeFilters.length > 0 ? 'gainsightTypeFilters' : null)\n );\n this.isRealtimeActive.next(false);\n }\n\n applyFormFilters({ severityOptions, showCleared, selectedDates }: AlarmListFormFilters): void {\n this.severityOptions = severityOptions;\n this.showCleared = showCleared;\n this.selectedDates = selectedDates;\n this.selectedSeverities = this.alarmsViewService.updateSelectedSeverities(this.severityOptions);\n this.alarmsViewService.updateAlarmList();\n this.isRealtimeActive.next(false);\n }\n\n async applyDateFilter(selectedDates: [Date, Date]): Promise<void> {\n this.alarms$.next(await this.alarmsViewService.retrieveAlarmsByDate(selectedDates));\n this.isRealtimeActive.next(false);\n }\n\n async clearAll(): Promise<void> {\n try {\n const translatedBody = this.translateService.instant(\n gettext('Do you really want to clear all alarms of selected severities?')\n );\n await this.modalService.confirm(\n gettext('Confirm clearing alarms?'),\n translatedBody,\n 'danger',\n {\n ok: gettext('Confirm'),\n cancel: gettext('Cancel')\n }\n );\n } catch {\n // modal canceled\n return;\n }\n\n await this.clearAlarms();\n\n this.alarmsViewService.closeDetailsView$.next();\n }\n\n refresh(): void {\n this.updateAlarms(null);\n this.isRealtimeActive.next(false);\n }\n\n changeInterval(value = true): void {\n this.shouldShowIntervalToggle$.next(value);\n }\n\n toggleRealtimeState(): void {\n this.isRealtimeToggleOn = !this.isRealtimeToggleOn;\n }\n\n private handleLegacyRealtime() {\n this.realtimeIconTitle = this.translateService.instant(gettext('Realtime active'));\n this.subscribeToRealtimeUpdates();\n }\n\n private async clearAlarms(): Promise<void> {\n try {\n const result = await this.alarmsViewService.clearAllActiveAlarms(\n this.selectedSeverities,\n this.contextSourceId\n );\n\n if (result.resolvedImmediately) {\n this.alertService.success(this.translateService.instant(gettext('Alarms cleared.')));\n this.refresh();\n } else {\n this.alertService.success(\n this.translateService.instant(gettext('Alarms are being cleared in background.'))\n );\n }\n } catch (error) {\n this.alertService.addServerFailure(error);\n }\n }\n\n private async getAlarms(): Promise<IResultList<IAlarm>> {\n try {\n this.isLoading$.next(true);\n\n const additionalFilter: Partial<AlarmQueryFilter> = {};\n\n if (this.contextSourceId) {\n (additionalFilter.source = this.contextSourceId),\n (additionalFilter.withSourceAssets = true),\n (additionalFilter.withSourceDevices = true);\n }\n\n if (this.typeFilters.length > 0) {\n additionalFilter.type = this.typeFilters.map(({ filters }) => filters.type).join(',');\n }\n\n return await this.alarmsViewService.retrieveFilteredAlarms(\n this.selectedSeverities,\n this.showCleared,\n this.selectedDates,\n additionalFilter\n );\n } catch (error) {\n if (error?.res?.status === 403) {\n this.isDisabled = true;\n return;\n }\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private async updateAlarms(value: ReloadAlarmsListType) {\n const alarms = await this.getAlarms();\n this.alarms$.next(alarms);\n if (value === 'gainsightTypeFilters') {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS, {\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARMS_TYPE_FILTER,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.APPLY_TYPE_FILTER,\n alarmsCount: alarms.data.length\n });\n }\n }\n\n private subscribeToRealtimeUpdates(): void {\n this.alarmWithChildrenRealtimeService\n .onAll$(this.contextSourceId)\n .pipe(\n takeUntil(this.destroy$),\n throttleTime(THROTTLE_REALTIME_REFRESH, undefined, { trailing: true })\n )\n .subscribe(() => {\n if (this.isRealtimeToggleOn) {\n this.refresh();\n } else {\n this.isRealtimeActive.next(true);\n }\n });\n }\n\n private initializeContextSourceId(): void {\n const routeContext = this.contextRouteService.getContextData(this.activatedRoute);\n if (!routeContext) {\n return;\n }\n const { context, contextData } = routeContext;\n if (\n [ViewContext.Device, ViewContext.Group, ViewContext.Service, ViewContext.Simulators].includes(\n context\n )\n ) {\n this.contextSourceId = contextData?.id;\n }\n }\n}\n","<ng-container *ngIf=\"(activatedRoute.data | async)?.title\">\n <c8y-title>{{ TITLE | translate }}</c8y-title>\n</ng-container>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form min-width-fit\"\n>\n <c8y-alarms-filter\n class=\"d-block fit-w\"\n [contextSourceId]=\"contextSourceId\"\n (onFilterApplied)=\"applyFormFilters($event)\"\n ></c8y-alarms-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form min-width-fit\"\n>\n <c8y-alarms-date-filter (dateFilterChange)=\"applyFormFilters($event)\"></c8y-alarms-date-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <c8y-alarms-type-filter\n class=\"d-block fit-w\"\n [alarms]=\"alarms$ | async\"\n (onFilterChanged)=\"applyTypeFilters($event)\"\n ></c8y-alarms-type-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"0\"\n>\n <button\n class=\"btn btn-link\"\n [title]=\"'Clear all alarms' | translate\"\n type=\"button\"\n (click)=\"clearAll()\"\n data-cy=\"c8y-alarms-view--clear-all-button\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear all`alarms`' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<!--Realtime button-->\n<ng-template #realtimeRefresh>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"\n (isRealtimeActive | async)\n ? (NEW_REALTIME_ALARM_MESSAGE | translate)\n : (REFRESH_LABEL | translate)\n \"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"isLoading$ | async\"\n (click)=\"refresh()\"\n >\n <span\n class=\"tag tag--info m-r-8\"\n *ngIf=\"isRealtimeActive | async\"\n >\n {{ 'New alarms' | translate }}\n </span>\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading$ | async }\"\n ></i>\n </button>\n <button\n class=\"c8y-realtime btn btn-default btn-sm\"\n [attr.aria-label]=\"realtimeIconTitle\"\n [tooltip]=\"realtimeIconTitle\"\n placement=\"bottom\"\n type=\"button\"\n data-cy=\"c8y-alarms--realtime-button\"\n [container]=\"'body'\"\n (click)=\"toggleRealtimeState()\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{\n active: isRealtimeToggleOn,\n inactive: !isRealtimeToggleOn\n }\"\n ></span>\n </button>\n </div>\n</ng-template>\n\n<c8y-help\n src=\"/docs/device-management-application/monitoring-and-controlling-devices/#working-with-alarms\"\n></c8y-help>\n\n<div class=\"card content-fullpage split-view--5-7 grid__row--1\">\n <c8y-alarms-list\n class=\"d-contents\"\n [isInitialLoading]=\"isLoading$ | async\"\n [alarms]=\"alarms$ | async\"\n [typeFilters]=\"typeFilters\"\n (onScrollingStateChange)=\"changeInterval(!$event); isListScrolled.set($event)\"\n (onSelectedAlarm)=\"changeInterval(false)\"\n [splitView]=\"true\"\n [hasPermissions]=\"!isDisabled\"\n >\n <ng-container *ngIf=\"isIntervalRefresh; else realtimeRefresh\">\n <c8y-alarms-interval-refresh\n [alarmsListLoading$]=\"isLoading$\"\n [isIntervalToggleEnabled]=\"shouldShowIntervalToggle$ | async\"\n (onCountdownEnded)=\"refresh()\"\n [isDisabled]=\"isDisabled\"\n ></c8y-alarms-interval-refresh>\n </ng-container>\n </c8y-alarms-list>\n\n <router-outlet class=\"d-contents\"></router-outlet>\n</div>\n","import { Routes } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ContextRouteComponent,\n ContextRouteGuard,\n Route,\n RouterTabsResolver,\n ViewContext,\n ViewContextRootRoute\n} from '@c8y/ngx-components';\nimport { AlarmEmptyComponent } from './alarm-empty.component';\nimport { AlarmInfoComponent } from './alarm-info.component';\n\nexport function getViewContextRoutes(contexts: ViewContext[]): Routes {\n return contexts.map(context => ({\n context,\n path: 'details',\n icon: 'bell',\n label: gettext('Details'),\n component: AlarmInfoComponent,\n tabsOutlet: 'alarms'\n }));\n}\n\nexport function getChildrenForViewContext(context: ViewContext): Routes {\n return [\n {\n path: '',\n component: AlarmEmptyComponent,\n label: gettext('Alarms')\n },\n {\n path: ':id',\n rootContext: context,\n component: ContextRouteComponent,\n canActivate: [ContextRouteGuard],\n data: { context, contextData: {} },\n resolve: {\n tabs: RouterTabsResolver\n }\n }\n ] as Array<Route | ViewContextRootRoute>;\n}\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { TitleCasePipe } from '@angular/common';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport {\n CommonModule,\n CoreModule,\n DynamicComponentModule,\n HeaderModule,\n RelativeTimePipe,\n hookNavigator,\n hookRoute,\n C8yTranslateModule\n} from '@c8y/ngx-components';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AlarmDetailsComponent } from './alarm-details.component';\nimport { AlarmEmptyComponent } from './alarm-empty.component';\nimport { AlarmInfoComponent } from './alarm-info.component';\nimport { AlarmSeveritiesToTitlePipe } from './alarm-severities-to-title.pipe';\nimport { AlarmSeverityToIconPipe } from './alarm-severity-to-icon.pipe';\nimport { AlarmSeverityToLabelPipe } from './alarm-severity-to-label.pipe';\nimport { AlarmStatusToIconPipe } from './alarm-status-to-icon.pipe';\nimport { AlarmStatusToLabelPipe } from './alarm-status-to-label.pipe';\nimport { AlarmsFilterComponent } from './alarms-filter.component';\nimport { AlarmsIconComponent } from './alarms-icon.component';\nimport { AlarmsIntervalRefreshComponent } from './alarms-interval-refresh.component';\nimport { AlarmsListComponent } from './alarms-list.component';\nimport { AlarmsComponent } from './alarms.component';\nimport { ALARMS_MODULE_CONFIG, AlarmsModuleConfig } from './alarms.model';\nimport { AuditChangesMessagePipe } from './audit-changes-message.pipe';\nimport { smartRulesUpgradeServiceProvider } from './ng1-smart-rules-upgrade.service';\nimport { AlarmEventSelectorModule } from '@c8y/ngx-components/alarm-event-selector';\nimport { AlarmsTypeFilterComponent } from './alarms-type-filter.component';\nimport { AlarmListIndicatorPipe } from './alarm-list-custom-indicator/alarm-list-indicator.pipe';\nimport { AlarmDetailsButtonPipe } from './alarm-details-custom-button/alarm-details-button.pipe';\nimport { AlarmsDateFilterComponent } from './alarms-date-filter.component';\nimport { IntervalPickerComponent } from '@c8y/ngx-components/interval-picker';\n\nconst defaultAlarmsConfig: AlarmsModuleConfig = {\n hybrid: true\n};\n\n@NgModule({\n exports: [AlarmsComponent, AlarmsListComponent, AlarmsFilterComponent, AlarmsDateFilterComponent],\n providers: [\n TitleCasePipe,\n RelativeTimePipe,\n {\n provide: ALARMS_MODULE_CONFIG,\n useValue: defaultAlarmsConfig\n }\n ],\n imports: [\n A11yModule,\n BsDropdownModule,\n CommonModule,\n CoreModule,\n HeaderModule,\n PopoverModule,\n TooltipModule.forRoot(),\n C8yTranslateModule,\n RouterModule,\n AlarmEventSelectorModule,\n RouterModule,\n AlarmListIndicatorPipe,\n AlarmDetailsButtonPipe,\n AlarmSeverityToIconPipe,\n DynamicComponentModule,\n IntervalPickerComponent,\n AlarmDetailsComponent,\n AlarmInfoComponent,\n AlarmsComponent,\n AlarmSeveritiesToTitlePipe,\n AlarmsFilterComponent,\n AlarmsIconComponent,\n AlarmsIntervalRefreshComponent,\n AlarmsListComponent,\n AlarmStatusToIconPipe,\n AuditChangesMessagePipe,\n AlarmSeverityToLabelPipe,\n AlarmStatusToLabelPipe,\n AlarmEmptyComponent,\n AlarmsDateFilterComponent,\n AlarmsTypeFilterComponent\n ]\n})\nexport class AlarmsModule {\n static config(config: AlarmsModuleConfig = {}): ModuleWithProviders<AlarmsModule> {\n const alarmsConfig: AlarmsModuleConfig = { ...defaultAlarmsConfig, ...config };\n return {\n ngModule: AlarmsModule,\n providers: [\n ...(alarmsConfig.hybrid ? [smartRulesUpgradeServiceProvider] : []),\n hookNavigator(alarmsConfig.rootNavigatorNode),\n hookRoute(alarmsConfig.route),\n {\n provide: ALARMS_MODULE_CONFIG,\n useValue: alarmsConfig\n }\n ]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i1.AlarmDetailsButtonService","i2","i3","i4","i1.AlarmDetailsService","i4.Ng1SmartRulesUpgradeService","i5","i6.AlarmsViewService","i7.AlarmsActivityTrackerService","i3.AlarmsViewService","i1.AlarmListIndicatorService","i2.AlarmsViewService","takeUntil","map","i5.AlarmsActivityTrackerService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-alarms.mjs","sources":["../../alarms/alarm-details-custom-button/alarm-details-button.service.ts","../../alarms/alarm-details-custom-button/alarm-details-button.pipe.ts","../../alarms/alarm-details.service.ts","../../alarms/alarms.model.ts","../../alarms/ng1-smart-rules-upgrade.service.ts","../../alarms/alarms-view.service.ts","../../alarms/alarms-activity-tracker.service.ts","../../alarms/alarm-severity-to-icon.pipe.ts","../../alarms/alarm-status-to-icon.pipe.ts","../../alarms/audit-changes-message.pipe.ts","../../alarms/alarm-details.component.ts","../../alarms/alarm-details.component.html","../../alarms/alarm-empty.component.ts","../../alarms/alarm-empty.component.html","../../alarms/alarm-info.component.ts","../../alarms/alarm-info.component.html","../../alarms/alarm-list-custom-indicator/alarm-list-indicator.service.ts","../../alarms/alarm-list-custom-indicator/alarm-list-indicator.pipe.ts","../../alarms/alarm-severities-to-title.pipe.ts","../../alarms/alarm-severity-to-icon-class.pipe.ts","../../alarms/alarm-severity-to-label.pipe.ts","../../alarms/alarm-status-to-label.pipe.ts","../../alarms/alarms-filter.component.ts","../../alarms/alarms-filter.component.html","../../alarms/alarms-icon.component.ts","../../alarms/alarms-icon.component.html","../../alarms/alarms-interval-refresh.component.ts","../../alarms/alarms-interval-refresh.component.html","../../alarms/alarms-list.component.ts","../../alarms/alarms-list.component.html","../../alarms/alarms-date-filter.component.ts","../../alarms/alarms-date-filter.component.html","../../alarms/alarms-type-filter.component.ts","../../alarms/alarms-type-filter.component.html","../../alarms/alarms.component.ts","../../alarms/alarms.component.html","../../alarms/alarms.helper.ts","../../alarms/alarms.module.ts","../../alarms/c8y-ngx-components-alarms.ts"],"sourcesContent":["import { IAlarm, IManagedObject } from '@c8y/client';\nimport { combineLatest, Observable } from 'rxjs';\nimport { filter, map, startWith, switchMap } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { PluginsResolveService, ServiceRegistry } from '@c8y/ngx-components';\nimport { AlarmDetailsButton } from '../alarms.model';\nimport { sortBy } from 'lodash-es';\n\n@Injectable({ providedIn: 'root' })\n/**\n * A service to retrieve custom buttons for the alarm details view.\n */\nexport class AlarmDetailsButtonService {\n constructor(\n private serviceRegistry: ServiceRegistry,\n private pluginsResolver: PluginsResolveService\n ) {}\n\n get$(alarm: IAlarm, source: IManagedObject): Observable<AlarmDetailsButton[]> {\n const providers$ = this.pluginsResolver.allPluginsLoaded$.pipe(\n filter(Boolean),\n map(() => {\n return this.serviceRegistry.get('alarmDetailsButton');\n })\n );\n\n return providers$.pipe(\n switchMap(providers => {\n const observables$ = providers.map(provider =>\n provider.getAlarmDetailsButton$(alarm, source).pipe(startWith(false))\n );\n return combineLatest(observables$);\n }),\n map(indicators => {\n return indicators.filter(Boolean) as AlarmDetailsButton[];\n }),\n map(indicators => sortBy(indicators, this.byPriority))\n );\n }\n\n private byPriority(item: AlarmDetailsButton) {\n if (item.priority === undefined) {\n return 0;\n }\n return -item.priority;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { IAlarm, IManagedObject } from '@c8y/client';\nimport { Observable } from 'rxjs';\nimport { AlarmDetailsButtonService } from './alarm-details-button.service';\nimport { AlarmDetailsButton } from '../alarms.model';\n\n@Pipe({\n standalone: true,\n name: 'alarmDetailsButton',\n pure: true\n})\n/**\n * A pipe to provide custom buttons for the alarm details view.\n *\n * Will call `get$()` method of `AlarmDetailsButtonService` to get the custom buttons for the provided alarm.\n */\nexport class AlarmDetailsButtonPipe implements PipeTransform {\n constructor(private alarmDetailsButtonService: AlarmDetailsButtonService) {}\n\n transform(alarm: IAlarm, source: IManagedObject): Observable<AlarmDetailsButton[]> {\n return this.alarmDetailsButtonService.get$(alarm, source);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AlarmStatus, AlarmStatusType, IAuditRecord, IChange } from '@c8y/client';\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AlarmDetailsService {\n private readonly STATUS_ATTRIBUTE = 'status';\n\n constructor(private permissions: Permissions) {}\n\n /**\n * Retrieves the username of the user who acknowledged an alarm status.\n *\n * This method checks if the provided status is equal to the acknowledged\n * status. If it is not, or if the\n * audit log is empty or the first log item does not contain a user, the\n * method returns a default value ('--').\n *\n * If the status is the acknowledged status and the audit log contains valid\n * records, the method iterates over the audit records in reverse order\n * (starting from the most recent). It finds the first record where the\n * status attribute (defined by this.STATUS_ATTRIBUTE) has been changed to\n * the acknowledged status. The method then returns the username of the user\n * who made this change.\n *\n * If no such change is found in the audit records, it returns the username\n * from the first record of the audit log.\n *\n * There can be multiple audit logs with ACKNOWLEDGED status.\n *\n * @param status - The current status of the alarm.\n * @param auditLog - An array of audit records to process.\n * @returns The username of the user who acknowledged the status\n * or '--' if the status is not acknowledged or audit log is invalid.\n */\n getAcknowledgedBy(status: AlarmStatusType, auditLog: IAuditRecord[]): string {\n let acknowledgedBy = '--';\n\n if (status !== AlarmStatus.ACKNOWLEDGED || !auditLog || !auditLog[0]?.user) {\n return acknowledgedBy;\n }\n\n acknowledgedBy = auditLog[0].user;\n\n return auditLog.reduceRight((acc, auditLogItem) => {\n const changes = Array.from(auditLogItem.changes || []);\n const acknowledgedStatusChange = changes.find(\n (change: IChange) =>\n change.attribute === this.STATUS_ATTRIBUTE && change.newValue === AlarmStatus.ACKNOWLEDGED\n );\n return (acknowledgedStatusChange && auditLogItem.user) || acc;\n }, acknowledgedBy);\n }\n\n /**\n * Calculates the acknowledge time from a list of audit records.\n *\n * This method iterates over the provided audit records in reverse order\n * (starting from the most recent) and finds the first record where a\n * specific status attribute (defined by this.STATUS_ATTRIBUTE) has been\n * acknowledged. It then returns the creation time of that record.\n *\n * If no such record is found, the method returns the creation time of the\n * first audit record. If the audit record list is empty, it returns null.\n *\n * There can be multiple audit logs with ACKNOWLEDGED status.\n *\n * @param auditLog - An array of audit records to process.\n * @returns The creation time of the acknowledged record,\n * the creation time of the first record if no acknowledged record is found,\n * or null if the audit log is empty.\n */\n getAcknowledgeTime(auditLog: IAuditRecord[]): string | null {\n const initialValue = auditLog.length ? auditLog[0].creationTime : null;\n\n return auditLog.reduceRight((acc, auditLogItem) => {\n const changes = Array.from(auditLogItem.changes || []);\n const acknowledgedStatusChange = changes.find(\n (change: IChange) =>\n change.attribute === this.STATUS_ATTRIBUTE && change.newValue === AlarmStatus.ACKNOWLEDGED\n );\n return acknowledgedStatusChange ? auditLogItem.creationTime : acc;\n }, initialValue);\n }\n\n /**\n * Retrieves the end time of an event from an audit log.\n *\n * The method processes the provided audit log to find the first instance\n * (starting from the most recent record) where the status was changed to 'CLEARED'.\n * It iterates over the audit records and\n * checks the changes in each record to find this status change.\n *\n * If a record with the CLEARED status is found, the method returns the creation time\n * of that record. If the entire audit log is processed without finding a CLEARED status,\n * the creation time of the first audit log record is returned.\n *\n * If the audit log is empty or null, the method returns null.\n *\n * There can be only one audit log with CLEARED status.\n *\n * @param auditLog - An array of audit records to process.\n * @returns The creation time of the record with the CLEARED status,\n * the creation time of the first record if no CLEARED status is found,\n * or null if the audit log is empty or null.\n */\n getEndTime(auditLog: IAuditRecord[]): string | null {\n if (!auditLog || auditLog.length === 0) {\n return null;\n }\n\n let latestClearedAuditTime = null;\n\n for (const auditLogItem of auditLog) {\n const changes = Array.from(auditLogItem.changes || []);\n const clearedStatusChange = changes.find(\n change =>\n change.attribute === this.STATUS_ATTRIBUTE && change.newValue === AlarmStatus.CLEARED\n );\n\n if (clearedStatusChange) {\n if (!latestClearedAuditTime || auditLogItem.creationTime > latestClearedAuditTime) {\n latestClearedAuditTime = auditLogItem.creationTime;\n }\n }\n }\n\n return latestClearedAuditTime || auditLog[0].creationTime;\n }\n\n checkIfHasAnyRoleAllowingToCreateSmartRule(): boolean {\n const ROLES_ALLOWING_SMART_RULE_CREATION = [\n [\n Permissions.ROLE_INVENTORY_ADMIN,\n Permissions.ROLE_INVENTORY_CREATE,\n Permissions.ROLE_MANAGED_OBJECT_ADMIN,\n Permissions.ROLE_MANAGED_OBJECT_CREATE\n ],\n [Permissions.ROLE_CEP_MANAGEMENT_ADMIN, Permissions.ROLE_SMARTRULE_ADMIN]\n ];\n\n return (\n this.permissions.hasAnyRole(ROLES_ALLOWING_SMART_RULE_CREATION[0]) &&\n this.permissions.hasAnyRole(ROLES_ALLOWING_SMART_RULE_CREATION[1])\n );\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport {\n AlarmStatus,\n AlarmStatusSettings,\n AlarmStatusType,\n IAlarm,\n IManagedObject,\n Severity,\n SeverityFilter,\n SeverityType\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { DateTimeContext, NavigatorNode, NavigatorNodeData, Route } from '@c8y/ngx-components';\nimport { QueryParamsHandling } from '@angular/router';\nimport type { SupportedIcons } from '@c8y/ngx-components/icon-selector/icons';\nimport { Observable } from 'rxjs';\nimport {\n INTERVALS,\n INTERVAL_TITLES,\n AlarmFilterInterval\n} from '@c8y/ngx-components/interval-picker';\n\nexport interface AlarmsModuleConfig {\n /**\n * Indicates whether the application is a combination of Angular and AngularJS.\n * @optional\n */\n hybrid?: boolean;\n\n /**\n * The root node of the navigator, which can be either a `NavigatorNode` or `NavigatorNodeData`.\n * This serves as the entry point for navigation structure for Alarms views.\n * @optional\n */\n rootNavigatorNode?: NavigatorNode | NavigatorNodeData;\n\n /**\n * An array of `Route` objects representing the navigation routes available.\n * Each route defines a navigation path and its associated components related to Alarms.\n * @optional\n */\n route?: Route[];\n}\n\nexport const ALARMS_MODULE_CONFIG = new InjectionToken('AlarmsModuleConfig');\n\nexport type AlarmCount = { [key in SeverityType]: number };\n\nexport const ALARM_STATUS_ICON = {\n ALERT_IDLE: 'c8y-alert-idle',\n BELL_SLASH: 'bell-slash',\n BELL: 'bell'\n} as const;\n\nexport type AlarmStatusIcon = (typeof ALARM_STATUS_ICON)[keyof typeof ALARM_STATUS_ICON];\n\n/**\n * A lookup table to map alarm statuses to corresponding icons.\n */\nexport const AlarmIconMap: Record<AlarmStatusType, AlarmStatusIcon> = {\n [AlarmStatus.CLEARED]: ALARM_STATUS_ICON.ALERT_IDLE,\n [AlarmStatus.ACKNOWLEDGED]: ALARM_STATUS_ICON.BELL_SLASH,\n [AlarmStatus.ACTIVE]: ALARM_STATUS_ICON.BELL\n} as const;\n\nexport const ALARM_SEVERITY_ICON = {\n CIRCLE: 'circle',\n HIGH_PRIORITY: 'high-priority',\n WARNING: 'warning',\n EXCLAMATION_CIRCLE: 'exclamation-circle'\n} as const;\n\nexport const HELP_ICON = 'help';\n\nexport type AlarmSeverityIcon = (typeof ALARM_SEVERITY_ICON)[keyof typeof ALARM_SEVERITY_ICON];\n/**\n * A lookup table to map alarm severity types to corresponding icons.\n */\nexport const ALARM_SEVERITY_ICON_MAP: Record<SeverityType, AlarmSeverityIcon> = {\n [Severity.CRITICAL]: ALARM_SEVERITY_ICON.EXCLAMATION_CIRCLE,\n [Severity.MAJOR]: ALARM_SEVERITY_ICON.WARNING,\n [Severity.MINOR]: ALARM_SEVERITY_ICON.HIGH_PRIORITY,\n [Severity.WARNING]: ALARM_SEVERITY_ICON.CIRCLE\n} as const;\n\nexport type AlarmListFormFilters = {\n showCleared: boolean;\n severityOptions: SeverityFilter;\n selectedDates?: DateTimeContext;\n};\n\n/**\n * Extended interval titles with an additional title for the case when no date is selected.\n */\nexport const INTERVAL_TITLES_EXTENDED: Record<AlarmFilterInterval['id'], string> = {\n ...INTERVAL_TITLES,\n none: gettext('No date filter')\n};\n\nexport const INTERVALS_EXTENDED: AlarmFilterInterval[] = [\n {\n id: 'none',\n title: gettext('No date filter')\n },\n ...INTERVALS\n];\n\nexport type WidgetTimeContextStateExtended = {\n date: DateTimeContext;\n interval: AlarmFilterInterval['id'];\n};\n\nexport type SelectedAlarm = IAlarm | null;\n\nexport const DEFAULT_ALARM_COUNTS: AlarmCount = { CRITICAL: 0, MAJOR: 0, MINOR: 0, WARNING: 0 };\n\nexport const DEFAULT_SEVERITY_VALUES: SeverityFilter = {\n [Severity.CRITICAL]: true,\n [Severity.MAJOR]: true,\n [Severity.MINOR]: true,\n [Severity.WARNING]: true\n};\n\nexport const DEFAULT_STATUS_VALUES: AlarmStatusSettings = {\n [AlarmStatus.ACTIVE]: true,\n [AlarmStatus.ACKNOWLEDGED]: true,\n [AlarmStatus.CLEARED]: true\n};\n\nexport const ALARMS_PATH = 'alarms';\n\nexport type CustomFragment = {\n [key: string]: unknown;\n};\n\n/**\n * Default properties of a alarm. Used to extract the custom properties from a Alarm object.\n */\nexport const ALARM_DEFAULT_PROPERTIES = [\n 'severity',\n 'source',\n 'type',\n 'time',\n 'text',\n 'id',\n 'status',\n 'count',\n 'name',\n 'history',\n 'self',\n 'creationTime',\n 'firstOccurrenceTime',\n 'lastUpdated'\n] as const satisfies ReadonlyArray<keyof IAlarm>;\n\nexport const THROTTLE_REALTIME_REFRESH = 1_000;\n\n/**\n * Represents the navigation options for an alarm component.\n */\nexport type AlarmNavigationOptions = {\n /**\n * Defines if the alarm should navigate to a detail view when clicked.\n */\n allowNavigationToAlarmsView: boolean;\n /**\n * Defines if the component should try to determine the context to navigate\n * to the correct alarm detail view or not. If set to true, the component will\n * not try to determine the context and will always navigate to the all alarms view.\n */\n alwaysNavigateToAllAlarms: boolean;\n /**\n * Defines if the cleared query parameter should be included in the navigation if\n * the alarm is cleared.\n */\n includeClearedQueryParams: boolean;\n /**\n * Determines how query parameters should be handled during navigation.\n * This property can be set to one of three values:\n *\n * - `\"merge\"` : Merge new parameters with current parameters.\n * - `\"preserve\"` : Preserve current parameters.\n * - `\"\"` : Replace current parameters with new parameters. This is the default behavior.\n */\n queryParamsHandling: QueryParamsHandling;\n};\n\nexport interface AlarmDetailsButton {\n additionalButtonClasses?: string;\n title: string;\n icon: SupportedIcons;\n additionalIconClasses?: string;\n label?: string;\n disabled?: boolean;\n /**\n * Action to be executed when the button is clicked.\n * @param alarm The alarm to apply this action to\n * @returns A boolean or a promise that resolves to a boolean or to the updated alarm. If the result is true, a reload will be triggered. If the result is an alarm, the alarm will be updated with the new values.\n */\n action: (alarm: IAlarm) => boolean | Promise<boolean | IAlarm>;\n priority?: number;\n}\n\nexport interface AlarmListIndicatorBase {\n priority?: number;\n}\n\nexport interface AlarmListIndicatorIcon extends AlarmListIndicatorBase {\n icon: SupportedIcons;\n title: string;\n class?: string;\n}\n\nexport type AlarmListIndicator = AlarmListIndicatorIcon;\n\nexport const PRODUCT_EXPERIENCE_ALARMS = {\n EVENTS: {\n ALARMS: 'Alarms'\n },\n COMPONENTS: {\n ALARMS_FILTER: 'alarms-filter',\n ALARMS_INTERVAL_REFRESH: 'alarms-interval-refresh',\n ALARMS: 'alarms',\n ALARMS_TYPE_FILTER: 'alarms-type-filter',\n ALARM_DETAILS: 'alarm-details'\n },\n ACTIONS: {\n APPLY_FILTER: 'applyFilter',\n REMOVE_CHIP_FILTER: 'removeChipFilter',\n APPLY_TYPE_FILTER: 'applyTypeFilter',\n CREATE_SMART_RULE: 'createSmartRule',\n ACKNOWLEDGE_ALARM: 'acknowledgeAlarm',\n REACTIVATE_ALARM: 'reactivateAlarm',\n CLEAR_ALARM: 'clearAlarm',\n RELOAD_AUDIT_LOGS: 'reloadAuditLogs',\n USER_SPEND_TIME_ON_COMPONENT: 'userSpendTimeOnComponent'\n }\n} as const;\n\nexport type ReloadAlarmsListType = 'gainsightTypeFilters' | null;\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace CumulocityServiceRegistry {\n interface SpecificExtensionKeys {\n alarmDetailsButton: AlarmDetailsButtonProvider;\n alarmListIndicator: AlarmListIndicatorProvider;\n }\n\n interface AlarmDetailsButtonProvider {\n /**\n * Determines whether the button should be shown for a given alarm.\n * @param alarm The alarm for which to determine button visibility.\n * @param source The managed object associated with the alarm.\n * @returns The button details or false.\n */\n getAlarmDetailsButton$(\n alarm: IAlarm,\n source: IManagedObject\n ): Observable<AlarmDetailsButton | false>;\n }\n\n interface AlarmListIndicatorProvider {\n /**\n * Determines whether the indicator should be shown for a given alarm.\n * @param alarm The alarm for which to determine indicator visibility.\n * @returns The indicator details or false.\n */\n getAlarmListIndicator$(alarm: IAlarm): Observable<AlarmListIndicator | false>;\n }\n }\n}\n","/**\n * This service is a duplicate of smart-rules-service with slight name change.\n * Duplicating allows to pass 'Verify App tutorial' job.\n * Name renames allows to pass 'Reusable build codex' job.\n * Overall this service is considered as a workaround.\n * In ticket MTM-58985 we will investigate if it's possible to remove this service\n * along with making failing jobs pass.\n */\nexport abstract class Ng1SmartRulesUpgradeService {\n abstract permissionsCfgs;\n abstract addNewForOutputOperationWithUI(operation);\n abstract addNewForInputAlarmAndOutputUserWithUI(alarm, user);\n}\n\nexport function SmartRulesUpgradeServiceFactory(injector: any) {\n return injector.get('smartRulesSvc');\n}\n\nexport const smartRulesUpgradeServiceProvider = {\n provide: Ng1SmartRulesUpgradeService,\n useFactory: SmartRulesUpgradeServiceFactory,\n deps: ['$injector']\n};\n","import { Injectable } from '@angular/core';\nimport { ActivatedRoute, ActivatedRouteSnapshot, Router } from '@angular/router';\nimport {\n ALARM_STATUS_LABELS,\n AlarmQueryFilter,\n AlarmService,\n AlarmStatus,\n AlarmStatusType,\n IAlarm,\n IResultList,\n Severity,\n SeverityFilter,\n SeverityType\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ApplicationOptions,\n ContextData,\n ContextRouteService,\n DateTimeContext,\n OptionsService,\n ViewContext\n} from '@c8y/ngx-components';\nimport { DateTimeContextPickerService, TimeInterval } from '@c8y/ngx-components/global-context';\nimport { AlarmFilterInterval } from '@c8y/ngx-components/interval-picker';\nimport { Observable, Subject } from 'rxjs';\nimport { ALARMS_PATH, ReloadAlarmsListType } from './alarms.model';\n\n/**\n * Service for managing and retrieving alarms data within the alarms view.\n *\n * The `AlarmsViewService` provides functionality to interact with alarms,\n * including filtering, counting, and translation-related operations in an alarms view.\n *\n * This service relies on the `AlarmService` for fetching alarm data and the `OptionsService`\n * for configuring alarms view options.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AlarmsViewService {\n readonly ALARM_REFRESH_TYPE_KEY: keyof ApplicationOptions = 'alarmsRefreshType';\n readonly DEFAULT_INTERVAL_VALUE = 30_000;\n readonly DEFAULT_REFRESH_OPTION_VALUE = 'interval';\n readonly DEFAULT_INTERVAL_VALUES = [5_000, 10_000, 15_000, 30_000, 60_000];\n readonly REALTIME_UPDATE_ALARMS_MESSAGE = gettext('The list was updated, click to refresh.');\n\n isIntervalEnabled$: Observable<boolean>;\n reloadAlarmsList$ = new Subject<ReloadAlarmsListType>();\n closeDetailsView$ = new Subject<void>();\n\n private _isIntervalEnabled: Subject<boolean>;\n\n constructor(\n private alarmService: AlarmService,\n private optionsService: OptionsService,\n private dateTimeContextPickerService: DateTimeContextPickerService,\n private router: Router,\n private contextRouteService: ContextRouteService\n ) {\n if (this.isIntervalRefresh()) {\n this._isIntervalEnabled = new Subject<boolean>();\n this.isIntervalEnabled$ = this._isIntervalEnabled.asObservable();\n }\n }\n\n /**\n * Emits a subject to initialize the alarms reloading.\n */\n updateAlarmList(value: ReloadAlarmsListType = null): void {\n this.reloadAlarmsList$.next(value);\n }\n\n /**\n * Retrieves a list of alarms filtered by specified severities and other optional query filters.\n *\n * @param severities an array of severities to filter the alarms.\n * @param showCleared flag indicating whether to show cleared alarms. Defaults to false.\n * @param selectedDates an array of two dates to filter alarms by creation and last update dates.\n * @param filter additional query filters for retrieving alarms.\n *\n * @returns A promise that resolves to a list of alarms satisfying the specified filters.\n */\n retrieveFilteredAlarms(\n severities: SeverityType[],\n showCleared = false,\n selectedDates?: [Date, Date],\n filter?: AlarmQueryFilter\n ): Promise<IResultList<IAlarm>> {\n const severitiesQuery = this.getSeverityQueryParameter(severities);\n const statusesQuery = this.getStatusQueryParameter(showCleared);\n\n const _filter: AlarmQueryFilter = {\n pageSize: 50,\n withTotalPages: true,\n ...(severitiesQuery && { severity: severitiesQuery }),\n ...(statusesQuery && { status: statusesQuery }),\n ...(selectedDates && {\n lastUpdatedFrom: selectedDates[0].toISOString(),\n createdTo: selectedDates[1].toISOString()\n }),\n ...filter\n };\n return this.alarmService.list(_filter);\n }\n\n retrieveAlarmsByDate(dates: DateTimeContext) {\n return this.alarmService.list({\n lastUpdatedFrom: dates[0].toISOString(),\n createdTo: dates[1].toISOString(),\n pageSize: 50,\n withTotalPages: true\n });\n }\n\n /**\n * Updates the state to enable or disable intervals.\n * @param value - A boolean value to indicate whether to enable intervals.\n */\n updateIntervalState(value: boolean): void {\n this._isIntervalEnabled?.next(value);\n }\n\n /**\n * Fetches the count of alarms filtered by severity and clearance status.\n *\n * @param severity - The severity level to filter by (e.g., CRITICAL, MAJOR, etc.).\n * @param showCleared - Whether or not to include cleared alarms in the count.\n * @param filter - Additional filter criteria for alarms.\n *\n * @returns A promise that resolves to the number of alarms that match the filter criteria.\n *\n */\n async getAlarmsCountBySeverity(\n severity: SeverityType,\n showCleared: boolean,\n filter?: AlarmQueryFilter\n ): Promise<number> {\n const statusesQuery = this.getStatusQueryParameter(showCleared);\n const _filter: AlarmQueryFilter = {\n ...(severity && { severity: severity }),\n ...(statusesQuery && { status: statusesQuery }),\n ...filter\n };\n const { data } = await this.alarmService.count(_filter);\n\n return data;\n }\n\n /**\n * Retrieves the current alarms refresh type from the OptionsService\n * and determines whether it is set to \"interval\".\n *\n * @returns `true` if the alarms refresh type is \"interval,\" otherwise `false`.\n */\n isIntervalRefresh(): boolean {\n const value = this.optionsService.get(this.ALARM_REFRESH_TYPE_KEY, 'interval');\n return value === 'interval';\n }\n\n /**\n * Updates the list of selected severities based on the new severity filter.\n *\n * @param severityUpdates - The object representing the updates to each severity.\n *\n * @returns An array representing the updated selected severities.\n */\n updateSelectedSeverities(severityUpdates: SeverityFilter): SeverityType[] {\n return (Object.keys(severityUpdates) as SeverityType[])\n .filter(key => severityUpdates[key])\n .map(key => key.toUpperCase() as SeverityType);\n }\n\n /**\n * Clears all active alarms of the selected severities.\n *\n * This method clears all active alarms for the given list of severities by making bulk update calls. If no severities are selected, it defaults to using all available severities.\n * It works by sending a series of update requests for each severity and returns a Promise that resolves with an object indicating if all alarms were resolved immediately.\n *\n * @param selectedSeverities An array of severities to be cleared. If not provided, all severities will be cleared.\n * @param sourceId - Identifier for the source associated with the alarms to be cleared.\n *\n * @returns A Promise that resolves with an object with a flag `resolvedImmediately`. The flag is true if all alarms for all selected severities were cleared successfully; otherwise false.\n *\n * **Example**\n * ```typescript\n * const severitiesToClear: SeverityType[] = [Severity.MAJOR, Severity.MINOR];\n *\n * clearAllActiveAlarms(severitiesToClear).then(({ resolvedImmediately }) => {\n * if (resolvedImmediately) {\n * console.log('All selected alarms were cleared successfully.');\n * } else {\n * console.log('Some alarms could not be cleared.');\n * }\n * });\n * ```\n *\n * **Note**\n * - The method uses the `alarmService.updateBulk` for each severity to clear the active alarms.\n * - It may fetch the `sourceId` based on the view (if applicable) and include it as a query parameter in the update calls.\n * - The method returns immediately but the returned Promise needs to have a `then` or `catch` method call to handle the result or error respectively.\n * - Uses `Promise.all` to wait for all update requests to complete before resolving the final result.\n */\n async clearAllActiveAlarms(\n selectedSeverities: SeverityType[],\n sourceId: string | number\n ): Promise<{ resolvedImmediately: boolean }> {\n const severitiesToUpdate = selectedSeverities || Severity;\n\n const promises = Object.values(severitiesToUpdate).map((severity: SeverityType) => {\n const commonParams = { resolved: false, severity };\n\n const parameters = sourceId\n ? {\n ...commonParams,\n source: sourceId,\n withSourceAssets: true,\n withSourceDevices: true\n }\n : commonParams;\n\n return this.alarmService.updateBulk({ status: AlarmStatus.CLEARED }, parameters);\n });\n\n const responses = await Promise.all(promises);\n return {\n resolvedImmediately: responses.every(res => res)\n };\n }\n\n /**\n * Returns the correct link based on the provided context data.\n * @param contextData The context the navigation was triggered from.\n * @param alarm The alarm to navigate to.\n * @returns A link to be used as an url navigation.\n */\n getRouterLink(contextData?: ContextData, alarm?: IAlarm): string {\n let detailUrl = `/${ALARMS_PATH}`;\n if (alarm) {\n detailUrl = `/${ALARMS_PATH}/${alarm.id}`;\n }\n if (!contextData) {\n return detailUrl;\n }\n\n switch (contextData.context) {\n case ViewContext.Device:\n return `/device/${contextData.contextData.id}${detailUrl}`;\n case ViewContext.Group:\n return `/group/${contextData.contextData.id}${detailUrl}`;\n case ViewContext.Simulators:\n return `/simulators/${contextData.contextData.id}${detailUrl}`;\n default:\n return detailUrl;\n }\n }\n\n /**\n * Returns the correct array navigation.\n * @param contextData The context the navigation was triggered from.\n * @param alarm The alarm to navigate to.\n * @returns A link to be used as a router.navigation.\n */\n getRouterNavigationArray(contextData?: ContextData, alarm?: IAlarm): string[] {\n return this.getRouterLink(contextData, alarm).split('/').filter(Boolean);\n }\n\n /**\n * Closes the details view and navigates based on the current route context,\n * preserving existing query parameters.\n */\n async closeDetailsView(activatedRoute: ActivatedRoute | ActivatedRouteSnapshot): Promise<void> {\n const contextData = this.contextRouteService.getContextData(activatedRoute);\n await this.router.navigate(this.getRouterNavigationArray(contextData), {\n queryParamsHandling: 'merge'\n });\n this.updateIntervalState(true);\n }\n\n /**\n * Returns the correct from and to dates based on the selected interval\n * @param intervalId the selected interval. E.g. 'none', 'hours', 'custom' ...\n * @returns The calculated date context based on the selected interval.\n */\n getDateTimeContextByInterval(intervalId: AlarmFilterInterval['id']): DateTimeContext {\n return this.dateTimeContextPickerService.getDateTimeContextByInterval(\n intervalId as TimeInterval\n );\n }\n\n /**\n * Converts a given number of seconds into a formatted string representing hours, minutes, and seconds.\n *\n * @param totalSeconds - The total number of seconds to convert.\n * @returns A string in the format \"HH:MM:SS\", where HH is hours, MM is minutes, and SS is seconds.\n */\n convertSecondsToTime(totalSeconds: number): string {\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = Math.floor(totalSeconds % 60);\n\n const paddedHours = hours.toString().padStart(2, '0');\n const paddedMinutes = minutes.toString().padStart(2, '0');\n const paddedSeconds = seconds.toString().padStart(2, '0');\n\n return `${paddedHours}:${paddedMinutes}:${paddedSeconds}`;\n }\n\n /**\n * Creates a value for query parameter for filtering alarms by severity based on array of selected severities.\n *\n * @param severities - An array of alarm severity types to include in the filter.\n * If the array is empty or undefined, no severity filter will be applied.\n *\n * @returns A comma-separated string of selected alarm severities,\n * or null if no severities are provided.\n */\n private getSeverityQueryParameter(severities: SeverityType[]): string | null {\n if (!severities || severities.length === 0) {\n return;\n }\n if (severities.length === Object.keys(Severity).length) {\n return;\n }\n\n return severities.join(',');\n }\n\n /**\n * Creates a value for query parameter for filtering alarms by statuses based on showCleared option.\n *\n * @param showCleared - A flag indicating whether to include cleared statuses.\n * If true, all statuses, including 'CLEARED', will be included; if false, 'CLEARED' will be excluded.\n *\n * @returns A comma-separated string of alarm statuses.\n */\n private getStatusQueryParameter(showCleared: boolean): string {\n const statuses = Object.keys(ALARM_STATUS_LABELS) as AlarmStatusType[];\n const filteredStatuses = showCleared\n ? statuses\n : statuses.filter(status => status !== 'CLEARED');\n return filteredStatuses.join(',');\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, fromEvent, Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\n\n@Injectable()\nexport class AlarmsActivityTrackerService implements OnDestroy {\n isUserActive$ = new BehaviorSubject(true);\n userSecondsSpendOnPage = 0;\n\n private gainsightTimerId: ReturnType<typeof setInterval>;\n private readonly INACTIVITY_THRESHOLD_SECONDS = 10;\n private readonly ONE_SECOND_IN_MILLISECONDS = 1_000;\n private gainsightInactivityTimeoutId: ReturnType<typeof setTimeout>;\n private destroy$ = new Subject<void>();\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n setGainsightInterval(): void {\n this.gainsightTimerId = setInterval(\n () => this.userSecondsSpendOnPage++,\n this.ONE_SECOND_IN_MILLISECONDS\n );\n }\n\n clearGainsightInterval(): void {\n clearInterval(this.gainsightTimerId);\n }\n\n resetInactivityTimer(): void {\n this.isUserActive$.next(true);\n clearTimeout(this.gainsightInactivityTimeoutId);\n this.gainsightInactivityTimeoutId = setTimeout(() => {\n this.isUserActive$.next(false); // Pause counting if the user is inactive\n }, this.INACTIVITY_THRESHOLD_SECONDS * this.ONE_SECOND_IN_MILLISECONDS);\n }\n\n setupEventListenersForGainsight() {\n const events = ['mousemove', 'keydown', 'click'];\n\n events.forEach(event => {\n fromEvent(window, event)\n .pipe(debounceTime(30), takeUntil(this.destroy$))\n .subscribe(() => this.resetInactivityTimer());\n });\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Severity, SeverityType } from '@c8y/client';\nimport { ALARM_SEVERITY_ICON_MAP, AlarmSeverityIcon, HELP_ICON } from './alarms.model';\n\n/**\n * Pipe for transforming alarm severity types into corresponding icons.\n *\n * @example\n * Usage in an Angular template:\n * {{ 'CRITICAL' | AlarmSeverityToIcon }}\n * Result: 'exclamation-circle'\n */\n@Pipe({\n name: 'AlarmSeverityToIcon',\n standalone: true\n})\nexport class AlarmSeverityToIconPipe implements PipeTransform {\n /**\n * Transforms an alarm severity type into a corresponding icon.\n *\n * @param alarmSeverity - The severity type of the alarm.\n * @returns The corresponding icon for the given alarm severity type.\n */\n transform(alarmSeverity: SeverityType): AlarmSeverityIcon | typeof HELP_ICON {\n const alarmSeverityMapped = Severity[alarmSeverity?.toUpperCase()];\n return ALARM_SEVERITY_ICON_MAP[alarmSeverityMapped] || HELP_ICON;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { AlarmIconMap, AlarmStatusIcon, HELP_ICON } from './alarms.model';\nimport { AlarmStatusType } from '@c8y/client';\n/**\n * Angular pipe for transforming alarm statuses into corresponding icons.\n *\n * @example\n * Usage in an Angular template:\n * {{ 'ACTIVE' | AlarmStatusToIcon }}\n * Result: 'bell'\n */\n@Pipe({ name: 'AlarmStatusToIcon' })\nexport class AlarmStatusToIconPipe implements PipeTransform {\n /**\n * Transforms an alarm status into a corresponding icon.\n *\n * @param alarmStatus - The status of the alarm.\n * @returns - The corresponding icon for the given alarm status.\n */\n transform(alarmStatus: AlarmStatusType): AlarmStatusIcon | typeof HELP_ICON {\n return AlarmIconMap[alarmStatus?.toUpperCase()] || HELP_ICON;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { IAuditRecord } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TranslateService } from '@ngx-translate/core';\n\n/**\n * A pipe for transforming audit record data into localized messages.\n * It specifically addresses changes in the audit records, with an emphasis on status changes.\n */\n@Pipe({ name: 'auditChangesMessage' })\nexport class AuditChangesMessagePipe implements PipeTransform {\n constructor(private translateService: TranslateService) {}\n\n /**\n * Transforms an IAuditRecord into a localized string message.\n * If the record contains changes, and if the first change is related to the 'status' attribute,\n * it formats a message indicating the status change. Otherwise, it returns a general activity message.\n * Example when there is a status change: \"Alarm status changed from ACKNOWLEDGED to ACTIVE\".\n * Example when record does not have a status attribute: \"Alarm updated\".\n *\n * @param record - The audit record to be transformed.\n * @returns The localized message describing the audit record,\n * particularly focusing on status changes if applicable.\n */\n transform(record: IAuditRecord): string {\n const firstItem = !!record.changes && Array.from(record.changes)[0];\n if (!firstItem || firstItem.attribute !== 'status') {\n const activityString = gettext(record.activity);\n return this.translateService.instant(activityString);\n }\n\n const { newValue, previousValue } = firstItem;\n\n const message = gettext(`Alarm status changed from {{ previousValue }} to {{ newValue }}`);\n\n return this.translateService.instant(message, {\n previousValue: this.translateService.instant(previousValue),\n newValue: this.translateService.instant(newValue)\n });\n }\n}\n","import {\n Component,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n SimpleChanges\n} from '@angular/core';\nimport {\n ALARM_STATUS_LABELS,\n AlarmStatus,\n AlarmService,\n AlarmStatusType,\n AuditService,\n IAlarm,\n IApplication,\n IAuditRecord,\n IManagedObject,\n IResultList,\n InventoryService,\n SEVERITY_LABELS\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n AppStateService,\n ColorService,\n RelativeTimePipe,\n SupportedAppKey,\n InterAppService,\n SupportedApps,\n GainsightService,\n DatePipe,\n IconDirective,\n ProductExperienceDirective,\n EmptyStateComponent,\n LoadingComponent,\n ListGroupComponent,\n ForOfDirective,\n ListItemTimelineComponent,\n ListItemComponent,\n ListItemBodyComponent,\n C8yTranslatePipe,\n HumanizeAppNamePipe,\n AssetLinkPipe\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { cloneDeep } from 'lodash-es';\nimport { AlarmDetailsService } from './alarm-details.service';\nimport {\n ALARM_DEFAULT_PROPERTIES,\n ALARM_STATUS_ICON,\n AlarmDetailsButton,\n CustomFragment,\n PRODUCT_EXPERIENCE_ALARMS\n} from './alarms.model';\nimport { Ng1SmartRulesUpgradeService } from './ng1-smart-rules-upgrade.service';\nimport { AlarmsViewService } from './alarms-view.service';\nimport { firstValueFrom, Observable, Subject } from 'rxjs';\nimport { distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { AlarmsActivityTrackerService } from './alarms-activity-tracker.service';\nimport { NgClass, NgIf, NgStyle, NgFor, AsyncPipe, LowerCasePipe, JsonPipe } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { AlarmDetailsButtonPipe } from './alarm-details-custom-button/alarm-details-button.pipe';\nimport { AlarmSeverityToIconPipe } from './alarm-severity-to-icon.pipe';\nimport { AlarmStatusToIconPipe } from './alarm-status-to-icon.pipe';\nimport { AuditChangesMessagePipe } from './audit-changes-message.pipe';\n\n@Component({\n selector: 'c8y-alarm-details',\n templateUrl: './alarm-details.component.html',\n providers: [AlarmsActivityTrackerService],\n imports: [\n IconDirective,\n NgClass,\n RouterLink,\n NgIf,\n NgStyle,\n PopoverDirective,\n ProductExperienceDirective,\n NgFor,\n EmptyStateComponent,\n LoadingComponent,\n ListGroupComponent,\n ForOfDirective,\n ListItemTimelineComponent,\n ListItemComponent,\n ListItemBodyComponent,\n C8yTranslatePipe,\n AsyncPipe,\n LowerCasePipe,\n JsonPipe,\n DatePipe,\n HumanizeAppNamePipe,\n AssetLinkPipe,\n AlarmDetailsButtonPipe,\n AlarmSeverityToIconPipe,\n AlarmStatusToIconPipe,\n AuditChangesMessagePipe\n ]\n})\nexport class AlarmDetailsComponent implements OnInit, OnChanges, OnDestroy {\n @Input() selectedAlarm: IAlarm;\n\n readonly ACKNOWLEDGED_STATUS_VALUE = AlarmStatus.ACKNOWLEDGED;\n readonly ACTIVE_STATUS_VALUE = AlarmStatus.ACTIVE;\n readonly CLEARED_STATUS_VALUE = AlarmStatus.CLEARED;\n readonly ACKNOWLEDGE_LABEL = gettext('Acknowledge');\n readonly REACTIVATE_LABEL = gettext('Reactivate');\n readonly SEVERITY_LABELS = SEVERITY_LABELS;\n readonly BELL_SLASH_ICON = ALARM_STATUS_ICON.BELL_SLASH;\n readonly BELL_ICON = ALARM_STATUS_ICON.BELL;\n readonly PRODUCT_EXPERIENCE_ALARMS = PRODUCT_EXPERIENCE_ALARMS;\n\n /**\n * Represents a Device Management application used by the user.\n * Determines the accurate name and context path required for navigating to alarms of the current device\n */\n userDeviceManagementApp$: Observable<IApplication>;\n /**\n * Manages the visibility of the navigation link.\n * If set to true, the link is visible, otherwise, it remains hidden.\n */\n showSourceNavigationLink$: Observable<boolean>;\n deviceManagementAppKey: SupportedAppKey = SupportedApps.devicemanagement;\n readonly linkTitle = gettext('Open in {{ appName }}');\n /**\n * Contains audit logs, including the very first audit log record in the alarms' history.\n * This ensures that the historical starting point of the audit logs is always included in the data set.\n * Usually it's an 'Alarm created' audit log.\n *\n * Only used when audit logs exceed PAGE_SIZE.\n *\n * @private\n */\n private extendedAuditLogs: IResultList<IAuditRecord>;\n private readonly PAGE_SIZE = 100;\n\n /**\n * Prevents the pipeline from failing for a tutorial application\n * because it's a pure Angular application and doesn't support any\n * AngularJS services.\n */\n isCreateSmartRulesButtonAvailable: boolean;\n /**\n * Property contains a 100 (see PAGE_SIZE) of most recent audit logs records.\n */\n auditLog: IResultList<IAuditRecord>;\n\n isLoading: boolean;\n /**\n * Indicates when alarms status change was started (Acknowledge/Reactivate)\n */\n isAlarmStatusChanging = false;\n /**\n * Represents a value for a 'Status' section in details.\n */\n statusMessage: string;\n /**\n * The color of the alarm type.\n */\n typeColor: string;\n /**\n * Custom fragments of the selected alarm. If none exist, null is returned.\n */\n customFragments: CustomFragment = null;\n\n selectedAlarmMO: IManagedObject;\n\n private readonly USER_MINIMUM_SPEND_TIME_SECONDS_TO_TRIGGER_EVENT = 1;\n\n private destroy$ = new Subject<void>();\n constructor(\n private alarmDetailsService: AlarmDetailsService,\n private alarmService: AlarmService,\n private alertService: AlertService,\n private appState: AppStateService,\n private auditService: AuditService,\n private relativeTime: RelativeTimePipe,\n @Optional() private ng1SmartRulesUpgradeService: Ng1SmartRulesUpgradeService,\n private translateService: TranslateService,\n private inventoryService: InventoryService,\n private alarmsViewService: AlarmsViewService,\n private colorService: ColorService,\n private interAppService: InterAppService,\n private gainsightService: GainsightService,\n private alarmsActivityTrackerService: AlarmsActivityTrackerService\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.alarmsActivityTrackerService.setupEventListenersForGainsight();\n this.alarmsActivityTrackerService.resetInactivityTimer();\n\n this.alarmsActivityTrackerService.isUserActive$\n .pipe(distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe(isActive =>\n isActive\n ? this.alarmsActivityTrackerService.setGainsightInterval()\n : this.alarmsActivityTrackerService.clearGainsightInterval()\n );\n\n const isSmartRulesServiceSubscribed = !!(await firstValueFrom(\n this.interAppService.getApp$(SupportedApps.smartrules)\n ));\n const hasAnyRoleAllowingToCreateSmartRule =\n this.alarmDetailsService.checkIfHasAnyRoleAllowingToCreateSmartRule();\n this.isCreateSmartRulesButtonAvailable =\n !!this.ng1SmartRulesUpgradeService &&\n isSmartRulesServiceSubscribed &&\n hasAnyRoleAllowingToCreateSmartRule;\n this.userDeviceManagementApp$ = this.interAppService.getApp$(this.deviceManagementAppKey);\n this.showSourceNavigationLink$ = this.interAppService.shouldShowAppLink$(\n this.deviceManagementAppKey\n );\n this.typeColor = await this.colorService.generateColor(this.selectedAlarm.type);\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes.selectedAlarm && changes.selectedAlarm.currentValue) {\n await this.reloadAuditLog(true, true);\n await this.updateStatusMessage();\n const { data } = await this.inventoryService.detail(this.selectedAlarm.source.id);\n this.selectedAlarmMO = data;\n this.customFragments = this.getCustomFragments(this.selectedAlarm);\n }\n }\n\n ngOnDestroy(): void {\n if (\n this.alarmsActivityTrackerService.userSecondsSpendOnPage >=\n this.USER_MINIMUM_SPEND_TIME_SECONDS_TO_TRIGGER_EVENT\n ) {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS, {\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARM_DETAILS,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.USER_SPEND_TIME_ON_COMPONENT,\n userSpendTime: this.alarmsViewService.convertSecondsToTime(\n this.alarmsActivityTrackerService.userSecondsSpendOnPage\n )\n });\n }\n this.alarmsActivityTrackerService.clearGainsightInterval();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n @HostListener('document:visibilitychange')\n visibilityChange() {\n if (document.hidden) {\n this.alarmsActivityTrackerService.clearGainsightInterval();\n return;\n }\n this.alarmsActivityTrackerService.setGainsightInterval();\n }\n\n createSmartRule(): void {\n if (!this.isCreateSmartRulesButtonAvailable) {\n return;\n }\n this.ng1SmartRulesUpgradeService.addNewForInputAlarmAndOutputUserWithUI(\n this.selectedAlarm,\n this.appState.currentUser.value\n );\n }\n\n /**\n * Navigates to a specific alarm source device based on the provided source.\n *\n * @param sourceId - The source id.\n */\n async goToAlarmSource(sourceId: string | number): Promise<void> {\n const { data } = await this.alarmService.detail(sourceId);\n await this.interAppService.navigateToApp(\n this.deviceManagementAppKey,\n `#/device/${data.source.id}/alarms`\n );\n }\n\n /**\n * Reloads audit log data asynchronously.\n *\n * This method fetches audit records using `getAlarmAuditRecords` and optionally updates the audit logs\n * state in the component based on the `isSetAuditLogs` flag. It handles the loading state and potential\n * errors during the fetch operation.\n *\n * @param isRevert - A boolean flag indicating whether to retrieve a 100 (see PAGE_SIZE) records (true)\n * or only record, that chronologically will be the oldest one (false). Defaults to true.\n * If set to false, it will set PAGE_SIZE to 1 and trigger a logic\n * concatenating a most recent record with the very first one to\n * calculate the alarm duration (change to CLEARED status).\n * It's passed to the `getAlarmAuditRecords` method.\n * @param isSetAuditLogs - A boolean flag to determine if the fetched audit logs should be set in the component state. Defaults to `false`.\n * @returns A promise that resolves to a list of `IAuditRecord` objects.\n */\n async reloadAuditLog(\n isRevert = true,\n isSetAuditLogs = false\n ): Promise<IResultList<IAuditRecord>> {\n try {\n this.isLoading = true;\n const auditLogs = await this.getAlarmAuditRecords(isRevert);\n\n if (isSetAuditLogs) {\n this.setAuditLogs(auditLogs);\n }\n\n return auditLogs;\n } catch (error) {\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading = false;\n }\n }\n\n async onUpdateDetails(status: AlarmStatusType): Promise<void> {\n try {\n this.isAlarmStatusChanging = true;\n await this.updateAlarmStatus(status);\n await this.reloadAuditLog(true, true);\n await this.updateStatusMessage();\n this.updateLastUpdatedDate(this.auditLog.data[0]);\n if (status === AlarmStatus.CLEARED) {\n this.alarmsViewService.closeDetailsView$.next();\n }\n } catch (error) {\n this.alertService.addServerFailure(error);\n } finally {\n this.isAlarmStatusChanging = false;\n }\n }\n\n async detailsButtonAction(button: AlarmDetailsButton, alarm: IAlarm): Promise<void> {\n const result = button.action(alarm);\n let shouldReload: boolean | IAlarm = false;\n if (result instanceof Promise) {\n shouldReload = await result;\n } else {\n shouldReload = result;\n }\n\n if (shouldReload) {\n let alarm: IAlarm;\n if (shouldReload === true) {\n const { data: updatedAlarm } = await this.alarmService.detail(this.selectedAlarm.id);\n alarm = updatedAlarm;\n } else {\n alarm = shouldReload;\n }\n this.alarmsViewService.updateAlarmList();\n\n const previousValue = this.selectedAlarm;\n this.selectedAlarm = alarm;\n this.ngOnChanges({\n selectedAlarm: {\n currentValue: alarm,\n previousValue,\n firstChange: false,\n isFirstChange: () => false\n }\n });\n }\n }\n\n private async updateAlarmStatus(status: AlarmStatusType): Promise<void> {\n const partiallyUpdatedAlarm: Partial<IAlarm> = { id: this.selectedAlarm.id, status };\n await this.alarmService.update(partiallyUpdatedAlarm);\n const translatedStatusLabel = this.translateService.instant(ALARM_STATUS_LABELS[status]);\n this.alertService.success(\n this.translateService.instant(gettext('Alarm status changed to {{ status }}'), {\n status: translatedStatusLabel.toUpperCase()\n })\n );\n this.selectedAlarm.status = status;\n this.alarmsViewService.updateAlarmList();\n }\n\n /**\n * Retrieves the audit log and appends the last audit record to it.\n *\n * This method fetches the existing audit log data and makes a deep copy of it. It then\n * retrieves the last audit record and appends it to the copied audit log data. This is\n * useful for scenarios where the most recent audit record needs to be included in the\n * existing audit log data (calculating the CLEARED period).\n *\n * @returns A promise of `IResultList<IAuditRecord>`, which includes the\n * existing audit log data along with the last audit record appended.\n * @private\n */\n private async auditLogWithFirstRecord(): Promise<IResultList<IAuditRecord>> {\n const existingData = this.auditLog;\n const copiedExistingData = cloneDeep(existingData);\n\n const lastAuditRecord = await this.reloadAuditLog(false);\n const lastRecord = lastAuditRecord.data[lastAuditRecord.data.length - 1];\n copiedExistingData.data.push(lastRecord);\n return copiedExistingData;\n }\n\n private setAuditLogs(auditLogs: IResultList<IAuditRecord>): void {\n this.auditLog = auditLogs;\n }\n\n private updateLastUpdatedDate(updatedAuditRecords: IAuditRecord): void {\n if (!updatedAuditRecords) {\n return;\n }\n\n const { creationTime } = updatedAuditRecords;\n this.selectedAlarm.lastUpdated = creationTime;\n }\n\n private getActiveStatusMessage(time: string): string {\n return this.translateService.instant(gettext('ACTIVE`alarm`: triggered {{alarmTimeFromNow}}'), {\n alarmTimeFromNow: this.relativeTime.transform(new Date(time))\n });\n }\n\n private getAcknowledgedStatusMessage(status: AlarmStatusType, changeLog: IAuditRecord[]): string {\n if (changeLog.length === 0) {\n return this.translateService.instant(gettext('ACKNOWLEDGED`alarm`'));\n }\n\n const acknowledgedBy = this.alarmDetailsService.getAcknowledgedBy(status, changeLog);\n const acknowledgeTime = this.alarmDetailsService.getAcknowledgeTime(changeLog);\n\n if (acknowledgedBy) {\n return this.translateService.instant(\n gettext('ACKNOWLEDGED`alarm` by: {{ackBy}} {{ackTimeFromNow}}'),\n {\n ackBy: acknowledgedBy,\n ackTimeFromNow: this.relativeTime.transform(new Date(acknowledgeTime))\n }\n );\n }\n\n return this.translateService.instant(gettext('ACKNOWLEDGED`alarm` {{ackTimeFromNow}}'), {\n ackTimeFromNow: this.relativeTime.transform(new Date(acknowledgeTime))\n });\n }\n\n private getClearedStatusMessage(auditLog: IAuditRecord[]): string {\n if (auditLog.length === 0) {\n return this.translateService.instant(gettext('CLEARED`alarm`'));\n }\n\n const differenceInMs = this.calculateAlarmDuration(auditLog);\n\n return this.translateService.instant(\n gettext('CLEARED`alarm`: was active for {{alarmDuration}}'),\n {\n alarmDuration: this.relativeTime.transform(differenceInMs, true)\n }\n );\n }\n\n /**\n * Calculates the duration of an alarm based on audit log records.\n *\n * This method computes the duration of an alarm by finding the difference\n * between the start and end times of the alarm. The start time is determined\n * from the last record in the audit log, using the first available time field\n * (`firstOccurrenceTime`, `time`, or `creationTime`). The end time is obtained\n * from the `alarmDetailsService`.\n *\n * @param auditLog - An array of `IAuditRecord` objects representing the audit log records.\n * @returns The duration of the alarm in milliseconds, or `null` if the end time is not available.\n * @private\n */\n private calculateAlarmDuration(auditLog: IAuditRecord[]): number | null {\n const firstAlarm = auditLog[auditLog.length - 1];\n const startTime = firstAlarm.firstOccurrenceTime || firstAlarm.time || firstAlarm.creationTime;\n const endTime = this.alarmDetailsService.getEndTime(auditLog);\n\n if (!endTime) {\n return null;\n }\n\n const startTimeToDate = new Date(startTime);\n const endTimeToDate = new Date(endTime);\n\n return endTimeToDate.getTime() - startTimeToDate.getTime();\n }\n\n /**\n * Retrieves a list of audit records for a selected alarm.\n *\n * This method fetches audit records based on the specified properties, including\n * the date, page size, whether to revert, the source alarm ID, and whether to include total pages.\n *\n * @param isRevert - A boolean flag indicating whether to retrieve a 100 (see PAGE_SIZE) records (true)\n * or only record, that chronologically will be the oldest one (false). Defaults to true.\n * If set to false, it will set PAGE_SIZE to 1 and trigger a logic\n * concatenating a most recent record with the very first one to\n * calculate the alarm duration (change to CLEARED status).\n * @returns A Promise that resolves to an IResultList of IAuditRecord objects, representing the audit records.\n * @async\n * @private\n */\n private async getAlarmAuditRecords(isRevert = true): Promise<IResultList<IAuditRecord>> {\n const properties = {\n dateTo: new Date(Date.now()).toISOString(),\n pageSize: isRevert ? this.PAGE_SIZE : 1,\n revert: isRevert,\n source: this.selectedAlarm.id,\n withTotalPages: true\n };\n\n return await this.auditService.list(properties);\n }\n\n private async updateStatusMessage(): Promise<void> {\n switch (this.selectedAlarm.status) {\n case this.ACTIVE_STATUS_VALUE:\n this.statusMessage = this.getActiveStatusMessage(this.selectedAlarm.time);\n break;\n case this.ACKNOWLEDGED_STATUS_VALUE:\n this.statusMessage = this.getAcknowledgedStatusMessage(\n this.selectedAlarm.status as unknown as AlarmStatusType,\n this.auditLog.data\n );\n break;\n case this.CLEARED_STATUS_VALUE:\n if (this.hasReachedOrExceededPageSizeLimit()) {\n this.extendedAuditLogs = await this.auditLogWithFirstRecord();\n this.statusMessage = this.getClearedStatusMessage(this.extendedAuditLogs.data);\n return;\n }\n this.statusMessage = this.getClearedStatusMessage(this.auditLog.data);\n break;\n }\n }\n\n private hasReachedOrExceededPageSizeLimit(): boolean {\n return this.auditLog.data.length >= this.PAGE_SIZE;\n }\n\n private getCustomFragments(selectedAlarm: IAlarm): CustomFragment {\n let customProperties = null;\n for (const key in selectedAlarm) {\n if (!ALARM_DEFAULT_PROPERTIES.find(k => k === key)) {\n if (!customProperties) {\n customProperties = {};\n }\n customProperties[key] = selectedAlarm[key];\n }\n }\n\n return customProperties;\n }\n}\n","<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\n class=\"border-all fit-w d-flex\"\n data-cy=\"c8y-alarm-details--status-section-wrapper\"\n >\n <div\n class=\"p-8\"\n data-cy=\"c8y-alarm-details--status-icon\"\n >\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\n class=\"border-all fit-w d-flex\"\n data-cy=\"c8y-alarm-details--severity-section-wrapper\"\n >\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\n class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n data-cy=\"c8y-alarm-details--source-wrapper\"\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 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\n : { 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\n class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n data-cy=\"c8y-alarm-details--severity-type-wrapper\"\n >\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 data-cy=\"c8y-alarm-details--last-updated-icon\"\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\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n data-cy=\"c8y-alarm-details--number-of-occurrences-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span\n class=\"badge badge-info\"\n data-cy=\"c8y-alarm-details--badge\"\n >\n {{ selectedAlarm.count }}\n </span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n data-cy=\"c8y-alarm-details--first-occurrence-wrapper\"\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\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was created. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n data-cy=\"c8y-alarm-details--last-updated-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.lastUpdated | c8yDate: 'medium' }}\n\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was last updated. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\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 data-cy=\"c8y-alarm-details--custom-fragments-wrapper\"\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 data-cy=\"c8y-alarms-details--reload-audit-logs\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARM_DETAILS,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.RELOAD_AUDIT_LOGS\n }\"\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 c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARM_DETAILS,\n action:\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? PRODUCT_EXPERIENCE_ALARMS.ACTIONS.ACKNOWLEDGE_ALARM\n : PRODUCT_EXPERIENCE_ALARMS.ACTIONS.REACTIVATE_ALARM\n }\"\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 c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARM_DETAILS,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.CREATE_SMART_RULE\n }\"\n data-cy=\"c8y-alarms-details--create-smart-rule\"\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 data-cy=\"c8y-alarm-details--clear-alarm\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARM_DETAILS,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.CLEAR_ALARM\n }\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"button.title | translate\"\n type=\"button\"\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n [ngClass]=\"button.additionalButtonClasses\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i\n [c8yIcon]=\"button.icon\"\n [ngClass]=\"button.additionalIconClasses\"\n ></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 | c8yDate: 'mediumDate' }}\n {{ log.creationTime | c8yDate: '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","import { Component } from '@angular/core';\nimport { EmptyStateComponent, C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-alarms-empty',\n templateUrl: './alarm-empty.component.html',\n imports: [EmptyStateComponent, C8yTranslatePipe]\n})\nexport class AlarmEmptyComponent {}\n","<div class=\"p-24 hidden-sm\" data-cy=\"c8y-alarms-empty\">\n <c8y-ui-empty-state\n [icon]=\"'alarm'\"\n [title]=\"'No alarm selected' | translate\"\n [subtitle]=\"'Select an alarm from the list to view its details.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IAlarm } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ContextRouteService,\n ViewContext,\n TitleComponent,\n IconDirective,\n TabsOutletComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { Observable, of } from 'rxjs';\nimport { AlarmsViewService } from './alarms-view.service';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { AlarmDetailsComponent } from './alarm-details.component';\n\n@Component({\n selector: 'c8y-alarm-info',\n templateUrl: './alarm-info.component.html',\n imports: [\n NgIf,\n TitleComponent,\n IconDirective,\n TabsOutletComponent,\n AlarmDetailsComponent,\n C8yTranslatePipe,\n AsyncPipe\n ]\n})\nexport class AlarmInfoComponent implements OnInit {\n selectedAlarm$: Observable<IAlarm>;\n\n hasAnyRoleAllowingToCreateSmartRule: boolean;\n isContextRoute = false;\n readonly TITLE = gettext('Alarms');\n\n constructor(\n public activatedRoute: ActivatedRoute,\n private router: Router,\n private contextRouteService: ContextRouteService,\n private alarmsViewService: AlarmsViewService\n ) {}\n\n async ngOnInit() {\n const contextData = this.contextRouteService.getContextData(this.activatedRoute);\n this.selectedAlarm$ = of(contextData.contextData as IAlarm);\n this.isContextRoute = this.contextRouteService.isContextRoute(this.router.url, [\n ViewContext.Device,\n ViewContext.Group\n ]);\n }\n\n back(): void {\n this.alarmsViewService.closeDetailsView$.next();\n }\n}\n","<ng-container *ngIf=\"!isContextRoute\">\n <c8y-title>{{ TITLE | translate }}</c8y-title>\n</ng-container>\n\n<div\n class=\"inner-scroll split-view__detail split-view__detail--selected\"\n *ngIf=\"selectedAlarm$ | async\"\n>\n <div class=\"sticky-top bg-component\">\n <div class=\"card-header gap-16 d-block-xs d-block-sm p-l-24 p-r-24 p-t-16 separator\">\n <button\n class=\"btn btn-clean text-primary visible-sm visible-xs\"\n data-cy=\"c8y-alarms-info--back\"\n [title]=\"'Back' | translate\"\n (click)=\"back()\"\n >\n <i c8yIcon=\"chevron-left\"></i>\n <span>{{ 'Back' | translate }}</span>\n </button>\n\n <div class=\"flex-no-shrink a-s-start\"></div>\n <div class=\"flex-grow d-col\">\n <div\n class=\"text-break-word flex-grow text-16\"\n data-cy=\"c8y-alarms-info--title\"\n >\n {{ (selectedAlarm$ | async)?.text | translate }}\n </div>\n </div>\n </div>\n <div class=\"p-relative\">\n <c8y-tabs-outlet\n outletName=\"alarms\"\n orientation=\"horizontal\"\n ></c8y-tabs-outlet>\n </div>\n <div class=\"card-block overflow-visible p-l-24 p-r-24\">\n <c8y-alarm-details [selectedAlarm]=\"selectedAlarm$ | async\"></c8y-alarm-details>\n </div>\n </div>\n</div>\n","import { IAlarm } from '@c8y/client';\nimport { combineLatest, Observable } from 'rxjs';\nimport { filter, map, startWith, switchMap } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { PluginsResolveService, ServiceRegistry } from '@c8y/ngx-components';\nimport { AlarmListIndicator } from '../alarms.model';\nimport { sortBy } from 'lodash-es';\n\n@Injectable({ providedIn: 'root' })\n/**\n * A service to retrieve custom indicators for the alarm list view.\n */\nexport class AlarmListIndicatorService {\n constructor(\n private serviceRegistry: ServiceRegistry,\n private pluginsResolver: PluginsResolveService\n ) {}\n\n get$(alarm: IAlarm): Observable<AlarmListIndicator[]> {\n const providers$ = this.pluginsResolver.allPluginsLoaded$.pipe(\n filter(Boolean),\n map(() => {\n return this.serviceRegistry.get('alarmListIndicator');\n })\n );\n\n return providers$.pipe(\n switchMap(providers => {\n const observables$ = providers.map(provider =>\n provider.getAlarmListIndicator$(alarm).pipe(startWith(false))\n );\n return combineLatest(observables$);\n }),\n map(indicators => {\n return indicators.filter(Boolean) as AlarmListIndicator[];\n }),\n map(indicators => sortBy(indicators, this.byPriority))\n );\n }\n\n private byPriority(item: AlarmListIndicator) {\n if (item.priority === undefined) {\n return 0;\n }\n return -item.priority;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { IAlarm } from '@c8y/client';\nimport { Observable } from 'rxjs';\nimport { AlarmListIndicatorService } from './alarm-list-indicator.service';\nimport { AlarmListIndicator } from '../alarms.model';\n\n@Pipe({\n standalone: true,\n name: 'alarmListIndicator',\n pure: true\n})\n/**\n * A pipe to provide custom indicators for the alarm list view.\n *\n * Will call `get$()` method of `AlarmListIndicatorService` to get the custom indicators for the provided alarm.\n */\nexport class AlarmListIndicatorPipe implements PipeTransform {\n constructor(private alarmListIndicatorService: AlarmListIndicatorService) {}\n\n transform(alarm: IAlarm): Observable<AlarmListIndicator[]> {\n return this.alarmListIndicatorService.get$(alarm);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { SeverityType, SEVERITY_LABELS } from '@c8y/client';\n\n/**\n * Pipe for transforming an array of alarm severity types into a comma-separated string.\n *\n * @example\n * Usage in a template: {{ ['WARNING', 'CRITICAL'] | AlarmSeveritiesToTitle }}\n * Result: 'Warning, Critical'\n */\n@Pipe({ name: 'AlarmSeveritiesToTitle' })\nexport class AlarmSeveritiesToTitlePipe implements PipeTransform {\n private readonly severityOptionsCount = Object.keys(SEVERITY_LABELS).length;\n\n constructor(private translateService: TranslateService) {}\n /**\n * Transforms an array of alarm severity types into a comma-separated string.\n *\n * @param severities - Array of severity types.\n * @returns - Transformed human-readable title string.\n */\n transform(severities: SeverityType[]): string {\n const uniqueSeverities = [...new Set(severities)];\n\n if (uniqueSeverities.some(severity => !(severity in SEVERITY_LABELS))) {\n return null;\n }\n if (uniqueSeverities.length === this.severityOptionsCount) {\n return this.translateService.instant(gettext('All alarms'));\n }\n\n const translatedChips = uniqueSeverities.map(severity => this.translateSeverityLabel(severity));\n return translatedChips.join(', ');\n }\n /**\n * Translates and converts a severity type to title case.\n *\n * @private\n * @param chip - Severity type.\n * @returns - Translated and title-cased severity type.\n */\n private translateSeverityLabel(chip: SeverityType): string {\n return this.translateService.instant(SEVERITY_LABELS[chip]);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Severity, SeverityType } from '@c8y/client';\n\n@Pipe({\n name: 'AlarmSeverityToIconClass',\n standalone: true\n})\nexport class AlarmSeverityToIconClassPipe implements PipeTransform {\n transform(alarmSeverity: SeverityType): string {\n let severityClassName = '';\n let iconClassName = '';\n\n switch (alarmSeverity) {\n case Severity.CRITICAL:\n severityClassName = 'critical';\n iconClassName = 'exclamation-circle';\n break;\n case Severity.MAJOR:\n severityClassName = 'major';\n iconClassName = 'warning';\n break;\n case Severity.MINOR:\n severityClassName = 'minor';\n iconClassName = 'high-priority';\n break;\n case Severity.WARNING:\n severityClassName = 'warning';\n iconClassName = 'circle';\n break;\n default:\n return '';\n }\n\n return `status icon-lg stroked-icon dlt-c8y-icon-${iconClassName} ${severityClassName}`;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SEVERITY_LABELS } from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\n\n/**\n * Pipe to transform alarm severity to corresponding label.\n */\n@Pipe({ name: 'AlarmSeverityToLabel' })\nexport class AlarmSeverityToLabelPipe implements PipeTransform {\n constructor(private translateService: TranslateService) {}\n\n /**\n * Transforms an alarm severity to its corresponding label.\n * @param alarmSeverity - The alarm severity to transform.\n * @returns The translated label corresponding to the given alarm severity.\n */\n transform(alarmSeverity: string): string {\n const alarmStatusMapped = SEVERITY_LABELS[alarmSeverity?.toUpperCase()];\n return this.translateService.instant(alarmStatusMapped ?? alarmSeverity);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { AlarmStatusType, ALARM_STATUS_LABELS } from '@c8y/client';\n\n/**\n * Pipe to transform alarm status to corresponding label.\n */\n@Pipe({ name: 'AlarmStatusToLabel' })\nexport class AlarmStatusToLabelPipe implements PipeTransform {\n constructor(private translateService: TranslateService) {}\n\n /**\n * Transforms an alarm status to its corresponding label.\n * @param alarmStatus - The alarm status to transform.\n * @returns The translated label corresponding to the given alarm status.\n */\n transform(alarmStatus: AlarmStatusType): string {\n return this.translateService.instant(ALARM_STATUS_LABELS[alarmStatus?.toUpperCase()]);\n }\n}\n","import {\n AfterViewInit,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild\n} from '@angular/core';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n AlarmQueryFilter,\n Severity,\n SeverityFilter,\n SEVERITY_LABELS,\n SeverityType\n} from '@c8y/client';\nimport {\n AlertService,\n DateTimeContext,\n ProductExperienceDirective,\n IconDirective,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n BsDropdownDirective,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective\n} from 'ngx-bootstrap/dropdown';\nimport { BehaviorSubject, Observable, Subject, combineLatest, from, forkJoin, EMPTY } from 'rxjs';\nimport { catchError, filter, finalize, map, startWith, takeUntil } from 'rxjs/operators';\nimport { AlarmsViewService } from './alarms-view.service';\nimport {\n AlarmCount,\n DEFAULT_ALARM_COUNTS,\n DEFAULT_SEVERITY_VALUES,\n AlarmListFormFilters,\n PRODUCT_EXPERIENCE_ALARMS\n} from './alarms.model';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport _ from 'lodash';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgIf, NgFor, NgClass, AsyncPipe, LowerCasePipe } from '@angular/common';\nimport { AlarmSeverityToIconPipe } from './alarm-severity-to-icon.pipe';\nimport { AlarmSeveritiesToTitlePipe } from './alarm-severities-to-title.pipe';\n\n@Component({\n selector: 'c8y-alarms-filter',\n templateUrl: './alarms-filter.component.html',\n imports: [\n FormsModule,\n ReactiveFormsModule,\n BsDropdownDirective,\n CdkTrapFocus,\n NgIf,\n NgFor,\n ProductExperienceDirective,\n IconDirective,\n NgClass,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe,\n AsyncPipe,\n LowerCasePipe,\n AlarmSeverityToIconPipe,\n AlarmSeveritiesToTitlePipe\n ]\n})\nexport class AlarmsFilterComponent implements OnInit, AfterViewInit, OnDestroy {\n readonly severitiesList = Object.keys(SEVERITY_LABELS) as SeverityType[];\n\n @Input()\n contextSourceId: number | string | null;\n\n /**\n * EventEmitter to notify when filters have been applied.\n * Emits a `AlarmListFormFilters` object representing the filter criteria applied by the user.\n */\n @Output()\n onFilterApplied = new EventEmitter<AlarmListFormFilters>();\n\n @ViewChild('filtersDropdown')\n filtersDropdown: BsDropdownDirective;\n\n formGroup = this.formBuilder.group(DEFAULT_SEVERITY_VALUES);\n chips: SeverityType[] = [];\n isIndeterminate$: Observable<boolean>;\n countLoading: boolean;\n showCleared = false;\n alarmCounts: AlarmCount = DEFAULT_ALARM_COUNTS;\n selectedDates: DateTimeContext;\n shouldDisableApplyButton$: Observable<boolean>;\n isEachCheckboxSelected$: Observable<boolean>;\n protected readonly SEVERITY_LABELS = SEVERITY_LABELS;\n protected readonly PRODUCT_EXPERIENCE_ALARMS = PRODUCT_EXPERIENCE_ALARMS;\n private isNoneCheckboxSelected$ = new BehaviorSubject<boolean>(false);\n private severitiesTouched$ = new BehaviorSubject<boolean>(false);\n private currentFormGroupValues = this.formGroup.value;\n private currentShowClearedValue: boolean;\n private destroy$: Subject<void> = new Subject<void>();\n\n constructor(\n private formBuilder: FormBuilder,\n private alarmsViewService: AlarmsViewService,\n private alertService: AlertService,\n private router: Router,\n private activatedRoute: ActivatedRoute\n ) {}\n\n ngOnInit(): void {\n this.activatedRoute.queryParams.pipe(takeUntil(this.destroy$)).subscribe(params => {\n this.showCleared = params.showCleared === 'true';\n this.formGroup.setValue({\n [Severity.CRITICAL]: params[Severity.CRITICAL] === 'true',\n [Severity.MAJOR]: params[Severity.MAJOR] === 'true',\n [Severity.MINOR]: params[Severity.MINOR] === 'true',\n [Severity.WARNING]: params[Severity.WARNING] === 'true'\n });\n if (params.lastUpdatedFrom) {\n this.selectedDates = [new Date(params.lastUpdatedFrom), new Date(params.createdTo)];\n }\n this.applyFilters(true, false);\n });\n this.trackCheckboxStateWithFormChanges();\n this.currentShowClearedValue = this.showCleared;\n this.updateChipsAndDefaultValues();\n }\n\n ngAfterViewInit(): void {\n this.filtersDropdown.isOpenChange\n .pipe(takeUntil(this.destroy$), filter(Boolean))\n .subscribe(() => this.updateAlarmsCount());\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n allChanged(selected: boolean): void {\n this.formGroup.patchValue({\n [Severity.CRITICAL]: selected,\n [Severity.MAJOR]: selected,\n [Severity.MINOR]: selected,\n [Severity.WARNING]: selected\n } as SeverityFilter);\n }\n\n applyFilters(emit = true, navigate = true): void {\n this.updateChipsAndDefaultValues();\n const combinedFormEvent: AlarmListFormFilters = {\n showCleared: this.showCleared,\n severityOptions: this.formGroup.value,\n selectedDates: this.selectedDates\n };\n if (emit) {\n this.onFilterApplied.emit(combinedFormEvent);\n }\n this.currentFormGroupValues = this.formGroup.value;\n this.currentShowClearedValue = this.showCleared;\n\n if (navigate) {\n this.router.navigate([], {\n queryParams: {\n showCleared: combinedFormEvent.showCleared,\n ...combinedFormEvent.severityOptions,\n lastUpdatedFrom: combinedFormEvent.selectedDates?.[0]?.toISOString(),\n createdTo: combinedFormEvent.selectedDates?.[1]?.toISOString()\n },\n queryParamsHandling: 'merge'\n });\n }\n }\n\n deselectChip(chip: SeverityType): void {\n this.formGroup.patchValue({\n ...this.formGroup.value,\n [chip]: false\n });\n this.applyFilters(false);\n this.closeDropdown();\n }\n\n closeDropdown(): void {\n if (this.filtersDropdown.isOpen) {\n this.filtersDropdown.isOpen = false;\n }\n }\n\n resetForm(): void {\n this.formGroup.reset(this.currentFormGroupValues);\n this.severitiesTouched$.next(false);\n this.showCleared = this.currentShowClearedValue;\n }\n\n markSeveritiesAsTouched(): void {\n this.severitiesTouched$.next(true);\n }\n\n /**\n * Asynchronously fetches and updates the count of alarms for each severity level.\n *\n * @param showCleared - Whether to include cleared alarms in the count.\n * Defaults to the current value of `this.currentShowClearedValue`.\n * @returns A Promise that resolves when all alarm counts have been fetched,\n * or rejects with an error if the operation fails.\n * @throws Will throw an error if any of the alarm count fetching promises reject.\n */\n async updateAlarmsCount(showCleared = this.currentShowClearedValue): Promise<void> {\n this.countLoading = true;\n const alarmFilter: AlarmQueryFilter | null = this.contextSourceId\n ? {\n source: this.contextSourceId,\n withSourceAssets: true,\n withSourceDevices: true\n }\n : null;\n const observables: Record<SeverityType, Observable<number>> = this.severitiesList.reduce(\n (acc, severity) => {\n acc[severity] = from(\n this.alarmsViewService.getAlarmsCountBySeverity(severity, showCleared, alarmFilter)\n );\n return acc;\n },\n {\n CRITICAL: null,\n MAJOR: null,\n MINOR: null,\n WARNING: null\n }\n );\n forkJoin(observables)\n .pipe(\n catchError(err => {\n this.alarmCounts = {} as AlarmCount;\n this.alertService.addServerFailure(err);\n return EMPTY;\n }),\n finalize(() => (this.countLoading = false))\n )\n .subscribe((alarmCounts: AlarmCount) => (this.alarmCounts = alarmCounts));\n }\n\n private createFormValueWithChangesStream(): Observable<SeverityFilter> {\n return this.formGroup.valueChanges.pipe(startWith(this.formGroup.value));\n }\n\n private trackCheckboxStateWithFormChanges(): void {\n const formValue$ = this.createFormValueWithChangesStream();\n this.isEachCheckboxSelected$ = this.createAllSelectedStream(formValue$);\n this.isIndeterminate$ = this.createIndeterminateStream(formValue$);\n this.trackAllCheckboxesDisabled(formValue$);\n this.shouldDisableApplyButton$ = this.createDisableApplyButtonStream();\n }\n\n private createAllSelectedStream(formValue$: Observable<SeverityFilter>): Observable<boolean> {\n return formValue$.pipe(map(severities => Object.values(severities).every(Boolean)));\n }\n\n private createIndeterminateStream(formValue$: Observable<SeverityFilter>): Observable<boolean> {\n return formValue$.pipe(\n map(\n severities =>\n Object.values(severities).some(Boolean) && !Object.values(severities).every(Boolean)\n )\n );\n }\n\n private trackAllCheckboxesDisabled(formValue$: Observable<SeverityFilter>): void {\n formValue$.pipe(takeUntil(this.destroy$)).subscribe(severities => {\n const areAllDisabled = Object.values(severities).every(value => !value);\n this.isNoneCheckboxSelected$.next(areAllDisabled);\n });\n }\n\n private createDisableApplyButtonStream(): Observable<boolean> {\n return combineLatest([this.isNoneCheckboxSelected$, this.severitiesTouched$]).pipe(\n map(\n ([allCheckboxesAreDisabled, severitiesTouched]) =>\n allCheckboxesAreDisabled || !severitiesTouched\n )\n );\n }\n\n private updateChipsAndDefaultValues(): void {\n const severityFilter = this.formGroup;\n const seveerityValues = severityFilter.value;\n\n this.chips = Object.keys(seveerityValues).filter(key => seveerityValues[key]) as SeverityType[];\n const allChipsRemoved = this.chips.length === 0;\n if (allChipsRemoved) {\n const defaultValues = DEFAULT_SEVERITY_VALUES;\n severityFilter.setValue(defaultValues);\n this.chips = Object.keys(defaultValues) as SeverityType[];\n }\n }\n}\n","<form\n class=\"d-flex a-i-center\"\n [formGroup]=\"formGroup\"\n>\n <div\n class=\"dropdown\"\n title=\"{{ 'Filter by severity' | translate }}\"\n container=\"body\"\n dropdown\n #filtersDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"filtersDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <div class=\"input-group fit-w\">\n <div\n class=\"form-control d-flex a-i-center inner-scroll\"\n style=\"min-width: 104px; padding-top: 0; padding-bottom: 0\"\n >\n @if (chips.length !== severitiesList.length) {\n @for (chip of chips; track chip) {\n <span\n class=\"tag tag--info chip\"\n [attr.data-cy]=\"'c8y-alarms-filter--chip-' + chip\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-alarms-filter--remove-chip\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARMS_FILTER,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.REMOVE_CHIP_FILTER,\n filterValues: {\n severities: formGroup.value,\n showCleared: showCleared\n }\n }\"\n (click)=\"deselectChip(chip); $event.stopPropagation()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <i\n class=\"status stroked-icon icon-12\"\n [c8yIcon]=\"chip | AlarmSeverityToIcon\"\n [attr.data-cy]=\"'c8y-alarms-filter--icon-' + chip\"\n [ngClass]=\"chip | lowercase\"\n ></i>\n {{ SEVERITY_LABELS[chip] | translate }}\n </span>\n }\n } @else {\n <span\n class=\"text-truncate\"\n title=\"{{ 'All severities' | translate }}\"\n >\n {{ 'All severities' | translate }}\n </span>\n }\n </div>\n <div class=\"input-group-btn input-group-btn--last\">\n <button\n class=\"btn-default btn btn--caret\"\n title=\"{{ chips | AlarmSeveritiesToTitle }}\"\n data-cy=\"c8y-alarms-filter\"\n dropdownToggle\n (click)=\"resetForm()\"\n >\n <i class=\"caret\"></i>\n </button>\n </div>\n </div>\n <ul\n class=\"dropdown-menu dropdown-menu-action-bar\"\n *dropdownMenu\n >\n <li class=\"p-l-16 p-r-16 p-t-4 p-b-4 d-flex a-i-center sticky-top separator-bottom\">\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n [title]=\"'All' | translate\"\n >\n <input\n type=\"checkbox\"\n data-cy=\"c8y-alarms-filter--all\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"allChanged($event)\"\n [ngModel]=\"isEachCheckboxSelected$ | async\"\n [indeterminate]=\"isIndeterminate$ | async\"\n (click)=\"markSeveritiesAsTouched()\"\n />\n <span></span>\n <i\n class=\"status stroked-icon m-l-8 icon-20\"\n [c8yIcon]=\"'bell'\"\n ></i>\n <span class=\"m-l-8\">{{ 'All' | translate }}</span>\n </label>\n </li>\n @for (severity of severitiesList; track severity) {\n <li class=\"p-l-16 p-r-16 p-t-4 p-b-4 d-flex a-i-center\">\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n [title]=\"SEVERITY_LABELS[severity] | translate\"\n >\n <input\n type=\"checkbox\"\n [attr.data-cy]=\"'c8y-alarms-filter--' + severity\"\n [formControlName]=\"severity\"\n [value]=\"severity\"\n (click)=\"markSeveritiesAsTouched()\"\n />\n <span></span>\n <i\n class=\"status stroked-icon m-l-8 icon-20\"\n [c8yIcon]=\"severity | AlarmSeverityToIcon\"\n [ngClass]=\"severity | lowercase\"\n ></i>\n <span class=\"m-l-8\">{{ SEVERITY_LABELS[severity] | translate }}</span>\n </label>\n <!-- badge -->\n @if (alarmCounts[severity] || alarmCounts[severity] === 0) {\n <div class=\"badge badge-info m-l-auto\">\n @if (countLoading) {\n <i\n class=\"icon-spin\"\n [c8yIcon]=\"'circle-o-notch'\"\n ></i>\n }\n @if (!countLoading) {\n <span [attr.data-cy]=\"'c8y-alarms-filter--' + severity + '-badge'\">\n {{ alarmCounts[severity] < 99 ? alarmCounts[severity] : '99+' }}\n </span>\n }\n </div>\n }\n </li>\n }\n <li class=\"p-l-16 p-r-16 p-t-4 p-b-4 d-flex a-i-center separator-top\">\n <label\n class=\"c8y-switch\"\n [attr.aria-label]=\"'Show cleared alarms' | translate\"\n [attr.data-cy]=\"'c8y-alarms-filter--cleared'\"\n >\n <input\n type=\"checkbox\"\n #showClearedCheckbox\n [ngModelOptions]=\"{ standalone: true }\"\n [(ngModel)]=\"showCleared\"\n (click)=\"markSeveritiesAsTouched(); updateAlarmsCount(showClearedCheckbox.checked)\"\n />\n <span></span>\n <span\n class=\"text-truncate\"\n title=\"{{ 'Show cleared alarms' | translate }}\"\n >\n {{ 'Show cleared alarms' | translate }}\n </span>\n </label>\n </li>\n <li class=\"p-16 d-flex sticky-bottom separator-top\">\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-alarms-filter--apply\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARMS_FILTER,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.APPLY_FILTER,\n filterValues: {\n severities: formGroup.value,\n showCleared: showCleared\n }\n }\"\n (click)=\"applyFilters(false); closeDropdown()\"\n [disabled]=\"shouldDisableApplyButton$ | async\"\n >\n {{ 'Apply' | translate }}\n </button>\n </li>\n </ul>\n </div>\n</form>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { IAlarm } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { AlarmDetails } from '@c8y/ngx-components/alarm-event-selector';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { NgClass, NgStyle, LowerCasePipe } from '@angular/common';\nimport { AlarmSeverityToIconPipe } from './alarm-severity-to-icon.pipe';\nimport { AlarmStatusToIconPipe } from './alarm-status-to-icon.pipe';\nimport { AlarmSeverityToLabelPipe } from './alarm-severity-to-label.pipe';\nimport { AlarmStatusToLabelPipe } from './alarm-status-to-label.pipe';\n\n@Component({\n selector: 'c8y-alarms-icon',\n templateUrl: 'alarms-icon.component.html',\n imports: [\n TooltipDirective,\n IconDirective,\n NgClass,\n NgStyle,\n C8yTranslatePipe,\n LowerCasePipe,\n AlarmSeverityToIconPipe,\n AlarmStatusToIconPipe,\n AlarmSeverityToLabelPipe,\n AlarmStatusToLabelPipe\n ]\n})\nexport class AlarmsIconComponent implements OnInit {\n @Input()\n alarm: IAlarm;\n\n @Input()\n typeFilters: AlarmDetails[];\n\n iconBackgroundColor = 'none';\n isFilterApplied = false;\n\n alarmSeverityLabel = gettext('Severity: {{ alarmSeverity }}');\n alarmStatusLabel = gettext('Status: {{ alarmStatus }}');\n alarmStatusType = gettext('Type: {{ alarmType }}');\n\n ngOnInit(): void {\n this.isFilterApplied = this.typeFilters.length > 0;\n this.iconBackgroundColor =\n this.typeFilters.find(filter => filter.filters.type === this.alarm.type)?.color || 'none';\n }\n}\n","<button\n class=\"btn-clean severity\"\n [attr.aria-label]=\"\n alarmSeverityLabel | translate: { alarmSeverity: alarm.severity | AlarmSeverityToLabel }\n \"\n [tooltip]=\"\n alarmSeverityLabel | translate: { alarmSeverity: alarm.severity | AlarmSeverityToLabel }\n \"\n placement=\"right\"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [delay]=\"500\"\n>\n <i\n class=\"status stroked-icon\"\n [c8yIcon]=\"alarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"alarm.severity | lowercase\"\n ></i>\n</button>\n<button\n class=\"btn-clean status\"\n [ngStyle]=\"{ 'background-color': iconBackgroundColor }\"\n [attr.aria-label]=\"\n alarmStatusLabel | translate: { alarmStatus: alarm.status | AlarmStatusToLabel }\n \"\n [tooltip]=\"\n (alarmStatusLabel | translate: { alarmStatus: alarm.status | AlarmStatusToLabel }) +\n '\\n' +\n (alarmStatusType | translate: { alarmType: alarm.type })\n \"\n placement=\"right\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ 'circle-icon-wrapper': isFilterApplied }\"\n data-cy=\"c8y-alarms-icon--status-icon\"\n (click)=\"$event.stopPropagation()\"\n [delay]=\"500\"\n>\n <i\n [c8yIcon]=\"alarm.status | AlarmStatusToIcon\"\n [ngClass]=\"{ 'stroked-icon': isFilterApplied }\"\n ></i>\n</button>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild\n} from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { filter, takeUntil, tap } from 'rxjs/operators';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n CountdownIntervalComponent,\n RequiredInputPlaceholderDirective,\n IconDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { AlarmsViewService } from './alarms-view.service';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { NgIf, NgFor, NgClass, AsyncPipe } from '@angular/common';\n\n@Component({\n selector: 'c8y-alarms-interval-refresh',\n templateUrl: './alarms-interval-refresh.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n TooltipDirective,\n RequiredInputPlaceholderDirective,\n NgIf,\n CountdownIntervalComponent,\n IconDirective,\n NgFor,\n NgClass,\n C8yTranslatePipe,\n AsyncPipe\n ]\n})\nexport class AlarmsIntervalRefreshComponent implements OnInit, AfterViewInit, OnDestroy {\n readonly refreshIntervalsInMilliseconds = this.alarmsViewService.DEFAULT_INTERVAL_VALUES;\n readonly DISABLE_AUTO_REFRESH = gettext('Disable auto refresh');\n readonly ENABLE_AUTO_REFRESH = gettext('Enable auto refresh');\n readonly SECONDS_UNTIL_REFRESH = gettext('{{ seconds }} s');\n\n @Input() isDisabled = false;\n /**\n * Controls the loading state of the alarms list reload button.\n */\n @Input()\n alarmsListLoading$: BehaviorSubject<boolean>;\n /**\n * * Set the value of `isIntervalEnabled` in response to user interactions with the alarm list scroll.\n * *\n * * This input setter allows you to control the `isIntervalEnabled` property, which is used to manage the state\n * * of a toggle button. When a user scrolls through the alarms list, you can update the `isIntervalEnabled` value\n * * using this setter.\n * *\n * * @param value - A boolean value representing the new state of the `isIntervalEnabled` property.\n * * - `true` indicates that the interval is enabled.\n * * - `false` indicates that the interval is disabled.\n */\n @Input()\n set isIntervalToggleEnabled(value: boolean) {\n const shouldSetInterval = this.isIntervalToggleEnabled || this.doesUserCheckedIntervalToggle;\n const shouldToggleInterval =\n !this.isDisabled &&\n this.isIntervalToggleEnabled &&\n this.doesUserCheckedIntervalToggle &&\n value;\n const intervalToggleControl = this.toggleIntervalForm.get('intervalToggle');\n /**\n * We check if any interactions to toggle interval button were made.\n * When user interacts with toggle button, we need to ignore assigning value to the form.\n */\n if (intervalToggleControl.dirty && !shouldSetInterval) {\n return;\n }\n /**\n * This condition checks if the interval toggle is enabled and if there has been user interaction,\n * and if the provided value is truthy.\n * If all conditions are met, the interval toggle should not be updated due to unnecessary update of countdown interval component\n */\n if (shouldToggleInterval) {\n return;\n }\n intervalToggleControl.setValue(value);\n }\n /**\n * This getter allows you to access the current state of the `isIntervalEnabled` property, which reflects\n * the state of a toggle button. It retrieves the value from the associated form control, providing the\n * current state of the toggle button.\n */\n get isIntervalToggleEnabled(): boolean {\n return !this.isDisabled && this.toggleIntervalForm.get('intervalToggle').value;\n }\n /**\n * Event emitter for notifying when a countdown timer has completed.\n */\n @Output()\n onCountdownEnded = new EventEmitter<void>();\n\n @ViewChild(CountdownIntervalComponent)\n countdownIntervalComponent: CountdownIntervalComponent;\n toggleIntervalForm = this.initForm();\n private destroy$: Subject<void> = new Subject<void>();\n /**\n * Indicates whether the user has been interacting with the interval toggle.\n * Property holds the current state of the interval toggle input element entered by the user,\n * distinguishing it from changes made programmatically (e.g. value from isIntervalToggleEnabled).\n */\n private doesUserCheckedIntervalToggle: boolean;\n\n constructor(\n private fb: FormBuilder,\n private alarmsViewService: AlarmsViewService\n ) {}\n\n ngOnInit(): void {\n this.listenToRefreshIntervalChange();\n }\n\n ngAfterViewInit(): void {\n this.onIntervalToggleChange();\n this.listenOnLoadingChanges();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n resetCountdown(): void {\n this.countdownIntervalComponent?.reset();\n }\n\n trackUserClickOnIntervalToggle(target: EventTarget): void {\n this.doesUserCheckedIntervalToggle = (target as HTMLInputElement).checked;\n }\n\n getTooltip() {\n return this.isDisabled\n ? gettext('Disabled')\n : this.isIntervalToggleEnabled\n ? this.DISABLE_AUTO_REFRESH\n : this.ENABLE_AUTO_REFRESH;\n }\n\n private startCountdown(): void {\n this.countdownIntervalComponent.start();\n }\n\n private onIntervalToggleChange(): void {\n this.toggleIntervalForm\n .get('intervalToggle')\n .valueChanges.pipe(takeUntil(this.destroy$), filter(Boolean))\n .subscribe(() => setTimeout(() => this.startCountdown()));\n }\n\n private initForm() {\n return this.fb.group({\n intervalToggle: true,\n refreshInterval: this.alarmsViewService.DEFAULT_INTERVAL_VALUE\n });\n }\n\n private listenToRefreshIntervalChange(): void {\n this.toggleIntervalForm\n .get('refreshInterval')\n .valueChanges.pipe(takeUntil(this.destroy$))\n .subscribe(() => this.resetCountdown());\n }\n\n private listenOnLoadingChanges() {\n this.alarmsListLoading$\n .pipe(tap(() => this.countdownIntervalComponent?.stop()))\n .subscribe(state => {\n !state && this.countdownIntervalComponent?.reset();\n });\n }\n}\n","<form\n class=\"d-flex a-i-center fit-w fit-h\"\n [formGroup]=\"toggleIntervalForm\"\n>\n <label class=\"m-b-0 m-r-8 text-normal text-muted flex-no-shrink\">\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isDisabled\"\n [attr.aria-label]=\"getTooltip() | translate\"\n [tooltip]=\"getTooltip() | translate\"\n placement=\"bottom\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n data-cy=\"c8y-alarms-interval-refresh--toggle-countdown\"\n >\n <input\n type=\"checkbox\"\n data-cy=\"c8y-alarms-interval-toggle\"\n formControlName=\"intervalToggle\"\n (click)=\"trackUserClickOnIntervalToggle($event.target)\"\n />\n <c8y-countdown-interval\n *ngIf=\"isIntervalToggleEnabled\"\n [countdownInterval]=\"toggleIntervalForm.value.refreshInterval\"\n (countdownEnded)=\"onCountdownEnded.emit()\"\n ></c8y-countdown-interval>\n <i\n data-cy=\"c8y-alarms-interval-refresh--pause\"\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalToggleEnabled\"\n ></i>\n </label>\n <div\n class=\"c8y-select-wrapper\"\n *ngIf=\"!isDisabled\"\n >\n <select\n class=\"form-control text-12\"\n [attr.aria-label]=\"'Refresh interval in seconds' | translate\"\n [tooltip]=\"'Refresh interval in seconds' | translate\"\n placement=\"bottom\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [container]=\"'body'\"\n formControlName=\"refreshInterval\"\n data-cy=\"c8y-alarms-interval-refresh--selector\"\n >\n <option\n [disabled]=\"isDisabled\"\n *ngFor=\"let refreshInterval of refreshIntervalsInMilliseconds\"\n [ngValue]=\"refreshInterval\"\n [attr.data-cy]=\"'c8y-interval-' + refreshInterval\"\n >\n {{ SECONDS_UNTIL_REFRESH | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n <span></span>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n style=\"border-left: 0\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"isDisabled || (alarmsListLoading$ | async)\"\n (click)=\"onCountdownEnded.emit()\"\n data-cy=\"c8y-alarms-interval-refresh--btn\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': alarmsListLoading$ | async }\"\n ></i>\n </button>\n </div>\n </div>\n</form>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport {\n ActivatedRoute,\n NavigationEnd,\n Router,\n RouterLinkActive,\n RouterLink\n} from '@angular/router';\nimport { IAlarm, IResultList } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ContextRouteService,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n ListItemComponent,\n LoadMoreMode,\n C8yTranslateDirective,\n ListGroupComponent,\n ForOfDirective,\n ListItemTimelineComponent,\n ListItemIconComponent,\n ListItemBodyComponent,\n IconDirective,\n LoadingComponent,\n EmptyStateComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n DynamicComponentAlertsComponent,\n C8yTranslatePipe,\n DatePipe\n} from '@c8y/ngx-components';\nimport { BehaviorSubject, Observable, Subject, fromEvent, pipe } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n shareReplay,\n switchMap,\n takeUntil\n} from 'rxjs/operators';\nimport { AlarmsViewService } from './alarms-view.service';\nimport { AlarmNavigationOptions } from './alarms.model';\nimport { AlarmDetails } from '@c8y/ngx-components/alarm-event-selector';\nimport { NgClass, NgIf, NgStyle, NgFor, AsyncPipe } from '@angular/common';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\nimport { AlarmsIconComponent } from './alarms-icon.component';\nimport { AlarmListIndicatorPipe } from './alarm-list-custom-indicator/alarm-list-indicator.pipe';\n\n@Component({\n selector: 'c8y-alarms-list',\n templateUrl: './alarms-list.component.html',\n imports: [\n NgClass,\n NgIf,\n C8yTranslateDirective,\n ListGroupComponent,\n NgStyle,\n ForOfDirective,\n ListItemTimelineComponent,\n RouterLinkActive,\n RouterLink,\n TooltipDirective,\n ListItemComponent,\n ListItemIconComponent,\n AlarmsIconComponent,\n ListItemBodyComponent,\n IconDirective,\n NgFor,\n LoadingComponent,\n EmptyStateComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n DynamicComponentAlertsComponent,\n C8yTranslatePipe,\n AsyncPipe,\n DatePipe,\n AlarmListIndicatorPipe\n ]\n})\nexport class AlarmsListComponent implements OnChanges, AfterViewInit, OnDestroy {\n readonly alarmBadgeTooltip = gettext(\n 'Number of occurrences`number of occurrences of alarm`. First occurrence {{ alarmFirstOccurrenceTime }} (device time).'\n );\n readonly alarmLastOccurrenceLabel = gettext('Last occurrence of this alarm (device time).');\n\n /**\n * Input property for receiving a list of alarms.\n */\n @Input()\n alarms: IResultList<IAlarm & { link?: string }>;\n\n @Input() hasPermissions = true;\n\n /**\n * Input property for the currently applied type filters.\n */\n @Input()\n typeFilters: AlarmDetails[] = [];\n\n /**\n * Input property for receiving load more mode.\n */\n @Input()\n loadMoreMode: LoadMoreMode = 'hidden';\n\n /**\n * Defines options, how the alarm list should be navigated if a user\n * clicks on an alarm.\n */\n @Input()\n navigationOptions: AlarmNavigationOptions = {\n allowNavigationToAlarmsView: true,\n alwaysNavigateToAllAlarms: false,\n includeClearedQueryParams: false,\n queryParamsHandling: 'merge'\n };\n\n /**\n * Controls the visibility of the loading bar\n * When set to `false`, the alarm list is displayed. When set to `true`, the opacity of alarms list is changed and a loading bar is shown.\n */\n @Input()\n isInitialLoading = false;\n\n /**\n * Controls the visibility and functionality of some components\n * When set to `true`, means the list is displayed in a split view layout:\n * the list on the first column and the selected record detail on the second column (the cockpit\n * alarms view for example)\n * When set to false, the list is displayed as a standalone component, opening the detail will\n * redirect to the alarms\n */\n @Input()\n splitView = false;\n\n /**\n * Indicates whether the component is in widget preview mode.\n */\n @Input() isInPreviewMode = false;\n\n /**\n * Emits an instance of a selected alarm when one is chosen from the list.\n */\n @Output()\n onSelectedAlarm = new EventEmitter<IAlarm>();\n\n /**\n * Emits a boolean value indicating the scrolling state: true when the user starts scrolling, and false when the user reaches the top of the list.\n */\n @Output()\n onScrollingStateChange = new EventEmitter<boolean>();\n\n /**\n * Current alarm or last alarm marked as active by the routerLinkActive directive.\n */\n activeAlarm$ = new BehaviorSubject<IAlarm>(null);\n activeChildParam$ = new Observable<string>();\n\n @ViewChild('scrollWrapper')\n innerScrollWrapper: ElementRef;\n\n isScrolling = false;\n /**\n * Determines whether the c8y-loading component should be displayed.\n * The loading component is shown when no alarms are displayed in the view or when the request is initial,\n * as we don't want to see empty space on alarm list during loading.\n */\n isEmptyListLoading = true;\n\n alertAggregator = new DynamicComponentAlertAggregator();\n\n mapAlarmLink = pipe(\n map((alarms: IAlarm[]) =>\n alarms.map((alarm: IAlarm) => {\n alarm.link = this.getRouterLink(alarm);\n return alarm;\n })\n )\n );\n\n private destroy$: Subject<void> = new Subject<void>();\n private HIDE_INTERVAL_COUNTDOWN_SCROLL = 50;\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private alarmsViewService: AlarmsViewService,\n private contextRouteService: ContextRouteService,\n private router: Router\n ) {\n this.verifyIfFiltersMatchingAlarm();\n }\n\n /**\n * Handles the change of the active route.\n *\n * @param isActive - A boolean indicating whether the route is active or not.\n * @param scrollAnchor - The ListItemComponent used as a scroll anchor.\n * @param alarm - The IAlarm object representing the active alarm.\n */\n activeRouteChanged(isActive: boolean, scrollAnchor: ListItemComponent, alarm: IAlarm): void {\n if (isActive) {\n scrollAnchor.element.nativeElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest'\n });\n this.activeAlarm$.next(alarm);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.alarms && changes.alarms) {\n this.activeAlarm$.next(null);\n this.isEmptyListLoading = !this.alarms?.data?.length;\n }\n\n if (changes.hasPermissions?.currentValue === false) {\n this.alertAggregator.addAlerts(\n new DynamicComponentAlert({\n type: 'system',\n text: gettext(\"You don't have permission to view alarms.\")\n })\n );\n }\n }\n\n ngAfterViewInit(): void {\n if (this.isInPreviewMode) {\n return;\n }\n\n if (this.alarmsViewService.isIntervalRefresh()) {\n const scrollElement = this.innerScrollWrapper.nativeElement;\n fromEvent(scrollElement, 'scroll')\n .pipe(takeUntil(this.destroy$), debounceTime(300))\n .subscribe((event: Event) => {\n const target = event.target as HTMLElement;\n this.isScrolling = this.shouldCountdownIntervalBeHidden(target);\n this.onScrollingStateChange.emit(this.isScrolling);\n });\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onAlarmOpen(alarm: IAlarm): void {\n this.onSelectedAlarm.emit(alarm);\n }\n\n getRouterLink(alarm: IAlarm): string {\n if (this.navigationOptions.alwaysNavigateToAllAlarms) {\n return this.alarmsViewService.getRouterLink(null, alarm);\n }\n const contextData = this.contextRouteService.getContextData(this.activatedRoute);\n return this.alarmsViewService.getRouterLink(contextData, alarm);\n }\n\n private shouldCountdownIntervalBeHidden(target: HTMLElement): boolean {\n const scrollTopPixels = target.scrollTop;\n return scrollTopPixels > this.HIDE_INTERVAL_COUNTDOWN_SCROLL;\n }\n\n private verifyIfFiltersMatchingAlarm() {\n this.activeChildParam$ = this.router.events.pipe(\n filter(e => e instanceof NavigationEnd && this.activatedRoute.children.length > 0),\n switchMap(() => this.activatedRoute.children[0].params),\n map(params => params.id),\n distinctUntilChanged(),\n shareReplay(),\n takeUntil(this.destroy$)\n );\n\n // done to get the first navigation\n this.activeChildParam$.subscribe();\n }\n}\n","<div\n class=\"inner-scroll\"\n [ngClass]=\"{ 'split-view__list bg-level-1': splitView, 'bg-component': !splitView }\"\n data-cy=\"c8y-alarms-list\"\n #scrollWrapper\n>\n <div\n class=\"flex-wrap flex-no-shrink sticky-top m-b-16\"\n [ngClass]=\"{\n 'separator-bottom card-header p-b-0': splitView,\n 'd-flex fit-w separator-top-bottom widget-bar p-l-16 p-r-16':\n !splitView && navigationOptions.allowNavigationToAlarmsView\n }\"\n >\n <div\n class=\"h4 card-title\"\n *ngIf=\"splitView\"\n >\n {{ 'Alarms list' | translate }}\n </div>\n <div\n [ngClass]=\"{ 'fit-w d-flex a-i-center gap-16': !splitView, 'fit-h-20 m-l-auto': splitView }\"\n >\n <ng-content></ng-content>\n </div>\n <!-- Loading -->\n <div\n class=\"fit-w overflow-hidden\"\n [ngClass]=\"{ 'p-t-16': splitView }\"\n >\n <div\n class=\"loading-bar\"\n data-cy=\"c8y-alarms-list--loading-bar\"\n style=\"z-index: 101\"\n [ngClass]=\"{ active: isInitialLoading && !isEmptyListLoading }\"\n ></div>\n </div>\n\n <div\n class=\"alert alert-warning\"\n role=\"alert\"\n translate\n *ngIf=\"\n !isEmptyListLoading &&\n (activeChildParam$ | async) &&\n (activeAlarm$ | async)?.id !== (activeChildParam$ | async)\n \"\n >\n The selected alarm is not currently in the list, change your filter.\n </div>\n </div>\n <c8y-list-group\n class=\"p-r-16 interactive\"\n [ngStyle]=\"{ opacity: isInitialLoading && !isEmptyListLoading ? 0.2 : 1 }\"\n style=\"transition: opacity 0.15s linear\"\n data-cy=\"c8y-alarms-list--group\"\n >\n <c8y-li-timeline\n class=\"pointer\"\n role=\"button\"\n data-cy=\"c8y-alarms-list--timeline-repeat\"\n *c8yFor=\"let alarm of alarms; let i = index; pipe: mapAlarmLink; loadMore: loadMoreMode\"\n [routerLink]=\"navigationOptions.allowNavigationToAlarmsView ? alarm.link : null\"\n routerLinkActive=\"active\"\n [queryParamsHandling]=\"navigationOptions.queryParamsHandling\"\n (isActiveChange)=\"activeRouteChanged($event, liScrollAnchor, alarm)\"\n (click)=\"onAlarmOpen(alarm)\"\n [queryParams]=\"\n navigationOptions.includeClearedQueryParams\n ? { showCleared: alarm.status === 'CLEARED' }\n : {}\n \"\n >\n <span\n [attr.aria-label]=\"alarmLastOccurrenceLabel | translate\"\n [tooltip]=\"alarmLastOccurrenceLabel | translate\"\n placement=\"right\"\n data-cy=\"c8y-alarms-list--last-occurrence-date\"\n container=\"body\"\n [delay]=\"500\"\n >\n {{ alarm.time | c8yDate: 'mediumDate' }}\n {{ alarm.time | c8yDate: 'mediumTime' }}\n </span>\n <c8y-li\n style=\"scroll-margin-top: 56px\"\n #liScrollAnchor\n >\n <c8y-li-icon class=\"a-s-start\">\n <div class=\"alarm-icons\">\n <c8y-alarms-icon [typeFilters]=\"typeFilters\" [alarm]=\"alarm\"></c8y-alarms-icon>\n </div>\n <button\n class=\"btn-clean text-center\"\n data-cy=\"c8y-alarms-list--badge\"\n [attr.aria-label]=\"\n alarmBadgeTooltip\n | translate\n : { alarmFirstOccurrenceTime: alarm.firstOccurrenceTime | c8yDate: 'medium' }\n \"\n [tooltip]=\"\n alarmBadgeTooltip\n | translate\n : { alarmFirstOccurrenceTime: alarm.firstOccurrenceTime | c8yDate: 'medium' }\n \"\n placement=\"right\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarm.firstOccurrenceTime\"\n (click)=\"$event.stopPropagation()\"\n [delay]=\"500\"\n >\n <span\n class=\"badge badge-info\"\n *ngIf=\"alarm.count > 1\"\n >\n {{ alarm.count }}\n </span>\n </button>\n </c8y-li-icon>\n <c8y-li-body class=\"a-s-stretch\">\n <div class=\"d-flex a-i-start fit-h\">\n <div class=\"min-width-0 flex-grow\">\n <p class=\"text-truncate-wrap p-b-4\" data-cy=\"c8y-alarms-list--alarm-text\">\n {{ alarm.text | translate }}\n </p>\n <div class=\"d-flex\">\n <p\n class=\"small text-muted text-truncate flex-grow\"\n [title]=\"alarm.source.name\"\n data-cy=\"c8y-alarms-list--alarm-source-name\"\n >\n <i [c8yIcon]=\"'exchange'\"></i>\n {{ alarm.source.name }}\n </p>\n <div class=\"d-flex\">\n <div\n [title]=\"item.title | translate\"\n *ngFor=\"let item of alarm | alarmListIndicator | async\"\n >\n <i\n [class]=\"item.class\"\n [c8yIcon]=\"item.icon\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n <c8y-loading\n data-cy=\"c8y-alarms-list--c8y-loading\"\n *ngIf=\"isInitialLoading && isEmptyListLoading\"></c8y-loading>\n <div\n class=\"p-relative p-l-24\"\n *ngIf=\"isEmptyListLoading && !isInitialLoading\"\n >\n <c8y-ui-empty-state\n [icon]=\"'c8y-alert-idle'\"\n [title]=\"'No alarms to display.' | translate\"\n data-cy=\"c8y-alarms-list--empty-state\"\n *ngIf=\"hasPermissions; else alertsA\"\n >\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a\n c8y-guide-href=\"/docs/device-management-application/monitoring-and-controlling-devices/#working-with-alarms\"\n >\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n </c8y-list-group>\n</div>\n\n<ng-template #alertsA>\n <c8y-dynamic-component-alerts [alerts]=\"alertAggregator\"></c8y-dynamic-component-alerts>\n</ng-template>\n","import {\n Component,\n EventEmitter,\n forwardRef,\n Input,\n OnDestroy,\n Output,\n ViewChild\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormBuilder,\n NG_VALUE_ACCESSOR,\n FormsModule,\n ReactiveFormsModule\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Severity, SeverityType } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n DateTimeContext,\n DropdownDirectionDirective,\n IconDirective,\n FormGroupComponent,\n C8yTranslateDirective,\n DateTimePickerComponent,\n MessagesComponent,\n MessageDirective,\n C8yTranslatePipe,\n DatePipe\n} from '@c8y/ngx-components';\nimport { Subject, take, takeUntil } from 'rxjs';\nimport {\n AlarmListFormFilters,\n INTERVAL_TITLES_EXTENDED,\n INTERVALS_EXTENDED,\n WidgetTimeContextStateExtended\n} from './alarms.model';\nimport {\n BsDropdownDirective,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective\n} from 'ngx-bootstrap/dropdown';\nimport { AlarmsViewService } from './alarms-view.service';\nimport { AlarmFilterInterval, IntervalPickerComponent } from '@c8y/ngx-components/interval-picker';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { NgIf, NgClass } from '@angular/common';\n\n@Component({\n selector: 'c8y-alarms-date-filter',\n templateUrl: './alarms-date-filter.component.html',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AlarmsDateFilterComponent),\n multi: true\n }\n ],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n BsDropdownDirective,\n DropdownDirectionDirective,\n BsDropdownToggleDirective,\n TooltipDirective,\n IconDirective,\n NgIf,\n BsDropdownMenuDirective,\n IntervalPickerComponent,\n FormGroupComponent,\n NgClass,\n C8yTranslateDirective,\n DateTimePickerComponent,\n MessagesComponent,\n MessageDirective,\n C8yTranslatePipe,\n DatePipe\n ]\n})\nexport class AlarmsDateFilterComponent implements OnDestroy, ControlValueAccessor {\n readonly INTERVALS = INTERVALS_EXTENDED;\n readonly INTERVAL_TITLES = INTERVAL_TITLES_EXTENDED;\n readonly DATE_FORMAT = 'short';\n\n @Input() DEFAULT_INTERVAL: AlarmFilterInterval['id'] = 'none';\n @Input() updateQueryParams = true;\n /**\n * Date range to be displayed in the date picker.\n */\n @Input() date: [string, string];\n noFilterLabel = gettext('No date filter');\n\n private showCleared: boolean;\n private severityOptions: { [key in SeverityType]: boolean };\n private typeFilters: string;\n private destroy$: Subject<void> = new Subject<void>();\n\n @Output() dateFilterChange = new EventEmitter<AlarmListFormFilters>();\n @ViewChild(BsDropdownDirective) dropdown: BsDropdownDirective;\n\n form: ReturnType<AlarmsDateFilterComponent['createForm']>;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onChange: (value: any) => void;\n\n constructor(\n private formBuilder: FormBuilder,\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private alarmsViewService: AlarmsViewService\n ) {}\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onTouched = () => {};\n\n ngOnInit() {\n const context = this.getDefaultContext();\n this.form = this.createForm(context);\n this.date = [\n this.form.value.currentDateContextFromDate,\n this.form.value.currentDateContextToDate\n ];\n this.activatedRoute.queryParams.pipe(take(1), takeUntil(this.destroy$)).subscribe(params => {\n this.showCleared = params.showCleared === 'true';\n this.severityOptions = {\n [Severity.CRITICAL]: params.critical === 'true',\n [Severity.MAJOR]: params.major === 'true',\n [Severity.MINOR]: params.minor === 'true',\n [Severity.WARNING]: params.warning === 'true'\n };\n if (params.typeFilters) {\n this.typeFilters = params.typeFilters;\n }\n if (!params.interval) {\n return;\n }\n if (params.interval !== 'custom') {\n this.updateDateTime(params.interval);\n } else {\n this.form.patchValue({\n currentDateContextInterval: params.interval,\n temporaryUserSelectedFromDate: params.lastUpdatedFrom,\n temporaryUserSelectedToDate: params.createdTo\n });\n this.date = [params.lastUpdatedFrom, params.createdTo];\n }\n });\n\n this.subscribeToIntervalChange();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n applyDateFilter(): void {\n const combinedFormEvent = {\n showCleared: this.showCleared,\n severityOptions: this.severityOptions,\n typeFilters: this.typeFilters,\n interval: this.form.value.currentDateContextInterval,\n selectedDates: [\n new Date(this.form.value.temporaryUserSelectedFromDate),\n new Date(this.form.value.temporaryUserSelectedToDate)\n ] as DateTimeContext\n };\n\n // needed for custom interval\n this.date = [\n this.form.value.temporaryUserSelectedFromDate,\n this.form.value.temporaryUserSelectedToDate\n ];\n\n this.router.navigate([], {\n relativeTo: this.activatedRoute,\n queryParams: {\n interval: this.form.value.currentDateContextInterval,\n lastUpdatedFrom: combinedFormEvent.selectedDates[0].toISOString(),\n createdTo: combinedFormEvent.selectedDates[1].toISOString()\n },\n queryParamsHandling: 'merge'\n });\n this.dateFilterChange.emit(combinedFormEvent);\n }\n\n writeValue(value: any): void {\n if (value) {\n this.form.patchValue({\n currentDateContextFromDate:\n typeof value[0] === 'string' ? value[0] : value[0].toISOString(),\n currentDateContextToDate: typeof value[1] === 'string' ? value[1] : value[1].toISOString()\n });\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(onTouched: any) {\n this.onTouched = onTouched;\n }\n\n private updateDateTime(interval: AlarmFilterInterval['id']): void {\n const date = this.alarmsViewService.getDateTimeContextByInterval(interval);\n if (this.dropdown) {\n this.dropdown.isOpen = false;\n }\n this.date = date.map(d => d.toISOString()) as [string, string];\n this.form.patchValue(\n {\n temporaryUserSelectedFromDate: date[0].toISOString(),\n temporaryUserSelectedToDate: date[1].toISOString(),\n currentDateContextInterval: interval\n },\n { emitEvent: false }\n );\n this.applyDateFilter();\n }\n\n private getDefaultContext() {\n return {\n date: this.alarmsViewService.getDateTimeContextByInterval(this.DEFAULT_INTERVAL),\n interval: this.DEFAULT_INTERVAL\n };\n }\n\n private subscribeToIntervalChange(): void {\n this.form.controls.currentDateContextInterval.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe(interval => {\n if (interval === 'custom') {\n this.form.patchValue(\n {\n temporaryUserSelectedFromDate:\n this.form.controls.temporaryUserSelectedFromDate.value === new Date(0).toISOString()\n ? this.form.controls.currentDateContextToDate.value\n : this.form.controls.temporaryUserSelectedFromDate.value,\n currentDateContextInterval: interval\n },\n { emitEvent: false }\n );\n return;\n }\n this.updateDateTime(interval);\n });\n }\n\n private createForm(context: WidgetTimeContextStateExtended) {\n return this.formBuilder.group({\n temporaryUserSelectedFromDate: context.date[0].toISOString(),\n temporaryUserSelectedToDate: context.date[1].toISOString(),\n currentDateContextFromDate: context.date[0].toISOString(),\n currentDateContextToDate: context.date[1].toISOString(),\n currentDateContextInterval: context.interval || 'custom'\n });\n }\n}\n","<form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n>\n <div\n class=\"dropdown flex-grow\"\n c8yDropdownDirection\n #dropDirection=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{\n (form.value.currentDateContextInterval === 'none'\n ? noFilterLabel\n : (date[0] | c8yDate: DATE_FORMAT) + ' — ' + (date[1] | c8yDate: DATE_FORMAT)\n ) | translate\n }}\"\n tooltip=\"{{\n (form.value.currentDateContextInterval === 'none'\n ? noFilterLabel\n : (date[0] | c8yDate: DATE_FORMAT) + ' — ' + (date[1] | c8yDate: DATE_FORMAT)\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"alarms-date-filter--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"alarms-date-filter--selected-time-range\"\n *ngIf=\"form.controls.currentDateContextInterval.value !== 'none'\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} — {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n [INTERVALS]=\"INTERVALS\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n class=\"m-b-8\"\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n class=\"m-b-8\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDateFilter(); dropdown.isOpen = false\"\n [disabled]=\"(form.pristine && form.untouched) || form.invalid\"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n</form>\n","import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IAlarm, IResultList } from '@c8y/client';\nimport {\n ColorService,\n IconDirective,\n ListGroupComponent,\n ListItemComponent,\n ListItemCheckboxComponent,\n EmptyStateComponent,\n C8yTranslateDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { AlarmDetails, AlarmEventSelectorService } from '@c8y/ngx-components/alarm-event-selector';\nimport { map, Subject, takeUntil } from 'rxjs';\nimport {\n BsDropdownDirective,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective\n} from 'ngx-bootstrap/dropdown';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgStyle } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n selector: 'c8y-alarms-type-filter',\n templateUrl: './alarms-type-filter.component.html',\n imports: [\n BsDropdownDirective,\n CdkTrapFocus,\n IconDirective,\n NgStyle,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective,\n ListGroupComponent,\n FormsModule,\n TooltipDirective,\n ListItemComponent,\n ListItemCheckboxComponent,\n EmptyStateComponent,\n C8yTranslateDirective,\n C8yTranslatePipe\n ]\n})\nexport class AlarmsTypeFilterComponent implements OnInit, OnDestroy, OnChanges {\n @Input()\n alarms: IResultList<IAlarm>;\n\n @Input()\n possibleFilters: AlarmDetails[] = [];\n\n @Input()\n activeFilters: AlarmDetails[] = [];\n\n @Output()\n onFilterChanged: EventEmitter<AlarmDetails[]> = new EventEmitter();\n\n customAlarmTypes: AlarmDetails[] = [];\n customAlarmTypeInput = '';\n\n readonly queryParamName = 'typeFilter';\n readonly STORAGE_ACCESS_KEY = 'customAlarmTypes';\n\n private destroy$ = new Subject<void>();\n private currentQueryParam = '';\n\n constructor(\n private alarmEventSelectorService: AlarmEventSelectorService,\n private activatedRoute: ActivatedRoute,\n private router: Router,\n private colorService: ColorService\n ) {}\n\n ngOnInit(): void {\n this.setQueryParameterObservable();\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes.alarms && changes.alarms.currentValue && this.activeFilters.length === 0) {\n await this.setPossibleFilters();\n this.applyFilterChange();\n }\n }\n\n setQueryParameterObservable() {\n this.activatedRoute.queryParams\n .pipe(\n map(params => {\n const alarms: AlarmDetails[] = this.possibleFilters;\n const possibleFilters = this.setActiveAlarmFiltersFromQueryParameter(\n alarms,\n params[this.queryParamName]\n );\n return possibleFilters;\n }),\n takeUntil(this.destroy$)\n )\n .subscribe((possibleFilters: AlarmDetails[]) => {\n this.possibleFilters = possibleFilters;\n this.applyFilterChange();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n toggleAlarmType(alarmType: AlarmDetails) {\n alarmType.__active = !alarmType.__active;\n }\n\n deselect(type: AlarmDetails) {\n const alarmFilter = this.possibleFilters.find(\n alarm => alarm.filters.type === type.filters.type\n );\n alarmFilter.__active = false;\n this.applyFilterChange();\n }\n\n deselectAll() {\n this.possibleFilters = this.possibleFilters.map(alarm => {\n return {\n ...alarm,\n __active: false\n };\n });\n this.applyFilterChange();\n }\n\n applyFilterChange() {\n const actives = this.possibleFilters.filter(\n (alarmFilter: AlarmDetails) => alarmFilter.__active\n );\n const newQueryParam = this.getQueryParams(actives);\n const hasChanged = newQueryParam !== this.currentQueryParam;\n if (hasChanged) {\n this.activeFilters = actives;\n this.onFilterChanged.emit(this.activeFilters);\n this.router.navigate([], {\n queryParams: {\n typeFilter: newQueryParam || null\n },\n queryParamsHandling: 'merge'\n });\n this.currentQueryParam = newQueryParam;\n }\n }\n\n resetFilters() {\n this.possibleFilters.forEach(possibleFilter => {\n possibleFilter.__active = this.activeFilters.some(\n (activeFilter: AlarmDetails) => activeFilter === possibleFilter\n );\n });\n }\n\n removeCustomAlarm(alarmDetails: AlarmDetails) {\n this.possibleFilters = this.possibleFilters.filter(filter => filter !== alarmDetails);\n this.storeCustomAlarmTypes();\n }\n\n confirmWithEnter(event: KeyboardEvent) {\n if (event.key === 'Enter') {\n this.addCustomAlarmType();\n }\n }\n\n async addCustomAlarmType() {\n if (!this.customAlarmTypeInput) {\n return;\n }\n this.possibleFilters.unshift({\n label: this.customAlarmTypeInput,\n color: await this.colorService.generateColor(this.customAlarmTypeInput),\n filters: {\n type: this.customAlarmTypeInput\n },\n timelineType: 'ALARM',\n __active: true,\n __target: null\n });\n this.customAlarmTypeInput = '';\n this.storeCustomAlarmTypes();\n }\n\n private storeCustomAlarmTypes() {\n const customTypes = this.possibleFilters.filter((filter: AlarmDetails) => !filter.__target);\n window.localStorage.setItem(this.STORAGE_ACCESS_KEY, JSON.stringify(customTypes));\n }\n\n private getCustomAlarmTypeFromStorage() {\n const types = window.localStorage.getItem(this.STORAGE_ACCESS_KEY);\n return types ? JSON.parse(types) : [];\n }\n\n private async setPossibleFilters() {\n const queryParameters = this.activatedRoute.snapshot.queryParamMap.get(this.queryParamName);\n const alarmTypesFromCurrentlyShownAlarms =\n await this.alarmEventSelectorService.getUniqueAlarmsOnly(this.alarms.data);\n const customAlarmTypesFromLocalStorage = this.getCustomAlarmTypeFromStorage();\n const selectableAlarmTypes = this.setActiveAlarmFiltersFromQueryParameter(\n [...customAlarmTypesFromLocalStorage, ...alarmTypesFromCurrentlyShownAlarms],\n queryParameters\n );\n this.possibleFilters = selectableAlarmTypes;\n }\n\n private setActiveAlarmFiltersFromQueryParameter(\n alarmFilters: AlarmDetails[],\n filterTypesQuery = ''\n ): AlarmDetails[] {\n const types = (filterTypesQuery ?? '').split(',');\n return alarmFilters.map((alarm: AlarmDetails) => ({\n ...alarm,\n __active: types.includes(alarm.filters.type)\n }));\n }\n\n private getQueryParams(activeFilters: AlarmDetails[]): string {\n return activeFilters.map(filter => filter.filters.type).join(',');\n }\n}\n","<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 @if (activeFilters.length > 0) {\n @for (filter of activeFilters; track $index) {\n <span\n class=\"tag tag--info chip\"\n style=\"max-width: 150px\"\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 <span\n class=\"text-truncate text-12 flex-grow\"\n [title]=\"filter.filters.type\"\n [attr.aria-label]=\"filter.filters.type\"\n >\n {{ filter.filters.type }}\n </span>\n </span>\n }\n } @else {\n <span class=\"text-nowrap\">\n {{ 'All alarm types' | translate }}\n </span>\n }\n </div>\n <div class=\"input-group-btn input-group-btn--last text-center\">\n @if (activeFilters.length) {\n <button\n class=\"btn-default btn\"\n [title]=\"'Clear filters' | translate\"\n (click)=\"deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n }\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=\"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 translate>The list below may not be complete.</strong>\n </p>\n <p>\n <span translate>\n Recent alarms are displayed below but older ones may not be shown.\n </span>\n <span translate>Optionally, you can add a custom alarm.</span>\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 type=\"text\"\n [placeholder]=\"'Custom alarm type' | translate\"\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 @for (alarmType of possibleFilters; track $index) {\n <c8y-li\n class=\"c8y-list__item__collapse--container-small cdk-drag\"\n style=\"cursor: pointer\"\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\n class=\"text-truncate text-12 flex-grow\"\n [title]=\"alarmType.label\"\n [attr.aria-label]=\"alarmType.label\"\n >\n {{ alarmType.label }}\n </span>\n @if (alarmType.__target === null) {\n <button\n class=\"btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"'Remove' | translate\"\n placement=\"top\"\n [delay]=\"500\"\n (click)=\"removeCustomAlarm(alarmType); $event.stopPropagation()\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n }\n </div>\n </c8y-li>\n }\n @if (possibleFilters.length === 0) {\n <c8y-li>\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 }\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","import { Component, HostListener, OnDestroy, OnInit, signal, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router, RouterOutlet } from '@angular/router';\nimport {\n AlarmQueryFilter,\n IAlarm,\n IResultList,\n SEVERITY_LABELS,\n SeverityFilter,\n SeverityType\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlarmWithChildrenRealtimeService,\n AlertService,\n ContextRouteService,\n DateTimeContext,\n ModalService,\n ViewContext,\n GainsightService,\n TitleComponent,\n ActionBarItemComponent,\n IconDirective,\n HelpComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { AlarmDetails } from '@c8y/ngx-components/alarm-event-selector';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n takeUntil,\n throttleTime\n} from 'rxjs/operators';\nimport { AlarmsIntervalRefreshComponent } from './alarms-interval-refresh.component';\nimport { AlarmsViewService } from './alarms-view.service';\nimport {\n AlarmListFormFilters,\n DEFAULT_SEVERITY_VALUES,\n PRODUCT_EXPERIENCE_ALARMS,\n ReloadAlarmsListType,\n THROTTLE_REALTIME_REFRESH\n} from './alarms.model';\nimport { AlarmsActivityTrackerService } from './alarms-activity-tracker.service';\nimport { NgIf, NgClass, AsyncPipe } from '@angular/common';\nimport { AlarmsFilterComponent } from './alarms-filter.component';\nimport { AlarmsDateFilterComponent } from './alarms-date-filter.component';\nimport { AlarmsTypeFilterComponent } from './alarms-type-filter.component';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { AlarmsListComponent } from './alarms-list.component';\n\n@Component({\n selector: 'c8y-alarms',\n templateUrl: './alarms.component.html',\n providers: [AlarmWithChildrenRealtimeService, AlarmsActivityTrackerService],\n imports: [\n NgIf,\n TitleComponent,\n ActionBarItemComponent,\n AlarmsFilterComponent,\n AlarmsDateFilterComponent,\n AlarmsTypeFilterComponent,\n IconDirective,\n TooltipDirective,\n NgClass,\n HelpComponent,\n AlarmsListComponent,\n AlarmsIntervalRefreshComponent,\n RouterOutlet,\n C8yTranslatePipe,\n AsyncPipe\n ]\n})\nexport class AlarmsComponent implements OnInit, OnDestroy {\n readonly NEW_REALTIME_ALARM_MESSAGE = this.alarmsViewService.REALTIME_UPDATE_ALARMS_MESSAGE;\n readonly TITLE = gettext('Alarms');\n readonly REFRESH_LABEL = gettext('Refresh');\n\n @ViewChild(AlarmsIntervalRefreshComponent)\n alarmIntervalRefreshComponent: AlarmsIntervalRefreshComponent;\n alarms$: BehaviorSubject<IResultList<IAlarm>> = new BehaviorSubject<IResultList<IAlarm>>(null);\n contextSourceId: number | string | null;\n /** responsible for showing either realtime button or intervals, based on 'refreshType' key in OptionsService */\n isIntervalRefresh: boolean;\n isLoading$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\n isRealtimeActive = new BehaviorSubject<boolean>(false);\n realtimeIconTitle: string;\n shouldShowIntervalToggle$ = new BehaviorSubject<boolean>(true);\n isRealtimeToggleOn = true;\n typeFilters: AlarmDetails[] = [];\n isDisabled = false;\n isListScrolled = signal(false);\n\n private destroy$: Subject<void> = new Subject<void>();\n private selectedSeverities = Object.keys(SEVERITY_LABELS) as SeverityType[];\n private severityOptions: SeverityFilter = DEFAULT_SEVERITY_VALUES;\n private showCleared = false;\n private readonly WAIT_TIME_AVOID_MULTIPLE_REQUEST_BY_PARAM_CHANGE = 100;\n private selectedDates: DateTimeContext;\n\n constructor(\n public activatedRoute: ActivatedRoute,\n private alarmsViewService: AlarmsViewService,\n private alarmWithChildrenRealtimeService: AlarmWithChildrenRealtimeService,\n private alertService: AlertService,\n private contextRouteService: ContextRouteService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private router: Router,\n private gainsightService: GainsightService,\n private alarmsActivityTrackerService: AlarmsActivityTrackerService\n ) {\n this.isIntervalRefresh = this.alarmsViewService.isIntervalRefresh();\n this.initializeContextSourceId();\n }\n\n ngOnInit() {\n this.alarmsActivityTrackerService.setupEventListenersForGainsight();\n this.alarmsActivityTrackerService.resetInactivityTimer();\n\n this.alarmsActivityTrackerService.isUserActive$\n .pipe(distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe(isActive =>\n isActive\n ? this.alarmsActivityTrackerService.setGainsightInterval()\n : this.alarmsActivityTrackerService.clearGainsightInterval()\n );\n\n const isInDetailView = !!this.activatedRoute.children[0]?.snapshot.params.id;\n if (isInDetailView) {\n this.changeInterval(false);\n }\n\n if (!this.isIntervalRefresh) {\n this.handleLegacyRealtime();\n }\n\n this.alarmsViewService.reloadAlarmsList$\n .pipe(\n debounceTime(this.WAIT_TIME_AVOID_MULTIPLE_REQUEST_BY_PARAM_CHANGE),\n takeUntil(this.destroy$)\n )\n .subscribe((value: ReloadAlarmsListType) => {\n this.updateAlarms(value);\n });\n if (this.isIntervalRefresh) {\n this.alarmsViewService.isIntervalEnabled$\n .pipe(\n takeUntil(this.destroy$),\n filter(() => !this.isListScrolled())\n )\n .subscribe(value => this.changeInterval(value));\n }\n this.alarmsViewService.closeDetailsView$.subscribe(\n async () => await this.alarmsViewService.closeDetailsView(this.activatedRoute)\n );\n }\n\n ngOnDestroy(): void {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS, {\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARMS,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.USER_SPEND_TIME_ON_COMPONENT,\n userSpendTime: this.alarmsViewService.convertSecondsToTime(\n this.alarmsActivityTrackerService.userSecondsSpendOnPage\n )\n });\n this.alarmsActivityTrackerService.clearGainsightInterval();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n @HostListener('document:visibilitychange')\n visibilityChange() {\n if (document.hidden) {\n this.alarmsActivityTrackerService.clearGainsightInterval();\n return;\n }\n this.alarmsActivityTrackerService.setGainsightInterval();\n }\n\n applyTypeFilters(typeFilters: AlarmDetails[]): void {\n this.typeFilters = typeFilters;\n setTimeout(() =>\n this.alarmsViewService.updateAlarmList(typeFilters.length > 0 ? 'gainsightTypeFilters' : null)\n );\n this.isRealtimeActive.next(false);\n }\n\n applyFormFilters({ severityOptions, showCleared, selectedDates }: AlarmListFormFilters): void {\n this.severityOptions = severityOptions;\n this.showCleared = showCleared;\n this.selectedDates = selectedDates;\n this.selectedSeverities = this.alarmsViewService.updateSelectedSeverities(this.severityOptions);\n this.alarmsViewService.updateAlarmList();\n this.isRealtimeActive.next(false);\n }\n\n async applyDateFilter(selectedDates: [Date, Date]): Promise<void> {\n this.alarms$.next(await this.alarmsViewService.retrieveAlarmsByDate(selectedDates));\n this.isRealtimeActive.next(false);\n }\n\n async clearAll(): Promise<void> {\n try {\n const translatedBody = this.translateService.instant(\n gettext('Do you really want to clear all alarms of selected severities?')\n );\n await this.modalService.confirm(\n gettext('Confirm clearing alarms?'),\n translatedBody,\n 'danger',\n {\n ok: gettext('Confirm'),\n cancel: gettext('Cancel')\n }\n );\n } catch {\n // modal canceled\n return;\n }\n\n await this.clearAlarms();\n\n this.alarmsViewService.closeDetailsView$.next();\n }\n\n refresh(): void {\n this.updateAlarms(null);\n this.isRealtimeActive.next(false);\n }\n\n changeInterval(value = true): void {\n this.shouldShowIntervalToggle$.next(value);\n }\n\n toggleRealtimeState(): void {\n this.isRealtimeToggleOn = !this.isRealtimeToggleOn;\n }\n\n private handleLegacyRealtime() {\n this.realtimeIconTitle = this.translateService.instant(gettext('Realtime active'));\n this.subscribeToRealtimeUpdates();\n }\n\n private async clearAlarms(): Promise<void> {\n try {\n const result = await this.alarmsViewService.clearAllActiveAlarms(\n this.selectedSeverities,\n this.contextSourceId\n );\n\n if (result.resolvedImmediately) {\n this.alertService.success(this.translateService.instant(gettext('Alarms cleared.')));\n this.refresh();\n } else {\n this.alertService.success(\n this.translateService.instant(gettext('Alarms are being cleared in background.'))\n );\n }\n } catch (error) {\n this.alertService.addServerFailure(error);\n }\n }\n\n private async getAlarms(): Promise<IResultList<IAlarm>> {\n try {\n this.isLoading$.next(true);\n\n const additionalFilter: Partial<AlarmQueryFilter> = {};\n\n if (this.contextSourceId) {\n (additionalFilter.source = this.contextSourceId),\n (additionalFilter.withSourceAssets = true),\n (additionalFilter.withSourceDevices = true);\n }\n\n if (this.typeFilters.length > 0) {\n additionalFilter.type = this.typeFilters.map(({ filters }) => filters.type).join(',');\n }\n\n return await this.alarmsViewService.retrieveFilteredAlarms(\n this.selectedSeverities,\n this.showCleared,\n this.selectedDates,\n additionalFilter\n );\n } catch (error) {\n if (error?.res?.status === 403) {\n this.isDisabled = true;\n return;\n }\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private async updateAlarms(value: ReloadAlarmsListType) {\n const alarms = await this.getAlarms();\n this.alarms$.next(alarms);\n if (value === 'gainsightTypeFilters') {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ALARMS.EVENTS.ALARMS, {\n component: PRODUCT_EXPERIENCE_ALARMS.COMPONENTS.ALARMS_TYPE_FILTER,\n action: PRODUCT_EXPERIENCE_ALARMS.ACTIONS.APPLY_TYPE_FILTER,\n alarmsCount: alarms.data.length\n });\n }\n }\n\n private subscribeToRealtimeUpdates(): void {\n this.alarmWithChildrenRealtimeService\n .onAll$(this.contextSourceId)\n .pipe(\n takeUntil(this.destroy$),\n throttleTime(THROTTLE_REALTIME_REFRESH, undefined, { trailing: true })\n )\n .subscribe(() => {\n if (this.isRealtimeToggleOn) {\n this.refresh();\n } else {\n this.isRealtimeActive.next(true);\n }\n });\n }\n\n private initializeContextSourceId(): void {\n const routeContext = this.contextRouteService.getContextData(this.activatedRoute);\n if (!routeContext) {\n return;\n }\n const { context, contextData } = routeContext;\n if (\n [ViewContext.Device, ViewContext.Group, ViewContext.Service, ViewContext.Simulators].includes(\n context\n )\n ) {\n this.contextSourceId = contextData?.id;\n }\n }\n}\n","<ng-container *ngIf=\"(activatedRoute.data | async)?.title\">\n <c8y-title>{{ TITLE | translate }}</c8y-title>\n</ng-container>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form min-width-fit\"\n>\n <c8y-alarms-filter\n class=\"d-block fit-w\"\n [contextSourceId]=\"contextSourceId\"\n (onFilterApplied)=\"applyFormFilters($event)\"\n ></c8y-alarms-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form min-width-fit\"\n>\n <c8y-alarms-date-filter (dateFilterChange)=\"applyFormFilters($event)\"></c8y-alarms-date-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <c8y-alarms-type-filter\n class=\"d-block fit-w\"\n [alarms]=\"alarms$ | async\"\n (onFilterChanged)=\"applyTypeFilters($event)\"\n ></c8y-alarms-type-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"0\"\n>\n <button\n class=\"btn btn-link\"\n [title]=\"'Clear all alarms' | translate\"\n type=\"button\"\n (click)=\"clearAll()\"\n data-cy=\"c8y-alarms-view--clear-all-button\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear all`alarms`' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<!--Realtime button-->\n<ng-template #realtimeRefresh>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"\n (isRealtimeActive | async)\n ? (NEW_REALTIME_ALARM_MESSAGE | translate)\n : (REFRESH_LABEL | translate)\n \"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"isLoading$ | async\"\n (click)=\"refresh()\"\n >\n <span\n class=\"tag tag--info m-r-8\"\n *ngIf=\"isRealtimeActive | async\"\n >\n {{ 'New alarms' | translate }}\n </span>\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading$ | async }\"\n ></i>\n </button>\n <button\n class=\"c8y-realtime btn btn-default btn-sm\"\n [attr.aria-label]=\"realtimeIconTitle\"\n [tooltip]=\"realtimeIconTitle\"\n placement=\"bottom\"\n type=\"button\"\n data-cy=\"c8y-alarms--realtime-button\"\n [container]=\"'body'\"\n (click)=\"toggleRealtimeState()\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{\n active: isRealtimeToggleOn,\n inactive: !isRealtimeToggleOn\n }\"\n ></span>\n </button>\n </div>\n</ng-template>\n\n<c8y-help\n src=\"/docs/device-management-application/monitoring-and-controlling-devices/#working-with-alarms\"\n></c8y-help>\n\n<div class=\"card content-fullpage split-view--5-7 grid__row--1\">\n <c8y-alarms-list\n class=\"d-contents\"\n [isInitialLoading]=\"isLoading$ | async\"\n [alarms]=\"alarms$ | async\"\n [typeFilters]=\"typeFilters\"\n (onScrollingStateChange)=\"changeInterval(!$event); isListScrolled.set($event)\"\n (onSelectedAlarm)=\"changeInterval(false)\"\n [splitView]=\"true\"\n [hasPermissions]=\"!isDisabled\"\n >\n <ng-container *ngIf=\"isIntervalRefresh; else realtimeRefresh\">\n <c8y-alarms-interval-refresh\n [alarmsListLoading$]=\"isLoading$\"\n [isIntervalToggleEnabled]=\"shouldShowIntervalToggle$ | async\"\n (onCountdownEnded)=\"refresh()\"\n [isDisabled]=\"isDisabled\"\n ></c8y-alarms-interval-refresh>\n </ng-container>\n </c8y-alarms-list>\n\n <router-outlet class=\"d-contents\"></router-outlet>\n</div>\n","import { Routes } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ContextRouteComponent,\n ContextRouteGuard,\n Route,\n RouterTabsResolver,\n ViewContext,\n ViewContextRootRoute\n} from '@c8y/ngx-components';\nimport { AlarmEmptyComponent } from './alarm-empty.component';\nimport { AlarmInfoComponent } from './alarm-info.component';\n\nexport function getViewContextRoutes(contexts: ViewContext[]): Routes {\n return contexts.map(context => ({\n context,\n path: 'details',\n icon: 'bell',\n label: gettext('Details'),\n component: AlarmInfoComponent,\n tabsOutlet: 'alarms'\n }));\n}\n\nexport function getChildrenForViewContext(context: ViewContext): Routes {\n return [\n {\n path: '',\n component: AlarmEmptyComponent,\n label: gettext('Alarms')\n },\n {\n path: ':id',\n rootContext: context,\n component: ContextRouteComponent,\n canActivate: [ContextRouteGuard],\n data: { context, contextData: {} },\n resolve: {\n tabs: RouterTabsResolver\n }\n }\n ] as Array<Route | ViewContextRootRoute>;\n}\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { TitleCasePipe } from '@angular/common';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport {\n CommonModule,\n CoreModule,\n DynamicComponentModule,\n HeaderModule,\n RelativeTimePipe,\n hookNavigator,\n hookRoute,\n C8yTranslateModule\n} from '@c8y/ngx-components';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AlarmDetailsComponent } from './alarm-details.component';\nimport { AlarmEmptyComponent } from './alarm-empty.component';\nimport { AlarmInfoComponent } from './alarm-info.component';\nimport { AlarmSeveritiesToTitlePipe } from './alarm-severities-to-title.pipe';\nimport { AlarmSeverityToIconPipe } from './alarm-severity-to-icon.pipe';\nimport { AlarmSeverityToLabelPipe } from './alarm-severity-to-label.pipe';\nimport { AlarmStatusToIconPipe } from './alarm-status-to-icon.pipe';\nimport { AlarmStatusToLabelPipe } from './alarm-status-to-label.pipe';\nimport { AlarmsFilterComponent } from './alarms-filter.component';\nimport { AlarmsIconComponent } from './alarms-icon.component';\nimport { AlarmsIntervalRefreshComponent } from './alarms-interval-refresh.component';\nimport { AlarmsListComponent } from './alarms-list.component';\nimport { AlarmsComponent } from './alarms.component';\nimport { ALARMS_MODULE_CONFIG, AlarmsModuleConfig } from './alarms.model';\nimport { AuditChangesMessagePipe } from './audit-changes-message.pipe';\nimport { smartRulesUpgradeServiceProvider } from './ng1-smart-rules-upgrade.service';\nimport { AlarmEventSelectorModule } from '@c8y/ngx-components/alarm-event-selector';\nimport { AlarmsTypeFilterComponent } from './alarms-type-filter.component';\nimport { AlarmListIndicatorPipe } from './alarm-list-custom-indicator/alarm-list-indicator.pipe';\nimport { AlarmDetailsButtonPipe } from './alarm-details-custom-button/alarm-details-button.pipe';\nimport { AlarmsDateFilterComponent } from './alarms-date-filter.component';\nimport { IntervalPickerComponent } from '@c8y/ngx-components/interval-picker';\n\nconst defaultAlarmsConfig: AlarmsModuleConfig = {\n hybrid: true\n};\n\n@NgModule({\n exports: [AlarmsComponent, AlarmsListComponent, AlarmsFilterComponent, AlarmsDateFilterComponent],\n providers: [\n TitleCasePipe,\n RelativeTimePipe,\n {\n provide: ALARMS_MODULE_CONFIG,\n useValue: defaultAlarmsConfig\n }\n ],\n imports: [\n A11yModule,\n BsDropdownModule,\n CommonModule,\n CoreModule,\n HeaderModule,\n PopoverModule,\n TooltipModule.forRoot(),\n C8yTranslateModule,\n RouterModule,\n AlarmEventSelectorModule,\n RouterModule,\n AlarmListIndicatorPipe,\n AlarmDetailsButtonPipe,\n AlarmSeverityToIconPipe,\n DynamicComponentModule,\n IntervalPickerComponent,\n AlarmDetailsComponent,\n AlarmInfoComponent,\n AlarmsComponent,\n AlarmSeveritiesToTitlePipe,\n AlarmsFilterComponent,\n AlarmsIconComponent,\n AlarmsIntervalRefreshComponent,\n AlarmsListComponent,\n AlarmStatusToIconPipe,\n AuditChangesMessagePipe,\n AlarmSeverityToLabelPipe,\n AlarmStatusToLabelPipe,\n AlarmEmptyComponent,\n AlarmsDateFilterComponent,\n AlarmsTypeFilterComponent\n ]\n})\nexport class AlarmsModule {\n static config(config: AlarmsModuleConfig = {}): ModuleWithProviders<AlarmsModule> {\n const alarmsConfig: AlarmsModuleConfig = { ...defaultAlarmsConfig, ...config };\n return {\n ngModule: AlarmsModule,\n providers: [\n ...(alarmsConfig.hybrid ? [smartRulesUpgradeServiceProvider] : []),\n hookNavigator(alarmsConfig.rootNavigatorNode),\n hookRoute(alarmsConfig.route),\n {\n provide: ALARMS_MODULE_CONFIG,\n useValue: alarmsConfig\n }\n ]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i1.AlarmDetailsButtonService","i2","i3","i4","i1.AlarmDetailsService","i4.Ng1SmartRulesUpgradeService","i5","i6.AlarmsViewService","i7.AlarmsActivityTrackerService","i3.AlarmsViewService","i1.AlarmListIndicatorService","i2.AlarmsViewService","takeUntil","map","i5.AlarmsActivityTrackerService"],"mappings":"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"}
|