@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
1 lines • 261 kB
Source Map (JSON)
{"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-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 {\n DateTimeContext,\n gettext,\n NavigatorNode,\n NavigatorNodeData,\n Route\n} 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 {\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 {\n ApplicationOptions,\n ContextData,\n DateTimeContext,\n OptionsService,\n ViewContext,\n gettext,\n ContextRouteService\n} from '@c8y/ngx-components';\nimport { Observable, Subject } from 'rxjs';\nimport { ALARMS_PATH, INTERVALS_EXTENDED, ReloadAlarmsListType } from './alarms.model';\nimport { AlarmFilterInterval } from '@c8y/ngx-components/interval-picker';\nimport { ActivatedRoute, ActivatedRouteSnapshot, Router } from '@angular/router';\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 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 const interval = INTERVALS_EXTENDED.find(({ id }) => id === intervalId);\n if (interval.id === 'none') {\n return [new Date(0), new Date()];\n }\n\n const dateTo = new Date();\n const dateFrom = new Date(dateTo.valueOf() - interval.timespanInMs);\n return [dateFrom, dateTo];\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';\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 {\n AlertService,\n AppStateService,\n ColorService,\n RelativeTimePipe,\n gettext,\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 {\n ContextRouteService,\n gettext,\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';\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_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, 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 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 {\n CountdownIntervalComponent,\n gettext,\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 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 {\n ContextRouteService,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n ListItemComponent,\n LoadMoreMode,\n gettext,\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 * 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.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 {\n DateTimeContext,\n gettext,\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 { NgIf, NgFor, 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 NgIf,\n NgFor,\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 <ng-container *ngIf=\"activeFilters.length > 0; else allTypes\">\n <span\n class=\"tag tag--info chip\"\n style=\"max-width: 150px\"\n *ngFor=\"let filter of activeFilters\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n (click)=\"$event.stopPropagation(); deselect(filter)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small\"\n [ngStyle]=\"{ 'background-color': filter.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n <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 </ng-container>\n <ng-template #allTypes>\n <span class=\"text-nowrap\">\n {{ 'All alarm types' | translate }}\n </span>\n </ng-template>\n </div>\n <div class=\"input-group-btn input-group-btn--last text-center\">\n <button\n class=\"btn-default btn\"\n [title]=\"'Clear filters' | translate\"\n *ngIf=\"activeFilters.length\"\n (click)=\"deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn-default btn btn--caret\"\n [title]=\"'Alarm types' | translate\"\n data-cy=\"c8y-alarm-type-filter\"\n dropdownToggle\n >\n <i class=\"caret\"></i>\n </button>\n </div>\n </div>\n <div\n class=\"dropdown-menu dropdown-menu-action-bar\"\n style=\"min-width: 250px\"\n *dropdownMenu\n >\n <div class=\"p-16 bg-level-2\">\n <div>\n <p>\n <i\n class=\"text-info m-r-4\"\n [c8yIcon]=\"'info-circle'\"\n ></i>\n <strong tanslate>The list below may not be complete.</strong>\n </p>\n <p tanslate>\n Recent alarms are displayed below. Past alarms might not be shown. Optionally you can\n add a custom alarm.\n </p>\n </div>\n </div>\n <c8y-list-group>\n <div class=\"input-group p-t-16 p-b-16 p-r-32 p-l-32 separator-bottom\">\n <input\n class=\"form-control\"\n 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 <c8y-li\n class=\"c8y-list__item__collapse--container-small cdk-drag\"\n style=\"cursor: pointer\"\n *ngFor=\"let alarmType of possibleFilters\"\n (click)=\"toggleAlarmType(alarmType)\"\n >\n <c8y-li-checkbox\n class=\"a-s-center m-t-4 p-r-0 p-l-0\"\n [selected]=\"alarmType.__active\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleAlarmType(alarmType); $event.stopPropagation()\"\n ></c8y-li-checkbox>\n <div class=\"d-flex a-i-center p-l-4\">\n <div class=\"c8y-list__item__colorpicker p-t-0 p-b-0 p-l-0\">\n <div class=\"c8y-colorpicker c8y-colorpicker--alarm\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': alarmType.color }\"\n >\n <i\n class=\"stroked-icon\"\n [c8yIcon]=\"'bell'\"\n ></i>\n </span>\n </div>\n </div>\n <span\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 <button\n class=\"btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"'Remove' | translate\"\n placement=\"top\"\n *ngIf=\"alarmType.__target === null\"\n [delay]=\"500\"\n (click)=\"removeCustomAlarm(alarmType); $event.stopPropagation()\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li>\n <c8y-li *ngIf=\"possibleFilters.length === 0\">\n <c8y-ui-empty-state\n class=\"p-t-8\"\n icon=\"c8y-alarm\"\n [title]=\"'No alarm found' | translate\"\n [subtitle]=\"\n 'There is no alarm to filter. You can still add a custom alarm.' | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </c8y-li>\n <div class=\"sticky-bottom p-16\">\n <button\n class=\"btn btn-block btn-primary\"\n [disabled]=\"possibleFilters.length === 0\"\n (click)=\"applyFilterChange(); $event.stopPropagation(); filtersDropdown.hide()\"\n translate\n >\n Apply\n </button>\n </div>\n </c8y-list-group>\n </div>\n </div>\n</div>\n","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 {\n AlarmWithChildrenRealtimeService,\n AlertService,\n ContextRouteService,\n DateTimeContext,\n ModalService,\n ViewContext,\n gettext,\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 {\n ContextRouteComponent,\n ContextRouteGuard,\n gettext,\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 },\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","i1.AlarmDetailsService","i4.Ng1SmartRulesUpgradeService","i5","i6.AlarmsViewService","i7.AlarmsActivityTrackerService","i3.AlarmsViewService","i1.AlarmListIndicatorService","i2.AlarmsViewService","i4","takeUntil","map","i5.AlarmsActivityTrackerService"],"mappings":"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"}