{"version":3,"file":"c8y-ngx-components-events.mjs","sources":["../../events/events.model.ts","../../events/events.service.ts","../../events/event-details.component.ts","../../events/event-details.component.html","../../events/event-icon.pipe.ts","../../events/event-is-image.pipe.ts","../../events/events-view.service.ts","../../events/event-router-link.pipe.ts","../../events/events-date-filter.component.ts","../../events/events-date-filter.component.html","../../events/events-interval-refresh.component.ts","../../events/events-interval-refresh.component.html","../../events/events-list.component.ts","../../events/events-list.component.html","../../events/events-type-filter.component.ts","../../events/events-type-filter.component.html","../../events/events.component.ts","../../events/events.component.html","../../events/c8y-ngx-components-events.ts"],"sourcesContent":["import { QueryParamsHandling } from '@angular/router';\nimport { DateTimeContext } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  AlarmFilterInterval,\n  INTERVALS,\n  INTERVAL_TITLES\n} from '@c8y/ngx-components/interval-picker';\n\nexport interface EventsFilter {\n  source?: string | number;\n  type?: string;\n  dateFrom?: Date;\n  dateTo?: Date;\n  pageSize?: number;\n  withSourceChildren?: boolean;\n}\n\nexport const EVENT_RESERVED_KEYS = [\n  'creationTime',\n  'id',\n  'lastUpdated',\n  'self',\n  'source',\n  'text',\n  'time',\n  'type',\n  'c8y_IsBinary'\n];\n\nexport const EVENT_STANDARD_KEYS = {\n  type: gettext('Type'),\n  text: gettext('Text'),\n  lastUpdated: gettext('Last updated')\n};\n\nexport const EVENTS_PATH = 'events';\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 EventListFormFilters = {\n  selectedDates?: DateTimeContext;\n  interval?: AlarmFilterInterval['id'];\n};\n\n/**\n * Represents the navigation options for the events list component.\n */\nexport type EventNavigationOptions = {\n  /**\n   * Defines if the event should navigate to a detail view when clicked.\n   */\n  allowNavigationToEventsView: boolean;\n  /**\n   * Defines if the component should try to determine the context to navigate\n   * to the correct event 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 events view.\n   */\n  alwaysNavigateToAllEvents: boolean;\n  /**\n   * Determines how query parameters should be handled during navigation.\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","import { inject, Injectable } from '@angular/core';\nimport { IEvent, IEventBinary } from '@c8y/client';\nimport { FilesService, GenericFileIconPipe } from '@c8y/ngx-components';\nimport { difference, has, includes, keys, pickBy, without } from 'lodash-es';\nimport {\n  EVENT_RESERVED_KEYS as RESERVED_KEYS,\n  EVENT_STANDARD_KEYS as STANDARD_KEYS\n} from './events.model';\n\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'];\n\n@Injectable({ providedIn: 'root' })\nexport class EventsService {\n  private filesService = inject(FilesService);\n  private fileIconPipe = new GenericFileIconPipe(this.filesService);\n\n  resolveFileIcon(fileName: string): string {\n    const extension = this.filesService.getFileExtension(fileName);\n    if (!extension) {\n      return 'file-o';\n    }\n    const genericType = this.fileIconPipe.getGenericType({ name: fileName } as File);\n    return this.fileIconPipe.getIcon(genericType);\n  }\n\n  getStandardKeys(event: IEvent) {\n    return pickBy(STANDARD_KEYS, (_, key) => has(event, key));\n  }\n\n  getNonStandardKeys(event: IEvent, excluding: string[] = []) {\n    return without(\n      difference(this.getKeys(event), keys(this.getStandardKeys(event))),\n      ...excluding\n    );\n  }\n\n  isImageBinary(binaryInfo: IEventBinary): boolean {\n    if (!binaryInfo?.name) {\n      return false;\n    }\n    const extension = this.filesService.getFileExtension(binaryInfo.name);\n    return extension ? IMAGE_EXTENSIONS.includes(extension) : false;\n  }\n\n  getCustomFragments(event: IEvent): Record<string, unknown> | null {\n    const nonStandardKeys = this.getNonStandardKeys(event);\n    if (nonStandardKeys.length === 0) {\n      return null;\n    }\n\n    const fragments: Record<string, unknown> = {};\n    for (const key of nonStandardKeys) {\n      fragments[key] = event[key];\n    }\n    return fragments;\n  }\n\n  arrayBufferToBase64(buffer: ArrayBuffer): string {\n    const bytes = new Uint8Array(buffer);\n    const chunks: string[] = [];\n    for (let i = 0; i < bytes.length; i += 8192) {\n      chunks.push(String.fromCharCode(...bytes.subarray(i, i + 8192)));\n    }\n    return btoa(chunks.join(''));\n  }\n\n  private getKeys(managedObject: IEvent) {\n    return Object.keys({ ...managedObject }).filter(key => !includes(RESERVED_KEYS, key));\n  }\n}\n","import { JsonPipe, KeyValuePipe } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  DestroyRef,\n  inject,\n  OnInit,\n  signal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport {\n  EventBinaryService,\n  EventService,\n  IEvent,\n  IEventBinary,\n  IManagedObject,\n  InventoryService\n} from '@c8y/client';\nimport {\n  AlertService,\n  AssetLinkPipe,\n  C8yTranslatePipe,\n  ColorService,\n  DatePipe,\n  HumanizePipe,\n  IconDirective,\n  IconPanelComponent,\n  LoadingComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { saveAs } from 'file-saver';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { EventsService } from './events.service';\n\ntype CustomFragment = Record<string, unknown> | null;\n\n@Component({\n  selector: 'c8y-event-details',\n  templateUrl: './event-details.component.html',\n  imports: [\n    AssetLinkPipe,\n    C8yTranslatePipe,\n    DatePipe,\n    HumanizePipe,\n    IconDirective,\n    IconPanelComponent,\n    JsonPipe,\n    KeyValuePipe,\n    LoadingComponent,\n    PopoverDirective,\n    RouterLink\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EventDetailsComponent implements OnInit {\n  readonly CREATION_TIME_HELP_TEXT = gettext(\n    \"Time in which the event was created on the server. The time shown corresponds to the server's time.\"\n  );\n  readonly EVENT_ICON = 'online1';\n  readonly TIME_HELP_TEXT = gettext(\n    'Time in which the event was created on the device. Device time can be different from server time.'\n  );\n\n  binaryPreviewLoading = signal(false);\n  binaryPreviewUrl = signal<string | null>(null);\n  binaryPreviewFailed = signal(false);\n  customFragments = signal<CustomFragment>(null);\n  isDownloading = signal(false);\n  isLoading = signal(true);\n  selectedEvent = signal<IEvent | null>(null);\n  selectedEventSource = signal<IManagedObject | null>(null);\n  typeColor = signal<string>('');\n\n  binaryInfo = computed<IEventBinary | null>(() => this.selectedEvent()?.['c8y_IsBinary'] ?? null);\n  hasBinary = computed(() => !!this.binaryInfo());\n  canDownload = computed(() => this.binaryInfo()?.length !== undefined);\n  binaryIcon = computed(() => {\n    const info = this.binaryInfo();\n    if (!info?.name) {\n      return 'file-o';\n    }\n    return this.eventsService.resolveFileIcon(info.name);\n  });\n\n  private activatedRoute = inject(ActivatedRoute);\n  private alertService = inject(AlertService);\n  private colorService = inject(ColorService);\n  private destroyRef = inject(DestroyRef);\n  private eventBinaryService = inject(EventBinaryService);\n  private eventService = inject(EventService);\n  private eventsService = inject(EventsService);\n  private inventoryService = inject(InventoryService);\n\n  ngOnInit(): void {\n    this.activatedRoute.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\n      if (params['id']) {\n        void this.loadEventDetails(params['id']);\n      }\n    });\n  }\n\n  isComplexValue(value: unknown): boolean {\n    return typeof value === 'object' && value !== null;\n  }\n\n  async downloadBinary(): Promise<void> {\n    const event = this.selectedEvent();\n    const binaryInfo = this.binaryInfo();\n    if (!event || !binaryInfo) {\n      return;\n    }\n\n    try {\n      this.isDownloading.set(true);\n      const response = await this.eventBinaryService.download(event);\n      const arrayBuffer = await response.arrayBuffer();\n      const contentType = response.headers.get('Content-Type') || 'application/octet-stream';\n      const blob = new Blob([arrayBuffer], { type: contentType });\n      saveAs(blob, binaryInfo.name || 'attachment');\n    } catch (error: unknown) {\n      this.alertService.addServerFailure(error);\n    } finally {\n      this.isDownloading.set(false);\n    }\n  }\n\n  private async loadEventDetails(eventId: string): Promise<void> {\n    try {\n      this.isLoading.set(true);\n      this.binaryPreviewUrl.set(null);\n      this.binaryPreviewFailed.set(false);\n\n      const { data: event } = await this.eventService.detail(eventId);\n      this.selectedEvent.set(event);\n\n      const [source, color] = await Promise.all([\n        this.loadEventSource(event.source?.id),\n        this.colorService.generateColor(event.type)\n      ]);\n\n      this.selectedEventSource.set(source);\n      this.typeColor.set(color);\n      this.customFragments.set(this.eventsService.getCustomFragments(event));\n\n      if (event['c8y_IsBinary'] && this.eventsService.isImageBinary(event['c8y_IsBinary'])) {\n        void this.loadBinaryPreview(event);\n      }\n    } catch (error: unknown) {\n      this.alertService.addServerFailure(error);\n    } finally {\n      this.isLoading.set(false);\n    }\n  }\n\n  private async loadEventSource(sourceId: string | number): Promise<IManagedObject | null> {\n    if (!sourceId) {\n      return null;\n    }\n    try {\n      const { data } = await this.inventoryService.detail(sourceId);\n      return data;\n    } catch {\n      return null;\n    }\n  }\n\n  private async loadBinaryPreview(event: IEvent): Promise<void> {\n    try {\n      this.binaryPreviewLoading.set(true);\n      const response = await this.eventBinaryService.download(event);\n      const arrayBuffer = await response.arrayBuffer();\n      const contentType = response.headers.get('Content-Type') || 'image/png';\n      const base64 = this.eventsService.arrayBufferToBase64(arrayBuffer);\n      this.binaryPreviewUrl.set(`data:${contentType};base64,${base64}`);\n    } catch {\n      this.binaryPreviewFailed.set(true);\n    } finally {\n      this.binaryPreviewLoading.set(false);\n    }\n  }\n}\n","@if (isLoading()) {\n  <c8y-loading />\n} @else if (selectedEvent(); as event) {\n  <!-- Header with event text -->\n  <div\n    class=\"card-header p-24 m-b-16 bg-component separator-bottom sticky-top\"\n    style=\"margin: 0 -24px\"\n  >\n    <h4\n      class=\"m-0\"\n      data-cy=\"c8y-event-details-title\"\n    >\n      {{ event.text | translate }}\n    </h4>\n  </div>\n\n  <c8y-icon-panel [sections]=\"[]\">\n    <!-- Source section -->\n    <div\n      class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n      data-cy=\"c8y-event-details--source-wrapper\"\n    >\n      <div class=\"border-all fit-w d-flex\">\n        <div class=\"p-8\">\n          <i\n            class=\"icon-24 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 min-width-0\">\n          <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n          <p class=\"small\">\n            @if (selectedEventSource(); as source) {\n              <button\n                class=\"btn-link p-0 m-r-8 text-left text-truncate\"\n                [title]=\"source.name || event.source?.id\"\n                type=\"button\"\n                [routerLink]=\"source | assetLink\"\n              >\n                <i c8yIcon=\"exchange\"></i>\n                {{ source.name || event.source?.id }}\n              </button>\n            } @else {\n              <span class=\"text-muted\">{{ event.source?.id }}</span>\n            }\n          </p>\n        </div>\n      </div>\n    </div>\n\n    <!-- Type section -->\n    <div\n      class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n      data-cy=\"c8y-event-details--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            [style.background-color]=\"typeColor()\"\n          >\n            <i\n              class=\"stroked-icon\"\n              [c8yIcon]=\"EVENT_ICON\"\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]=\"event.type\"\n          >\n            <code>{{ event.type }}</code>\n          </p>\n        </div>\n      </div>\n    </div>\n\n    <!-- Time, Server creation time, and Last updated -->\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-event-details--calendar-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            <!-- Device time -->\n            <div\n              class=\"col-4 p-b-8\"\n              data-cy=\"c8y-event-details--time-wrapper\"\n            >\n              <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Time' | translate }}</p>\n              <p class=\"small\">\n                {{ event.time | c8yDate: 'medium' }}\n                <button\n                  class=\"btn-help btn-help--sm\"\n                  [attr.aria-label]=\"'Help' | translate\"\n                  [popover]=\"TIME_HELP_TEXT | translate\"\n                  placement=\"right\"\n                  triggers=\"focus\"\n                  container=\"body\"\n                  type=\"button\"\n                ></button>\n              </p>\n            </div>\n            <!-- Server creation time -->\n            <div\n              class=\"col-4 p-b-8\"\n              data-cy=\"c8y-event-details--creation-time-wrapper\"\n            >\n              <p class=\"text-label-small m-b-0 m-r-8\">\n                {{ 'Server creation time' | translate }}\n              </p>\n              <p class=\"small\">\n                {{ event.creationTime | c8yDate: 'medium' }}\n                <button\n                  class=\"btn-help btn-help--sm\"\n                  [attr.aria-label]=\"'Help' | translate\"\n                  [popover]=\"CREATION_TIME_HELP_TEXT | translate\"\n                  placement=\"right\"\n                  triggers=\"focus\"\n                  container=\"body\"\n                  type=\"button\"\n                ></button>\n              </p>\n            </div>\n            <!-- Last updated -->\n            @if (event['lastUpdated']) {\n              <div\n                class=\"col-4 p-b-8\"\n                data-cy=\"c8y-event-details--last-updated-wrapper\"\n              >\n                <p class=\"text-label-small m-b-0 m-r-8\">\n                  {{ 'Last updated' | translate }}\n                </p>\n                <p class=\"small\">\n                  {{ event['lastUpdated'] | c8yDate: 'medium' }}\n                </p>\n              </div>\n            }\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <!-- Custom fragments section -->\n    @if (customFragments(); as fragments) {\n      <div\n        class=\"col-xs-12 col-md-12 p-b-16\"\n        data-cy=\"c8y-event-details--custom-fragments-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\"\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=\"event-details-custom-data\"\n          >\n            <ul class=\"list-unstyled small m-b-0\">\n              @for (item of fragments | keyvalue; track item.key) {\n                <li\n                  class=\"p-t-4 p-b-4 separator-bottom\"\n                  data-cy=\"event-details-custom-data-item\"\n                >\n                  <label class=\"small m-b-4 text-label-small d-block\">\n                    {{ item.key | humanize }}\n                  </label>\n                  @if (isComplexValue(item.value)) {\n                    <pre class=\"m-b-0\"><code>{{ item.value | json }}</code></pre>\n                  } @else {\n                    <span>{{ item.value }}</span>\n                  }\n                </li>\n              }\n            </ul>\n          </div>\n        </div>\n      </div>\n    }\n\n    <!-- Attachment section -->\n    @if (hasBinary()) {\n      <div\n        class=\"col-xs-12 col-md-12 p-b-16\"\n        data-cy=\"c8y-event-details--attachment-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\"\n              [c8yIcon]=\"binaryIcon()\"\n            ></i>\n          </div>\n          <div class=\"p-t-8 p-b-8 p-r-8 flex-grow\">\n            <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Attachment' | translate }}</p>\n\n            <!-- Image preview -->\n            @if (binaryPreviewLoading()) {\n              <div class=\"m-b-16\">\n                <c8y-loading></c8y-loading>\n              </div>\n            } @else if (binaryPreviewUrl(); as previewUrl) {\n              @let imgAltText = 'Attachment preview' | translate;\n              <div class=\"m-b-16\">\n                <img\n                  class=\"max-width-100\"\n                  [src]=\"previewUrl\"\n                  [alt]=\"binaryInfo()?.name || imgAltText\"\n                  data-cy=\"c8y-event-details--attachment-preview\"\n                />\n              </div>\n            } @else if (binaryPreviewFailed()) {\n              <p\n                class=\"text-muted small m-b-8\"\n                translate\n              >\n                Preview unavailable.\n              </p>\n            }\n\n            <!-- Download button -->\n            @if (canDownload()) {\n              <button\n                class=\"btn btn-primary btn-xs\"\n                [title]=\"'Download' | translate\"\n                [attr.aria-busy]=\"isDownloading()\"\n                type=\"button\"\n                [disabled]=\"isDownloading()\"\n                (click)=\"downloadBinary()\"\n                data-cy=\"c8y-event-details--download-btn\"\n              >\n                <i [c8yIcon]=\"isDownloading() ? 'spinner' : 'download'\"></i>\n                <span>{{ 'Download' | translate }}</span>\n              </button>\n            }\n          </div>\n        </div>\n      </div>\n    }\n  </c8y-icon-panel>\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { IEvent, IEventBinary } from '@c8y/client';\nimport { EventsService } from './events.service';\n\nconst DEFAULT_EVENT_ICON = 'online1';\n\n@Pipe({\n  name: 'eventIcon',\n  standalone: true\n})\nexport class EventIconPipe implements PipeTransform {\n  private eventsService = inject(EventsService);\n\n  transform(event: IEvent): string {\n    const binaryInfo: IEventBinary | undefined = event['c8y_IsBinary'];\n    return binaryInfo?.name\n      ? this.eventsService.resolveFileIcon(binaryInfo.name)\n      : DEFAULT_EVENT_ICON;\n  }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { IEvent } from '@c8y/client';\nimport { EventsService } from './events.service';\n\n@Pipe({\n  name: 'eventIsImage',\n  standalone: true\n})\nexport class EventIsImagePipe implements PipeTransform {\n  private eventsService = inject(EventsService);\n\n  transform(event: IEvent): boolean {\n    return this.eventsService.isImageBinary(event['c8y_IsBinary']);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { EventService, IEvent, IResultList } from '@c8y/client';\nimport { ContextData, DateTimeContext, ViewContext } from '@c8y/ngx-components';\nimport { DateTimeContextPickerService, TimeInterval } from '@c8y/ngx-components/global-context';\nimport { AlarmFilterInterval } from '@c8y/ngx-components/interval-picker';\nimport { Subject } from 'rxjs';\nimport { EVENTS_PATH, EventsFilter } from './events.model';\n\nexport interface BuildEventsFilterParams {\n  source?: string | number | null;\n  type?: string | null;\n  dateRange?: DateTimeContext | null;\n  dateTimeContext?: { dateFrom?: Date | string | null; dateTo?: Date | string | null } | null;\n  withSourceChildren?: boolean;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class EventsViewService {\n  readonly DEFAULT_PAGE_SIZE = 50;\n  readonly DEFAULT_REFRESH_INTERVAL = 30_000;\n\n  reloadEventsList$ = new Subject<void>();\n\n  constructor(\n    private eventService: EventService,\n    private dateTimeContextPickerService: DateTimeContextPickerService\n  ) {}\n\n  /**\n   * Emits a subject to trigger events list reload.\n   */\n  updateEventsList(): void {\n    this.reloadEventsList$.next();\n  }\n\n  /**\n   * Retrieves a list of events with optional filters.\n   */\n  async retrieveEvents(filter?: EventsFilter): Promise<IResultList<IEvent>> {\n    const queryFilter: Record<string, unknown> = {\n      pageSize: filter?.pageSize ?? this.DEFAULT_PAGE_SIZE,\n      withTotalPages: true\n    };\n\n    if (filter?.source) {\n      queryFilter['source'] = filter.source;\n      queryFilter['withSourceChildren'] = filter.withSourceChildren ?? true;\n    }\n\n    if (filter?.type) {\n      queryFilter['type'] = filter.type;\n    }\n\n    if (filter?.dateFrom) {\n      queryFilter['dateFrom'] = filter.dateFrom.toISOString();\n    }\n\n    if (filter?.dateTo) {\n      queryFilter['dateTo'] = filter.dateTo.toISOString();\n    }\n\n    return this.eventService.list(queryFilter);\n  }\n\n  /**\n   * Returns the correct link based on the provided context data.\n   */\n  getRouterLink(contextData?: ContextData, event?: IEvent): string {\n    let detailUrl = `/${EVENTS_PATH}`;\n    if (event) {\n      detailUrl = `/${EVENTS_PATH}/${event.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      default:\n        return detailUrl;\n    }\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  buildEventsFilter(params: BuildEventsFilterParams): EventsFilter {\n    const dateFrom = params.dateTimeContext?.dateFrom ?? params.dateRange?.[0];\n    const dateTo = params.dateTimeContext?.dateTo ?? params.dateRange?.[1];\n    return {\n      ...(params.source && {\n        source: params.source,\n        withSourceChildren: params.withSourceChildren ?? true\n      }),\n      ...(params.type && { type: params.type }),\n      ...(dateFrom && { dateFrom: new Date(dateFrom) }),\n      ...(dateTo && { dateTo: new Date(dateTo) })\n    };\n  }\n\n  getDateTimeContextByInterval(intervalId: AlarmFilterInterval['id']): DateTimeContext {\n    return this.dateTimeContextPickerService.getDateTimeContextByInterval(\n      intervalId as TimeInterval\n    );\n  }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IEvent } from '@c8y/client';\nimport { ContextRouteService } from '@c8y/ngx-components';\nimport { EventsViewService } from './events-view.service';\n\n@Pipe({\n  name: 'eventRouterLink',\n  standalone: true\n})\nexport class EventRouterLinkPipe implements PipeTransform {\n  private activatedRoute = inject(ActivatedRoute);\n  private contextRouteService = inject(ContextRouteService);\n  private eventsViewService = inject(EventsViewService);\n\n  transform(event: IEvent, alwaysNavigateToAllEvents = false): string {\n    if (alwaysNavigateToAllEvents) {\n      return this.eventsViewService.getRouterLink(null, event);\n    }\n    const contextData = this.contextRouteService.getContextData(this.activatedRoute);\n    return this.eventsViewService.getRouterLink(contextData, event);\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  inject,\n  input,\n  OnInit,\n  output,\n  signal,\n  viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  DatePipe,\n  DateTimePickerComponent,\n  FormGroupComponent,\n  IconDirective,\n  MessageDirective,\n  MessagesComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlarmFilterInterval, IntervalPickerComponent } from '@c8y/ngx-components/interval-picker';\nimport {\n  BsDropdownDirective,\n  BsDropdownMenuDirective,\n  BsDropdownToggleDirective\n} from 'ngx-bootstrap/dropdown';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { take } from 'rxjs';\nimport { EventsViewService } from './events-view.service';\nimport {\n  EventListFormFilters,\n  INTERVAL_TITLES_EXTENDED,\n  INTERVALS_EXTENDED,\n  WidgetTimeContextStateExtended\n} from './events.model';\n\n@Component({\n  selector: 'c8y-events-date-filter',\n  templateUrl: './events-date-filter.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    FormsModule,\n    ReactiveFormsModule,\n    BsDropdownDirective,\n    BsDropdownToggleDirective,\n    TooltipDirective,\n    IconDirective,\n    BsDropdownMenuDirective,\n    IntervalPickerComponent,\n    FormGroupComponent,\n    C8yTranslateDirective,\n    DateTimePickerComponent,\n    MessagesComponent,\n    MessageDirective,\n    C8yTranslatePipe,\n    DatePipe\n  ]\n})\nexport class EventsDateFilterComponent implements OnInit {\n  readonly INTERVALS = INTERVALS_EXTENDED;\n  readonly INTERVAL_TITLES = INTERVAL_TITLES_EXTENDED;\n  readonly DATE_FORMAT = 'short';\n\n  readonly defaultInterval = input<AlarmFilterInterval['id']>('none');\n  readonly updateQueryParams = input(true);\n  date = signal<[string, string] | undefined>(undefined);\n  noFilterLabel = gettext('No date filter');\n\n  dateFilterChange = output<EventListFormFilters>();\n  dropdown = viewChild(BsDropdownDirective);\n\n  private activatedRoute = inject(ActivatedRoute);\n  private destroyRef = inject(DestroyRef);\n  private eventsViewService = inject(EventsViewService);\n  private formBuilder = inject(FormBuilder);\n  private router = inject(Router);\n\n  form: ReturnType<EventsDateFilterComponent['createForm']>;\n\n  ngOnInit() {\n    const context = this.getDefaultContext();\n    this.form = this.createForm(context);\n    this.date.set([\n      this.form.value.currentDateContextFromDate,\n      this.form.value.currentDateContextToDate\n    ]);\n    this.activatedRoute.queryParams\n      .pipe(take(1), takeUntilDestroyed(this.destroyRef))\n      .subscribe(params => {\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.dateFrom,\n            temporaryUserSelectedToDate: params.dateTo\n          });\n          this.date.set([params.dateFrom, params.dateTo]);\n        }\n      });\n\n    this.subscribeToIntervalChange();\n  }\n\n  applyDateFilter(): void {\n    const interval = this.form.value.currentDateContextInterval;\n    const isNoDateFilter = interval === 'none';\n\n    const combinedFormEvent: EventListFormFilters = {\n      interval,\n      selectedDates: isNoDateFilter\n        ? undefined\n        : [\n            new Date(this.form.value.temporaryUserSelectedFromDate),\n            new Date(this.form.value.temporaryUserSelectedToDate)\n          ]\n    };\n\n    // needed for custom interval\n    this.date.set([\n      this.form.value.temporaryUserSelectedFromDate,\n      this.form.value.temporaryUserSelectedToDate\n    ]);\n\n    this.router.navigate([], {\n      relativeTo: this.activatedRoute,\n      queryParams: {\n        interval,\n        dateFrom: isNoDateFilter ? null : combinedFormEvent.selectedDates[0].toISOString(),\n        dateTo: isNoDateFilter ? null : combinedFormEvent.selectedDates[1].toISOString()\n      },\n      queryParamsHandling: 'merge'\n    });\n    this.dateFilterChange.emit(combinedFormEvent);\n  }\n\n  private updateDateTime(interval: AlarmFilterInterval['id']): void {\n    const date = this.eventsViewService.getDateTimeContextByInterval(interval);\n    const dropdown = this.dropdown();\n    if (dropdown) {\n      dropdown.isOpen = false;\n    }\n    this.date.set(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.eventsViewService.getDateTimeContextByInterval(this.defaultInterval()),\n      interval: this.defaultInterval()\n    };\n  }\n\n  private subscribeToIntervalChange(): void {\n    this.form.controls.currentDateContextInterval.valueChanges\n      .pipe(takeUntilDestroyed(this.destroyRef))\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    #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=\"events-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          {{\n            INTERVAL_TITLES[form.controls.currentDateContextInterval.value ?? 'none'] | translate\n          }}\n        </span>\n        @if (form.controls.currentDateContextInterval.value !== 'none') {\n          <span\n            class=\"text-10 text-muted text-truncate\"\n            data-cy=\"events-date-filter--selected-time-range\"\n          >\n            {{ date()?.[0] | c8yDate: DATE_FORMAT }} — {{ date()?.[1] | c8yDate: DATE_FORMAT }}\n          </span>\n        }\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      @if (form.controls.currentDateContextInterval.value === 'custom') {\n        <div class=\"p-l-16 p-r-16\">\n          <c8y-form-group\n            class=\"m-b-8\"\n            [class.has-error]=\"form.controls.temporaryUserSelectedFromDate.errors\"\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              [class.has-error]=\"form.controls.temporaryUserSelectedFromDate.errors\"\n              id=\"temporaryUserSelectedFromDate\"\n              [maxDate]=\"form.value.temporaryUserSelectedToDate ?? ''\"\n              [placeholder]=\"'From`date`' | translate\"\n              [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\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            [class.has-error]=\"form.controls.temporaryUserSelectedToDate.errors\"\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              [class.has-error]=\"form.controls.temporaryUserSelectedToDate.errors\"\n              id=\"temporaryUserSelectedToDate\"\n              [minDate]=\"form.value.temporaryUserSelectedFromDate ?? ''\"\n              [placeholder]=\"'To`date`' | translate\"\n              [formControl]=\"form.controls.temporaryUserSelectedToDate\"\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            data-cy=\"events-date-filter--apply-button\"\n            (click)=\"applyDateFilter(); dropDirection.isOpen = false\"\n            [disabled]=\"(form.pristine && form.untouched) || form.invalid\"\n            translate\n          >\n            Apply\n          </button>\n        </div>\n      }\n    </ul>\n  </div>\n</form>\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  effect,\n  inject,\n  input,\n  output,\n  untracked,\n  viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { C8yTranslatePipe, CountdownIntervalComponent, IconDirective } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n  selector: 'c8y-events-interval-refresh',\n  templateUrl: './events-interval-refresh.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    FormsModule,\n    ReactiveFormsModule,\n    TooltipDirective,\n    CountdownIntervalComponent,\n    IconDirective,\n    C8yTranslatePipe\n  ]\n})\nexport class EventsIntervalRefreshComponent implements AfterViewInit {\n  readonly DEFAULT_INTERVAL_VALUES = [5_000, 10_000, 15_000, 30_000, 60_000];\n  readonly DEFAULT_INTERVAL_VALUE = 30_000;\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  isLoading = input(false);\n  isDisabled = input(false);\n  isIntervalToggleEnabled = input(true);\n\n  onCountdownEnded = output<void>();\n\n  countdownIntervalComponent = viewChild(CountdownIntervalComponent);\n\n  private fb = inject(FormBuilder);\n  toggleIntervalForm = this.initForm();\n\n  private destroyRef = inject(DestroyRef);\n  private doesUserCheckedIntervalToggle = false;\n\n  constructor() {\n    effect(() => {\n      const externalValue = this.isIntervalToggleEnabled();\n      const intervalEnabledControl = this.toggleIntervalForm.get('intervalEnabled');\n\n      const shouldUpdate =\n        !intervalEnabledControl.dirty || (this.doesUserCheckedIntervalToggle && externalValue);\n\n      if (shouldUpdate && intervalEnabledControl.value !== externalValue) {\n        intervalEnabledControl.setValue(externalValue);\n      }\n    });\n\n    effect(() => {\n      const loading = this.isLoading();\n      untracked(() => {\n        if (loading) {\n          this.countdownIntervalComponent()?.stop();\n        } else {\n          this.countdownIntervalComponent()?.reset();\n        }\n      });\n    });\n  }\n\n  get isToggleEnabled(): boolean {\n    return !this.isDisabled() && this.toggleIntervalForm.get('intervalEnabled').value;\n  }\n\n  ngAfterViewInit(): void {\n    this.onIntervalToggleChange();\n    this.listenToRefreshIntervalChange();\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(): string {\n    return this.isDisabled()\n      ? gettext('Disabled')\n      : this.isToggleEnabled\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('intervalEnabled')\n      .valueChanges.pipe(takeUntilDestroyed(this.destroyRef), filter(Boolean))\n      .subscribe(() => setTimeout(() => this.startCountdown()));\n  }\n\n  private initForm() {\n    return this.fb.group({\n      intervalEnabled: true,\n      refreshInterval: this.DEFAULT_INTERVAL_VALUE\n    });\n  }\n\n  private listenToRefreshIntervalChange(): void {\n    this.toggleIntervalForm\n      .get('refreshInterval')\n      .valueChanges.pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => this.resetCountdown());\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-events-interval-refresh--toggle-countdown\"\n    >\n      <input\n        type=\"checkbox\"\n        data-cy=\"c8y-events-interval-toggle\"\n        formControlName=\"intervalEnabled\"\n        (click)=\"trackUserClickOnIntervalToggle($event.target)\"\n      />\n      @if (isToggleEnabled) {\n        <c8y-countdown-interval\n          [countdownInterval]=\"toggleIntervalForm.value.refreshInterval ?? DEFAULT_INTERVAL_VALUE\"\n          (countdownEnded)=\"onCountdownEnded.emit()\"\n        />\n      } @else {\n        <i\n          c8yIcon=\"pause\"\n          data-cy=\"c8y-events-interval-refresh--pause\"\n        ></i>\n      }\n    </label>\n    @if (!isDisabled()) {\n      <div class=\"c8y-select-wrapper\">\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-events-interval-refresh--selector\"\n        >\n          @for (refreshInterval of DEFAULT_INTERVAL_VALUES; track refreshInterval) {\n            <option\n              [disabled]=\"isDisabled()\"\n              [ngValue]=\"refreshInterval\"\n              [attr.data-cy]=\"'c8y-interval-' + refreshInterval\"\n            >\n              {{ SECONDS_UNTIL_REFRESH | translate: { seconds: refreshInterval / 1000 } }}\n            </option>\n          }\n        </select>\n        <span></span>\n      </div>\n    }\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() || isLoading()\"\n        (click)=\"onCountdownEnded.emit()\"\n        data-cy=\"c8y-events-interval-refresh--btn\"\n      >\n        <i\n          [class.icon-spin]=\"isLoading()\"\n          c8yIcon=\"refresh\"\n        ></i>\n      </button>\n    </div>\n  </div>\n</form>\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  DestroyRef,\n  effect,\n  inject,\n  input,\n  output,\n  signal,\n  untracked,\n  viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n  ActivatedRoute,\n  NavigationEnd,\n  Router,\n  RouterLink,\n  RouterLinkActive\n} from '@angular/router';\nimport {\n  EventBinaryService,\n  IEvent,\n  IEventBinary,\n  IFetchResponse,\n  IManagedObjectBinary,\n  IResultList\n} from '@c8y/client';\nimport {\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  DatePipe,\n  ForOfDirective,\n  IconDirective,\n  ListGroupComponent,\n  ListItemBodyComponent,\n  ListItemComponent,\n  ListItemIconComponent,\n  ListItemTimelineComponent,\n  LoadMoreMode,\n  SplitViewAlertsComponent,\n  SplitViewHeaderActionsComponent,\n  SplitViewListComponent\n} from '@c8y/ngx-components';\nimport { FilePreviewModule } from '@c8y/ngx-components/file-preview';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { fromEvent, timer } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators';\nimport { EventIconPipe } from './event-icon.pipe';\nimport { EventIsImagePipe } from './event-is-image.pipe';\nimport { EventRouterLinkPipe } from './event-router-link.pipe';\nimport { EventNavigationOptions } from './events.model';\n\n@Component({\n  selector: 'c8y-events-list',\n  templateUrl: './events-list.component.html',\n  imports: [\n    C8yTranslateDirective,\n    C8yTranslatePipe,\n    DatePipe,\n    EventIconPipe,\n    EventIsImagePipe,\n    EventRouterLinkPipe,\n    ForOfDirective,\n    IconDirective,\n    ListGroupComponent,\n    ListItemBodyComponent,\n    ListItemComponent,\n    ListItemIconComponent,\n    ListItemTimelineComponent,\n    RouterLink,\n    RouterLinkActive,\n    FilePreviewModule,\n    SplitViewAlertsComponent,\n    SplitViewHeaderActionsComponent,\n    SplitViewListComponent\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EventsListComponent implements AfterViewInit {\n  readonly EMPTY_STATE_TITLE = gettext('No events to display.');\n  readonly LIST_TITLE = gettext('Events list');\n\n  /**\n   * The paginated result list of events to display.\n   */\n  events = input<IResultList<IEvent>>();\n\n  /**\n   * Whether the events are currently being fetched.\n   */\n  isLoading = input(false);\n\n  /**\n   * Controls the \"load more\" button behavior at the bottom of the list.\n   */\n  loadMoreMode = input<LoadMoreMode>('hidden');\n\n  /**\n   * Whether to show a file preview button for image events.\n   */\n  showPreview = input(false);\n\n  /**\n   * Defines options for how the events list should navigate when a user clicks on an event.\n   */\n  navigationOptions = input<EventNavigationOptions>({\n    allowNavigationToEventsView: true,\n    alwaysNavigateToAllEvents: false,\n    queryParamsHandling: 'merge'\n  });\n\n  /**\n   * Emits `true` when the list is scrolled past the threshold, `false` when scrolled back.\n   * Used to hide the countdown interval refresh control.\n   */\n  onScrollingStateChange = output<boolean>();\n\n  /**\n   * Emits `true` when a file preview is opened, `false` when closed.\n   */\n  onPreviewStateChange = output<boolean>();\n\n  /**\n   * Emits the event that was clicked by the user.\n   */\n  onSelectedEvent = output<IEvent>();\n\n  activeEvent = signal<IEvent | null>(null);\n  activeChildParamId = signal<string | null>(null);\n  pendingActiveCheck = signal(true);\n  showEmptyState = computed(\n    () => !!this.events() && !this.events()?.data?.length && !this.isLoading()\n  );\n  showFilterWarning = computed(\n    () =>\n      !this.pendingActiveCheck() &&\n      !!this.activeChildParamId() &&\n      this.activeEvent()?.id !== this.activeChildParamId()\n  );\n\n  svListComponent = viewChild<SplitViewListComponent>('scrollWrapper');\n\n  private isPreviewOpen = signal(false);\n\n  /** Scroll threshold in pixels after which the countdown interval is hidden. */\n  private readonly HIDE_INTERVAL_COUNTDOWN_SCROLL = 50;\n  private readonly activatedRoute = inject(ActivatedRoute);\n  private readonly bsModalService = inject(BsModalService);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly eventBinaryService = inject(EventBinaryService);\n  private readonly router = inject(Router);\n\n  constructor() {\n    this.setupActiveChildParamTracking();\n    this.setupPreviewModalCloseListener();\n\n    effect(() => {\n      this.events();\n      untracked(() => {\n        this.activeEvent.set(null);\n        this.pendingActiveCheck.set(true);\n        if (this.activeChildParamId()) {\n          // Wait for routerLinkActive to confirm the match via activeRouteChanged.\n          // Fallback clears pending state so warning can show if event is not in the list.\n          timer(500)\n            .pipe(takeUntilDestroyed(this.destroyRef))\n            .subscribe(() => this.pendingActiveCheck.set(false));\n        } else {\n          this.pendingActiveCheck.set(false);\n        }\n      });\n    });\n  }\n\n  ngAfterViewInit(): void {\n    this.setupScrollListener();\n  }\n\n  onEventClick(event: IEvent): void {\n    this.onSelectedEvent.emit(event);\n  }\n\n  activeRouteChanged(isActive: boolean, scrollAnchor: ListItemComponent, event: IEvent): void {\n    if (isActive) {\n      scrollAnchor.element.nativeElement.scrollIntoView({\n        behavior: 'smooth',\n        block: 'nearest'\n      });\n      this.activeEvent.set(event);\n      this.pendingActiveCheck.set(false);\n    }\n  }\n\n  onPreviewClick(mouseEvent: MouseEvent): void {\n    mouseEvent.stopPropagation();\n    this.isPreviewOpen.set(true);\n    this.onPreviewStateChange.emit(true);\n  }\n\n  toBinaryMo(event: IEvent): IManagedObjectBinary {\n    const binaryInfo: IEventBinary = event['c8y_IsBinary'];\n    return {\n      id: `${event.id}`,\n      name: binaryInfo?.name ?? event.text,\n      contentType: binaryInfo?.type ?? 'application/octet-stream',\n      type: binaryInfo?.type ?? 'application/octet-stream',\n      length: 0,\n      c8y_IsBinary: {}\n    };\n  }\n\n  getEventDownloadFn(event: IEvent): () => Promise<IFetchResponse> {\n    return () => this.eventBinaryService.download(event);\n  }\n\n  private setupPreviewModalCloseListener(): void {\n    this.bsModalService.onHidden\n      .pipe(\n        filter(() => this.isPreviewOpen()),\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe(() => {\n        this.isPreviewOpen.set(false);\n        this.onPreviewStateChange.emit(false);\n      });\n  }\n\n  private setupActiveChildParamTracking(): void {\n    this.router.events\n      .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        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe(id => this.activeChildParamId.set(id ?? null));\n  }\n\n  private setupScrollListener(): void {\n    const scrollElement = this.svListComponent()?.innerScrollDiv?.nativeElement;\n    if (scrollElement) {\n      fromEvent(scrollElement, 'scroll')\n        .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(300))\n        .subscribe((scrollEvent: Event) => {\n          if (!(scrollEvent.target instanceof HTMLElement)) {\n            return;\n          }\n          const isScrolledPastThreshold = this.shouldCountdownIntervalBeHidden(scrollEvent.target);\n          this.onScrollingStateChange.emit(isScrolledPastThreshold);\n        });\n    }\n  }\n\n  private shouldCountdownIntervalBeHidden(target: HTMLElement): boolean {\n    return target.scrollTop > this.HIDE_INTERVAL_COUNTDOWN_SCROLL;\n  }\n}\n","<c8y-sv-list\n  [emptyStateIcon]=\"'online1'\"\n  [title]=\"LIST_TITLE | translate\"\n  [emptyStateTitle]=\"EMPTY_STATE_TITLE | translate\"\n  #scrollWrapper\n  [loading]=\"isLoading()\"\n  [showEmptyState]=\"showEmptyState()\"\n  [docsUrl]=\"\n    '/docs/device-management-application/monitoring-and-controlling-devices/#to-view-events'\n  \"\n  data-cy=\"c8y-events-list\"\n>\n  <c8y-sv-header-actions>\n    <ng-content />\n  </c8y-sv-header-actions>\n\n  <c8y-sv-alerts>\n    @if (showFilterWarning()) {\n      <div\n        class=\"alert alert-warning m-b-0\"\n        role=\"alert\"\n        translate\n      >\n        The selected event is not currently in the list, change your filter.\n      </div>\n    }\n  </c8y-sv-alerts>\n\n  <c8y-list-group class=\"c8y-list--timeline d-block p-r-16 p-t-16\">\n    @let navOpts = navigationOptions();\n    <c8y-li-timeline\n      class=\"pointer c8y-list--timeline__item\"\n      role=\"button\"\n      data-cy=\"c8y-events-list--timeline-item\"\n      *c8yFor=\"let event of events()!; loadMore: loadMoreMode()\"\n      [routerLink]=\"\n        navOpts.allowNavigationToEventsView\n          ? (event | eventRouterLink: navOpts.alwaysNavigateToAllEvents)\n          : null\n      \"\n      [queryParamsHandling]=\"navOpts.queryParamsHandling\"\n      routerLinkActive=\"active\"\n      (isActiveChange)=\"activeRouteChanged($event, liScrollAnchor, event)\"\n      (click)=\"onEventClick(event)\"\n    >\n      <!-- Date column -->\n      <span data-cy=\"c8y-events-list--event-date\">\n        {{ event.time | c8yDate: 'mediumDate' }}\n        {{ event.time | c8yDate: 'mediumTime' }}\n      </span>\n\n      <c8y-li\n        style=\"scroll-margin-top: 56px\"\n        #liScrollAnchor\n      >\n        <c8y-li-icon class=\"a-s-start\">\n          <i [c8yIcon]=\"event | eventIcon\"></i>\n        </c8y-li-icon>\n\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              <!-- Event column (text) -->\n              <p\n                class=\"text-truncate-wrap p-b-4\"\n                data-cy=\"c8y-events-list--event-text\"\n              >\n                {{ event.text | translate }}\n              </p>\n\n              <!-- Source column -->\n              <p\n                class=\"small text-muted text-truncate\"\n                [title]=\"event.source?.name\"\n                data-cy=\"c8y-events-list--event-source\"\n              >\n                <i [c8yIcon]=\"'exchange'\"></i>\n                {{ event.source?.name }}\n              </p>\n            </div>\n            @if (showPreview() && (event | eventIsImage)) {\n              <c8y-file-preview\n                data-cy=\"c8y-events-list--image-preview\"\n                (click)=\"onPreviewClick($event)\"\n                [mo]=\"toBinaryMo(event)\"\n                [downloadFn]=\"getEventDownloadFn(event)\"\n              >\n                <button\n                  class=\"btn btn-default btn-icon btn-xs\"\n                  [title]=\"'Preview' | translate\"\n                  type=\"button\"\n                  customButton\n                  data-cy=\"c8y-events-list--preview-btn\"\n                >\n                  <i c8yIcon=\"search\"></i>\n                </button>\n              </c8y-file-preview>\n            }\n          </div>\n        </c8y-li-body>\n      </c8y-li>\n    </c8y-li-timeline>\n  </c8y-list-group>\n</c8y-sv-list>\n","import { CdkTrapFocus } from '@angular/cdk/a11y';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  QueryList,\n  ViewChildren,\n  computed,\n  effect,\n  inject,\n  input,\n  OnInit,\n  output,\n  signal,\n  untracked\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IEvent, IResultList } from '@c8y/client';\nimport {\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  ColorService,\n  EmptyStateComponent,\n  IconDirective,\n  ListGroupComponent,\n  ListItemComponent\n} from '@c8y/ngx-components';\nimport { AlarmEventSelectorService, EventDetails } from '@c8y/ngx-components/alarm-event-selector';\nimport {\n  BsDropdownDirective,\n  BsDropdownMenuDirective,\n  BsDropdownToggleDirective\n} from 'ngx-bootstrap/dropdown';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { map } from 'rxjs/operators';\n\n@Component({\n  selector: 'c8y-events-type-filter',\n  templateUrl: './events-type-filter.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    BsDropdownDirective,\n    BsDropdownToggleDirective,\n    BsDropdownMenuDirective,\n    CdkTrapFocus,\n    IconDirective,\n    ListGroupComponent,\n    ListItemComponent,\n    FormsModule,\n    TooltipDirective,\n    EmptyStateComponent,\n    C8yTranslateDirective,\n    C8yTranslatePipe\n  ]\n})\nexport class EventsTypeFilterComponent implements OnInit {\n  @ViewChildren('optionItem', { read: ElementRef }) optionItems!: QueryList<ElementRef>;\n\n  /** The latest page of events used to derive available filter types. */\n  events = input<IResultList<IEvent>>();\n\n  /** Emits the selected {@link EventDetails} when the active filter changes, or `null` when cleared. */\n  onFilterChanged = output<EventDetails | null>();\n\n  possibleFilters = signal<EventDetails[]>([]);\n  activeFilter = signal<EventDetails | null>(null);\n  customEventTypeInput = signal('');\n  isCustomEventTypeInputInvalid = computed(() => !this.customEventTypeInput().trim());\n\n  readonly queryParamName = 'eventTypeFilter';\n  /**\n   * localStorage key storing user-added custom event types.\n   * Schema: `EventDetails[]` serialised as JSON (only entries where `__target === null`).\n   */\n  readonly STORAGE_ACCESS_KEY = 'customEventTypes';\n\n  private activatedRoute = inject(ActivatedRoute);\n  private alarmEventSelectorService = inject(AlarmEventSelectorService);\n  private colorService = inject(ColorService);\n  private destroyRef = inject(DestroyRef);\n  private router = inject(Router);\n  private currentQueryParam = '';\n\n  constructor() {\n    effect(() => {\n      const eventsResult = this.events();\n      if (eventsResult) {\n        untracked(() => {\n          if (!this.activeFilter()) {\n            this.setPossibleFilters()\n              .then(() => this.applyFilterChange())\n              // eslint-disable-next-line no-console\n              .catch(err => console.error('[EventsTypeFilter] Failed to load filters', err));\n          }\n        });\n      }\n    });\n  }\n\n  ngOnInit(): void {\n    this.setQueryParameterObservable();\n  }\n\n  setQueryParameterObservable(): void {\n    this.activatedRoute.queryParams\n      .pipe(\n        map(params => {\n          const events: EventDetails[] = this.possibleFilters();\n          const possibleFilters = this.setActiveEventFiltersFromQueryParameter(\n            events,\n            params[this.queryParamName]\n          );\n          return possibleFilters;\n        }),\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe((possibleFilters: EventDetails[]) => {\n        this.possibleFilters.set(possibleFilters);\n        this.applyFilterChange();\n      });\n  }\n\n  selectEventType(eventType: EventDetails): void {\n    this.possibleFilters.update(filters =>\n      filters.map(f => ({ ...f, __active: f.filters.type === eventType.filters.type }))\n    );\n  }\n\n  /** Selects an event type, applies the filter, and closes the dropdown in one action. */\n  selectAndClose(eventType: EventDetails, dropdown: BsDropdownDirective): void {\n    this.selectEventType(eventType);\n    this.applyFilterChange();\n    dropdown.hide();\n  }\n\n  deselect(): void {\n    this.possibleFilters.update(filters => filters.map(f => ({ ...f, __active: false })));\n    this.applyFilterChange();\n  }\n\n  applyFilterChange(): void {\n    const active = this.possibleFilters().find((eventFilter: EventDetails) => eventFilter.__active);\n    const newQueryParam = active?.filters.type ?? '';\n    const hasChanged = newQueryParam !== this.currentQueryParam;\n    if (hasChanged) {\n      this.activeFilter.set(active ?? null);\n      this.onFilterChanged.emit(this.activeFilter());\n      this.router.navigate([], {\n        queryParams: {\n          [this.queryParamName]: newQueryParam || null\n        },\n        queryParamsHandling: 'merge'\n      });\n      this.currentQueryParam = newQueryParam;\n    }\n  }\n\n  restoreActiveFilter(): void {\n    const activeType = this.activeFilter()?.filters.type;\n    this.possibleFilters.update(filters =>\n      filters.map(f => ({ ...f, __active: f.filters.type === activeType }))\n    );\n  }\n\n  removeCustomEvent(eventDetails: EventDetails): void {\n    const wasActive = eventDetails.filters.type === this.activeFilter()?.filters.type;\n    this.possibleFilters.update(filters =>\n      filters.filter(f => f.filters.type !== eventDetails.filters.type)\n    );\n    this.storeCustomEventTypes();\n    if (wasActive) {\n      this.applyFilterChange();\n    }\n  }\n\n  navigateOption(event: KeyboardEvent, step: 1 | -1): void {\n    event.preventDefault();\n    const items = this.optionItems.toArray();\n    const focused = document.activeElement;\n    const currentIndex = items.findIndex(item => item.nativeElement === focused);\n    const nextIndex = (currentIndex + step + items.length) % items.length;\n    items[nextIndex]?.nativeElement.focus();\n  }\n\n  confirmWithEnter(event: KeyboardEvent): void {\n    if (event.key === 'Enter') {\n      this.addCustomEventType();\n    }\n  }\n\n  async addCustomEventType(): Promise<void> {\n    const inputValue = this.customEventTypeInput().trim();\n    if (!inputValue) {\n      return;\n    }\n    let color: string;\n    try {\n      color = await this.colorService.generateColor(inputValue);\n    } catch {\n      color = '#000000';\n    }\n    const newFilter: EventDetails = {\n      label: inputValue,\n      color,\n      filters: { type: inputValue },\n      timelineType: 'EVENT',\n      __active: true,\n      __target: null\n    };\n    this.possibleFilters.update(filters => [\n      newFilter,\n      ...filters.map(f => ({ ...f, __active: false }))\n    ]);\n    this.customEventTypeInput.set('');\n    this.storeCustomEventTypes();\n    this.applyFilterChange();\n  }\n\n  private storeCustomEventTypes(): void {\n    try {\n      const customTypes = this.possibleFilters().filter((filter: EventDetails) => !filter.__target);\n      window.localStorage.setItem(this.STORAGE_ACCESS_KEY, JSON.stringify(customTypes));\n    } catch {\n      // localStorage may be unavailable or quota exceeded — skip persistence silently\n    }\n  }\n\n  private getCustomEventTypeFromStorage(): EventDetails[] {\n    try {\n      const types = window.localStorage.getItem(this.STORAGE_ACCESS_KEY);\n      return types ? JSON.parse(types) : [];\n    } catch {\n      return [];\n    }\n  }\n\n  private async setPossibleFilters(): Promise<void> {\n    const queryParameters = this.activatedRoute.snapshot.queryParamMap.get(this.queryParamName);\n    const eventsData = this.events()?.data ?? [];\n    const eventTypesFromCurrentlyShownEvents =\n      await this.alarmEventSelectorService.getUniqueEventsOnly(eventsData);\n    const customEventTypesFromLocalStorage = this.getCustomEventTypeFromStorage();\n    const selectableEventTypes = this.setActiveEventFiltersFromQueryParameter(\n      [...customEventTypesFromLocalStorage, ...eventTypesFromCurrentlyShownEvents],\n      queryParameters\n    );\n    this.possibleFilters.set(selectableEventTypes);\n  }\n\n  private setActiveEventFiltersFromQueryParameter(\n    eventFilters: EventDetails[],\n    filterTypeQuery = ''\n  ): EventDetails[] {\n    const selectedType = filterTypeQuery ?? '';\n    return eventFilters.map((event: EventDetails) => ({\n      ...event,\n      __active: event.filters.type === selectedType\n    }));\n  }\n}\n","<div class=\"d-flex a-i-center\">\n  <div\n    class=\"dropdown\"\n    title=\"{{ 'Filter by event types' | translate }}\"\n    dropdown\n    [insideClick]=\"true\"\n    #filtersDropdown=\"bs-dropdown\"\n    [cdkTrapFocus]=\"filtersDropdown.isOpen\"\n    (onHidden)=\"restoreActiveFilter()\"\n  >\n    <div class=\"input-group fit-w\">\n      @let active = activeFilter();\n      <div\n        class=\"form-control d-flex a-i-center inner-scroll\"\n        role=\"status\"\n      >\n        @if (active) {\n          <span\n            class=\"text-truncate\"\n            style=\"max-width: 150px !important\"\n            [title]=\"active.filters.type\"\n          >\n            {{ active.filters.type }}\n          </span>\n        } @else {\n          <span class=\"text-nowrap\">\n            {{ 'All event types' | translate }}\n          </span>\n        }\n      </div>\n      @if (active) {\n        <div class=\"input-group-btn text-center\">\n          <button\n            class=\"btn-default btn\"\n            [title]=\"'Clear filter' | translate\"\n            [attr.aria-label]=\"'Clear filter' | translate\"\n            (click)=\"deselect()\"\n          >\n            <i\n              c8yIcon=\"times\"\n              aria-hidden=\"true\"\n            ></i>\n          </button>\n        </div>\n      }\n      <div class=\"input-group-btn input-group-btn--last\">\n        <button\n          class=\"btn-default m-l-0 btn btn--caret\"\n          [attr.aria-label]=\"'Event types' | translate\"\n          [attr.aria-haspopup]=\"'listbox'\"\n          [attr.aria-expanded]=\"filtersDropdown.isOpen\"\n          [attr.aria-controls]=\"'event-types-listbox'\"\n          data-cy=\"c8y-event-type-filter\"\n          dropdownToggle\n        >\n          <i\n            class=\"caret\"\n            aria-hidden=\"true\"\n          ></i>\n        </button>\n      </div>\n    </div>\n    <div\n      class=\"dropdown-menu dropdown-menu-action-bar\"\n      *dropdownMenu\n    >\n      <div\n        class=\"p-16 bg-level-2\"\n        style=\"min-width: 250px\"\n      >\n        <div>\n          <p class=\"icon-flex\">\n            <i\n              class=\"text-info m-r-4\"\n              [c8yIcon]=\"'info-circle'\"\n              aria-hidden=\"true\"\n            ></i>\n            <strong translate>The list may be incomplete</strong>\n          </p>\n          <p class=\"text-12\">\n            <span translate>\n              Recent events are displayed below, but older ones may not be shown.\n            </span>\n            <span translate>Optionally, you can add a custom event type.</span>\n          </p>\n        </div>\n      </div>\n      <div class=\"input-group p-16 separator-bottom\">\n        <input\n          class=\"form-control\"\n          [attr.aria-label]=\"'Custom event type' | translate\"\n          type=\"text\"\n          [placeholder]=\"'Custom event type' | translate\"\n          [ngModel]=\"customEventTypeInput()\"\n          (ngModelChange)=\"customEventTypeInput.set($event)\"\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 event' | translate\"\n            [tooltip]=\"'Add' | translate\"\n            placement=\"top\"\n            [delay]=\"500\"\n            [disabled]=\"isCustomEventTypeInputInvalid()\"\n            (click)=\"addCustomEventType()\"\n          >\n            <i\n              c8yIcon=\"plus-circle\"\n              aria-hidden=\"true\"\n            ></i>\n          </button>\n        </div>\n      </div>\n      <c8y-list-group\n        [attr.aria-label]=\"'Event types' | translate\"\n        id=\"event-types-listbox\"\n        role=\"listbox\"\n      >\n        @for (eventType of possibleFilters(); track eventType.filters.type) {\n          <c8y-li\n            class=\"pointer p-0\"\n            tabindex=\"0\"\n            [attr.aria-selected]=\"eventType.__active\"\n            role=\"option\"\n            [active]=\"eventType.__active\"\n            #optionItem\n            (keydown.arrowdown)=\"navigateOption($event, 1)\"\n            (keydown.arrowup)=\"navigateOption($event, -1)\"\n            (keydown.enter)=\"selectAndClose(eventType, filtersDropdown)\"\n            (click)=\"selectAndClose(eventType, filtersDropdown)\"\n          >\n            <div class=\"d-flex gap-8 a-i-center flex-grow p-t-4 p-b-4\">\n              <span\n                class=\"circle-icon-wrapper\"\n                [style.background-color]=\"eventType.color\"\n              >\n                <i\n                  class=\"stroked-icon\"\n                  [c8yIcon]=\"'online1'\"\n                  aria-hidden=\"true\"\n                ></i>\n              </span>\n              <span\n                class=\"text-truncate text-12 flex-grow\"\n                [title]=\"eventType.label\"\n                [attr.aria-label]=\"eventType.label\"\n              >\n                {{ eventType.label }}\n              </span>\n              @if (eventType.__target === null) {\n                <button\n                  class=\"btn-dot btn-dot--danger\"\n                  [attr.aria-label]=\"'Remove' | translate\"\n                  [tooltip]=\"'Remove' | translate\"\n                  placement=\"top\"\n                  [delay]=\"500\"\n                  (click)=\"removeCustomEvent(eventType); $event.stopPropagation()\"\n                >\n                  <i\n                    c8yIcon=\"minus-circle\"\n                    aria-hidden=\"true\"\n                  ></i>\n                </button>\n              }\n            </div>\n          </c8y-li>\n        }\n        @if (possibleFilters().length === 0) {\n          <c8y-li aria-live=\"polite\">\n            <c8y-ui-empty-state\n              class=\"p-t-8\"\n              icon=\"online1\"\n              [title]=\"'No events found' | translate\"\n              [subtitle]=\"\n                'There are no events to filter. You can still add a custom event type.' | translate\n              \"\n              [horizontal]=\"true\"\n            />\n          </c8y-li>\n        }\n      </c8y-list-group>\n    </div>\n  </div>\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  inject,\n  OnInit,\n  signal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, RouterOutlet } from '@angular/router';\nimport { IEvent, IResultList } from '@c8y/client';\nimport {\n  ActionBarItemComponent,\n  AlertService,\n  C8yTranslatePipe,\n  ContextRouteService,\n  DateTimeContext,\n  HelpComponent,\n  SplitViewComponent,\n  SplitViewDetailsComponent,\n  TitleComponent,\n  ViewContext\n} from '@c8y/ngx-components';\nimport { EventDetails } from '@c8y/ngx-components/alarm-event-selector';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlarmFilterInterval } from '@c8y/ngx-components/interval-picker';\nimport { debounceTime } from 'rxjs/operators';\nimport { EventsDateFilterComponent } from './events-date-filter.component';\nimport { EventsIntervalRefreshComponent } from './events-interval-refresh.component';\nimport { EventsListComponent } from './events-list.component';\nimport { EventsTypeFilterComponent } from './events-type-filter.component';\nimport { EventsViewService } from './events-view.service';\nimport { EventListFormFilters } from './events.model';\n\n@Component({\n  selector: 'c8y-events',\n  templateUrl: './events.component.html',\n  imports: [\n    C8yTranslatePipe,\n    TitleComponent,\n    HelpComponent,\n    ActionBarItemComponent,\n    SplitViewComponent,\n    SplitViewDetailsComponent,\n    EventsListComponent,\n    EventsDateFilterComponent,\n    EventsIntervalRefreshComponent,\n    EventsTypeFilterComponent,\n    RouterOutlet\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EventsComponent implements OnInit {\n  readonly TITLE = gettext('Events');\n\n  events = signal<IResultList<IEvent> | null>(null);\n  isLoading = signal(false);\n  shouldShowIntervalToggle = signal(true);\n\n  contextSourceId: string | number | null = null;\n  isListScrolled = signal(false);\n  typeFilter: EventDetails | null = null;\n\n  private dateFilter: DateTimeContext | null = null;\n  private dateInterval: AlarmFilterInterval['id'] | null = null;\n\n  private activatedRoute = inject(ActivatedRoute);\n  private alertService = inject(AlertService);\n  private contextRouteService = inject(ContextRouteService);\n  private destroyRef = inject(DestroyRef);\n  private eventsViewService = inject(EventsViewService);\n\n  constructor() {\n    this.initializeContextSourceId();\n  }\n\n  ngOnInit(): void {\n    this.setupEventListReload();\n\n    // Pause interval if already in detail view\n    const isInDetailView = !!this.activatedRoute.children[0]?.snapshot.params['id'];\n    if (isInDetailView) {\n      this.changeInterval(false);\n    }\n\n    // Initial load\n    this.eventsViewService.updateEventsList();\n  }\n\n  refresh(): void {\n    this.eventsViewService.updateEventsList();\n  }\n\n  changeInterval(value = true): void {\n    this.shouldShowIntervalToggle.set(value);\n  }\n\n  onScrollingStateChange(isScrolling: boolean): void {\n    this.isListScrolled.set(isScrolling);\n    this.changeInterval(!isScrolling);\n  }\n\n  onPreviewStateChange(isOpen: boolean): void {\n    if (isOpen || !this.isListScrolled()) {\n      this.changeInterval(!isOpen);\n    }\n  }\n\n  onEventSelected(): void {\n    this.changeInterval(false);\n  }\n\n  applyTypeFilter(filter: EventDetails | null): void {\n    this.typeFilter = filter;\n    this.refresh();\n  }\n\n  applyDateFilter(filter: EventListFormFilters): void {\n    this.dateInterval = filter.interval ?? null;\n    this.dateFilter = filter.selectedDates ?? null;\n    this.refresh();\n  }\n\n  private setupEventListReload(): void {\n    this.eventsViewService.reloadEventsList$\n      .pipe(debounceTime(100), takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => this.loadEvents());\n  }\n\n  private async loadEvents(): Promise<void> {\n    try {\n      this.isLoading.set(true);\n\n      const filter = this.eventsViewService.buildEventsFilter({\n        source: this.contextSourceId,\n        type: this.typeFilter?.filters.type ?? null,\n        dateRange: this.resolveCurrentDateRange()\n      });\n\n      const events: IResultList<IEvent> = await this.eventsViewService.retrieveEvents(filter);\n      this.events.set(events);\n    } catch (error: unknown) {\n      this.alertService.addServerFailure(error);\n    } finally {\n      this.isLoading.set(false);\n    }\n  }\n\n  private resolveCurrentDateRange(): DateTimeContext | null {\n    if (!this.dateInterval || this.dateInterval === 'none') {\n      return null;\n    }\n    if (this.dateInterval === 'custom') {\n      return this.dateFilter;\n    }\n    return this.eventsViewService.getDateTimeContextByInterval(this.dateInterval);\n  }\n\n  private initializeContextSourceId(): void {\n    const routeContext = this.contextRouteService.getContextData(this.activatedRoute);\n    if (!routeContext) {\n      return;\n    }\n\n    const { context, contextData } = routeContext;\n    if ([ViewContext.Device, ViewContext.Group].includes(context)) {\n      this.contextSourceId = contextData?.id;\n    }\n  }\n}\n","<c8y-title>{{ TITLE | translate }}</c8y-title>\n<c8y-help\n  src=\"/docs/device-management-application/monitoring-and-controlling-devices/#troubleshooting-devices\"\n></c8y-help>\n\n<c8y-action-bar-item\n  [placement]=\"'left'\"\n  itemClass=\"navbar-form\"\n>\n  <c8y-events-type-filter\n    [events]=\"events()\"\n    (onFilterChanged)=\"applyTypeFilter($event)\"\n  />\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n  [placement]=\"'left'\"\n  itemClass=\"navbar-form\"\n>\n  <c8y-events-date-filter (dateFilterChange)=\"applyDateFilter($event)\" />\n</c8y-action-bar-item>\n\n<c8y-sv [resizableConfig]=\"{ trackId: 'events-split-view', collapsible: false }\">\n  <c8y-events-list\n    [events]=\"events()\"\n    [isLoading]=\"isLoading()\"\n    (onScrollingStateChange)=\"onScrollingStateChange($event)\"\n    (onPreviewStateChange)=\"onPreviewStateChange($event)\"\n    (onSelectedEvent)=\"onEventSelected()\"\n  >\n    <c8y-events-interval-refresh\n      [isLoading]=\"isLoading()\"\n      [isIntervalToggleEnabled]=\"shouldShowIntervalToggle()\"\n      (onCountdownEnded)=\"refresh()\"\n    />\n  </c8y-events-list>\n\n  <c8y-sv-details\n    emptyStateIcon=\"online1\"\n    [emptyStateTitle]=\"'No event selected' | translate\"\n    [emptyStateSubtitle]=\"'Select an event from the list to view its details.' | translate\"\n  >\n    <router-outlet />\n  </c8y-sv-details>\n</c8y-sv>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["STANDARD_KEYS","RESERVED_KEYS","i1"],"mappings":"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"}