@c8y/ngx-components 1021.71.3 → 1021.73.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/branding/shared/lazy/branding/branding.component.d.ts.map +1 -1
- package/core/beta-feature/beta-preview.component.d.ts +0 -1
- package/core/beta-feature/beta-preview.component.d.ts.map +1 -1
- package/core/beta-feature/beta-preview.service.d.ts +1 -1
- package/core/beta-feature/beta-preview.service.d.ts.map +1 -1
- package/core/common/ApplicationOptions.d.ts +4 -1
- package/core/common/ApplicationOptions.d.ts.map +1 -1
- package/esm2022/branding/shared/lazy/branding/branding.component.mjs +4 -5
- package/esm2022/core/beta-feature/beta-preview.component.mjs +1 -3
- package/esm2022/core/beta-feature/beta-preview.service.mjs +10 -6
- package/esm2022/core/common/ApplicationOptions.mjs +1 -1
- package/esm2022/datapoint-explorer/view/datapoint-explorer.component.mjs +3 -3
- package/esm2022/datapoint-selector/datapoint-selector.component.mjs +3 -3
- package/esm2022/ecosystem/packages/package-versions/packages-versions.component.mjs +3 -3
- package/esm2022/messaging-management/messaging-management.module.mjs +21 -5
- package/esm2022/register-device/general/general-device-registration.component.mjs +3 -3
- package/esm2022/register-device/general/general-device-registration.service.mjs +2 -2
- package/esm2022/trusted-certificates/list/trusted-certificate-list.component.mjs +6 -3
- package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.mjs +3 -3
- package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.mjs +3 -3
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +3 -4
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +2 -2
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +2 -2
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +2 -2
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-messaging-management.mjs +19 -3
- package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-register-device.mjs +3 -3
- package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +5 -2
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +4 -4
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +9 -6
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +314 -41
- package/locales/es.po +315 -42
- package/locales/fr.po +315 -42
- package/locales/ja_JP.po +308 -47
- package/locales/ko.po +314 -42
- package/locales/locales.pot +305 -31
- package/locales/nl.po +312 -40
- package/locales/pl.po +315 -42
- package/locales/pt_BR.po +312 -39
- package/locales/zh_CN.po +312 -40
- package/locales/zh_TW.po +313 -42
- package/messaging-management/messaging-management.module.d.ts.map +1 -1
- package/package.json +1 -1
- package/trusted-certificates/list/trusted-certificate-list.component.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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.module.ts","../../messaging-management/c8y-ngx-components-messaging-management.ts"],"sourcesContent":["import { gettext } from '@c8y/ngx-components';\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 {\n AppStateService,\n ExtensionFactory,\n gettext,\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';\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 { C8yTranslatePipe, gettext, 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 { C8yTranslateModule, gettext, 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 class=\"h1\">\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 >\n {{ ITEM_DETAILS[dataType].title | translate }}\n </span>\n </div>\n</div>\n<div\n class=\"card-footer d-flex gap-16 j-c-center a-i-center\"\n *ngIf=\"dataType === DATA_TYPE.topics && limit !== 0\"\n>\n <span\n class=\"tag tag--default no-pointer\"\n data-cy=\"card-limit\"\n >\n {{ topicsLimitLabel | translate: { backlogQuotaLimit: limit | backlogQuotaLimit } }}\n </span>\n <app-usage\n [count]=\"value\"\n [limit]=\"limit\"\n ></app-usage>\n</div>\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 class=\"h4\">{{ namespaceLabel }}</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';\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 {\n BaseColumn,\n Column,\n DataSourceModifier,\n gettext,\n ServerSideDataResult\n} 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 {\n ActionBarItemComponent,\n AppStateService,\n BreadcrumbModule,\n BytesPipe,\n C8yTranslatePipe,\n Column,\n DataGridModule,\n DataSourceModifier,\n EmptyStateComponent,\n EmptyStateContextDirective,\n gettext,\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 <ng-container *ngIf=\"loading$ | async; else serviceUsageLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceUsageLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.namespace as namespace\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Topics' | translate }}</label>\n <ng-container *ngIf=\"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 </ng-container>\n <ng-container *ngIf=\"namespace?.topics?.limit === 0\">\n <span class=\"m-l-16\">{{ namespace?.topics?.count | number }}</span>\n </ng-container>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex text-nowrap\">\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 </ng-container>\n </ng-template>\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 <ng-container *ngIf=\"loading$ | async; else serviceMessageBacklogLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceMessageBacklogLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.policies as policies\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex text-nowrap\">\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 </ng-container>\n </ng-template>\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 {\n AlertService,\n BaseColumn,\n Column,\n DataSourceModifier,\n gettext,\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('Acknowledgment 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 {\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 gettext,\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 <ng-container *ngIf=\"loading$ | async; else topicSummary\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #topicSummary>\n <ng-container *ngIf=\"overview$ | async as overview\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex text-nowrap\">\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 </ng-container>\n </ng-template>\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 <ng-container *ngIf=\"loading$ | async; else topicBacklog\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #topicBacklog>\n <ng-container *ngIf=\"overview$ | async as overview\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex text-nowrap\">\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 </ng-container>\n </ng-template>\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 <span\n title=\"{{ context.value }}\"\n *ngIf=\"context.value; else noLastAcknwoldegeDate\"\n >\n {{ context.value | relativeTime }}\n </span>\n <ng-template #noLastAcknwoldegeDate>–</ng-template>\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, 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 { NgModule } from '@angular/core';\nimport { hookNavigator, 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';\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 ]\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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"}
|
|
1
|
+
{"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.module.ts","../../messaging-management/c8y-ngx-components-messaging-management.ts"],"sourcesContent":["import { gettext } from '@c8y/ngx-components';\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 {\n AppStateService,\n ExtensionFactory,\n gettext,\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';\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 { C8yTranslatePipe, gettext, 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 { C8yTranslateModule, gettext, 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 class=\"h1\">\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 >\n {{ ITEM_DETAILS[dataType].title | translate }}\n </span>\n </div>\n</div>\n<div\n class=\"card-footer d-flex gap-16 j-c-center a-i-center\"\n *ngIf=\"dataType === DATA_TYPE.topics && limit !== 0\"\n>\n <span\n class=\"tag tag--default no-pointer\"\n data-cy=\"card-limit\"\n >\n {{ topicsLimitLabel | translate: { backlogQuotaLimit: limit | backlogQuotaLimit } }}\n </span>\n <app-usage\n [count]=\"value\"\n [limit]=\"limit\"\n ></app-usage>\n</div>\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 class=\"h4\">{{ namespaceLabel }}</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';\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 {\n BaseColumn,\n Column,\n DataSourceModifier,\n gettext,\n ServerSideDataResult\n} 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 {\n ActionBarItemComponent,\n AppStateService,\n BreadcrumbModule,\n BytesPipe,\n C8yTranslatePipe,\n Column,\n DataGridModule,\n DataSourceModifier,\n EmptyStateComponent,\n EmptyStateContextDirective,\n gettext,\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 <ng-container *ngIf=\"loading$ | async; else serviceUsageLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceUsageLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.namespace as namespace\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Topics' | translate }}</label>\n <ng-container *ngIf=\"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 </ng-container>\n <ng-container *ngIf=\"namespace?.topics?.limit === 0\">\n <span class=\"m-l-16\">{{ namespace?.topics?.count | number }}</span>\n </ng-container>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex text-nowrap\">\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 </ng-container>\n </ng-template>\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 <ng-container *ngIf=\"loading$ | async; else serviceMessageBacklogLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceMessageBacklogLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.policies as policies\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex text-nowrap\">\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 </ng-container>\n </ng-template>\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 {\n AlertService,\n BaseColumn,\n Column,\n DataSourceModifier,\n gettext,\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('Acknowledgment 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 {\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 gettext,\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 <ng-container *ngIf=\"loading$ | async; else topicSummary\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #topicSummary>\n <ng-container *ngIf=\"overview$ | async as overview\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex text-nowrap\">\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 </ng-container>\n </ng-template>\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 <ng-container *ngIf=\"loading$ | async; else topicBacklog\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #topicBacklog>\n <ng-container *ngIf=\"overview$ | async as overview\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\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 class=\"p-t-4 p-b-4 d-flex text-nowrap\">\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 </ng-container>\n </ng-template>\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 <span\n title=\"{{ context.value }}\"\n *ngIf=\"context.value; else noLastAcknwoldegeDate\"\n >\n {{ context.value | relativeTime }}\n </span>\n <ng-template #noLastAcknwoldegeDate>–</ng-template>\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, 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 { 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, MESSAGING_MANAGEMENT_FEATURE_KEY } from './constants';\nimport { MessagingManagementGuard } from './messaging-management.guard';\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({\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})\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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"}
|