{"version":3,"file":"c8y-ngx-components-widgets-implementations-alarms.mjs","sources":["../../widgets/implementations/alarms/alarm-list-widget.model.ts","../../widgets/implementations/alarms/alarm-widget.service.ts","../../widgets/implementations/alarms/severity-icon.pipe.ts","../../widgets/implementations/alarms/sorting-description-popover-message.pipe.ts","../../widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.ts","../../widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.html","../../widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.ts","../../widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.html","../../widgets/implementations/alarms/alarms-widget.module.ts","../../widgets/implementations/alarms/c8y-ngx-components-widgets-implementations-alarms.ts"],"sourcesContent":["import type { AlarmStatusSettings, SeverityFilter } from '@c8y/client';\nimport { GlobalAutoRefreshWidgetConfig } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport type { GlobalContextState } from '@c8y/ngx-components/global-context';\n\nexport const ALARM_ORDER_VALUES = {\n  BY_ACTIVE: 'BY_ACTIVE',\n  BY_DATE_ASCENDING: 'BY_DATE_ASCENDING',\n  BY_DATE_DESCENDING: 'BY_DATE_DESCENDING',\n  BY_SEVERITY: 'BY_SEVERITY'\n} as const;\n\nexport const ALARM_ORDER_LABELS = {\n  BY_ACTIVE: gettext('By active status') as 'By active status',\n  BY_DATE_ASCENDING: gettext('By date (ascending)') as 'By date (ascending)',\n  BY_DATE_DESCENDING: gettext('By date (descending)') as 'By date (descending)',\n  BY_SEVERITY: gettext('By severity') as 'By severity'\n} as const;\n\nexport type AlarmOrderType = keyof typeof ALARM_ORDER_VALUES;\n\nexport type SelectedDevice = { id: string; name: string };\n\nexport const ASSET_ALARMS_WIDGET_ID = 'Asset Alarms';\n\nexport const RECENT_ALARMS_WIDGET_ID = 'Recent Alarms';\n\n// TODO: remove\nexport type AlarmListRefreshOption = 'none' | 'interval' | 'global-interval';\n\n// TODO: remove\nexport const GLOBAL_INTERVAL_OPTION: AlarmListRefreshOption = 'global-interval';\n\nexport type LegacyAlarmListConfig = {\n  realtime: boolean;\n  options: {\n    severity: SeverityFilter;\n    types: string[];\n    orderMode: string;\n    device: string;\n    status: AlarmStatusSettings;\n  };\n  device?: {\n    name: string;\n    id: string;\n  };\n};\n\nexport interface AlarmListWidgetConfig\n  extends Partial<GlobalContextState>,\n    GlobalAutoRefreshWidgetConfig {\n  order: AlarmOrderType;\n  showAlarmsForChildren?: boolean;\n  device?: SelectedDevice | null;\n  severities: SeverityFilter;\n  status: AlarmStatusSettings;\n  types?: string[];\n  isRealtime?: boolean;\n  realtime?: boolean;\n  widgetId?: string;\n}\n","import { Injectable } from '@angular/core';\nimport {\n  AlarmQueryFilter,\n  AlarmStatusSettings,\n  AlarmStatus,\n  IAlarm,\n  Severity,\n  SeverityFilter,\n  SEVERITY_LABELS\n} from '@c8y/client';\n\nimport { SeveritySettings, SeverityType } from '@c8y/client';\nimport { AlarmsViewService } from '@c8y/ngx-components/alarms';\nimport {\n  ALARM_ORDER_VALUES,\n  AlarmListWidgetConfig,\n  AlarmOrderType,\n  LegacyAlarmListConfig,\n  RECENT_ALARMS_WIDGET_ID\n} from './alarm-list-widget.model';\n\nexport const DEFAULT_PAGE_SIZE = 20;\n\n@Injectable({ providedIn: 'root' })\nexport class AlarmWidgetService {\n  constructor(private alarmsViewService: AlarmsViewService) {}\n\n  /**\n   * Checks if the provided data follows the LegacyAlarmConfig structure.\n   *\n   * This function determines if a given data object is an instance of LegacyAlarmConfig\n   * by checking for the presence of the 'options' property.\n   *\n   * @param data - The data object to be checked.\n   * @returns - Returns `true` if the data object is a LegacyAlarmConfig, otherwise `false`.\n   */\n  isOldAlarmConfigStructure(\n    data: LegacyAlarmListConfig | AlarmListWidgetConfig\n  ): data is LegacyAlarmListConfig {\n    return data !== null && typeof data === 'object' && 'options' in data;\n  }\n\n  /**\n   * Creates predefined widget configuration object.\n   *\n   * This method creates a new configuration object based on\n   * a widgets ID (that determines if is a legacy Recent or Critical alarms widget).\n   *\n   * @param isIntervalRefresh - determines a type of a refresh.\n   * @param widgetId - determines if a config should be done for Recent or Critical alarms widget.\n   * @returns The new, predefined configuration object.\n   */\n  getPredefinedConfiguration(widgetId?: string, existingConfig?: any): AlarmListWidgetConfig {\n    // Check if any time/refresh configuration exists (cast to any for legacy properties)\n    const hasAnyTimeConfig =\n      existingConfig?.dateTimeContext ||\n      existingConfig?.dateFilter ||\n      existingConfig?.date ||\n      existingConfig?.dateFrom ||\n      existingConfig?.dateTo ||\n      existingConfig?.refreshOption ||\n      existingConfig?.isAutoRefreshEnabled !== undefined ||\n      existingConfig?.refreshInterval ||\n      existingConfig?.aggregation !== undefined;\n\n    const config: AlarmListWidgetConfig = {\n      order: ALARM_ORDER_VALUES.BY_ACTIVE,\n      severities:\n        widgetId === RECENT_ALARMS_WIDGET_ID\n          ? ({\n              [Severity.CRITICAL]: true,\n              [Severity.MAJOR]: true,\n              [Severity.MINOR]: true,\n              [Severity.WARNING]: true\n            } as SeveritySettings)\n          : ({\n              [Severity.CRITICAL]: true,\n              [Severity.MAJOR]: false,\n              [Severity.MINOR]: false,\n              [Severity.WARNING]: false\n            } as SeveritySettings),\n      status:\n        widgetId === RECENT_ALARMS_WIDGET_ID\n          ? ({\n              [AlarmStatus.ACKNOWLEDGED]: true,\n              [AlarmStatus.ACTIVE]: true,\n              [AlarmStatus.CLEARED]: true\n            } as AlarmStatusSettings)\n          : ({\n              [AlarmStatus.ACKNOWLEDGED]: false,\n              [AlarmStatus.ACTIVE]: true,\n              [AlarmStatus.CLEARED]: false\n            } as AlarmStatusSettings),\n      types: [''],\n      widgetId: widgetId || ''\n    };\n\n    // Only add global context defaults if no time/refresh config exists at all\n    if (!hasAnyTimeConfig) {\n      config.isAutoRefreshEnabled = true;\n      config.refreshInterval = this.alarmsViewService.DEFAULT_INTERVAL_VALUE;\n      config.aggregation = null;\n      config.refreshOption = 'live';\n      config.dateTimeContext = {\n        dateFrom: new Date(0).toISOString(),\n        dateTo: new Date().toISOString(),\n        interval: 'custom'\n      };\n    }\n\n    return config;\n  }\n\n  /**\n   * Transforms a LegacyAlarmConfig object into an AlarmListWidgetConfig object.\n   *\n   * This function maps the properties from an old configuration structure (LegacyAlarmConfig)\n   * to a new configuration structure (AlarmListWidgetConfig).\n   *\n   * @param oldConfig - The old configuration object to be transformed.\n   * @returns - The new configuration object mapped from the old one.\n   */\n  mapToNewConfigStructure(oldConfig: LegacyAlarmListConfig): AlarmListWidgetConfig {\n    const order: AlarmOrderType =\n      oldConfig.options.orderMode === 'ACTIVE_FIRST'\n        ? ALARM_ORDER_VALUES.BY_ACTIVE\n        : ALARM_ORDER_VALUES.BY_SEVERITY;\n\n    if (!this.isContainingAllSeverityTypes(oldConfig.options.severity)) {\n      oldConfig.options.severity = this.addAllMissingSeverityTypes(oldConfig.options.severity);\n    }\n\n    return {\n      order: order,\n      isRealtime: oldConfig.realtime,\n      device: oldConfig.device,\n      showAlarmsForChildren: true,\n      severities: oldConfig.options.severity,\n      status: this.allValuesFalse(oldConfig.options.status)\n        ? ({\n            [AlarmStatus.ACKNOWLEDGED]: true,\n            [AlarmStatus.ACTIVE]: true,\n            [AlarmStatus.CLEARED]: true\n          } as AlarmStatusSettings)\n        : oldConfig.options.status,\n      types: oldConfig.options.types?.length ? oldConfig.options.types : [''],\n      isAutoRefreshEnabled: true,\n      refreshInterval: this.alarmsViewService.DEFAULT_INTERVAL_VALUE\n    };\n  }\n\n  /**\n   * Checks if the provided severity object contains all the predefined severity types.\n   *\n   * @param severity - A record object where keys are severity type strings and values are boolean.\n   *                 - This object is checked against the predefined severity types.\n   * @returns `true` if all predefined severity types are present in the severity object; otherwise, `false`.\n   */\n  isContainingAllSeverityTypes(severity: SeverityFilter): boolean {\n    return Object.keys(SEVERITY_LABELS).every(severityType => severityType in severity);\n  }\n\n  /**\n   * Adds any missing severity types to the provided severity object with a default value of `false`.\n   *\n   * @param severity - A record object where keys are severity type strings and values are boolean.\n   *                 - Missing severity types will be added to this object.\n   * @returns The modified severity object, which includes all predefined severity types, adding any\n   *          that were missing with a value of `false`.\n   */\n  addAllMissingSeverityTypes(severity: SeverityFilter): SeverityFilter {\n    Object.keys(SEVERITY_LABELS).forEach(severityType => {\n      if (!(severityType in severity)) {\n        severity[severityType] = false;\n      }\n    });\n    return severity;\n  }\n\n  /**\n   * Maps an AlarmListWidgetConfig object to an AlarmQueryFilter.\n   *\n   * This function converts the provided AlarmListWidgetConfig into a format suitable for querying alarms.\n   *\n   * @param config - The configuration object for the alarm list widget.\n   * @param pageSize - Optional number specifying the size of the pages to be returned in the query.\n   * @returns - The query filter object constructed from the provided configuration.\n   */\n  mapConfigToQueryFilter(config: AlarmListWidgetConfig, pageSize?: number): AlarmQueryFilter {\n    const filter: AlarmQueryFilter = {\n      pageSize: pageSize || DEFAULT_PAGE_SIZE,\n      query: this.getOrderParameters(config.order),\n      severity: this.extractFilterParams(config.severities || {}),\n      status: this.extractFilterParams(config.status || {}),\n      type: (config.types || []).join(','),\n      withTotalPages: true\n    };\n    if (config.dateTimeContext) {\n      const { dateFrom, dateTo } = config.dateTimeContext;\n      filter.lastUpdatedFrom = typeof dateFrom === 'string' ? dateFrom : dateFrom.toISOString();\n      filter.createdTo = typeof dateTo === 'string' ? dateTo : dateTo.toISOString();\n    }\n    if (config.device) {\n      filter.source = config.device.id;\n      filter.withSourceAssets = true;\n      filter.withSourceDevices = true;\n      filter.withSourceAssets = config.showAlarmsForChildren ?? true;\n      filter.withSourceDevices = config.showAlarmsForChildren ?? true;\n    }\n    return filter;\n  }\n\n  /**\n   * Extracts and concatenates filter parameters from a given object.\n   *\n   * This function takes an object containing filter settings (either SeverityFilter\n   * or AlarmStatusSettings) and returns a string of all keys where the corresponding value is true.\n   * If the object is empty or null, an empty string is returned.\n   *\n   * @param obj - The object containing filter settings.\n   * @returns - A concatenated string of keys with true values, separated by commas.\n   */\n  extractFilterParams(obj: SeverityFilter | AlarmStatusSettings): string {\n    if (!obj) {\n      return '';\n    }\n    return Object.entries(obj)\n      .filter(([, value]) => value)\n      .map(([key]) => key)\n      .join(',');\n  }\n\n  /**\n   * Determines if an incoming real-time alarm has a different status than an existing alarm.\n   *\n   * This function checks if the provided incoming real-time alarm's status differs\n   * from that of an existing alarm with the same ID in the given array of alarms.\n   *\n   * @param existingAlarms - The array of existing alarms.\n   * @param incomingRealtimeAlarm - The incoming real-time alarm to check.\n   * @returns - True if the existing alarm's status has changed, otherwise false.\n   */\n  hasExistingAlarmChangedStatus(existingAlarms: IAlarm[], incomingRealtimeAlarm: IAlarm): boolean {\n    const existingAlarm = existingAlarms.find(alarm => alarm.id === incomingRealtimeAlarm.id);\n    return !!existingAlarm && existingAlarm.status !== incomingRealtimeAlarm.status;\n  }\n\n  /**\n   * Filters alarms based on their status, severity, and type.\n   *\n   * This method determines if a given alarm, identified either by a numeric ID or an `IAlarm` object,\n   * matches specific criteria defined in `alarms` and optionally `config`.\n   *\n   * @param alarm - The alarm to check, represented either by a numeric ID or an `IAlarm` object.\n   * @param alarms - An array of `IAlarm` objects against which the given alarm is evaluated.\n   * @param config - Optional. Configuration for the alarm list widget, used to define additional\n   *                 filtering criteria.\n   *\n   * @returns `true` if the alarm matches the specified criteria; otherwise, `false`.\n   *          If `alarm` is a number, it always returns `false`.\n   *          If `config` is not provided, it uses a legacy filter for critical alarms.\n   *\n   * @remarks\n   * - When `alarm` is a numeric ID, the function returns `false` as it cannot match against type and severity.\n   * - If `config` is not provided, the function assumes a legacy scenario for filtering all critical alarms.\n   */\n  filterAlarmsByStatusSeverityAndType(\n    alarm: number | IAlarm,\n    alarms: IAlarm[],\n    config?: AlarmListWidgetConfig\n  ): boolean {\n    if (typeof alarm === 'number') {\n      return false;\n    }\n\n    return this.isAlarmMatchedByConfig(alarm, alarms, config);\n  }\n\n  /**\n   * Determines if all values in the given object are false.\n   *\n   * This function checks every value in the provided object to see if they are all false.\n   *\n   * @param obj - An object with boolean values.\n   * @returns - Returns `true` if all values in the object are false, otherwise `false`.\n   */\n  allValuesFalse(obj: { [key: string]: boolean }): boolean {\n    return Object.values(obj).every(value => !value);\n  }\n\n  /**\n   * Constructs a string of order parameters for a query based on the specified alarm order.\n   *\n   * This function takes an alarm order and maps it to a corresponding set of order parameters.\n   * It supports different ordering types, such as BY_ACTIVE, BY_SEVERITY, and BY_DATE_ASCENDING.\n   * The order parameters are used to construct a query string that determines the order\n   * in which alarms are retrieved or displayed.\n   *\n   * @param order - The specified order for sorting alarms (e.g., BY_ACTIVE).\n   * @returns - A string of order parameters to be used in a query, or an empty string if the order type is unrecognized.\n   */\n  getOrderParameters(order: AlarmOrderType): string {\n    let orderParams: string[];\n\n    switch (order) {\n      case ALARM_ORDER_VALUES.BY_ACTIVE:\n        orderParams = ['status asc', 'severity asc', 'time.date desc', 'text asc'];\n        return this.buildOrderParameters(orderParams);\n      case ALARM_ORDER_VALUES.BY_SEVERITY:\n        orderParams = ['severity asc', 'time.date desc', 'text asc'];\n        return this.buildOrderParameters(orderParams);\n      case ALARM_ORDER_VALUES.BY_DATE_ASCENDING:\n        orderParams = ['time.date asc', 'text asc'];\n        return this.buildOrderParameters(orderParams);\n      default:\n        orderParams = ['time.date desc', 'text asc'];\n        return this.buildOrderParameters(orderParams);\n    }\n  }\n\n  /**\n   * Determines if an alarm is matched by the specified widget configuration.\n   *\n   * This function evaluates whether a given alarm should be included based on the severity,\n   * status, and type filters defined in the AlarmListWidgetConfig. It checks if the alarm's\n   * severity and status match the configuration settings and if the alarm's type is included\n   * in the configuration's types (if specified).\n   *\n   * @ignore\n   * @param alarm - The alarm to evaluate.\n   * @param alarms - An array of existing alarms, used for status matching.\n   * @param config - The configuration settings to match against.\n   * @returns - Returns `true` if the alarm matches the configuration criteria; otherwise, `false`.\n   */\n  isAlarmMatchedByConfig(alarm: IAlarm, alarms: IAlarm[], config: AlarmListWidgetConfig): boolean {\n    const isSeverityMatched = this.isSeverityMatching(alarm.severity, config);\n    const isStatusMatched = this.isStatusMatching(alarm, alarms, config);\n    const isTypeMatched = this.isTypesMatching(config, alarm);\n\n    return isSeverityMatched && isStatusMatched && isTypeMatched;\n  }\n  /**\n   * Checks if the severity of an alarm matches the configuration setting.\n   *\n   * This function determines whether the severity of an alarm is included in the\n   * severity settings defined in the AlarmListWidgetConfig.\n   *\n   * @ignore\n   * @param severity - The severity of the alarm to check.\n   * @param config - The configuration with severity settings.\n   * @returns - Returns `true` if the alarm's severity matches the configuration; otherwise, `false`.\n   */\n  isSeverityMatching(severity: SeverityType, config: AlarmListWidgetConfig): boolean {\n    return !!config.severities[severity];\n  }\n\n  /**\n   * Evaluates if the status of an alarm matches the configuration setting or has changed.\n   *\n   * This function checks if the status of an alarm is included in the status settings defined in\n   * the AlarmListWidgetConfig, or if the alarm's status has changed based on the existing alarms.\n   *\n   * @ignore\n   * @param alarm - The alarm whose status is to be evaluated.\n   * @param alarms - An array of existing alarms to compare against for status changes.\n   * @param config - The configuration with status settings.\n   * @returns - Returns `true` if the alarm's status matches or has changed as per the configuration; otherwise, `false`.\n   */\n  isStatusMatching(alarm: IAlarm, alarms: IAlarm[], config: AlarmListWidgetConfig): boolean {\n    return !!config.status[alarm.status] || this.hasExistingAlarmChangedStatus(alarms, alarm);\n  }\n\n  /**\n   * Checks if the configuration's types array contains only empty string or includes a specific alarm type.\n   *\n   * @param config - The configuration object with a `types` property.\n   * @param alarm - The alarm object with a `type` property to check against the config's types.\n   * @returns `true` if the config's types array contains only empty string or includes the alarm's type, otherwise `false`.\n   */\n  isTypesMatching(config: AlarmListWidgetConfig, alarm: IAlarm): boolean {\n    return Array.isArray(config.types) && config.types.length === 1 && config.types[0] === ''\n      ? true\n      : (config.types?.includes(alarm.type) ?? false);\n  }\n\n  /**\n   * Constructs a query string from an array of order parameters.\n   *\n   * This function takes an array of ordering parameters and constructs a query string\n   * for use in alarm ordering queries. The parameters are concatenated into a single string,\n   * prefixed with '$orderby='.\n   *\n   * @ignore\n   * @private\n   * @param orderParams - The order parameters to be included in the query.\n   * @returns - A query string representing the order parameters.\n   */\n  private buildOrderParameters(orderParams: string[]): string {\n    return `$orderby=${orderParams.join(',')}`;\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Severity } from '@c8y/client';\nimport { SupportedIconsSuggestions } from '@c8y/ngx-components/icon-selector/icons';\n\ninterface SeverityIcon {\n  c8yIcon?: string;\n  iconClass: string;\n  severityClass?: string;\n}\n\n@Pipe({ name: 'severityIcon' })\nexport class SeverityIconPipe implements PipeTransform {\n  transform(severity: string): SeverityIcon {\n    let severityClassName = '';\n    let iconClassName: SupportedIconsSuggestions = '';\n\n    switch (severity) {\n      case Severity.CRITICAL:\n        severityClassName = 'critical';\n        iconClassName = 'exclamation-circle';\n        break;\n      case Severity.MAJOR:\n        severityClassName = 'major';\n        iconClassName = 'warning';\n        break;\n      case Severity.MINOR:\n        severityClassName = 'minor';\n        iconClassName = 'high-priority';\n        break;\n      case Severity.WARNING:\n        severityClassName = 'warning';\n        iconClassName = 'circle';\n        break;\n      default:\n        return { iconClass: '', severityClass: '' };\n    }\n\n    return {\n      iconClass: `status icon-lg stroked-icon dlt-c8y-icon-${iconClassName} ${severityClassName}`,\n      c8yIcon: severityClassName\n    };\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { ALARM_ORDER_VALUES, AlarmOrderType } from './alarm-list-widget.model';\n\n@Pipe({ name: 'sortingDescriptionPopoverMessage' })\nexport class SortingDescriptionPopoverMessagePipe implements PipeTransform {\n  transform(order: AlarmOrderType): string {\n    switch (order) {\n      case ALARM_ORDER_VALUES.BY_ACTIVE:\n        return gettext('Order alarms by active status, severity, and time.');\n      case ALARM_ORDER_VALUES.BY_DATE_ASCENDING:\n        return gettext('Order alarms by time, starting with the oldest ones.');\n      case ALARM_ORDER_VALUES.BY_DATE_DESCENDING:\n        return gettext('Order alarms by time, starting with the latest ones.');\n      case ALARM_ORDER_VALUES.BY_SEVERITY:\n        return gettext('Order alarms by severity and time.');\n      default:\n        return '';\n    }\n  }\n}\n","import { AsyncPipe, NgClass } from '@angular/common';\nimport { Component, Input, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport {\n  ControlContainer,\n  FormArray,\n  FormBuilder,\n  FormControl,\n  FormGroup,\n  FormsModule,\n  NgForm,\n  ReactiveFormsModule,\n  ValidatorFn\n} from '@angular/forms';\nimport {\n  ALARM_STATUS_LABELS,\n  AlarmService,\n  AlarmStatus,\n  IAlarm,\n  IResultList,\n  SEVERITY_LABELS\n} from '@c8y/client';\nimport {\n  AlertService,\n  C8yTranslatePipe,\n  OnBeforeSave,\n  FormGroupComponent,\n  IconDirective,\n  MessageDirective,\n  MessagesComponent,\n  RequiredInputPlaceholderDirective\n} from '@c8y/ngx-components';\nimport {\n  ALARM_STATUS_ICON,\n  AlarmsDateFilterComponent,\n  AlarmsListComponent,\n  AlarmsViewService,\n  DEFAULT_SEVERITY_VALUES,\n  DEFAULT_STATUS_VALUES\n} from '@c8y/ngx-components/alarms';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport {\n  GLOBAL_CONTEXT_DISPLAY_MODE,\n  LocalControlsComponent,\n  PRESET_NAME,\n  PresetName\n} from '@c8y/ngx-components/global-context';\nimport { merge } from 'lodash-es';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { BehaviorSubject, EMPTY, from, Observable, Subject } from 'rxjs';\nimport { filter, shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';\nimport {\n  ALARM_ORDER_LABELS,\n  ALARM_ORDER_VALUES,\n  AlarmListWidgetConfig,\n  AlarmOrderType\n} from '../alarm-list-widget.model';\nimport { AlarmWidgetService, DEFAULT_PAGE_SIZE } from '../alarm-widget.service';\nimport { SeverityIconPipe } from '../severity-icon.pipe';\nimport { SortingDescriptionPopoverMessagePipe } from '../sorting-description-popover-message.pipe';\n\n@Component({\n  selector: 'c8y-alarm-list-widget-config',\n  templateUrl: './alarm-list-widget-config.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  imports: [\n    FormsModule,\n    ReactiveFormsModule,\n    PopoverDirective,\n    FormGroupComponent,\n    AlarmsDateFilterComponent,\n    RequiredInputPlaceholderDirective,\n    NgClass,\n    IconDirective,\n    MessagesComponent,\n    MessageDirective,\n    AlarmsListComponent,\n    C8yTranslatePipe,\n    AsyncPipe,\n    SeverityIconPipe,\n    SortingDescriptionPopoverMessagePipe,\n    LocalControlsComponent\n  ]\n})\nexport class AlarmListWidgetConfigComponent implements OnInit, OnBeforeSave, OnDestroy {\n  @Input() config: AlarmListWidgetConfig;\n\n  readonly REFRESH_INTERVAL_IN_MILLISECONDS = this.alarmsViewService.DEFAULT_INTERVAL_VALUES;\n  readonly SEVERITY_LABELS = SEVERITY_LABELS;\n  readonly STATUS_LABELS = ALARM_STATUS_LABELS;\n\n  readonly ACKNOWLEDGE_STATUS_VALUE = AlarmStatus.ACKNOWLEDGED;\n  readonly CLEARED_STATUS_VALUE = AlarmStatus.CLEARED;\n\n  readonly BELL_SLASH_ICON = ALARM_STATUS_ICON.BELL_SLASH;\n  readonly BELL_ICON = ALARM_STATUS_ICON.BELL;\n  readonly C8Y_ALERT_IDLE_ICON = ALARM_STATUS_ICON.ALERT_IDLE;\n\n  readonly ALARM_ORDER_LABELS = ALARM_ORDER_LABELS;\n\n  alarms$: BehaviorSubject<IResultList<IAlarm> | null> = new BehaviorSubject(null);\n  formGroup: ReturnType<AlarmListWidgetConfigComponent['createForm']>;\n\n  isLoading: boolean;\n  orderList = Object.values(ALARM_ORDER_VALUES);\n  severityList = Object.keys(SEVERITY_LABELS);\n  /**\n   * Order does matter.\n   */\n  statusList = [AlarmStatus.ACTIVE, AlarmStatus.ACKNOWLEDGED, AlarmStatus.CLEARED];\n\n  @ViewChild('alarmListPreview')\n  set previewMapSet(template: TemplateRef<any>) {\n    if (template) {\n      this.widgetConfigService.setPreview(template);\n      return;\n    }\n    this.widgetConfigService.setPreview(null);\n  }\n\n  private destroy$ = new Subject<void>();\n\n  config$ = this.widgetConfigService.currentConfig$.pipe(\n    filter(config => !!config),\n    filter(c => c.dateTimeContext),\n    tap(config => {\n      if (!this.formGroup) {\n        this.initializeForm();\n      } else {\n        this.formGroup.patchValue(config, { emitEvent: false });\n      }\n    }),\n    takeUntil(this.destroy$),\n    shareReplay(1)\n  );\n\n  // Preview controls\n  controls: PresetName = PRESET_NAME.ALARM_LIST;\n  constructor(\n    private alarmListWidgetService: AlarmWidgetService,\n    private alarmService: AlarmService,\n    private alarmsViewService: AlarmsViewService,\n    private alertService: AlertService,\n    private form: NgForm,\n    private formBuilder: FormBuilder,\n    private widgetConfigService: WidgetConfigService\n  ) {}\n\n  ngOnInit(): void {\n    this.config$\n      .pipe(\n        takeUntil(this.destroy$),\n        filter(config => {\n          const displayMode = config?.displayMode ?? GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n          if (displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n            return !!config?.isGlobalContextReady;\n          }\n          return true;\n        }),\n        switchMap(config => {\n          if (\n            (config?.severities && this.alarmListWidgetService.allValuesFalse(config.severities)) ||\n            (config?.status && this.alarmListWidgetService.allValuesFalse(config.status))\n          ) {\n            this.alarms$.next({ data: [], res: null });\n            return EMPTY;\n          }\n          const isWidgetWithExistingConfig = config.order && config.severities && config.status;\n          const filterConfig = isWidgetWithExistingConfig\n            ? config\n            : { ...this.formGroup.value, ...config };\n          return from(this.getAlarms(filterConfig as AlarmListWidgetConfig));\n        })\n      )\n      .subscribe();\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  onBeforeSave(config?: AlarmListWidgetConfig): boolean | Promise<boolean> | Observable<boolean> {\n    const { types } = this.formGroup.value;\n    if (types.length > 1) {\n      const stringTypes = types as string[];\n\n      if (this.isContainingOnlyEmptyTypes(stringTypes)) {\n        this.formGroup.value.types = [''];\n      } else {\n        this.formGroup.value.types = this.filterEmptyTypes(stringTypes);\n      }\n    }\n\n    /**\n     * Applies only to converted legacy Alarm list widget\n     */\n    if (config['options']) {\n      delete config['options'];\n    }\n\n    Object.assign(config, this.formGroup.value);\n\n    return true;\n  }\n\n  removeType(index: number): void {\n    if (this.types.controls.length === 1) {\n      this.formGroup.get('types').reset();\n    } else {\n      this.types.removeAt(index);\n    }\n  }\n\n  addType(): void {\n    this.types.push(this.formBuilder.control(''));\n  }\n\n  get types(): FormArray {\n    return this.formGroup.get('types') as FormArray;\n  }\n\n  private filterEmptyTypes(types: (string | null)[]): string[] {\n    return types.filter((element: string | null) => element !== '' && element !== null);\n  }\n\n  private isContainingOnlyEmptyTypes(types: (string | null)[]): boolean {\n    return types.every((element: string | null) => element === '' || element === null);\n  }\n\n  private async getAlarms(config: AlarmListWidgetConfig): Promise<void> {\n    try {\n      this.isLoading = true;\n      const result: IResultList<IAlarm> = await this.alarmService.list(\n        this.alarmListWidgetService.mapConfigToQueryFilter(config, DEFAULT_PAGE_SIZE)\n      );\n\n      this.alarms$.next(result);\n    } catch (error) {\n      this.alertService.addServerFailure(error);\n    } finally {\n      this.isLoading = false;\n    }\n  }\n\n  private initializeForm(): void {\n    this.formGroup = this.createForm();\n    this.form.form.addControl('config', this.formGroup);\n    this.formGroup.patchValue(this.config, { emitEvent: false });\n    this.initializeTypes(this.config.types);\n\n    this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {\n      this.config = merge(this.config, value);\n      this.getAlarms(this.config);\n    });\n  }\n\n  private createForm() {\n    return this.formBuilder.group({\n      status: this.formBuilder.group(DEFAULT_STATUS_VALUES, {\n        validators: this.minSelectedCheckboxes(1)\n      }),\n      showAlarmsForChildren: true,\n      types: this.formBuilder.array([]),\n      severities: this.formBuilder.group(DEFAULT_SEVERITY_VALUES, {\n        validators: this.minSelectedCheckboxes(1)\n      }),\n      order: ALARM_ORDER_VALUES.BY_ACTIVE as AlarmOrderType,\n      device: this.config.device ? new FormControl(this.config.device) : new FormControl(undefined)\n    });\n  }\n\n  private minSelectedCheckboxes(min = 1): ValidatorFn {\n    const validator: ValidatorFn = (formGroup: FormGroup) => {\n      const totalSelected = Object.values(formGroup.controls).reduce(\n        (prev, next) => (next.value ? prev + next.value : prev),\n        0\n      );\n\n      return totalSelected >= min ? null : { required: true };\n    };\n\n    return validator;\n  }\n\n  private initializeTypes(types: string[]): void {\n    const typesControl = this.formGroup.get('types') as FormArray;\n    if (types) {\n      types.forEach(type => {\n        typesControl.push(this.formBuilder.control(type));\n      });\n    } else {\n      typesControl.push(this.formBuilder.control(''));\n    }\n  }\n}\n","<div\n  class=\"p-l-24 p-r-24\"\n  [style.pointer-events]=\"'auto'\"\n  [style.opacity]=\"1\"\n></div>\n\n@if (formGroup) {\n  <form\n    class=\"row d-flex flex-wrap\"\n    [formGroup]=\"formGroup\"\n  >\n    <div class=\"col-md-6\">\n      <fieldset class=\"c8y-fieldset\">\n        <legend>{{ 'Order`of items on a list, noun`' | translate }}</legend>\n        <c8y-form-group class=\"m-b-8\">\n          @for (order of orderList; track order; let i = $index) {\n            <div\n              class=\"d-flex p-b-8 p-t-4 a-i-center\"\n              data-cy=\"c8y-alarm-list-widget-config--order-elements\"\n            >\n              <label\n                class=\"c8y-radio gap-4\"\n                title=\"{{ ALARM_ORDER_LABELS[order] | translate }}\"\n              >\n                <input\n                  type=\"radio\"\n                  [value]=\"order\"\n                  formControlName=\"order\"\n                />\n                <span class=\"a-s-center\"></span>\n                <span class=\"text-truncate\">{{ ALARM_ORDER_LABELS[order] | translate }}</span>\n              </label>\n              <button\n                class=\"btn-help btn-help--sm\"\n                [attr.aria-label]=\"'Help' | translate\"\n                [popover]=\"order | sortingDescriptionPopoverMessage | translate\"\n                placement=\"right\"\n                triggers=\"focus\"\n                container=\"body\"\n                type=\"button\"\n                [adaptivePosition]=\"true\"\n              ></button>\n            </div>\n          }\n        </c8y-form-group>\n      </fieldset>\n    </div>\n    <div class=\"col-md-6 col-xs-12\">\n      <fieldset\n        class=\"c8y-fieldset\"\n        formGroupName=\"severities\"\n      >\n        <legend>{{ 'Severities' | translate }}</legend>\n        <c8y-form-group\n          [hasError]=\"formGroup.controls.severities.hasError('required')\"\n          [ngClass]=\"{\n            'm-b-8': !formGroup.controls.severities.hasError('required')\n          }\"\n          data-cy=\"c8y-alarm-list-widget-config--severities-elements\"\n        >\n          @for (severityOption of severityList; track severityOption) {\n            <label\n              class=\"c8y-checkbox m-t-0 gap-4\"\n              [title]=\"SEVERITY_LABELS[severityOption] | translate\"\n            >\n              <input\n                type=\"checkbox\"\n                [formControlName]=\"severityOption\"\n                [name]=\"severityOption\"\n              />\n              <span class=\"a-s-center\"></span>\n              @let severityIcon = severityOption | severityIcon;\n              <i\n                class=\"a-s-center m-r-4 icon-20 {{ severityIcon.iconClass }}\"\n                [c8yIcon]=\"severityIcon.c8yIcon\"\n              ></i>\n              <span>{{ SEVERITY_LABELS[severityOption] | translate }}</span>\n            </label>\n          }\n          <c8y-messages>\n            @if (formGroup.controls.severities.hasError('required')) {\n              <c8y-message>\n                {{ 'Select at least one severity.' | translate }}\n              </c8y-message>\n            }\n          </c8y-messages>\n        </c8y-form-group>\n      </fieldset>\n      @if (showDateFilter) {\n        <fieldset class=\"c8y-fieldset\">\n          <legend>{{ 'Date filter' | translate }}</legend>\n          <c8y-form-group class=\"m-b-8\">\n            <c8y-alarms-date-filter\n              [updateQueryParams]=\"false\"\n              [DEFAULT_INTERVAL]=\"config.interval || 'none'\"\n              formControlName=\"dateFilter\"\n              (dateFilterChange)=\"onDateFilterChange($event)\"\n            ></c8y-alarms-date-filter>\n          </c8y-form-group>\n        </fieldset>\n      }\n    </div>\n\n    <div class=\"col-md-6 col-xs-12\">\n      <fieldset\n        class=\"c8y-fieldset\"\n        formGroupName=\"status\"\n      >\n        <legend data-cy=\"c8y-alarm-list-widget-config-status-label\">\n          {{ 'Status' | translate }}\n        </legend>\n        <c8y-form-group\n          [hasError]=\"formGroup.controls.status.hasError('required')\"\n          [ngClass]=\"{\n            'm-b-8': !formGroup.controls.status.hasError('required')\n          }\"\n          data-cy=\"c8y-alarm-list-widget-config--status-elements\"\n        >\n          @for (statusOption of statusList; track statusOption) {\n            <label\n              class=\"c8y-checkbox m-t-0 gap-4\"\n              [title]=\"STATUS_LABELS[statusOption] | translate\"\n            >\n              <input\n                type=\"checkbox\"\n                [formControlName]=\"statusOption\"\n                [name]=\"statusOption\"\n              />\n              <span class=\"a-s-center\"></span>\n              <i\n                class=\"a-s-center m-l-4 m-r-4 text-gray-dark c8y-icon icon-20\"\n                [c8yIcon]=\"\n                  statusOption === CLEARED_STATUS_VALUE\n                    ? C8Y_ALERT_IDLE_ICON\n                    : statusOption === ACKNOWLEDGE_STATUS_VALUE\n                      ? BELL_SLASH_ICON\n                      : BELL_ICON\n                \"\n              ></i>\n              <span>{{ STATUS_LABELS[statusOption] | translate }}</span>\n            </label>\n          }\n          <c8y-messages>\n            @if (formGroup.controls.status.hasError('required')) {\n              <c8y-message>\n                {{ 'Select at least one status.' | translate }}\n              </c8y-message>\n            }\n          </c8y-messages>\n        </c8y-form-group>\n      </fieldset>\n    </div>\n    <div class=\"col-md-6 col-xs-12\">\n      <fieldset\n        class=\"c8y-fieldset\"\n        data-cy=\"c8y-alarm-list-widget-config--child-devices-section\"\n      >\n        <legend>{{ 'Child devices' | translate }}</legend>\n        <c8y-form-group class=\"m-b-8\">\n          <label\n            class=\"c8y-switch\"\n            [title]=\"'Show alarms from child devices' | translate\"\n            data-cy=\"c8y-alarm-list-widget-config--child-devices-label\"\n          >\n            <input\n              type=\"checkbox\"\n              formControlName=\"showAlarmsForChildren\"\n              data-cy=\"c8y-alarm-list-widget-config--showAlarmsForChildren-checkbox\"\n            />\n            <span></span>\n            <span>{{ 'Show alarms' | translate }}</span>\n            <span class=\"sr-only\">{{ 'Show alarms' | translate }}</span>\n          </label>\n        </c8y-form-group>\n      </fieldset>\n    </div>\n\n    <div class=\"col-xs-12\">\n      <fieldset class=\"c8y-fieldset\">\n        <legend>{{ 'Types' | translate }}</legend>\n        <c8y-form-group\n          class=\"m-b-8\"\n          formArrayName=\"types\"\n        >\n          @for (type of types.controls; track type; let i = $index) {\n            <div\n              class=\"input-group m-b-4\"\n              data-cy=\"c8y-alarm-list-widget-config--types-elements\"\n            >\n              <input\n                class=\"form-control\"\n                type=\"text\"\n                [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Alarm' }\"\n                [formControlName]=\"i\"\n              />\n              <div class=\"input-group-btn\">\n                <button\n                  class=\"btn-dot btn-dot--danger m-l-auto\"\n                  [title]=\"'Remove' | translate\"\n                  type=\"button\"\n                  (click)=\"removeType(i)\"\n                  data-cy=\"c8y-alarm-list-widget-config--types-remove-type\"\n                  [disabled]=\"types.controls?.length === 1 && !type.value\"\n                >\n                  <i c8yIcon=\"minus-circle\"></i>\n                </button>\n              </div>\n              @if (i === types.controls.length - 1) {\n                <div class=\"input-group-btn\">\n                  <button\n                    class=\"btn-dot btn-dot--primary m-l-auto\"\n                    [title]=\"'Add alarm type' | translate\"\n                    type=\"button\"\n                    (click)=\"addType()\"\n                    data-cy=\"c8y-alarm-list-widget-config--types-add-type\"\n                  >\n                    <i c8yIcon=\"plus-circle\"></i>\n                  </button>\n                </div>\n              }\n            </div>\n          }\n        </c8y-form-group>\n      </fieldset>\n    </div>\n  </form>\n}\n\n<ng-template #alarmListPreview>\n  @if ((config$ | async)?.displayMode !== 'dashboard') {\n    <c8y-local-controls\n      [controls]=\"controls\"\n      [displayMode]=\"(config$ | async)?.displayMode\"\n      [config]=\"config$ | async\"\n      [disabled]=\"true\"\n    ></c8y-local-controls>\n  }\n  <c8y-alarms-list\n    [alarms]=\"alarms$ | async\"\n    [isInPreviewMode]=\"true\"\n    [isInitialLoading]=\"isLoading\"\n    [navigationOptions]=\"{\n      allowNavigationToAlarmsView: false,\n      alwaysNavigateToAllAlarms: false,\n      includeClearedQueryParams: false,\n      queryParamsHandling: 'merge'\n    }\"\n    data-cy=\"c8y-alarm-list-widget-config--preview-alarm-list\"\n  ></c8y-alarms-list>\n</ng-template>\n\n<ng-template #dateSelectionHelpTemplate>\n  <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, Input, OnDestroy, OnInit, inject, signal } from '@angular/core';\nimport { AlarmService, IAlarm, IResultList } from '@c8y/client';\nimport {\n  AlarmRealtimeService,\n  AlarmWithChildrenRealtimeService,\n  AlertService,\n  DashboardChildComponent,\n  DismissAlertStrategy,\n  DynamicComponent,\n  DynamicComponentAlert,\n  DynamicComponentAlertAggregator\n} from '@c8y/ngx-components';\nimport { AlarmsListComponent } from '@c8y/ngx-components/alarms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  LocalControlsComponent,\n  GlobalContextState,\n  GlobalContextConnectorComponent,\n  REFRESH_OPTION,\n  WidgetConfigMigrationService,\n  PresetName,\n  DisplayMode,\n  GLOBAL_CONTEXT_DISPLAY_MODE,\n  CONTEXT_FEATURE,\n  PRESET_NAME\n} from '@c8y/ngx-components/global-context';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { isEmpty, isMatch, merge } from 'lodash-es';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport {\n  AlarmListWidgetConfig,\n  ASSET_ALARMS_WIDGET_ID,\n  RECENT_ALARMS_WIDGET_ID\n} from '../alarm-list-widget.model';\nimport { AlarmWidgetService } from '../alarm-widget.service';\n\n@Component({\n  selector: 'c8y-alarm-list-widget',\n  templateUrl: './alarm-list-widget.component.html',\n  providers: [AlarmRealtimeService, AlarmWithChildrenRealtimeService],\n  imports: [AlarmsListComponent, AsyncPipe, LocalControlsComponent, GlobalContextConnectorComponent]\n})\nexport class AlarmListWidgetComponent implements OnInit, OnDestroy, DynamicComponent {\n  private alarmWidgetService = inject(AlarmWidgetService);\n  private alarmService = inject(AlarmService);\n  private dashboardChild = inject(DashboardChildComponent);\n  private alertService = inject(AlertService);\n  private widgetConfigMigrationService = inject(WidgetConfigMigrationService);\n\n  @Input() config: AlarmListWidgetConfig;\n  displayMode = signal<DisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD);\n  contextConfig = signal<GlobalContextState>({});\n  isLinkedToGlobal = signal<boolean | undefined>(undefined);\n  alarms$: BehaviorSubject<IResultList<IAlarm> | null> = new BehaviorSubject(null);\n  isLoading$: BehaviorSubject<boolean> = new BehaviorSubject(true);\n  alerts: DynamicComponentAlertAggregator;\n  widgetControls = signal<PresetName>(PRESET_NAME.ALARM_LIST);\n\n  readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n  readonly CONTEXT_FEATURE = CONTEXT_FEATURE;\n  readonly REFRESH_OPTION = REFRESH_OPTION;\n  readonly PRESET_NAME = PRESET_NAME;\n\n  private TIMEOUT_ERROR_TEXT = gettext(\n    'The request is taking longer than usual. We apologize for the inconvenience.'\n  );\n  private SERVER_ERROR_TEXT = gettext('Server error occurred.');\n  private unsubscribe$ = new Subject<void>();\n  hasPermissions = true;\n\n  async ngOnInit(): Promise<void> {\n    this.alerts.setAlertGroupDismissStrategy(\n      'warning',\n      DismissAlertStrategy.TEMPORARY_OR_PERMANENT\n    );\n\n    const alarmsWidgetId =\n      this.dashboardChild['data']?.componentId ?? this.dashboardChild['data']?.name;\n\n    // Check for legacy angularJS widget without proper configuration\n    const isLegacyWidgetWithoutConfiguration =\n      (this.config?.widgetId ?? alarmsWidgetId) === defaultWidgetIds.ALL_CRITICAL_ALARMS ||\n      (this.config?.widgetId ?? alarmsWidgetId) === defaultWidgetIds.RECENT_ALARMS ||\n      isEmpty(this.config) ||\n      (isMatch(this.config, { displaySettings: { globalAutoRefreshContext: true } }) &&\n        !this.config['options']?.device &&\n        !this.config.types &&\n        !this.config.status &&\n        !this.config.severities);\n\n    if (isLegacyWidgetWithoutConfiguration) {\n      let updatedId = alarmsWidgetId;\n      const assetAlarms =\n        this.dashboardChild['data']?.title === 'Active, critical alarms' && 'Asset alarms';\n      const recentAlarms =\n        this.dashboardChild['data']?.title === 'Recent alarms' && 'Recent alarms';\n\n      if (assetAlarms) {\n        updatedId = ASSET_ALARMS_WIDGET_ID;\n      }\n      if (recentAlarms) {\n        updatedId = RECENT_ALARMS_WIDGET_ID;\n      }\n\n      this.setLegacyRecentOrCriticalAlarmWidgetConfig(updatedId);\n      this.config.widgetId = updatedId;\n    } else if (this.alarmWidgetService.isOldAlarmConfigStructure(this.config)) {\n      const mappedConfig = this.alarmWidgetService.mapToNewConfigStructure(this.config);\n      Object.assign(this.config, mappedConfig);\n    }\n\n    if (\n      this.config?.widgetId === RECENT_ALARMS_WIDGET_ID ||\n      this.config?.widgetId === ASSET_ALARMS_WIDGET_ID\n    ) {\n      this.widgetControls.set(PRESET_NAME.ALARM_LIST_LEGACY);\n    }\n\n    const migratedConfig = this.widgetConfigMigrationService.migrateWidgetConfig(this.config);\n    this.config = merge(this.config, migratedConfig);\n\n    const resolvedWidgetId = this.config?.widgetId ?? alarmsWidgetId ?? defaultWidgetIds.ALARM_LIST;\n    this.config.widgetId = resolvedWidgetId;\n\n    const displayMode = this.config.displayMode || GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n    this.displayMode.set(displayMode as DisplayMode);\n\n    const initialContextConfig = {\n      dateTimeContext: this.config.dateTimeContext,\n      aggregation: this.config.aggregation,\n      isAutoRefreshEnabled: this.config.isAutoRefreshEnabled,\n      refreshInterval: this.config.refreshInterval,\n      refreshOption: this.config.refreshOption\n    };\n    this.contextConfig.set(initialContextConfig);\n\n    // In dashboard mode, wait for GlobalContextConnector to emit the first state\n    // In config modes, fetch immediately with widget config\n    if (displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n      await this.fetchAlarms();\n    }\n  }\n\n  ngOnDestroy(): void {\n    if (this.config?.isRealtime) {\n      this.unsubscribe$.next();\n      this.unsubscribe$.complete();\n    }\n  }\n\n  onContextChange(event: { context: GlobalContextState; diff: GlobalContextState }): void {\n    const { diff, context } = event;\n    if (\n      diff.isAutoRefreshEnabled === false &&\n      Object.keys(diff).length === 1 &&\n      context.refreshOption === REFRESH_OPTION.LIVE\n    ) {\n      return;\n    }\n\n    this.contextConfig.set(event.context);\n    void this.fetchAlarms();\n  }\n\n  getDashboardChild(): DashboardChildComponent {\n    return this.dashboardChild;\n  }\n\n  onRefresh(): void {\n    void this.fetchAlarms();\n  }\n\n  onScrollingStateChange(isScrolling: boolean): void {\n    const current = this.contextConfig();\n\n    if (current.refreshOption === REFRESH_OPTION.HISTORY) {\n      return;\n    }\n    this.contextConfig.set({ ...current, isAutoRefreshEnabled: !isScrolling });\n    this.isLinkedToGlobal.set(!isScrolling);\n  }\n\n  private async fetchAlarms(): Promise<void> {\n    const alarms = await this.getAlarms();\n    this.alarms$.next(alarms);\n  }\n\n  private async getAlarms(): Promise<IResultList<IAlarm>> {\n    try {\n      this.isLoading$.next(true);\n      const effectiveConfig = {\n        ...this.config,\n        ...this.contextConfig()\n      };\n      return await this.alarmService.list(\n        this.alarmWidgetService.mapConfigToQueryFilter(effectiveConfig)\n      );\n    } catch (error) {\n      if (error?.res?.status === 403) {\n        this.hasPermissions = false;\n        return;\n      }\n      this.alerts.addAlerts(\n        new DynamicComponentAlert({\n          type: 'warning',\n          text:\n            error?.name === 'TimeoutError'\n              ? this.TIMEOUT_ERROR_TEXT\n              : (error?.message ?? this.SERVER_ERROR_TEXT)\n        })\n      );\n      this.alertService.addServerFailure(error);\n    } finally {\n      this.isLoading$.next(false);\n    }\n  }\n\n  private setLegacyRecentOrCriticalAlarmWidgetConfig(widgetId: string): void {\n    if (widgetId === RECENT_ALARMS_WIDGET_ID) {\n      const predefinedConfig = this.alarmWidgetService.getPredefinedConfiguration(\n        RECENT_ALARMS_WIDGET_ID,\n        this.config\n      );\n      Object.assign(this.config, predefinedConfig);\n      return;\n    }\n\n    if (widgetId === ASSET_ALARMS_WIDGET_ID) {\n      const predefinedConfig = this.alarmWidgetService.getPredefinedConfiguration(\n        ASSET_ALARMS_WIDGET_ID,\n        this.config\n      );\n      Object.assign(this.config, predefinedConfig);\n    }\n  }\n}\n","@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n  <c8y-global-context-connector\n    [controls]=\"widgetControls()\"\n    [config]=\"contextConfig()\"\n    [isLoading]=\"isLoading$ | async\"\n    [dashboardChild]=\"getDashboardChild()\"\n    [linked]=\"isLinkedToGlobal()\"\n    (configChange)=\"onContextChange($event)\"\n    (refresh)=\"onRefresh()\"\n  ></c8y-global-context-connector>\n} @else {\n  <c8y-local-controls\n    [controls]=\"widgetControls()\"\n    [displayMode]=\"displayMode()\"\n    [config]=\"contextConfig()\"\n    [isLoading]=\"isLoading$ | async\"\n    (configChange)=\"onContextChange($event)\"\n    (refresh)=\"onRefresh()\"\n  ></c8y-local-controls>\n}\n\n<c8y-alarms-list\n  #list\n  [alarms]=\"alarms$ | async\"\n  [navigationOptions]=\"{\n    alwaysNavigateToAllAlarms: !config.device,\n    allowNavigationToAlarmsView: true,\n    includeClearedQueryParams: true,\n    queryParamsHandling: ''\n  }\"\n  [isInitialLoading]=\"isLoading$ | async\"\n  [hasPermissions]=\"hasPermissions\"\n  (onScrollingStateChange)=\"onScrollingStateChange($event)\"\n></c8y-alarms-list>\n","import { CommonModule as NgCommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule as NgFormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport {\n  CommonModule,\n  CountdownIntervalModule,\n  DocsModule,\n  FormsModule\n} from '@c8y/ngx-components';\nimport { AlarmsModule } from '@c8y/ngx-components/alarms';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AlarmListWidgetConfigComponent } from './alarm-list-widget-config/alarm-list-widget-config.component';\nimport { AlarmListWidgetComponent } from './alarm-list-widget-view/alarm-list-widget.component';\nimport { SortingDescriptionPopoverMessagePipe } from './sorting-description-popover-message.pipe';\nimport { SeverityIconPipe } from './severity-icon.pipe';\nimport {\n  ConfigContextSelectorComponent,\n  GlobalContextConfigComponent,\n  GlobalContextWidgetWrapperComponent,\n  GlobalContextInlineComponent\n} from '@c8y/ngx-components/global-context';\n\n@NgModule({\n  imports: [\n    AlarmsModule,\n    CommonModule,\n    CountdownIntervalModule,\n    DocsModule,\n    FormsModule,\n    NgCommonModule,\n    NgFormsModule,\n    PopoverModule,\n    ReactiveFormsModule,\n    RouterModule,\n    TooltipModule.forRoot(),\n    AlarmListWidgetComponent,\n    AlarmListWidgetConfigComponent,\n    SeverityIconPipe,\n    SortingDescriptionPopoverMessagePipe,\n    GlobalContextConfigComponent,\n    GlobalContextInlineComponent,\n    ConfigContextSelectorComponent,\n    GlobalContextWidgetWrapperComponent\n  ]\n})\nexport class AlarmsWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AlarmWidgetService","i3","FormsModule","NgCommonModule","NgFormsModule"],"mappings":"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"}