{"version":3,"file":"c8y-ngx-components-messaging-management.mjs","sources":["../../messaging-management/utils/namespace-props.ts","../../messaging-management/api/services/messaging-namespaces.service.ts","../../messaging-management/constants.ts","../../messaging-management/messaging-management.guard.ts","../../messaging-management/navigator/messaging-navigator-factory.ts","../../messaging-management/utils/backlog-quota-limit.pipe.ts","../../messaging-management/messaging/shared/usage/usage.component.ts","../../messaging-management/messaging/shared/usage/usage.component.html","../../messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.ts","../../messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.html","../../messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.ts","../../messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.html","../../messaging-management/messaging/namespace-list/namespace-list.component.ts","../../messaging-management/messaging/namespace-list/namespace-list.component.html","../../messaging-management/utils/time-to-live.pipe.ts","../../messaging-management/api/services/messaging-topics.service.ts","../../messaging-management/messaging/topic/topics-data-grid.service.ts","../../messaging-management/messaging/topic/topic-list-view.component.ts","../../messaging-management/messaging/topic/topic-list-view.component.html","../../messaging-management/api/model/topicType.ts","../../messaging-management/api/services/messaging-subscribers.service.ts","../../messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.ts","../../messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.ts","../../messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.html","../../messaging-management/navigator/topic-details-tab.factory.ts","../../messaging-management/messaging-management-preview.factory.ts","../../messaging-management/messaging-management.module.ts","../../messaging-management/c8y-ngx-components-messaging-management.ts"],"sourcesContent":["import { gettext } from '@c8y/ngx-components/gettext';\n\ntype NamespaceProps = {\n  icon: string;\n  label: string;\n};\n\n/**\n * Currently known namespaces and their properties.\n */\nexport const NAMESPACE_PROPS: Record<string, NamespaceProps> = {\n  mqtt: {\n    icon: 'c8y-device-protocols',\n    label: gettext('MQTT Service')\n  },\n  'data-broker-fwd': {\n    icon: 'c8y-data-broker',\n    label: gettext('Data Broker')\n  },\n  relnotif: {\n    icon: 'c8y-notification',\n    label: gettext('Notifications 2.0')\n  },\n  'streaming-analytics': {\n    icon: 'c8y-streaming-analytics',\n    label: gettext('Streaming Analytics')\n  }\n};\n","import { inject, Injectable } from '@angular/core';\nimport { MessagingNamespaceList } from '../model/namespaceList';\nimport { MessagingNamespacePolicies } from '../model/namespacePolicies';\nimport { MessagingNamespace } from '../model/namespace';\nimport { FetchClient, Service } from '@c8y/client';\nimport { MessagingNamespaceDetails } from '../model/namespaceDetails';\nimport { AlertService } from '@c8y/ngx-components';\n\n@Injectable({ providedIn: 'root' })\nexport class MessagingNamespacesService extends Service<any> {\n  protected baseUrl = '/service/messaging-management';\n  protected listUrl = 'tenants';\n\n  private alertService = inject(AlertService);\n\n  constructor(client: FetchClient) {\n    super(client);\n  }\n\n  /**\n   * Get namespace list for a tenant\n   *\n   * @param tenant Tenant id\n   * @return Namespaces list\n   */\n  async getNamespaces(tenant: string): Promise<MessagingNamespaceList> {\n    const namespacesUrl = `/${this.listUrl}/${tenant}/namespaces`;\n    return this.fetch(namespacesUrl).then(res => res.json());\n  }\n\n  /**\n   * Get namespace.\n   *\n   * @param tenant Tenant ID.\n   * @param namespace Name of namespace.\n   * @return Namespace.\n   */\n  async getNamespace(tenant: string, namespace: string): Promise<MessagingNamespace> {\n    const namespaceUrl = `/${this.listUrl}/${tenant}/namespaces/${namespace}`;\n    return this.fetch(namespaceUrl).then(res => res.json());\n  }\n\n  /**\n   * Get namespace policies\n   *\n   * @param tenant Tenant id\n   * @param namespace Name of namespace\n   * @return Namespaces policies\n   */\n  async getNamespacePolicies(\n    tenant: string,\n    namespace: string\n  ): Promise<MessagingNamespacePolicies> {\n    const policiesUrl = `/${this.listUrl}/${tenant}/namespaces/${namespace}/policies`;\n    return this.fetch(policiesUrl).then(res => res.json());\n  }\n\n  /**\n   * Get single namespace details\n   * @param tenant Tenant ID\n   * @param namespaceName Namespace name\n   * @return Namespace with details\n   */\n  async getNamespaceDetails(\n    tenant: string,\n    namespaceName: string\n  ): Promise<MessagingNamespaceDetails> {\n    const namespace = await this.getNamespace(tenant, namespaceName);\n    const policies = await this.getNamespacePolicies(tenant, namespaceName);\n    return {\n      id: namespaceName,\n      namespace,\n      policies\n    };\n  }\n\n  /**\n   * Get namespaces with details\n   *\n   * @param tenant Tenant ID\n   * @return Namespaces with details\n   */\n  async getNamespacesDetails(tenant: string): Promise<MessagingNamespaceDetails[]> {\n    try {\n      const { namespaces } = await this.getNamespaces(tenant);\n      return Promise.all(\n        namespaces.map(async namespace => this.getNamespaceDetails(tenant, namespace.name))\n      );\n    } catch (error) {\n      this.alertService.addServerFailure(error);\n      return [];\n    }\n  }\n}\n","export const basePath = 'monitoring/messaging-service';\nexport const MESSAGING_MANAGEMENT_FEATURE_KEY = 'messaging-management.api';\nexport const MESSAGING_MANAGEMENT_MICROSERVICE_NAME = 'messaging-management';\n","import { inject, Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { Permissions } from '@c8y/ngx-components';\nimport { ApplicationService, FeatureService, UserService } from '@c8y/client';\nimport {\n  MESSAGING_MANAGEMENT_FEATURE_KEY,\n  MESSAGING_MANAGEMENT_MICROSERVICE_NAME\n} from './constants';\n\n@Injectable({ providedIn: 'root' })\nexport class MessagingManagementGuard implements CanActivate {\n  private userService = inject(UserService);\n  private featureService = inject(FeatureService);\n  private applicationService = inject(ApplicationService);\n\n  private cachedResult: boolean | null = null;\n\n  async canActivate(): Promise<boolean> {\n    if (this.cachedResult !== null) {\n      return this.cachedResult;\n    }\n\n    const currentUser = (await this.userService.current()).data;\n    const hasRequiredRoles = this.userService.hasAnyRole(currentUser, [\n      Permissions.ROLE_TENANT_STATISTICS_READ,\n      Permissions.ROLE_TENANT_MANAGEMENT_ADMIN\n    ]);\n\n    const featureEnabled = await this.featureService\n      .detail(MESSAGING_MANAGEMENT_FEATURE_KEY)\n      .then(({ data }) => data.active)\n      .catch(() => false);\n\n    const microserviceSubscribed = await this.applicationService\n      .isAvailable(MESSAGING_MANAGEMENT_MICROSERVICE_NAME)\n      .then(({ data: subscribed }) => subscribed)\n      .catch(() => false);\n\n    this.cachedResult = hasRequiredRoles && featureEnabled && microserviceSubscribed;\n\n    return this.cachedResult;\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  AppStateService,\n  ExtensionFactory,\n  NavigatorNode,\n  NavigatorService\n} from '@c8y/ngx-components';\nimport { NAMESPACE_PROPS } from '../utils/namespace-props';\nimport { MessagingNamespacesService } from '../api/services/messaging-namespaces.service';\nimport { catchError, filter, map, shareReplay, switchMap, take } from 'rxjs/operators';\nimport { from, Observable } from 'rxjs';\nimport { MessagingManagementGuard } from '../messaging-management.guard';\n\nconst baseNode = new NavigatorNode({\n  label: gettext('Messaging service'),\n  icon: 'arrows-dotted-left-right',\n  path: 'monitoring/messaging-service',\n  priority: 100,\n  parent: {\n    label: gettext('Monitoring'),\n    icon: 'monitoring'\n  }\n});\n\n@Injectable({ providedIn: 'root' })\nexport class MessagingNavigatorNodeFactory implements ExtensionFactory<NavigatorNode> {\n  appState = inject(AppStateService);\n  navigatorService = inject(NavigatorService);\n  namespacesService = inject(MessagingNamespacesService);\n  guard = inject(MessagingManagementGuard);\n\n  currentTenantId = this.appState.currentTenant.pipe(\n    filter(currentTenant => !!currentTenant),\n    map(currentTenant => currentTenant.name),\n    take(1)\n  );\n\n  navigatorNode$: Observable<NavigatorNode | NavigatorNode[]>;\n\n  constructor() {\n    this.navigatorNode$ = from(this.guard.canActivate()).pipe(\n      filter(allowed => allowed),\n      switchMap(() => this.currentTenantId),\n      switchMap(currentTenantId => this.namespacesService.getNamespaces(currentTenantId)),\n      map(({ namespaces }) => {\n        if (!namespaces?.length) {\n          return [];\n        }\n        namespaces.forEach(namespace => {\n          const label = NAMESPACE_PROPS[namespace.name]?.label || namespace.name;\n          const childNode = new NavigatorNode({\n            label,\n            path: `monitoring/messaging-service/namespace/${namespace.name}`,\n            icon: NAMESPACE_PROPS[namespace.name]?.icon,\n            routerLinkExact: false\n          });\n          baseNode.add(childNode);\n        });\n        return baseNode;\n      }),\n      catchError(() => {\n        return [];\n      }),\n      shareReplay(1)\n    );\n  }\n\n  get(): Observable<NavigatorNode | NavigatorNode[]> {\n    return this.navigatorNode$;\n  }\n}\n","import { formatNumber } from '@angular/common';\nimport { inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TranslateService } from '@ngx-translate/core';\n\n/**\n * In case of limits in Messaging management, value of '-1' means that there is no limit.\n */\n@Pipe({ name: 'backlogQuotaLimit', standalone: true })\nexport class BacklogQuotaLimitPipe implements PipeTransform {\n  private translateService = inject(TranslateService);\n  private locale = inject(LOCALE_ID);\n\n  transform(value: number): number | string {\n    if (value == null || isNaN(value)) {\n      return '-';\n    } else if (value === -1) {\n      return this.translateService.instant(gettext('Unlimited` backlog quota`'));\n    } else {\n      return formatNumber(value, this.locale);\n    }\n  }\n}\n","import { Component, computed, input } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';\nimport { NgClass, NgIf, PercentPipe } from '@angular/common';\n\n/**\n * Usage component displays usage information in a form of e.g. \"51% used\".\n * It can be used in two ways:\n * 1. By providing `count` and `limit` inputs, it will calculate the usage percentage.\n * 2. By providing `percentage` input, it will use the provided percentage value.\n * Note: `percentage` input takes precedence over `count` and `limit` inputs.\n */\n@Component({\n  selector: 'app-usage',\n  standalone: true,\n  imports: [IconDirective, NgIf, NgClass, IconDirective, C8yTranslatePipe, PercentPipe],\n  templateUrl: './usage.component.html',\n  host: { class: 'd-contents' }\n})\nexport class UsageComponent {\n  count = input<number | null>(null);\n  limit = input<number | null>(null);\n  /**\n   * Percentage of usage. Value range is from 0 to 100 (or more).\n   * For example, if 10% is used, this value should be provided as 10 (not 0.1).\n   */\n  percentage = input<number | null>(null);\n\n  /**\n   * Usage as a fraction (e.g. if 50% is used, usage value will be 0.5)\n   */\n  usage = computed(() =>\n    this.percentage() != null ? this.percentage() / 100 : this.getUsage(this.count(), this.limit())\n  );\n  status = computed(() => this.getStatus(this.usage()));\n  usageToDisplay = gettext('{{ percentageOfQuota }} used');\n\n  statusMap = {\n    danger: ['tag--danger'],\n    warning: ['tag--warning'],\n    success: ['tag--success']\n  };\n\n  /**\n   * Get usage as fraction of count and limit.\n   * E.g. if count is 5 and limit is 10, returned usage will be 0.5\n   * @param count Usage count\n   * @param limit Usage limit\n   * @returns Count divided by limit or null if count or limit is null or limit is -1 (indicates no limit)\n   */\n  private getUsage(count: number, limit: number): number | null {\n    if (count == null || limit == null || limit === -1) {\n      return null;\n    }\n    return count / limit;\n  }\n\n  private getStatus(usage: number | null) {\n    if (usage == null) {\n      return null;\n    }\n    const percentage = usage * 100;\n\n    if (percentage >= 80) {\n      return 'danger';\n    } else if (percentage >= 50) {\n      return 'warning';\n    } else {\n      return 'success';\n    }\n  }\n}\n","<div\n  class=\"tag no-pointer\"\n  [ngClass]=\"statusMap[status()]\"\n  *ngIf=\"usage() !== null\"\n>\n  <i\n    class=\"text-danger m-r-4 text-12\"\n    c8yIcon=\"exclamation-circle\"\n    *ngIf=\"status() === 'danger'\"\n  ></i>\n  <span>\n    {{ usageToDisplay | translate: { percentageOfQuota: (usage() | percent: '1.0-2') } }}\n  </span>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { C8yTranslateModule, IconDirective } from '@c8y/ngx-components';\nimport { CommonModule } from '@angular/common';\nimport { BacklogQuotaLimitPipe } from '../../../../utils/backlog-quota-limit.pipe';\nimport { UsageComponent } from '../../../shared/usage/usage.component';\n\nconst DataType = {\n  publishers: 'publishers',\n  subscribers: 'subscribers',\n  topics: 'topics'\n} as const;\n\n@Component({\n  selector: 'app-namespace-item-card',\n  standalone: true,\n  imports: [IconDirective, C8yTranslateModule, CommonModule, BacklogQuotaLimitPipe, UsageComponent],\n  templateUrl: './namespace-item-card.component.html',\n  host: { class: 'card m-b-0 fit-w' }\n})\nexport class NamespaceItemCardComponent {\n  readonly DATA_TYPE = DataType;\n  readonly ITEM_DETAILS: Record<keyof typeof DataType, { icon: string; title: string }> = {\n    publishers: { icon: 'output', title: gettext('Publishers') },\n    subscribers: { icon: 'input', title: gettext('Subscribers') },\n    topics: { icon: 'day-view', title: gettext('Topics') }\n  } as const;\n  topicsLimitLabel = gettext('Limit: {{ backlogQuotaLimit }}');\n\n  /**\n   * The label of the service (already translated).\n   */\n  @Input() serviceLabel = '';\n  @Input() limit?: number;\n  @Input() dataType: keyof typeof DataType;\n  @Input() value: number | undefined;\n}\n","<div class=\"card-block text-default visible-xs text-center p-b-0\">\n  <span class=\"text-12 text-uppercase text-muted\">\n    {{ serviceLabel | translate }}\n  </span>\n</div>\n<div\n  class=\"card-block text-default p-t-sm-48\"\n  [ngClass]=\"{\n    'p-b-sm-48': limit === 0\n  }\"\n>\n  <div class=\"d-flex fit-w a-i-center gap-8 j-c-center\">\n    <i\n      class=\"icon-32 c8y-icon-duocolor\"\n      [c8yIcon]=\"ITEM_DETAILS[dataType].icon\"\n    ></i>\n    <span\n      class=\"h1\"\n      data-cy=\"namespace-item-card--value\"\n    >\n      {{ value | number }}\n    </span>\n    <span\n      class=\"a-s-baseline text-14 text-medium text-truncate\"\n      title=\"{{ ITEM_DETAILS[dataType].title | translate }}\"\n      data-cy=\"namespace-item-card--label\"\n    >\n      {{ ITEM_DETAILS[dataType].title | translate }}\n    </span>\n  </div>\n</div>\n@if (dataType === DATA_TYPE.topics && limit !== 0) {\n  <div class=\"card-footer d-flex gap-16 j-c-center a-i-center\">\n    <span\n      class=\"tag tag--default no-pointer\"\n      data-cy=\"namespace-item-card--limit\"\n    >\n      {{ topicsLimitLabel | translate: { backlogQuotaLimit: limit | backlogQuotaLimit } }}\n    </span>\n    <app-usage\n      data-cy=\"namespace-item-card--usage\"\n      [count]=\"value\"\n      [limit]=\"limit\"\n    ></app-usage>\n  </div>\n}\n","import { Component, inject, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';\nimport { NamespaceItemCardComponent } from './namespace-item-card/namespace-item-card.component';\nimport { NAMESPACE_PROPS } from '../../../utils/namespace-props';\nimport { MessagingNamespace } from '../../../api/model/namespace';\nimport { MessagingNamespacePolicies } from '../../../api/model/namespacePolicies';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n  selector: 'app-namespace-item',\n  standalone: true,\n  imports: [CommonModule, IconDirective, NamespaceItemCardComponent, C8yTranslatePipe],\n  templateUrl: './namespace-item.component.html'\n})\nexport class NamespaceItemComponent {\n  private translateService = inject(TranslateService);\n\n  @Input('namespaceName')\n  set _namespaceName(name: string) {\n    this.namespaceName = name;\n    this.icon = NAMESPACE_PROPS[name]?.icon;\n    this.namespaceLabel = this.translateService.instant(NAMESPACE_PROPS[name]?.label) || name;\n  }\n  namespaceName = '';\n  namespaceLabel = '';\n  icon = '';\n\n  @Input() namespace: MessagingNamespace = {};\n  @Input() policies: MessagingNamespacePolicies = {};\n}\n","<div class=\"d-flex-sm d-col-xs p-t-24 p-l-16 p-r-16 m-0 bg-level-1\">\n  <div\n    class=\"col-sm-3 m-b-24 col-xs-12 d-flex gap-16 text-default a-i-center j-c-center a-s-stretch\"\n  >\n    <div class=\"text-center d-col\">\n      <i\n        class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n        [c8yIcon]=\"icon\"\n      ></i>\n      <span class=\"tag tag--info\">{{ 'Service' | translate }}</span>\n    </div>\n    <span\n      class=\"h4\"\n      data-cy=\"namespace-item--namespace-label\"\n    >\n      {{ namespaceLabel }}\n    </span>\n  </div>\n  <div class=\"col-sm-3 m-b-24 col-xs-12 a-i-stretch d-flex\">\n    <app-namespace-item-card\n      [serviceLabel]=\"namespaceLabel\"\n      [dataType]=\"'topics'\"\n      [limit]=\"namespace?.topics?.limit\"\n      [value]=\"namespace?.topics?.count\"\n    ></app-namespace-item-card>\n  </div>\n  <div class=\"col-sm-3 m-b-24 col-xs-12 a-i-stretch d-flex\">\n    <app-namespace-item-card\n      [serviceLabel]=\"namespaceLabel\"\n      [dataType]=\"'publishers'\"\n      [value]=\"namespace?.publishers?.count\"\n    ></app-namespace-item-card>\n  </div>\n  <div class=\"col-sm-3 m-b-24 col-xs-12 a-i-stretch d-flex\">\n    <app-namespace-item-card\n      [serviceLabel]=\"namespaceLabel\"\n      [dataType]=\"'subscribers'\"\n      [value]=\"namespace?.subscribers?.count\"\n    ></app-namespace-item-card>\n  </div>\n</div>\n","import { Component, inject, OnInit } from '@angular/core';\nimport {\n  ActionBarItemComponent,\n  AlertService,\n  AppStateService,\n  BreadcrumbModule,\n  C8yTranslateModule,\n  HeaderModule,\n  HelpModule,\n  IconDirective,\n  LoadingComponent\n} from '@c8y/ngx-components';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { NamespaceItemComponent } from './namespace-item/namespace-item.component';\nimport { MessagingNamespacesService } from '../../api/services/messaging-namespaces.service';\nimport { MessagingNamespaceDetails } from '../../api/model/namespaceDetails';\n\n@Component({\n  selector: 'app-namespace-list',\n  templateUrl: './namespace-list.component.html',\n  imports: [\n    CommonModule,\n    HeaderModule,\n    HelpModule,\n    C8yTranslateModule,\n    NamespaceItemComponent,\n    RouterLink,\n    BreadcrumbModule,\n    ActionBarItemComponent,\n    IconDirective,\n    LoadingComponent\n  ],\n  standalone: true\n})\nexport class NamespaceListComponent implements OnInit {\n  alertService = inject(AlertService);\n  appState = inject(AppStateService);\n  namespacesService = inject(MessagingNamespacesService);\n\n  namespacesDetails: MessagingNamespaceDetails[];\n  loading = true;\n\n  async ngOnInit() {\n    await this.reload();\n  }\n\n  async reload() {\n    this.loading = true;\n    try {\n      const currentTenantId = this.appState.currentTenant.value.name;\n      this.namespacesDetails = await this.namespacesService.getNamespacesDetails(currentTenantId);\n    } catch (e) {\n      this.alertService.addServerFailure(e);\n    } finally {\n      this.loading = false;\n    }\n  }\n}\n","<c8y-title>{{ 'Messaging service' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    [icon]=\"'monitoring'\"\n    [label]=\"'Monitoring' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item [label]=\"'Messaging service' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <li>\n    <a\n      class=\"btn btn-link\"\n      title=\"{{ 'Reload' | translate }}\"\n      (click)=\"reload()\"\n    >\n      <i\n        c8yIcon=\"refresh\"\n        [ngClass]=\"{ 'icon-spin': loading }\"\n      ></i>\n      {{ 'Reload' | translate }}\n    </a>\n  </li>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/standard-tenant/monitoring/#messaging-service\"></c8y-help>\n\n<div\n  class=\"interact-grid\"\n  *ngIf=\"!loading; else loadingTemplate\"\n>\n  <a\n    class=\"card\"\n    *ngFor=\"let namespace of namespacesDetails\"\n    [routerLink]=\"['namespace', namespace.id]\"\n  >\n    <app-namespace-item\n      [namespaceName]=\"namespace.id\"\n      [namespace]=\"namespace.namespace\"\n    ></app-namespace-item>\n  </a>\n</div>\n\n<ng-template #loadingTemplate>\n  <c8y-loading></c8y-loading>\n</ng-template>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Pipe({\n  name: 'timeToLive',\n  standalone: true\n})\nexport class TimeToLivePipe implements PipeTransform {\n  constructor(private translateService: TranslateService) {}\n\n  /**\n   * Transform time in seconds to human readable format.\n   * @param seconds time in seconds\n   * @returns human readable time period\n   */\n  transform(seconds: number | null): string {\n    if (seconds == null || isNaN(seconds)) {\n      return '-';\n    }\n    if (seconds === -1) {\n      return this.translateService.instant(gettext('Unlimited` time-to-live period`'));\n    }\n    const minutes = Math.floor(seconds / 60);\n    const hours = Math.floor(minutes / 60);\n    const days = Math.floor(hours / 24);\n\n    if (days >= 1) {\n      const remainingHours = hours % 24;\n      if (days === 1) {\n        if (remainingHours === 0) {\n          return this.translateService.instant(gettext('1 day'));\n        }\n        if (remainingHours === 1) {\n          return this.translateService.instant(gettext('1 day 1 hour'));\n        }\n        return this.translateService.instant(gettext('1 day {{hours}} hours'), {\n          hours: remainingHours\n        });\n      } else {\n        if (remainingHours === 0) {\n          return this.translateService.instant(gettext('{{days}} days'), { days });\n        }\n        if (remainingHours === 1) {\n          return this.translateService.instant(gettext('{{days}} days 1 hour'), { days });\n        }\n        return this.translateService.instant(gettext('{{days}} days {{hours}} hours'), {\n          days,\n          hours: remainingHours\n        });\n      }\n    }\n\n    if (hours > 0) {\n      const remainingMinutes = minutes % 60;\n      if (hours === 1) {\n        if (remainingMinutes === 0) {\n          return this.translateService.instant(gettext('1 hour'));\n        }\n        if (remainingMinutes === 1) {\n          return this.translateService.instant(gettext('1 hour 1 minute'));\n        }\n        return this.translateService.instant(gettext('1 hour {{minutes}} minutes'), {\n          minutes: remainingMinutes\n        });\n      } else {\n        if (remainingMinutes === 0) {\n          return this.translateService.instant(gettext('{{hours}} hours'), { hours });\n        }\n        if (remainingMinutes === 1) {\n          return this.translateService.instant(gettext('{{hours}} hours 1 minute'), { hours });\n        }\n        return this.translateService.instant(gettext('{{hours}} hours {{minutes}} minutes'), {\n          hours,\n          minutes: remainingMinutes\n        });\n      }\n    }\n\n    if (minutes > 0) {\n      const remainingSeconds = seconds % 60;\n      if (minutes === 1) {\n        if (remainingSeconds === 0) {\n          return this.translateService.instant(gettext('1 minute'));\n        }\n        if (remainingSeconds === 1) {\n          return this.translateService.instant(gettext('1 minute 1 second'));\n        }\n        return this.translateService.instant(gettext('1 minute {{seconds}} seconds'), {\n          seconds: remainingSeconds\n        });\n      } else {\n        if (remainingSeconds === 0) {\n          return this.translateService.instant(gettext('{{minutes}} minutes'), { minutes });\n        }\n        if (remainingSeconds === 1) {\n          return this.translateService.instant(gettext('{{minutes}} minutes 1 second'), {\n            minutes\n          });\n        }\n        return this.translateService.instant(gettext('{{minutes}} minutes {{seconds}} seconds'), {\n          minutes,\n          seconds: remainingSeconds\n        });\n      }\n    }\n\n    if (seconds === 1) {\n      return this.translateService.instant(gettext('1 second'));\n    } else {\n      return this.translateService.instant(gettext('{{seconds}} seconds'), { seconds });\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { FetchClient, IResult, Paging, Service } from '@c8y/client';\nimport { MessagingTopicList } from '../model/topicList';\nimport { MessagingTopicListFilters } from '../model/topicListFilters';\nimport { MessagingTopic } from '../model/topic';\nimport { MessagingTopicDetailFilters } from '../model/topicDetailFilters';\n\n@Injectable({ providedIn: 'root' })\nexport class MessagingTopicsService extends Service<MessagingTopic> {\n  protected baseUrl = '/service/messaging-management';\n  protected listUrl = 'tenants';\n\n  constructor(client: FetchClient) {\n    super(client);\n  }\n\n  async list(filter: MessagingTopicListFilters) {\n    const headers = { accept: 'application/json' };\n    const { tenant, namespace, ...params } = filter;\n    const url = `/${this.listUrl}/${tenant}/namespaces/${namespace}/topics`;\n    const res = await this.fetch(url, this.changeFetchOptions({ headers, params }, url));\n    const topicList = (await res.json()) as MessagingTopicList;\n    const data = topicList.topics;\n    const paging = this.getPaging(topicList, filter);\n    return { res, data, paging };\n  }\n\n  async detail(filter: MessagingTopicDetailFilters): Promise<IResult<MessagingTopic>> {\n    const headers = { accept: 'application/json' };\n    const { tenant, namespace, topic, type } = filter;\n    const url = `/${this.listUrl}/${tenant}/namespaces/${namespace}/topics/${topic}/types/${type}`;\n    const res = await this.fetch(url, this.changeFetchOptions({ headers }, url));\n    const data = await res.json();\n    return { res, data };\n  }\n\n  protected getPaging(\n    topicList: MessagingTopicList,\n    filter: MessagingTopicListFilters\n  ): Paging<MessagingTopic> {\n    if (topicList.pageStatistics) {\n      const { currentPage, totalPages } = topicList.pageStatistics;\n      const statistics = {\n        ...topicList.pageStatistics,\n        nextPage: currentPage < totalPages ? currentPage + 1 : null,\n        prevPage: currentPage > 1 ? currentPage - 1 : null\n      };\n      return new Paging<MessagingTopic>(this, statistics, filter);\n    }\n    return null;\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { BaseColumn, Column, DataSourceModifier, ServerSideDataResult } from '@c8y/ngx-components';\nimport { MessagingTopicListFilters } from '../../api/model/topicListFilters';\nimport { MessagingTopicsService } from '../../api/services/messaging-topics.service';\n\n@Injectable({ providedIn: 'root' })\nexport class TopicsDataGridService {\n  protected topicsService = inject(MessagingTopicsService);\n\n  getColumns(): Column[] {\n    return [\n      this.createColumn({\n        name: 'name',\n        header: gettext('Name'),\n        path: 'name',\n        filterable: true,\n        filteringConfig: {\n          fields: [\n            {\n              key: 'name',\n              type: 'input',\n              props: {\n                label: gettext('Filter topics by partial name'),\n                placeholder: 'myTopic',\n                required: true\n              }\n            }\n          ],\n          getFilter(model: { name: string }): string {\n            return model.name;\n          }\n        }\n      }),\n      this.createColumn({\n        name: 'msgRateIn',\n        header: gettext('Message rate in (msg/s)'),\n        path: 'msgRateIn'\n      }),\n      this.createColumn({\n        name: 'msgRateOut',\n        header: gettext('Message rate out (msg/s)'),\n        path: 'msgRateOut'\n      }),\n      this.createColumn({\n        name: 'subscribers',\n        header: gettext('Subscribers'),\n        path: 'subscribers'\n      }),\n      this.createColumn({\n        name: 'backlogSize',\n        header: gettext('Message backlog'),\n        path: 'backlogSize'\n      }),\n      this.createColumn({\n        name: 'backlogUsagePercentage',\n        header: gettext('Used backlog'),\n        path: 'backlogUsagePercentage',\n        sortOrder: 'desc'\n      })\n    ];\n  }\n\n  async getServerSideData(\n    tenantId: string,\n    namespaceId: string,\n    dataSourceModifier: DataSourceModifier\n  ): Promise<ServerSideDataResult> {\n    const topicFilters = this.getTopicFilters(tenantId, namespaceId, dataSourceModifier);\n    const { res, data, paging } = await this.topicsService.list(topicFilters);\n    const filteredSize = paging.totalElements;\n    const size = (\n      await this.topicsService.list({\n        ...topicFilters,\n        currentPage: 1,\n        pageSize: 1\n      })\n    ).paging.totalPages;\n\n    return {\n      res,\n      data,\n      paging,\n      size,\n      filteredSize\n    };\n  }\n\n  private createColumn(columnProps: Partial<BaseColumn>): BaseColumn {\n    const column = new BaseColumn();\n    Object.assign(column, columnProps);\n    return column;\n  }\n\n  private getTopicFilters(\n    tenantId: string,\n    namespaceId: string,\n    dataSourceModifier: DataSourceModifier\n  ): MessagingTopicListFilters {\n    const topicFilters: MessagingTopicListFilters = {\n      tenant: tenantId,\n      namespace: namespaceId,\n      currentPage: dataSourceModifier.pagination.currentPage,\n      pageSize: dataSourceModifier.pagination.pageSize\n    };\n\n    return dataSourceModifier.columns.reduce((topicFilters, column) => {\n      if (column.filterable) {\n        if (column.filterPredicate) {\n          topicFilters[column.path] = column.filterPredicate;\n        }\n\n        if (column.externalFilterQuery) {\n          topicFilters[column.path] = column.filteringConfig.getFilter(column.externalFilterQuery);\n        }\n      }\n\n      if (column.sortable && column.sortOrder) {\n        const sortPath = column.sortingConfig?.pathSortingConfigs?.[0]?.path || column.path;\n        topicFilters.sort = `${sortPath},${column.sortOrder}`;\n      }\n\n      return topicFilters;\n    }, topicFilters);\n  }\n}\n","import { AfterViewInit, Component, DestroyRef, EventEmitter, inject } from '@angular/core';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  ActionBarItemComponent,\n  AppStateService,\n  BreadcrumbModule,\n  BytesPipe,\n  C8yTranslatePipe,\n  Column,\n  DataGridModule,\n  DataSourceModifier,\n  EmptyStateComponent,\n  EmptyStateContextDirective,\n  HeaderModule,\n  IconDirective,\n  LoadingComponent,\n  Pagination,\n  ServerSideDataCallback,\n  ServerSideDataResult\n} from '@c8y/ngx-components';\nimport { AsyncPipe, DecimalPipe, NgClass, NgIf, PercentPipe } from '@angular/common';\nimport { MessagingNamespacesService } from '../../api/services/messaging-namespaces.service';\nimport { BacklogQuotaLimitPipe } from '../../utils/backlog-quota-limit.pipe';\nimport { UsageComponent } from '../shared/usage/usage.component';\nimport { TimeToLivePipe } from '../../utils/time-to-live.pipe';\nimport { NAMESPACE_PROPS } from '../../utils/namespace-props';\nimport { TranslateService } from '@ngx-translate/core';\nimport { TopicsDataGridService } from './topics-data-grid.service';\nimport { map, shareReplay, switchMap, tap } from 'rxjs/operators';\nimport { BehaviorSubject, combineLatest, firstValueFrom } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n  imports: [\n    RouterLink,\n    HeaderModule,\n    DataGridModule,\n    DecimalPipe,\n    C8yTranslatePipe,\n    BacklogQuotaLimitPipe,\n    UsageComponent,\n    BytesPipe,\n    TimeToLivePipe,\n    BreadcrumbModule,\n    LoadingComponent,\n    NgIf,\n    ActionBarItemComponent,\n    NgClass,\n    IconDirective,\n    PercentPipe,\n    EmptyStateComponent,\n    EmptyStateContextDirective,\n    AsyncPipe\n  ],\n  selector: 'app-topic-list-view',\n  standalone: true,\n  templateUrl: './topic-list-view.component.html'\n})\nexport class TopicListViewComponent implements AfterViewInit {\n  route = inject(ActivatedRoute);\n  appState = inject(AppStateService);\n  namespacesService = inject(MessagingNamespacesService);\n  topicsDataGridService = inject(TopicsDataGridService);\n  translateService = inject(TranslateService);\n  destroyRef = inject(DestroyRef);\n\n  loading$ = new BehaviorSubject<boolean>(false);\n  refresh = new EventEmitter<void>();\n\n  tenantId$ = this.appState.currentTenant.pipe(map(tenant => tenant.name));\n  namespaceId$ = this.route.params.pipe(map(params => params['namespace'] as string));\n  namespaceLabel$ = this.namespaceId$.pipe(\n    map(namespaceId => this.translateService.instant(NAMESPACE_PROPS[namespaceId].label))\n  );\n  icon$ = this.namespaceId$.pipe(map(namespaceId => NAMESPACE_PROPS[namespaceId].icon));\n\n  namespaceDetails$ = combineLatest([this.tenantId$, this.namespaceId$, this.refresh]).pipe(\n    tap(() => this.loading$.next(true)),\n    switchMap(([tenantId, namespaceId]) =>\n      this.namespacesService.getNamespaceDetails(tenantId, namespaceId)\n    ),\n    tap(() => this.loading$.next(false)),\n    shareReplay(1)\n  );\n\n  tableTitle = gettext('Topics');\n  loadingItemsLabel = gettext('Loading topics...');\n  loadMoreItemsLabel = gettext('Load more topics');\n  noResultsMessage = gettext('No matching topics found.');\n  noResultsSubtitle = gettext('Refine your search terms or check your spelling.');\n  noDataMessage = gettext('No topics to display.');\n  noDataSubtitle = gettext('Create new topics to monitor them here.');\n\n  columns: Column[] = this.topicsDataGridService.getColumns();\n  pagination: Pagination = {\n    pageSize: 20,\n    currentPage: 1\n  };\n\n  serverSideDataCallback: ServerSideDataCallback = this.onDataSourceModifier.bind(this);\n  async onDataSourceModifier(\n    dataSourceModifier: DataSourceModifier\n  ): Promise<ServerSideDataResult> {\n    return firstValueFrom(\n      combineLatest([this.tenantId$, this.namespaceId$]).pipe(\n        switchMap(([tenantId, namespaceId]) =>\n          this.topicsDataGridService.getServerSideData(tenantId, namespaceId, dataSourceModifier)\n        )\n      )\n    );\n  }\n\n  ngAfterViewInit() {\n    this.route.params\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => this.refresh.emit());\n  }\n}\n","<c8y-title>{{ namespaceLabel$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    [icon]=\"'monitoring'\"\n    [label]=\"'Monitoring' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [label]=\"'Messaging service' | translate\"\n    [path]=\"'/monitoring/messaging-service'\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item [label]=\"namespaceLabel$ | async\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <a\n    class=\"btn btn-link\"\n    title=\"{{ 'Reload' | translate }}\"\n    (click)=\"refresh.emit()\"\n  >\n    <i\n      c8yIcon=\"refresh\"\n      [ngClass]=\"{ 'icon-spin': loading$ | async }\"\n    ></i>\n    {{ 'Reload' | translate }}\n  </a>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-flex d-col\">\n  <div class=\"bg-level-1 separator-bottom flex-no-shrink\">\n    <div\n      class=\"card-block\"\n      style=\"min-height: 172px\"\n    >\n      <div\n        class=\"col-md-4 m-b-24 col-xs-12 d-flex p-t-24 gap-16 text-default a-i-center a-s-stretch\"\n      >\n        <div class=\"text-center d-col\">\n          <i\n            class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n            [c8yIcon]=\"icon$ | async\"\n          ></i>\n          <span class=\"tag tag--info\">{{ 'Service' | translate }}</span>\n        </div>\n        <span class=\"h4 text-break-all\">{{ namespaceLabel$ | async }}</span>\n      </div>\n      <div class=\"col-md-4\">\n        <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n          <legend>\n            {{ 'Service usage/limits' | translate }}\n          </legend>\n\n          @if (loading$ | async) {\n            <c8y-loading></c8y-loading>\n          } @else {\n            @let namespace = (namespaceDetails$ | async)?.namespace;\n            @if (namespace) {\n              <ul class=\"list-unstyled small animated fadeIn\">\n                <li\n                  class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\"\n                  data-cy=\"topic-list-view--topics\"\n                >\n                  <label class=\"small m-b-0 m-r-auto\">{{ 'Topics' | translate }}</label>\n                  @if (namespace?.topics?.limit !== 0) {\n                    <app-usage\n                      [count]=\"namespace?.topics?.count\"\n                      [limit]=\"namespace?.topics?.limit\"\n                    ></app-usage>\n                    <span class=\"m-l-16\">\n                      {{ namespace?.topics?.count | number }} /\n                      {{ namespace?.topics?.limit | backlogQuotaLimit }}\n                    </span>\n                  } @else {\n                    <span class=\"m-l-16\">{{ namespace?.topics?.count | number }}</span>\n                  }\n                </li>\n\n                <li\n                  class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\"\n                  data-cy=\"topic-list-view--subscribers\"\n                >\n                  <label class=\"small m-b-0 m-r-auto\">{{ 'Subscribers' | translate }}</label>\n                  <span class=\"m-l-16\">\n                    {{ namespace?.subscribers?.count | number }}\n                  </span>\n                </li>\n\n                <li\n                  class=\"p-t-4 p-b-4 d-flex text-nowrap\"\n                  data-cy=\"topic-list-view--publishers\"\n                >\n                  <label class=\"small m-b-0 m-r-auto\">{{ 'Publishers' | translate }}</label>\n                  <span class=\"m-l-16\">\n                    {{ namespace?.publishers?.count | number }}\n                  </span>\n                </li>\n              </ul>\n            }\n          }\n        </fieldset>\n      </div>\n      <div class=\"col-md-4\">\n        <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n          <legend>{{ 'Service message backlog limits' | translate }}</legend>\n\n          @if (loading$ | async) {\n            <c8y-loading></c8y-loading>\n          } @else {\n            @let policies = (namespaceDetails$ | async)?.policies;\n            @if (policies) {\n              <ul class=\"list-unstyled small animated fadeIn\">\n                <li\n                  class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\"\n                  data-cy=\"topic-list-view--backlog-quota\"\n                >\n                  <label class=\"small m-b-0 m-r-auto\">\n                    {{ 'Backlog quota (per topic)' | translate }}\n                  </label>\n                  <span\n                    title=\"{{\n                      policies?.backlogQuota?.limit > 0\n                        ? (policies.backlogQuota.limit | bytes: 0 : true)\n                        : '-'\n                    }}\"\n                  >\n                    {{\n                      policies?.backlogQuota?.limit > 0\n                        ? (policies.backlogQuota.limit | bytes: 0)\n                        : '-'\n                    }}\n                  </span>\n                </li>\n\n                <li\n                  class=\"p-t-4 p-b-4 d-flex text-nowrap\"\n                  data-cy=\"topic-list-view--backlog-ttl\"\n                >\n                  <label class=\"small m-b-0 m-r-auto\">\n                    {{ 'Backlog time to live (TTL)' | translate }}\n                  </label>\n                  <span>{{ policies?.messageTTL | timeToLive }}</span>\n                </li>\n              </ul>\n            }\n          }\n        </fieldset>\n      </div>\n    </div>\n  </div>\n\n  <c8y-data-grid\n    class=\"d-contents\"\n    [title]=\"tableTitle | translate\"\n    [loadingItemsLabel]=\"loadingItemsLabel | translate\"\n    [loadMoreItemsLabel]=\"loadMoreItemsLabel | translate\"\n    [columns]=\"columns\"\n    [pagination]=\"pagination\"\n    [serverSideDataCallback]=\"serverSideDataCallback\"\n    [refresh]=\"refresh\"\n    [hideReload]=\"true\"\n  >\n    <c8y-ui-empty-state\n      [icon]=\"stats?.size > 0 ? 'search' : 'day-view'\"\n      [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n      [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n      *emptyStateContext=\"let stats\"\n      [horizontal]=\"stats?.size > 0\"\n    ></c8y-ui-empty-state>\n\n    <c8y-column name=\"name\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        <a\n          title=\"{{ context.value }}\"\n          [routerLink]=\"['topic', context.item.id]\"\n        >\n          {{ context.value }}\n        </a>\n      </ng-container>\n    </c8y-column>\n\n    <c8y-column name=\"msgRateIn\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        <span title=\"{{ context.value | number }}\">\n          {{ context.value | number }}\n        </span>\n      </ng-container>\n    </c8y-column>\n\n    <c8y-column name=\"msgRateOut\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        <span title=\"{{ context.value | number }}\">\n          {{ context.value | number }}\n        </span>\n      </ng-container>\n    </c8y-column>\n\n    <c8y-column name=\"subscribers\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        <a\n          title=\"{{ context.value | number }}\"\n          [routerLink]=\"['topic', context.item.id, 'subscribers']\"\n        >\n          {{ context.value | number }}\n        </a>\n      </ng-container>\n    </c8y-column>\n\n    <c8y-column name=\"backlogSize\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        <span title=\"{{ context.value | bytes: 2 : true }}\">\n          {{ context.value | bytes: 2 }}\n        </span>\n      </ng-container>\n    </c8y-column>\n\n    <c8y-column name=\"backlogUsagePercentage\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        <span title=\"{{ context.value / 100 | percent: '1.0-2' }}\">\n          {{ context.value / 100 | percent: '1.0-2' }}\n        </span>\n      </ng-container>\n    </c8y-column>\n  </c8y-data-grid>\n</div>\n","/**\n * If the topic is persistent or not. If false, the topic is not saved and will be deleted if there are no clients.\n */\nexport enum MessagingTopicType {\n  Persistent = 'persistent',\n  NonPersistent = 'non-persistent'\n}\n","import { Injectable } from '@angular/core';\nimport { FetchClient, Paging, Service } from '@c8y/client';\nimport { MessagingSubscriberList } from '../model/subscriberList';\nimport { MessagingSubscriber } from '../model/subscriber';\nimport { MessagingTopic } from '../model/topic';\nimport { MessagingSubscriberFilters } from '../model/subscriberFilters';\nimport { MessagingSubscriberToDelete } from '../model/subscriberToDelete';\nimport { MessagingTopicType } from '../model/topicType';\nimport { omit } from 'lodash-es';\n\n@Injectable({ providedIn: 'root' })\nexport class MessagingSubscribersService extends Service<MessagingSubscriber> {\n  protected baseUrl = '/service/messaging-management';\n  protected listUrl = 'tenants';\n\n  constructor(client: FetchClient) {\n    super(client);\n  }\n\n  /**\n   * Get the list of subscribers for a topic.\n   *\n   * @param filter Subscriber filters.\n   */\n  async list(filter: MessagingSubscriberFilters) {\n    const headers = { accept: 'application/json' };\n    const params = omit(filter, ['tenant', 'namespace', 'topic', 'type']);\n    const url = this.getBaseUrl(filter);\n    const res = await this.fetch(url, this.changeFetchOptions({ headers, params }, url));\n    const subscriberList = (await res.json()) as MessagingSubscriberList;\n    const data = subscriberList.subscribers;\n    const paging = this.getPaging(subscriberList, filter);\n    return { res, data, paging };\n  }\n\n  async delete(subscriberToDelete: MessagingSubscriberToDelete) {\n    const method = 'DELETE';\n    const url = this.getBaseUrl(subscriberToDelete) + `/${subscriberToDelete.name}`;\n    const res = await this.fetch(url, this.changeFetchOptions({ method }, url));\n    return { res, data: null };\n  }\n\n  protected getPaging(json: MessagingSubscriberList, filter: object): Paging<MessagingSubscriber> {\n    if (json.pageStatistics) {\n      const { currentPage, totalPages } = json.pageStatistics;\n      const statistics = {\n        ...json.pageStatistics,\n        nextPage: currentPage < totalPages ? currentPage + 1 : null,\n        prevPage: currentPage > 1 ? currentPage - 1 : null\n      };\n      return new Paging<MessagingTopic>(this, statistics, filter);\n    }\n    return null;\n  }\n\n  private getBaseUrl({\n    tenant,\n    namespace,\n    topic,\n    type\n  }: {\n    tenant: string;\n    namespace: string;\n    topic: string;\n    type: MessagingTopicType;\n  }) {\n    return `/${this.listUrl}/${tenant}/namespaces/${namespace}/topics/${topic}/types/${type}/subscribers`;\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  AlertService,\n  BaseColumn,\n  Column,\n  DataSourceModifier,\n  ModalService,\n  ServerSideDataResult,\n  Status\n} from '@c8y/ngx-components';\nimport { MessagingSubscribersService } from '../../../api/services/messaging-subscribers.service';\nimport { MessagingTopicType } from '../../../api/model/topicType';\nimport { MessagingSubscriberFilters } from '../../../api/model/subscriberFilters';\nimport { MessagingSubscriber } from '../../../api/model/subscriber';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MessagingSubscriberToDelete } from '../../../api/model/subscriberToDelete';\n\n@Injectable({ providedIn: 'root' })\nexport class TopicSubscribersDataGridService {\n  protected subscribersService = inject(MessagingSubscribersService);\n  private alertService = inject(AlertService);\n  private modalService = inject(ModalService);\n  private translateService = inject(TranslateService);\n\n  getColumns(): Column[] {\n    return [\n      this.createColumn({\n        name: 'name',\n        header: gettext('Name'),\n        path: 'name',\n        filterable: true,\n        filteringConfig: {\n          fields: [\n            {\n              key: 'name',\n              type: 'input',\n              props: {\n                label: gettext('Filter subscribers by partial name'),\n                placeholder: 'mySubscriber',\n                required: true\n              }\n            }\n          ],\n          getFilter(model: { name: string }): string {\n            return model.name;\n          }\n        }\n      }),\n      this.createColumn({\n        name: 'activeClients',\n        header: gettext('Connected clients'),\n        path: 'activeClients'\n      }),\n      this.createColumn({\n        name: 'messageAckRate',\n        header: gettext('Acknowledgement rate (msg/s)'),\n        path: 'messageAckRate'\n      }),\n      this.createColumn({\n        name: 'lastAcknowledgeDate',\n        header: gettext('Last acknowledged'),\n        path: 'lastAcknowledgeDate',\n        sortingConfig: {\n          pathSortingConfigs: [\n            {\n              path: 'lastAcknowledgeTimestamp'\n            }\n          ]\n        }\n      }),\n      this.createColumn({\n        name: 'unackMsgBacklog',\n        header: gettext('Unacknowledged messages'),\n        path: 'unackMsgBacklog'\n      }),\n      this.createColumn({\n        name: 'backlogUsagePercentage',\n        header: gettext('Used backlog'),\n        path: 'backlogUsagePercentage',\n        sortOrder: 'desc'\n      })\n    ];\n  }\n\n  async getServerSideData(\n    tenantId: string,\n    namespaceId: string,\n    topicId: string,\n    topicType: MessagingTopicType,\n    dataSourceModifier: DataSourceModifier\n  ): Promise<ServerSideDataResult> {\n    const subscriberFilters = this.getSubscriberFilters(\n      tenantId,\n      namespaceId,\n      topicId,\n      topicType,\n      dataSourceModifier\n    );\n    const { res, data, paging } = await this.subscribersService.list(subscriberFilters);\n    const filteredSize = paging.totalElements;\n    const size = (\n      await this.subscribersService.list({\n        ...subscriberFilters,\n        currentPage: 1,\n        pageSize: 1\n      })\n    ).paging.totalPages;\n\n    return {\n      res,\n      data: data.map(subscriber => ({\n        ...subscriber,\n        lastAcknowledgeDate: this.getLastAcknowledgeDate(subscriber),\n        id: subscriber.name\n      })),\n      paging,\n      size,\n      filteredSize\n    };\n  }\n\n  async unsubscribeSubscriber(\n    subscriber: MessagingSubscriberToDelete,\n    refreshCallback: () => void\n  ): Promise<void> {\n    const confirmationTitle = gettext('Unsubscribe \"{{ subscriberName }}\"?');\n    const confirmationMessage =\n      subscriber.activeClients > 0\n        ? gettext(\n            'You are about to unsubscribe \"{{ subscriberName }}\" which has active clients. Do you want to proceed?'\n          )\n        : gettext('You are about to unsubscribe \"{{ subscriberName }}\". Do you want to proceed?');\n    try {\n      const subscriberName = subscriber.name;\n      await this.modalService.confirm(\n        this.translateService.instant(confirmationTitle, {\n          subscriberName\n        }),\n        this.translateService.instant(confirmationMessage, {\n          subscriberName\n        }),\n        Status.DANGER,\n        {\n          ok: gettext('Unsubscribe')\n        }\n      );\n    } catch (e) {\n      // cancel\n      return;\n    }\n\n    try {\n      await this.subscribersService.delete(subscriber);\n      this.alertService.success(\n        this.translateService.instant(gettext('Subscriber \"{{ subscriberName }}\" unsubscribed.'), {\n          subscriberName: subscriber.name\n        })\n      );\n    } catch (error) {\n      this.alertService.addServerFailure(error);\n    }\n    refreshCallback();\n  }\n\n  async bulkUnsubscribeSubscribers(\n    subscribers: MessagingSubscriberToDelete[],\n    refreshCallback: () => void\n  ): Promise<void> {\n    const anySubscriberHasActiveClients = subscribers.some(\n      subscriber => subscriber.activeClients > 0\n    );\n\n    const confirmationTitle = gettext('Unsubscribe {{ numberOfSubscribers }} subscribers?');\n    const confirmationMessage = anySubscriberHasActiveClients\n      ? gettext(\n          'You are about to unsubscribe {{ numberOfSubscribers }} subscribers. Some of them have active clients. Do you want to proceed?'\n        )\n      : gettext(\n          'You are about to unsubscribe {{ numberOfSubscribers }} subscribers. Do you want to proceed?'\n        );\n\n    try {\n      const numberOfSubscribers = subscribers.length;\n      await this.modalService.confirm(\n        this.translateService.instant(confirmationTitle, {\n          numberOfSubscribers\n        }),\n        this.translateService.instant(confirmationMessage, {\n          numberOfSubscribers\n        }),\n        Status.DANGER,\n        {\n          ok: gettext('Unsubscribe')\n        }\n      );\n    } catch (e) {\n      // cancel\n      return;\n    }\n\n    const results = await Promise.allSettled(\n      subscribers.map(sub =>\n        this.subscribersService\n          .delete(sub)\n          .then(() => ({\n            success: true,\n            name: sub.name\n          }))\n          .catch(error => ({\n            success: false,\n            name: sub.name,\n            error\n          }))\n      )\n    );\n\n    const failed = results\n      .filter(result => result.status === 'fulfilled' && result.value.success === false)\n      .map(result => (result as PromiseFulfilledResult<any>).value);\n\n    const succeeded = results\n      .filter(result => result.status === 'fulfilled' && result.value.success === true)\n      .map(result => (result as PromiseFulfilledResult<any>).value);\n\n    if (failed.length === 0) {\n      this.alertService.success(\n        this.translateService.instant(\n          gettext('{{ numberOfSubscribers }} subscribers unsubscribed.'),\n          { numberOfSubscribers: succeeded.length }\n        )\n      );\n    } else if (succeeded.length === 0) {\n      const errorMessage = this.translateService.instant(\n        gettext('Failed to unsubscribe {{ numberOfSubscribers }} subscribers.'),\n        {\n          numberOfSubscribers: failed.length\n        }\n      );\n      const details = `${failed.map(f => `'${f.name}': ${f.error.data.message}`).join('\\n')}`;\n      this.alertService.danger(errorMessage, details);\n    } else {\n      // Some succeeded, some failed\n      const nonUnsubscribedSubscribers = failed.map(s => s.name).join(', ');\n      const message = this.translateService.instant(\n        gettext(\n          `Successfully unsubscribed {{ count }} subscribers.<br/>Failed to unsubscribe: {{ nonUnsubscribedSubscribers }}.`\n        ),\n        { count: succeeded.length, nonUnsubscribedSubscribers }\n      );\n      const details = `${failed.map(f => `'${f.name}': ${f.error.data.message}`).join('\\n')}`;\n      this.alertService.warning(message, details);\n    }\n\n    refreshCallback();\n  }\n\n  private createColumn(columnProps: Partial<BaseColumn>): BaseColumn {\n    const column = new BaseColumn();\n    Object.assign(column, columnProps);\n    return column;\n  }\n\n  private getSubscriberFilters(\n    tenantId: string,\n    namespaceId: string,\n    topicId: string,\n    topicType: MessagingTopicType,\n    dataSourceModifier: DataSourceModifier\n  ): MessagingSubscriberFilters {\n    const subscriberFilters: MessagingSubscriberFilters = {\n      tenant: tenantId,\n      namespace: namespaceId,\n      topic: topicId,\n      type: topicType,\n      currentPage: dataSourceModifier.pagination.currentPage,\n      pageSize: dataSourceModifier.pagination.pageSize\n    };\n\n    return dataSourceModifier.columns.reduce((subscriberFilters, column) => {\n      if (column.filterable) {\n        if (column.filterPredicate) {\n          subscriberFilters[column.path] = column.filterPredicate;\n        }\n\n        if (column.externalFilterQuery) {\n          subscriberFilters[column.path] = column.filteringConfig.getFilter(\n            column.externalFilterQuery\n          );\n        }\n      }\n\n      if (column.sortable && column.sortOrder) {\n        const sortPath = column.sortingConfig?.pathSortingConfigs?.[0]?.path || column.path;\n        subscriberFilters.sort = `${sortPath},${column.sortOrder}`;\n      }\n\n      return subscriberFilters;\n    }, subscriberFilters);\n  }\n\n  private getLastAcknowledgeDate(subscriber: MessagingSubscriber): Date {\n    const lastAcknowledgeDate = new Date(subscriber.lastAcknowledgeTimestamp);\n    return lastAcknowledgeDate.getTime() > 0 ? lastAcknowledgeDate : null;\n  }\n}\n","import {\n  AfterViewInit,\n  Component,\n  DestroyRef,\n  EventEmitter,\n  inject,\n  ViewChild\n} from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  ActionBarItemComponent,\n  ActionControl,\n  AppStateService,\n  BreadcrumbModule,\n  BulkActionControl,\n  BytesPipe,\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  Column,\n  DataGridComponent,\n  DataGridModule,\n  DataSourceModifier,\n  EmptyStateComponent,\n  EmptyStateContextDirective,\n  HeaderModule,\n  IconDirective,\n  LoadingComponent,\n  Pagination,\n  Permissions,\n  RelativeTimePipe,\n  ServerSideDataCallback,\n  ServerSideDataResult\n} from '@c8y/ngx-components';\nimport { ActivatedRoute } from '@angular/router';\nimport { CommonModule, DecimalPipe } from '@angular/common';\nimport { MessagingTopicType } from '../../../api/model/topicType';\nimport { MessagingTopicsService } from '../../../api/services/messaging-topics.service';\nimport { MessagingNamespacesService } from '../../../api/services/messaging-namespaces.service';\nimport { NAMESPACE_PROPS } from '../../../utils/namespace-props';\nimport { TranslateService } from '@ngx-translate/core';\nimport { TopicSubscribersDataGridService } from './topic-subscribers-data-grid.service';\nimport { BehaviorSubject, combineLatest, firstValueFrom } from 'rxjs';\nimport { map, shareReplay, switchMap, tap } from 'rxjs/operators';\nimport { UsageComponent } from '../../shared/usage/usage.component';\nimport { MessagingSubscriber } from '../../../api/model/subscriber';\nimport { MessagingSubscriberToDelete } from '../../../api/model/subscriberToDelete';\n\n@Component({\n  selector: 'app-topic-subscribers-view',\n  standalone: true,\n  imports: [\n    DataGridModule,\n    DecimalPipe,\n    HeaderModule,\n    C8yTranslateDirective,\n    RelativeTimePipe,\n    C8yTranslatePipe,\n    CommonModule,\n    BytesPipe,\n    BreadcrumbModule,\n    UsageComponent,\n    ActionBarItemComponent,\n    IconDirective,\n    EmptyStateComponent,\n    EmptyStateContextDirective,\n    LoadingComponent\n  ],\n  templateUrl: './topic-subscribers-view.component.html'\n})\nexport class TopicSubscribersViewComponent implements AfterViewInit {\n  route = inject(ActivatedRoute);\n  appState = inject(AppStateService);\n  namespacesService = inject(MessagingNamespacesService);\n  topicsService = inject(MessagingTopicsService);\n  topicSubscribersDataGridService = inject(TopicSubscribersDataGridService);\n  translateService = inject(TranslateService);\n  permissions = inject(Permissions);\n  destroyRef = inject(DestroyRef);\n\n  loading$ = new BehaviorSubject<boolean>(false);\n  refresh = new EventEmitter<void>();\n\n  tenantId$ = this.appState.currentTenant.pipe(map(tenant => tenant.name));\n  namespaceId$ = this.route.params.pipe(map(params => params['namespace'] as string));\n  namespaceLabel$ = this.namespaceId$.pipe(\n    map(namespaceId => this.translateService.instant(NAMESPACE_PROPS[namespaceId].label))\n  );\n  topicId$ = this.route.params.pipe(map(params => params['topic'] as string));\n  overview$ = combineLatest([this.tenantId$, this.namespaceId$, this.topicId$, this.refresh]).pipe(\n    tap(() => this.loading$.next(true)),\n    switchMap(async ([tenantId, namespaceId, topicId]) => ({\n      topic: (\n        await this.topicsService.detail({\n          tenant: tenantId,\n          namespace: namespaceId,\n          topic: topicId,\n          type: MessagingTopicType.Persistent\n        })\n      ).data,\n      policies: await this.namespacesService.getNamespacePolicies(tenantId, namespaceId)\n    })),\n    tap(() => this.loading$.next(false)),\n    shareReplay(1)\n  );\n  topicName$ = this.overview$.pipe(map(overview => overview.topic.name));\n\n  tableTitle = gettext('Subscribers');\n  loadingItemsLabel = gettext('Loading subscribers...');\n  loadMoreItemsLabel = gettext('Load more subscribers');\n  noResultsMessage = gettext('No matching subscribers found.');\n  noResultsSubtitle = gettext('Refine your search terms or check your spelling.');\n  noDataMessage = gettext('No subscribers to display.');\n  noDataSubtitle = gettext('Create new subscribers to monitor them here.');\n\n  columns: Column[] = this.topicSubscribersDataGridService.getColumns();\n  pagination: Pagination = {\n    pageSize: 20,\n    currentPage: 1\n  };\n\n  selectable = true;\n  actionControls: ActionControl[] = [\n    {\n      type: 'unsubscribeSubscriber',\n      icon: 'unsubscribe',\n      text: gettext('Unsubscribe'),\n      callback: (subscriber: MessagingSubscriber) => this.unsubscribeSubscriber(subscriber),\n      showIf: () => this.permissions.hasRole(Permissions.ROLE_TENANT_MANAGEMENT_ADMIN)\n    }\n  ];\n  bulkActionControls: BulkActionControl[] = [\n    {\n      type: 'unsubscribeSubscriber',\n      icon: 'unsubscribe',\n      text: gettext('Unsubscribe'),\n      callback: (subscribersNames: string[]) => this.bulkUnsubscribeSubscribers(subscribersNames),\n      showIf: () => this.permissions.hasRole(Permissions.ROLE_TENANT_MANAGEMENT_ADMIN)\n    }\n  ];\n  @ViewChild(DataGridComponent, { static: true }) dataGrid: DataGridComponent;\n\n  serverSideDataCallback: ServerSideDataCallback = this.onDataSourceModifier.bind(this);\n  async onDataSourceModifier(\n    dataSourceModifier: DataSourceModifier\n  ): Promise<ServerSideDataResult> {\n    return firstValueFrom(\n      combineLatest([this.tenantId$, this.namespaceId$, this.topicId$]).pipe(\n        switchMap(([tenantId, namespaceId, topicId]) =>\n          this.topicSubscribersDataGridService.getServerSideData(\n            tenantId,\n            namespaceId,\n            topicId,\n            MessagingTopicType.Persistent,\n            dataSourceModifier\n          )\n        )\n      )\n    );\n  }\n\n  ngAfterViewInit() {\n    this.refresh.emit();\n  }\n\n  async unsubscribeSubscriber(subscriber: MessagingSubscriber) {\n    const tenant = await firstValueFrom(this.tenantId$);\n    const namespace = await firstValueFrom(this.namespaceId$);\n    const topic = await firstValueFrom(this.topicId$);\n    this.topicSubscribersDataGridService.unsubscribeSubscriber(\n      {\n        ...subscriber,\n        tenant,\n        namespace,\n        topic,\n        type: MessagingTopicType.Persistent\n      },\n      () => this.refresh.emit()\n    );\n  }\n\n  async bulkUnsubscribeSubscribers(subscribersNames: string[]): Promise<void> {\n    const tenant = await firstValueFrom(this.tenantId$);\n    const namespace = await firstValueFrom(this.namespaceId$);\n    const topic = await firstValueFrom(this.topicId$);\n    const allSubscribers: MessagingSubscriber[] = await firstValueFrom(\n      this.dataGrid.dataSource.data$\n    );\n\n    const subscribers: MessagingSubscriberToDelete[] = subscribersNames.map(subscriberName => {\n      const subscriber = allSubscribers.find(subscriber => subscriber.name === subscriberName);\n      return {\n        ...subscriber,\n        tenant,\n        namespace,\n        topic,\n        type: MessagingTopicType.Persistent\n      };\n    });\n\n    this.topicSubscribersDataGridService.bulkUnsubscribeSubscribers(subscribers, () =>\n      this.refresh.emit()\n    );\n  }\n}\n","<c8y-title>{{ topicName$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    [icon]=\"'monitoring'\"\n    [label]=\"'Monitoring' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [label]=\"'Messaging service' | translate\"\n    [path]=\"'/monitoring/messaging-service'\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [label]=\"namespaceLabel$ | async\"\n    [path]=\"'/monitoring/messaging-service/namespace/' + (namespaceId$ | async)\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item [label]=\"topicName$ | async\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <a\n    class=\"btn btn-link\"\n    title=\"{{ 'Reload' | translate }}\"\n    (click)=\"refresh.emit()\"\n  >\n    <i\n      c8yIcon=\"refresh\"\n      [ngClass]=\"{ 'icon-spin': loading$ | async }\"\n    ></i>\n    {{ 'Reload' | translate }}\n  </a>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-flex d-col\">\n  <div class=\"bg-level-1 separator-bottom flex-no-shrink\">\n    <div class=\"card-block\">\n      <div\n        class=\"col-md-4 m-b-24 col-xs-12 d-flex p-t-24 gap-16 text-default a-i-center a-s-stretch\"\n      >\n        <div class=\"text-center d-col\">\n          <i\n            class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n            [c8yIcon]=\"'day-view'\"\n          ></i>\n          <span class=\"tag tag--default\">{{ 'Topic' | translate }}</span>\n        </div>\n        <span class=\"h4\">{{ topicName$ | async }}</span>\n      </div>\n      <div class=\"col-md-4\">\n        <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n          <legend translate>Topic usage</legend>\n\n          @if (loading$ | async) {\n            <c8y-loading></c8y-loading>\n          } @else {\n            @let overview = overview$ | async;\n            @if (overview) {\n              <ul class=\"list-unstyled small animated fadeIn\">\n                <li\n                  class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\"\n                  data-cy=\"topic-subscribers-view--active-subscribers\"\n                >\n                  <label class=\"small m-b-0 m-r-auto\">{{ 'Active subscribers' | translate }}</label>\n                  <span class=\"m-l-16\">{{ overview.topic.activeSubscribers | number }}</span>\n                </li>\n\n                <li\n                  class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\"\n                  data-cy=\"topic-subscribers-view--total-subscribers\"\n                >\n                  <label class=\"small m-b-0 m-r-auto\">{{ 'Total subscribers' | translate }}</label>\n                  <span class=\"m-l-16\">{{ overview.topic.subscribers | number }}</span>\n                </li>\n\n                <li\n                  class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\"\n                  data-cy=\"topic-subscribers-view--total-unacknowledged-messages\"\n                >\n                  <label class=\"small m-b-0 m-r-auto\">\n                    {{ 'Total unacknowledged messages' | translate }}\n                  </label>\n                  <span class=\"m-l-16\">{{ overview.topic.unackMsgBacklog | number }}</span>\n                </li>\n\n                <li\n                  class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\"\n                  data-cy=\"topic-subscribers-view--message-rate-in\"\n                >\n                  <label class=\"small m-b-0 m-r-auto\">\n                    {{ 'Message rate in' | translate }}\n                  </label>\n                  <span\n                    class=\"m-l-16\"\n                    ngNonBindable\n                    translate\n                    [translateParams]=\"{\n                      messagesPerSecond: overview.topic.msgRateIn | number\n                    }\"\n                  >\n                    {{ messagesPerSecond }} msg/s\n                  </span>\n                </li>\n\n                <li\n                  class=\"p-t-4 p-b-4 d-flex text-nowrap\"\n                  data-cy=\"topic-subscribers-view--message-rate-out\"\n                >\n                  <label class=\"small m-b-0 m-r-auto\">\n                    {{ 'Message rate out' | translate }}\n                  </label>\n                  <span\n                    class=\"m-l-16\"\n                    ngNonBindable\n                    translate\n                    [translateParams]=\"{\n                      messagesPerSecond: overview.topic.msgRateOut | number\n                    }\"\n                  >\n                    {{ messagesPerSecond }} msg/s\n                  </span>\n                </li>\n              </ul>\n            }\n          }\n        </fieldset>\n      </div>\n\n      <div class=\"col-md-4\">\n        <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n          <legend translate>Topic message backlog</legend>\n\n          @if (loading$ | async) {\n            <c8y-loading></c8y-loading>\n          } @else {\n            @let overview = overview$ | async;\n            @if (overview) {\n              <ul class=\"list-unstyled small animated fadeIn\">\n                <li\n                  class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\"\n                  data-cy=\"topic-subscribers-view--backlog-usage\"\n                >\n                  <label\n                    class=\"small m-b-0 m-r-auto\"\n                    translate\n                  >\n                    Backlog usage\n                  </label>\n                  <app-usage [percentage]=\"overview.topic.backlogUsagePercentage\"></app-usage>\n                  <span class=\"m-l-16\">{{ overview.topic.backlogSize | bytes }}</span>\n                </li>\n\n                <li\n                  class=\"p-t-4 p-b-4 d-flex text-nowrap\"\n                  data-cy=\"topic-subscribers-view--backlog-quota\"\n                >\n                  <label\n                    class=\"small m-b-0 m-r-auto\"\n                    translate\n                  >\n                    Backlog quota\n                  </label>\n                  <span class=\"m-l-16\">\n                    {{\n                      overview.policies.backlogQuota?.limit > 0\n                        ? (overview.policies.backlogQuota?.limit | bytes)\n                        : '-'\n                    }}\n                  </span>\n                </li>\n              </ul>\n            }\n          }\n        </fieldset>\n      </div>\n    </div>\n  </div>\n  <c8y-data-grid\n    class=\"content-fullpage d-flex d-col border-top border-bottom\"\n    [title]=\"tableTitle | translate\"\n    [loadingItemsLabel]=\"loadingItemsLabel | translate\"\n    [loadMoreItemsLabel]=\"loadMoreItemsLabel | translate\"\n    [columns]=\"columns\"\n    [pagination]=\"pagination\"\n    [serverSideDataCallback]=\"serverSideDataCallback\"\n    [refresh]=\"refresh\"\n    [hideReload]=\"true\"\n    [selectable]=\"selectable\"\n    [actionControls]=\"actionControls\"\n    [bulkActionControls]=\"bulkActionControls\"\n  >\n    <c8y-ui-empty-state\n      [icon]=\"stats?.size > 0 ? 'search' : 'input'\"\n      [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n      [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n      *emptyStateContext=\"let stats\"\n      [horizontal]=\"stats?.size > 0\"\n    ></c8y-ui-empty-state>\n\n    <c8y-column name=\"name\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        <span title=\"{{ context.value }}\">\n          {{ context.value }}\n        </span>\n      </ng-container>\n    </c8y-column>\n\n    <c8y-column name=\"activeClients\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        <span title=\"{{ context.value | number }}\">\n          {{ context.value | number }}\n        </span>\n      </ng-container>\n    </c8y-column>\n\n    <c8y-column name=\"messageAckRate\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        <span title=\"{{ context.value | number }}\">\n          {{ context.value | number }}\n        </span>\n      </ng-container>\n    </c8y-column>\n\n    <c8y-column name=\"lastAcknowledgeDate\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        @if (context.value) {\n          <span title=\"{{ context.value }}\">\n            {{ context.value | relativeTime }}\n          </span>\n        } @else {\n          &ndash;\n        }\n      </ng-container>\n    </c8y-column>\n\n    <c8y-column name=\"unackMsgBacklog\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        <span title=\"{{ context.value | number }}\">\n          {{ context.value | number }}\n        </span>\n      </ng-container>\n    </c8y-column>\n\n    <c8y-column name=\"backlogUsagePercentage\">\n      <ng-container *c8yCellRendererDef=\"let context\">\n        <span title=\"{{ context.value / 100 | percent: '1.0-2' }}\">\n          {{ context.value / 100 | percent: '1.0-2' }}\n        </span>\n      </ng-container>\n    </c8y-column>\n  </c8y-data-grid>\n</div>\n","import { Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TabFactory } from '@c8y/ngx-components';\nimport { Router } from '@angular/router';\nimport { basePath } from '../constants';\n\n@Injectable()\nexport class TopicDetailsTabFactory implements TabFactory {\n  constructor(public router: Router) {}\n\n  get() {\n    const pattern = /\\/namespace\\/(.+)\\/topic\\/(.+)\\/subscribers$/;\n    const matches = this.router.url.match(pattern);\n\n    if (matches) {\n      const namespace = matches[1];\n      const topic = matches[2];\n      return [\n        {\n          path: basePath + `/namespace/${namespace}/topic/${topic}/subscribers`,\n          priority: 500,\n          label: gettext('Subscribers')\n        }\n      ];\n    }\n    return [];\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ExtensionFactory, PreviewFeature } from '@c8y/ngx-components';\nimport { ApplicationService } from '@c8y/client';\nimport {\n  MESSAGING_MANAGEMENT_FEATURE_KEY,\n  MESSAGING_MANAGEMENT_MICROSERVICE_NAME\n} from './constants';\n\n@Injectable({ providedIn: 'root' })\nexport class MessagingManagementPreviewFactory implements ExtensionFactory<PreviewFeature> {\n  private readonly applicationService = inject(ApplicationService);\n\n  async get() {\n    const microserviceSubscribed = await this.applicationService\n      .isAvailable(MESSAGING_MANAGEMENT_MICROSERVICE_NAME)\n      .then(({ data: subscribed }) => subscribed)\n      .catch(() => false);\n\n    if (!microserviceSubscribed) {\n      return null;\n    }\n\n    return {\n      key: MESSAGING_MANAGEMENT_FEATURE_KEY,\n      label: 'Messaging service - monitoring & management',\n      description: () =>\n        import('@c8y/style/markdown-files/messaging-management-preview.md').then(m => m.default),\n      settings: {\n        reload: true\n      }\n    };\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { hookNavigator, hookPreview, hookRoute, hookTab } from '@c8y/ngx-components';\nimport { MessagingNavigatorNodeFactory } from './navigator/messaging-navigator-factory';\nimport { NamespaceListComponent } from './messaging/namespace-list/namespace-list.component';\nimport { TopicListViewComponent } from './messaging/topic/topic-list-view.component';\nimport { TopicSubscribersViewComponent } from './messaging/topic/topic-subscribers-view/topic-subscribers-view.component';\nimport { TopicDetailsTabFactory } from './navigator/topic-details-tab.factory';\nimport { basePath } from './constants';\nimport { MessagingManagementGuard } from './messaging-management.guard';\nimport { MessagingManagementPreviewFactory } from './messaging-management-preview.factory';\n\n@NgModule({\n  providers: [\n    hookRoute([\n      {\n        path: basePath,\n        component: NamespaceListComponent,\n        canActivate: [MessagingManagementGuard]\n      },\n      {\n        path: basePath + '/namespace/:namespace',\n        component: TopicListViewComponent,\n        canActivate: [MessagingManagementGuard]\n      },\n      {\n        path: basePath + '/namespace/:namespace/topic/:topic',\n        redirectTo: basePath + '/namespace/:namespace/topic/:topic/subscribers',\n        pathMatch: 'full'\n      },\n      {\n        path: basePath + '/namespace/:namespace/topic/:topic/subscribers',\n        component: TopicSubscribersViewComponent,\n        canActivate: [MessagingManagementGuard]\n      }\n    ]),\n    hookTab(TopicDetailsTabFactory),\n    hookNavigator(MessagingNavigatorNodeFactory),\n    hookPreview(MessagingManagementPreviewFactory)\n  ]\n})\nexport class MessagingManagementModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}