@c8y/ngx-components 1021.67.0 → 1021.71.0
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-import-modal/branding-import-modal.component.d.ts.map +1 -1
- package/core/beta-feature/beta-feature-show-notification.service.d.ts +10 -0
- package/core/beta-feature/beta-feature-show-notification.service.d.ts.map +1 -0
- package/core/beta-feature/beta-feature.providers.d.ts +3 -0
- package/core/beta-feature/beta-feature.providers.d.ts.map +1 -0
- package/core/beta-feature/beta-preview-button.component.d.ts +17 -0
- package/core/beta-feature/beta-preview-button.component.d.ts.map +1 -0
- package/core/beta-feature/beta-preview-drawer.factory.d.ts +19 -0
- package/core/beta-feature/beta-preview-drawer.factory.d.ts.map +1 -0
- package/core/beta-feature/beta-preview.component.d.ts +25 -0
- package/core/beta-feature/beta-preview.component.d.ts.map +1 -0
- package/core/beta-feature/beta-preview.model.d.ts +24 -0
- package/core/beta-feature/beta-preview.model.d.ts.map +1 -0
- package/core/beta-feature/beta-preview.service.d.ts +47 -0
- package/core/beta-feature/beta-preview.service.d.ts.map +1 -0
- package/core/beta-feature/feature-cache.service.d.ts +26 -0
- package/core/beta-feature/feature-cache.service.d.ts.map +1 -0
- package/core/beta-feature/feature-state.pipe.d.ts +12 -0
- package/core/beta-feature/feature-state.pipe.d.ts.map +1 -0
- package/core/beta-feature/index.d.ts +7 -0
- package/core/beta-feature/index.d.ts.map +1 -0
- package/core/bottom-drawer/bottom-drawer-ref.d.ts.map +1 -1
- package/core/bottom-drawer/bottom-drawer.component.d.ts +1 -0
- package/core/bottom-drawer/bottom-drawer.component.d.ts.map +1 -1
- package/core/bottom-drawer/bottom-drawer.model.d.ts +4 -0
- package/core/bottom-drawer/bottom-drawer.model.d.ts.map +1 -1
- package/core/common/ApplicationOptions.d.ts +8 -0
- package/core/common/ApplicationOptions.d.ts.map +1 -1
- package/core/common/bytes.pipe.d.ts +26 -10
- package/core/common/bytes.pipe.d.ts.map +1 -1
- package/core/common/index.d.ts +1 -0
- package/core/common/index.d.ts.map +1 -1
- package/core/common/notification-display.service.d.ts +19 -0
- package/core/common/notification-display.service.d.ts.map +1 -0
- package/core/core.module.d.ts.map +1 -1
- package/core/header/header-bar/header-bar.component.d.ts +1 -0
- package/core/header/header-bar/header-bar.component.d.ts.map +1 -1
- package/core/header/header.service.d.ts +4 -1
- package/core/header/header.service.d.ts.map +1 -1
- package/core/index.d.ts +1 -0
- package/core/index.d.ts.map +1 -1
- package/datapoint-explorer/datapoint-explorer-navigation-factory.d.ts +10 -0
- package/datapoint-explorer/datapoint-explorer-navigation-factory.d.ts.map +1 -0
- package/datapoint-explorer/datapoint-explorer-route-factory.d.ts +10 -0
- package/datapoint-explorer/datapoint-explorer-route-factory.d.ts.map +1 -0
- package/datapoint-explorer/datapoint-explorer.module.d.ts.map +1 -1
- package/echart/charts.component.d.ts +14 -3
- package/echart/charts.component.d.ts.map +1 -1
- package/esm2022/branding/shared/lazy/branding-import-modal/branding-import-modal.component.mjs +4 -7
- package/esm2022/core/beta-feature/beta-feature-show-notification.service.mjs +17 -0
- package/esm2022/core/beta-feature/beta-feature.providers.mjs +9 -0
- package/esm2022/core/beta-feature/beta-preview-button.component.mjs +53 -0
- package/esm2022/core/beta-feature/beta-preview-drawer.factory.mjs +52 -0
- package/esm2022/core/beta-feature/beta-preview.component.mjs +64 -0
- package/esm2022/core/beta-feature/beta-preview.model.mjs +2 -0
- package/esm2022/core/beta-feature/beta-preview.service.mjs +114 -0
- package/esm2022/core/beta-feature/feature-cache.service.mjs +48 -0
- package/esm2022/core/beta-feature/feature-state.pipe.mjs +22 -0
- package/esm2022/core/beta-feature/index.mjs +7 -0
- package/esm2022/core/bottom-drawer/bottom-drawer-ref.mjs +4 -1
- package/esm2022/core/bottom-drawer/bottom-drawer.component.mjs +4 -3
- package/esm2022/core/bottom-drawer/bottom-drawer.model.mjs +1 -1
- package/esm2022/core/common/ApplicationOptions.mjs +1 -1
- package/esm2022/core/common/bytes.pipe.mjs +47 -18
- package/esm2022/core/common/index.mjs +2 -1
- package/esm2022/core/common/notification-display.service.mjs +2 -0
- package/esm2022/core/core.module.mjs +4 -2
- package/esm2022/core/data-grid/data-grid.component.mjs +3 -3
- package/esm2022/core/docs/legal-notices-outlet/legal-notices-outlet.component.mjs +3 -3
- package/esm2022/core/header/header-bar/header-bar.component.mjs +4 -3
- package/esm2022/core/header/header.service.mjs +12 -6
- package/esm2022/core/index.mjs +2 -1
- package/esm2022/core/user/user-details-drawer/user-details-drawer.component.mjs +3 -3
- package/esm2022/core/version/version-list/version-list.component.mjs +3 -3
- package/esm2022/datapoint-explorer/datapoint-explorer-navigation-factory.mjs +31 -0
- package/esm2022/datapoint-explorer/datapoint-explorer-route-factory.mjs +37 -0
- package/esm2022/datapoint-explorer/datapoint-explorer.module.mjs +22 -48
- package/esm2022/echart/charts.component.mjs +50 -3
- package/esm2022/messaging-management/api/model/backlogQuota.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespace.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespaceDetails.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespaceList.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespacePolicies.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespacePublishers.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespaceSubscribers.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespaceTopics.mjs +2 -0
- package/esm2022/messaging-management/api/model/pageStatistics.mjs +2 -0
- package/esm2022/messaging-management/api/model/pageable.mjs +2 -0
- package/esm2022/messaging-management/api/model/sortable.mjs +2 -0
- package/esm2022/messaging-management/api/model/subscriber.mjs +2 -0
- package/esm2022/messaging-management/api/model/subscriberFilters.mjs +2 -0
- package/esm2022/messaging-management/api/model/subscriberList.mjs +2 -0
- package/esm2022/messaging-management/api/model/subscriberToDelete.mjs +2 -0
- package/esm2022/messaging-management/api/model/topic.mjs +2 -0
- package/esm2022/messaging-management/api/model/topicDetailFilters.mjs +2 -0
- package/esm2022/messaging-management/api/model/topicList.mjs +2 -0
- package/esm2022/messaging-management/api/model/topicListFilters.mjs +2 -0
- package/esm2022/messaging-management/api/model/topicType.mjs +9 -0
- package/esm2022/messaging-management/api/services/messaging-namespaces.service.mjs +83 -0
- package/esm2022/messaging-management/api/services/messaging-subscribers.service.mjs +55 -0
- package/esm2022/messaging-management/api/services/messaging-topics.service.mjs +48 -0
- package/esm2022/messaging-management/c8y-ngx-components-messaging-management.mjs +5 -0
- package/esm2022/messaging-management/constants.mjs +4 -0
- package/esm2022/messaging-management/index.mjs +2 -0
- package/esm2022/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.mjs +43 -0
- package/esm2022/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.mjs +36 -0
- package/esm2022/messaging-management/messaging/namespace-list/namespace-list.component.mjs +51 -0
- package/esm2022/messaging-management/messaging/shared/usage/usage.component.mjs +68 -0
- package/esm2022/messaging-management/messaging/topic/topic-list-view.component.mjs +81 -0
- package/esm2022/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.mjs +220 -0
- package/esm2022/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.mjs +137 -0
- package/esm2022/messaging-management/messaging/topic/topics-data-grid.service.mjs +113 -0
- package/esm2022/messaging-management/messaging-management.guard.mjs +40 -0
- package/esm2022/messaging-management/messaging-management.module.mjs +72 -0
- package/esm2022/messaging-management/navigator/messaging-navigator-factory.mjs +55 -0
- package/esm2022/messaging-management/navigator/topic-details-tab.factory.mjs +33 -0
- package/esm2022/messaging-management/utils/backlog-quota-limit.pipe.mjs +32 -0
- package/esm2022/messaging-management/utils/namespace-props.mjs +23 -0
- package/esm2022/messaging-management/utils/time-to-live.pipe.mjs +122 -0
- package/esm2022/operations/device-selector/device-selector.component.mjs +5 -1
- package/esm2022/register-device/bulk/bulk-device-registration-modal.component.mjs +8 -10
- package/esm2022/register-device/general/general-device-registration.component.mjs +8 -10
- package/esm2022/trusted-certificates/list/trusted-certificate-list.component.mjs +10 -12
- package/esm2022/upgrade/ng1/downgraded.services.mjs +3 -2
- package/esm2022/upgrade/ng1/index.mjs +3 -2
- package/esm2022/widgets/cockpit-exports/index.mjs +2 -2
- package/esm2022/widgets/definitions/datapoints-graph/datapoint-graph-widget-factory.mjs +56 -0
- package/esm2022/widgets/definitions/datapoints-graph/index.mjs +12 -29
- package/esm2022/widgets/definitions/index.mjs +3 -2
- package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.mjs +18 -3
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +3 -6
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +81 -48
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +49 -2
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-messaging-management.mjs +1225 -0
- package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs +4 -0
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-register-device.mjs +10 -14
- package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +18 -20
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade.mjs +3 -1
- package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +65 -28
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +17 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +396 -39
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +272 -5
- package/locales/es.po +271 -4
- package/locales/fr.po +272 -5
- package/locales/ja_JP.po +272 -5
- package/locales/ko.po +271 -4
- package/locales/locales.pot +271 -8
- package/locales/nl.po +271 -4
- package/locales/pl.po +271 -4
- package/locales/pt_BR.po +272 -5
- package/locales/zh_CN.po +271 -4
- package/locales/zh_TW.po +272 -5
- package/messaging-management/api/model/backlogQuota.d.ts +14 -0
- package/messaging-management/api/model/backlogQuota.d.ts.map +1 -0
- package/messaging-management/api/model/namespace.d.ts +13 -0
- package/messaging-management/api/model/namespace.d.ts.map +1 -0
- package/messaging-management/api/model/namespaceDetails.d.ts +8 -0
- package/messaging-management/api/model/namespaceDetails.d.ts.map +1 -0
- package/messaging-management/api/model/namespaceList.d.ts +5 -0
- package/messaging-management/api/model/namespaceList.d.ts.map +1 -0
- package/messaging-management/api/model/namespacePolicies.d.ts +10 -0
- package/messaging-management/api/model/namespacePolicies.d.ts.map +1 -0
- package/messaging-management/api/model/namespacePublishers.d.ts +4 -0
- package/messaging-management/api/model/namespacePublishers.d.ts.map +1 -0
- package/messaging-management/api/model/namespaceSubscribers.d.ts +4 -0
- package/messaging-management/api/model/namespaceSubscribers.d.ts.map +1 -0
- package/messaging-management/api/model/namespaceTopics.d.ts +5 -0
- package/messaging-management/api/model/namespaceTopics.d.ts.map +1 -0
- package/messaging-management/api/model/pageStatistics.d.ts +12 -0
- package/messaging-management/api/model/pageStatistics.d.ts.map +1 -0
- package/messaging-management/api/model/pageable.d.ts +8 -0
- package/messaging-management/api/model/pageable.d.ts.map +1 -0
- package/messaging-management/api/model/sortable.d.ts +6 -0
- package/messaging-management/api/model/sortable.d.ts.map +1 -0
- package/messaging-management/api/model/subscriber.d.ts +28 -0
- package/messaging-management/api/model/subscriber.d.ts.map +1 -0
- package/messaging-management/api/model/subscriberFilters.d.ts +13 -0
- package/messaging-management/api/model/subscriberFilters.d.ts.map +1 -0
- package/messaging-management/api/model/subscriberList.d.ts +7 -0
- package/messaging-management/api/model/subscriberList.d.ts.map +1 -0
- package/messaging-management/api/model/subscriberToDelete.d.ts +12 -0
- package/messaging-management/api/model/subscriberToDelete.d.ts.map +1 -0
- package/messaging-management/api/model/topic.d.ts +52 -0
- package/messaging-management/api/model/topic.d.ts.map +1 -0
- package/messaging-management/api/model/topicDetailFilters.d.ts +9 -0
- package/messaging-management/api/model/topicDetailFilters.d.ts.map +1 -0
- package/messaging-management/api/model/topicList.d.ts +7 -0
- package/messaging-management/api/model/topicList.d.ts.map +1 -0
- package/messaging-management/api/model/topicListFilters.d.ts +12 -0
- package/messaging-management/api/model/topicListFilters.d.ts.map +1 -0
- package/messaging-management/api/model/topicType.d.ts +8 -0
- package/messaging-management/api/model/topicType.d.ts.map +1 -0
- package/messaging-management/api/services/messaging-namespaces.service.d.ts +52 -0
- package/messaging-management/api/services/messaging-namespaces.service.d.ts.map +1 -0
- package/messaging-management/api/services/messaging-subscribers.service.d.ts +30 -0
- package/messaging-management/api/services/messaging-subscribers.service.d.ts.map +1 -0
- package/messaging-management/api/services/messaging-topics.service.d.ts +21 -0
- package/messaging-management/api/services/messaging-topics.service.d.ts.map +1 -0
- package/messaging-management/c8y-ngx-components-messaging-management.d.ts.map +1 -0
- package/messaging-management/constants.d.ts +4 -0
- package/messaging-management/constants.d.ts.map +1 -0
- package/messaging-management/index.d.ts +2 -0
- package/messaging-management/index.d.ts.map +1 -0
- package/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.d.ts +29 -0
- package/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.d.ts.map +1 -0
- package/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.d.ts +15 -0
- package/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.d.ts.map +1 -0
- package/messaging-management/messaging/namespace-list/namespace-list.component.d.ts +17 -0
- package/messaging-management/messaging/namespace-list/namespace-list.component.d.ts.map +1 -0
- package/messaging-management/messaging/shared/usage/usage.component.d.ts +40 -0
- package/messaging-management/messaging/shared/usage/usage.component.d.ts.map +1 -0
- package/messaging-management/messaging/topic/topic-list-view.component.d.ts +38 -0
- package/messaging-management/messaging/topic/topic-list-view.component.d.ts.map +1 -0
- package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.d.ts +21 -0
- package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.d.ts.map +1 -0
- package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.d.ts +52 -0
- package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.d.ts.map +1 -0
- package/messaging-management/messaging/topic/topics-data-grid.service.d.ts +13 -0
- package/messaging-management/messaging/topic/topics-data-grid.service.d.ts.map +1 -0
- package/messaging-management/messaging-management.guard.d.ts +12 -0
- package/messaging-management/messaging-management.guard.d.ts.map +1 -0
- package/messaging-management/messaging-management.module.d.ts +7 -0
- package/messaging-management/messaging-management.module.d.ts.map +1 -0
- package/messaging-management/navigator/messaging-navigator-factory.d.ts +18 -0
- package/messaging-management/navigator/messaging-navigator-factory.d.ts.map +1 -0
- package/messaging-management/navigator/topic-details-tab.factory.d.ts +15 -0
- package/messaging-management/navigator/topic-details-tab.factory.d.ts.map +1 -0
- package/messaging-management/utils/backlog-quota-limit.pipe.d.ts +13 -0
- package/messaging-management/utils/backlog-quota-limit.pipe.d.ts.map +1 -0
- package/messaging-management/utils/namespace-props.d.ts +10 -0
- package/messaging-management/utils/namespace-props.d.ts.map +1 -0
- package/messaging-management/utils/time-to-live.pipe.d.ts +16 -0
- package/messaging-management/utils/time-to-live.pipe.d.ts.map +1 -0
- package/operations/device-selector/device-selector.component.d.ts.map +1 -1
- package/package.json +1 -1
- package/register-device/bulk/bulk-device-registration-modal.component.d.ts +5 -5
- package/register-device/bulk/bulk-device-registration-modal.component.d.ts.map +1 -1
- package/register-device/general/general-device-registration.component.d.ts +5 -5
- package/register-device/general/general-device-registration.component.d.ts.map +1 -1
- package/trusted-certificates/list/trusted-certificate-list.component.d.ts +4 -4
- package/trusted-certificates/list/trusted-certificate-list.component.d.ts.map +1 -1
- package/upgrade/ng1/downgraded.services.d.ts +1 -0
- package/upgrade/ng1/downgraded.services.d.ts.map +1 -1
- package/upgrade/ng1/index.d.ts.map +1 -1
- package/widgets/cockpit-exports/index.d.ts +1 -1
- package/widgets/definitions/datapoints-graph/datapoint-graph-widget-factory.d.ts +11 -0
- package/widgets/definitions/datapoints-graph/datapoint-graph-widget-factory.d.ts.map +1 -0
- package/widgets/definitions/datapoints-graph/index.d.ts +0 -28
- package/widgets/definitions/datapoints-graph/index.d.ts.map +1 -1
- package/widgets/definitions/index.d.ts +2 -1
- package/widgets/definitions/index.d.ts.map +1 -1
- package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts +2 -0
- package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts.map +1 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Component, DestroyRef, EventEmitter, inject } from '@angular/core';
|
|
2
|
+
import { ActivatedRoute, RouterLink } from '@angular/router';
|
|
3
|
+
import { ActionBarItemComponent, AppStateService, BreadcrumbModule, BytesPipe, C8yTranslatePipe, DataGridModule, EmptyStateComponent, EmptyStateContextDirective, gettext, HeaderModule, IconDirective, LoadingComponent } from '@c8y/ngx-components';
|
|
4
|
+
import { AsyncPipe, DecimalPipe, NgClass, NgIf, PercentPipe } from '@angular/common';
|
|
5
|
+
import { MessagingNamespacesService } from '../../api/services/messaging-namespaces.service';
|
|
6
|
+
import { BacklogQuotaLimitPipe } from '../../utils/backlog-quota-limit.pipe';
|
|
7
|
+
import { UsageComponent } from '../shared/usage/usage.component';
|
|
8
|
+
import { TimeToLivePipe } from '../../utils/time-to-live.pipe';
|
|
9
|
+
import { NAMESPACE_PROPS } from '../../utils/namespace-props';
|
|
10
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
11
|
+
import { TopicsDataGridService } from './topics-data-grid.service';
|
|
12
|
+
import { map, shareReplay, switchMap, tap } from 'rxjs/operators';
|
|
13
|
+
import { BehaviorSubject, combineLatest, firstValueFrom } from 'rxjs';
|
|
14
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "@c8y/ngx-components";
|
|
17
|
+
export class TopicListViewComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.route = inject(ActivatedRoute);
|
|
20
|
+
this.appState = inject(AppStateService);
|
|
21
|
+
this.namespacesService = inject(MessagingNamespacesService);
|
|
22
|
+
this.topicsDataGridService = inject(TopicsDataGridService);
|
|
23
|
+
this.translateService = inject(TranslateService);
|
|
24
|
+
this.destroyRef = inject(DestroyRef);
|
|
25
|
+
this.loading$ = new BehaviorSubject(false);
|
|
26
|
+
this.refresh = new EventEmitter();
|
|
27
|
+
this.tenantId$ = this.appState.currentTenant.pipe(map(tenant => tenant.name));
|
|
28
|
+
this.namespaceId$ = this.route.params.pipe(map(params => params['namespace']));
|
|
29
|
+
this.namespaceLabel$ = this.namespaceId$.pipe(map(namespaceId => this.translateService.instant(NAMESPACE_PROPS[namespaceId].label)));
|
|
30
|
+
this.icon$ = this.namespaceId$.pipe(map(namespaceId => NAMESPACE_PROPS[namespaceId].icon));
|
|
31
|
+
this.namespaceDetails$ = combineLatest([this.tenantId$, this.namespaceId$, this.refresh]).pipe(tap(() => this.loading$.next(true)), switchMap(([tenantId, namespaceId]) => this.namespacesService.getNamespaceDetails(tenantId, namespaceId)), tap(() => this.loading$.next(false)), shareReplay(1));
|
|
32
|
+
this.tableTitle = gettext('Topics');
|
|
33
|
+
this.loadingItemsLabel = gettext('Loading topics...');
|
|
34
|
+
this.loadMoreItemsLabel = gettext('Load more topics');
|
|
35
|
+
this.noResultsMessage = gettext('No matching topics found.');
|
|
36
|
+
this.noResultsSubtitle = gettext('Refine your search terms or check your spelling.');
|
|
37
|
+
this.noDataMessage = gettext('No topics to display.');
|
|
38
|
+
this.noDataSubtitle = gettext('Create new topics to monitor them here.');
|
|
39
|
+
this.columns = this.topicsDataGridService.getColumns();
|
|
40
|
+
this.pagination = {
|
|
41
|
+
pageSize: 20,
|
|
42
|
+
currentPage: 1
|
|
43
|
+
};
|
|
44
|
+
this.serverSideDataCallback = this.onDataSourceModifier.bind(this);
|
|
45
|
+
}
|
|
46
|
+
async onDataSourceModifier(dataSourceModifier) {
|
|
47
|
+
return firstValueFrom(combineLatest([this.tenantId$, this.namespaceId$]).pipe(switchMap(([tenantId, namespaceId]) => this.topicsDataGridService.getServerSideData(tenantId, namespaceId, dataSourceModifier))));
|
|
48
|
+
}
|
|
49
|
+
ngAfterViewInit() {
|
|
50
|
+
this.route.params
|
|
51
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
52
|
+
.subscribe(() => this.refresh.emit());
|
|
53
|
+
}
|
|
54
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicListViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
55
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TopicListViewComponent, isStandalone: true, selector: "app-topic-list-view", ngImport: i0, template: "<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", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: HeaderModule }, { kind: "component", type: i1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "ngmodule", type: DataGridModule }, { kind: "directive", type: i1.CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: i1.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i1.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "hideReload"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: BacklogQuotaLimitPipe, name: "backlogQuotaLimit" }, { kind: "component", type: UsageComponent, selector: "app-usage", inputs: ["count", "limit", "percentage"] }, { kind: "pipe", type: BytesPipe, name: "bytes" }, { kind: "pipe", type: TimeToLivePipe, name: "timeToLive" }, { kind: "ngmodule", type: BreadcrumbModule }, { kind: "component", type: i1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: PercentPipe, name: "percent" }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
|
|
56
|
+
}
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicListViewComponent, decorators: [{
|
|
58
|
+
type: Component,
|
|
59
|
+
args: [{ imports: [
|
|
60
|
+
RouterLink,
|
|
61
|
+
HeaderModule,
|
|
62
|
+
DataGridModule,
|
|
63
|
+
DecimalPipe,
|
|
64
|
+
C8yTranslatePipe,
|
|
65
|
+
BacklogQuotaLimitPipe,
|
|
66
|
+
UsageComponent,
|
|
67
|
+
BytesPipe,
|
|
68
|
+
TimeToLivePipe,
|
|
69
|
+
BreadcrumbModule,
|
|
70
|
+
LoadingComponent,
|
|
71
|
+
NgIf,
|
|
72
|
+
ActionBarItemComponent,
|
|
73
|
+
NgClass,
|
|
74
|
+
IconDirective,
|
|
75
|
+
PercentPipe,
|
|
76
|
+
EmptyStateComponent,
|
|
77
|
+
EmptyStateContextDirective,
|
|
78
|
+
AsyncPipe
|
|
79
|
+
], selector: 'app-topic-list-view', standalone: true, template: "<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" }]
|
|
80
|
+
}] });
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtbGlzdC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21lc3NhZ2luZy1tYW5hZ2VtZW50L21lc3NhZ2luZy90b3BpYy90b3BpYy1saXN0LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbWVzc2FnaW5nLW1hbmFnZW1lbnQvbWVzc2FnaW5nL3RvcGljL3RvcGljLWxpc3Qtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZ0JBQWdCLEVBRWhCLGNBQWMsRUFFZCxtQkFBbUIsRUFDbkIsMEJBQTBCLEVBQzFCLE9BQU8sRUFDUCxZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUlqQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDN0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0s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SixzQkFBc0IsMEpBQ3RCLE9BQU8sb0ZBQ1AsYUFBYSxzRUFDYixXQUFXLGdEQUNYLG1CQUFtQixvSEFDbkIsMEJBQTBCLDJEQUMxQixTQUFTOzs0RkFNQSxzQkFBc0I7a0JBMUJsQyxTQUFTOzhCQUNDO3dCQUNQLFVBQVU7d0JBQ1YsWUFBWTt3QkFDWixjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsZ0JBQWdCO3dCQUNoQixxQkFBcUI7d0JBQ3JCLGNBQWM7d0JBQ2QsU0FBUzt3QkFDVCxjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixJQUFJO3dCQUNKLHNCQUFzQjt3QkFDdEIsT0FBTzt3QkFDUCxhQUFhO3dCQUNiLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQiwwQkFBMEI7d0JBQzFCLFNBQVM7cUJBQ1YsWUFDUyxxQkFBcUIsY0FDbkIsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRGVzdHJveVJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXJMaW5rIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEFjdGlvbkJhckl0ZW1Db21wb25lbnQsXG4gIEFwcFN0YXRlU2VydmljZSxcbiAgQnJlYWRjcnVtYk1vZHVsZSxcbiAgQnl0ZXNQaXBlLFxuICBDOHlUcmFuc2xhdGVQaXBlLFxuICBDb2x1bW4sXG4gIERhdGFHcmlkTW9kdWxlLFxuICBEYXRhU291cmNlTW9kaWZpZXIsXG4gIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gIEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlLFxuICBnZXR0ZXh0LFxuICBIZWFkZXJNb2R1bGUsXG4gIEljb25EaXJlY3RpdmUsXG4gIExvYWRpbmdDb21wb25lbnQsXG4gIFBhZ2luYXRpb24sXG4gIFNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gIFNlcnZlclNpZGVEYXRhUmVzdWx0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBEZWNpbWFsUGlwZSwgTmdDbGFzcywgTmdJZiwgUGVyY2VudFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWVzc2FnaW5nTmFtZXNwYWNlc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9hcGkvc2VydmljZXMvbWVzc2FnaW5nLW5hbWVzcGFjZXMuc2VydmljZSc7XG5pbXBvcnQgeyBCYWNrbG9nUXVvdGFMaW1pdFBpcGUgfSBmcm9tICcuLi8uLi91dGlscy9iYWNrbG9nLXF1b3RhLWxpbWl0LnBpcGUnO1xuaW1wb3J0IHsgVXNhZ2VDb21wb25lbnQgfSBmcm9tICcuLi9zaGFyZWQvdXNhZ2UvdXNhZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IFRpbWVUb0xpdmVQaXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdGltZS10by1saXZlLnBpcGUnO1xuaW1wb3J0IHsgTkFNRVNQQUNFX1BST1BTIH0gZnJvbSAnLi4vLi4vdXRpbHMvbmFtZXNwYWNlLXByb3BzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRvcGljc0RhdGFHcmlkU2VydmljZSB9IGZyb20gJy4vdG9waWNzLWRhdGEtZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5AQ29tcG9uZW50KHtcbiAgaW1wb3J0czogW1xuICAgIFJvdXRlckxpbmssXG4gICAgSGVhZGVyTW9kdWxlLFxuICAgIERhdGFHcmlkTW9kdWxlLFxuICAgIERlY2ltYWxQaXBlLFxuICAgIEM4eVRyYW5zbGF0ZVBpcGUsXG4gICAgQmFja2xvZ1F1b3RhTGltaXRQaXBlLFxuICAgIFVzYWdlQ29tcG9uZW50LFxuICAgIEJ5dGVzUGlwZSxcbiAgICBUaW1lVG9MaXZlUGlwZSxcbiAgICBCcmVhZGNydW1iTW9kdWxlLFxuICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgTmdJZixcbiAgICBBY3Rpb25CYXJJdGVtQ29tcG9uZW50LFxuICAgIE5nQ2xhc3MsXG4gICAgSWNvbkRpcmVjdGl2ZSxcbiAgICBQZXJjZW50UGlwZSxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlLFxuICAgIEFzeW5jUGlwZVxuICBdLFxuICBzZWxlY3RvcjogJ2FwcC10b3BpYy1saXN0LXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vdG9waWMtbGlzdC12aWV3LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBUb3BpY0xpc3RWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgYXBwU3RhdGUgPSBpbmplY3QoQXBwU3RhdGVTZXJ2aWNlKTtcbiAgbmFtZXNwYWNlc1NlcnZpY2UgPSBpbmplY3QoTWVzc2FnaW5nTmFtZXNwYWNlc1NlcnZpY2UpO1xuICB0b3BpY3NEYXRhR3JpZFNlcnZpY2UgPSBpbmplY3QoVG9waWNzRGF0YUdyaWRTZXJ2aWNlKTtcbiAgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWZyZXNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHRlbmFudElkJCA9IHRoaXMuYXBwU3RhdGUuY3VycmVudFRlbmFudC5waXBlKG1hcCh0ZW5hbnQgPT4gdGVuYW50Lm5hbWUpKTtcbiAgbmFtZXNwYWNlSWQkID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShtYXAocGFyYW1zID0+IHBhcmFtc1snbmFtZXNwYWNlJ10gYXMgc3RyaW5nKSk7XG4gIG5hbWVzcGFjZUxhYmVsJCA9IHRoaXMubmFtZXNwYWNlSWQkLnBpcGUoXG4gICAgbWFwKG5hbWVzcGFjZUlkID0+IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KE5BTUVTUEFDRV9QUk9QU1tuYW1lc3BhY2VJZF0ubGFiZWwpKVxuICApO1xuICBpY29uJCA9IHRoaXMubmFtZXNwYWNlSWQkLnBpcGUobWFwKG5hbWVzcGFjZUlkID0+IE5BTUVTUEFDRV9QUk9QU1tuYW1lc3BhY2VJZF0uaWNvbikpO1xuXG4gIG5hbWVzcGFjZURldGFpbHMkID0gY29tYmluZUxhdGVzdChbdGhpcy50ZW5hbnRJZCQsIHRoaXMubmFtZXNwYWNlSWQkLCB0aGlzLnJlZnJlc2hdKS5waXBlKFxuICAgIHRhcCgoKSA9PiB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSkpLFxuICAgIHN3aXRjaE1hcCgoW3RlbmFudElkLCBuYW1lc3BhY2VJZF0pID0+XG4gICAgICB0aGlzLm5hbWVzcGFjZXNTZXJ2aWNlLmdldE5hbWVzcGFjZURldGFpbHModGVuYW50SWQsIG5hbWVzcGFjZUlkKVxuICAgICksXG4gICAgdGFwKCgpID0+IHRoaXMubG9hZGluZyQubmV4dChmYWxzZSkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgdGFibGVUaXRsZSA9IGdldHRleHQoJ1RvcGljcycpO1xuICBsb2FkaW5nSXRlbXNMYWJlbCA9IGdldHRleHQoJ0xvYWRpbmcgdG9waWNzLi4uJyk7XG4gIGxvYWRNb3JlSXRlbXNMYWJlbCA9IGdldHRleHQoJ0xvYWQgbW9yZSB0b3BpY3MnKTtcbiAgbm9SZXN1bHRzTWVzc2FnZSA9IGdldHRleHQoJ05vIG1hdGNoaW5nIHRvcGljcyBmb3VuZC4nKTtcbiAgbm9SZXN1bHRzU3VidGl0bGUgPSBnZXR0ZXh0KCdSZWZpbmUgeW91ciBzZWFyY2ggdGVybXMgb3IgY2hlY2sgeW91ciBzcGVsbGluZy4nKTtcbiAgbm9EYXRhTWVzc2FnZSA9IGdldHRleHQoJ05vIHRvcGljcyB0byBkaXNwbGF5LicpO1xuICBub0RhdGFTdWJ0aXRsZSA9IGdldHRleHQoJ0NyZWF0ZSBuZXcgdG9waWNzIHRvIG1vbml0b3IgdGhlbSBoZXJlLicpO1xuXG4gIGNvbHVtbnM6IENvbHVtbltdID0gdGhpcy50b3BpY3NEYXRhR3JpZFNlcnZpY2UuZ2V0Q29sdW1ucygpO1xuICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uID0ge1xuICAgIHBhZ2VTaXplOiAyMCxcbiAgICBjdXJyZW50UGFnZTogMVxuICB9O1xuXG4gIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgPSB0aGlzLm9uRGF0YVNvdXJjZU1vZGlmaWVyLmJpbmQodGhpcyk7XG4gIGFzeW5jIG9uRGF0YVNvdXJjZU1vZGlmaWVyKFxuICAgIGRhdGFTb3VyY2VNb2RpZmllcjogRGF0YVNvdXJjZU1vZGlmaWVyXG4gICk6IFByb21pc2U8U2VydmVyU2lkZURhdGFSZXN1bHQ+IHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oXG4gICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnRlbmFudElkJCwgdGhpcy5uYW1lc3BhY2VJZCRdKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKFt0ZW5hbnRJZCwgbmFtZXNwYWNlSWRdKSA9PlxuICAgICAgICAgIHRoaXMudG9waWNzRGF0YUdyaWRTZXJ2aWNlLmdldFNlcnZlclNpZGVEYXRhKHRlbmFudElkLCBuYW1lc3BhY2VJZCwgZGF0YVNvdXJjZU1vZGlmaWVyKVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJvdXRlLnBhcmFtc1xuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVmcmVzaC5lbWl0KCkpO1xuICB9XG59XG4iLCI8Yzh5LXRpdGxlPnt7IG5hbWVzcGFjZUxhYmVsJCB8IGFzeW5jIH19PC9jOHktdGl0bGU+XG5cbjxjOHktYnJlYWRjcnVtYj5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBbaWNvbl09XCInbW9uaXRvcmluZydcIlxuICAgIFtsYWJlbF09XCInTW9uaXRvcmluZycgfCB0cmFuc2xhdGVcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIFtsYWJlbF09XCInTWVzc2FnaW5nIHNlcnZpY2UnIHwgdHJhbnNsYXRlXCJcbiAgICBbcGF0aF09XCInL21vbml0b3JpbmcvbWVzc2FnaW5nLXNlcnZpY2UnXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW0gW2xhYmVsXT1cIm5hbWVzcGFjZUxhYmVsJCB8IGFzeW5jXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxhXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIHRpdGxlPVwie3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIChjbGljayk9XCJyZWZyZXNoLmVtaXQoKVwiXG4gID5cbiAgICA8aVxuICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogbG9hZGluZyQgfCBhc3luYyB9XCJcbiAgICA+PC9pPlxuICAgIHt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYT5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdiBjbGFzcz1cImNhcmQgY29udGVudC1mdWxscGFnZSBkLWZsZXggZC1jb2xcIj5cbiAgPGRpdiBjbGFzcz1cImJnLWxldmVsLTEgc2VwYXJhdG9yLWJvdHRvbSBmbGV4LW5vLXNocmlua1wiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY2FyZC1ibG9ja1wiXG4gICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IDE3MnB4XCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY29sLW1kLTQgbS1iLTI0IGNvbC14cy0xMiBkLWZsZXggcC10LTI0IGdhcC0xNiB0ZXh0LWRlZmF1bHQgYS1pLWNlbnRlciBhLXMtc3RyZXRjaFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBkLWNvbFwiPlxuICAgICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cIm0tYi04IGljb24tNDAgYzh5LWljb24tZHVvY29sb3JcIlxuICAgICAgICAgICAgW2M4eUljb25dPVwiaWNvbiQgfCBhc3luY1wiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyB0YWctLWluZm9cIj57eyAnU2VydmljZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cImg0IHRleHQtYnJlYWstYWxsXCI+e3sgbmFtZXNwYWNlTGFiZWwkIHwgYXN5bmMgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXQgYzh5LWZpZWxkc2V0LS1sZ1wiPlxuICAgICAgICAgIDxsZWdlbmQ+XG4gICAgICAgICAgICB7eyAnU2VydmljZSB1c2FnZS9saW1pdHMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9sZWdlbmQ+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZyQgfCBhc3luYzsgZWxzZSBzZXJ2aWNlVXNhZ2VMaW1pdHNcIj5cbiAgICAgICAgICAgIDxjOHktbG9hZGluZz48L2M4eS1sb2FkaW5nPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZXJ2aWNlVXNhZ2VMaW1pdHM+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKG5hbWVzcGFjZURldGFpbHMkIHwgYXN5bmMpPy5uYW1lc3BhY2UgYXMgbmFtZXNwYWNlXCI+XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgc21hbGwgYW5pbWF0ZWQgZmFkZUluXCI+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gdGV4dC1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG0tYi0wIG0tci1hdXRvXCI+e3sgJ1RvcGljcycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hbWVzcGFjZT8udG9waWNzPy5saW1pdCAhPT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8YXBwLXVzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgW2NvdW50XT1cIm5hbWVzcGFjZT8udG9waWNzPy5jb3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xpbWl0XT1cIm5hbWVzcGFjZT8udG9waWNzPy5saW1pdFwiXG4gICAgICAgICAgICAgICAgICAgID48L2FwcC11c2FnZT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtMTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBuYW1lc3BhY2U/LnRvcGljcz8uY291bnQgfCBudW1iZXIgfX0gL1xuICAgICAgICAgICAgICAgICAgICAgIHt7IG5hbWVzcGFjZT8udG9waWNzPy5saW1pdCB8IGJhY2tsb2dRdW90YUxpbWl0IH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hbWVzcGFjZT8udG9waWNzPy5saW1pdCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC0xNlwiPnt7IG5hbWVzcGFjZT8udG9waWNzPy5jb3VudCB8IG51bWJlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLWF1dG9cIj57eyAnU3Vic2NyaWJlcnMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLTE2XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IG5hbWVzcGFjZT8uc3Vic2NyaWJlcnM/LmNvdW50IHwgbnVtYmVyIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cblxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLWF1dG9cIj57eyAnUHVibGlzaGVycycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtMTZcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbmFtZXNwYWNlPy5wdWJsaXNoZXJzPy5jb3VudCB8IG51bWJlciB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IGM4eS1maWVsZHNldC0tbGdcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdTZXJ2aWNlIG1lc3NhZ2UgYmFja2xvZyBsaW1pdHMnIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZyQgfCBhc3luYzsgZWxzZSBzZXJ2aWNlTWVzc2FnZUJhY2tsb2dMaW1pdHNcIj5cbiAgICAgICAgICAgIDxjOHktbG9hZGluZz48L2M4eS1sb2FkaW5nPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZXJ2aWNlTWVzc2FnZUJhY2tsb2dMaW1pdHM+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKG5hbWVzcGFjZURldGFpbHMkIHwgYXN5bmMpPy5wb2xpY2llcyBhcyBwb2xpY2llc1wiPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIHNtYWxsIGFuaW1hdGVkIGZhZGVJblwiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tIHRleHQtbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQmFja2xvZyBxdW90YSAocGVyIHRvcGljKScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7XG4gICAgICAgICAgICAgICAgICAgICAgcG9saWNpZXM/LmJhY2tsb2dRdW90YT8ubGltaXQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChwb2xpY2llcy5iYWNrbG9nUXVvdGEubGltaXQgfCBieXRlczogMCA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICctJ1xuICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgcG9saWNpZXM/LmJhY2tsb2dRdW90YT8ubGltaXQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChwb2xpY2llcy5iYWNrbG9nUXVvdGEubGltaXQgfCBieXRlczogMClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJy0nXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cblxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0JhY2tsb2cgdGltZSB0byBsaXZlIChUVEwpJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBvbGljaWVzPy5tZXNzYWdlVFRMIHwgdGltZVRvTGl2ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8Yzh5LWRhdGEtZ3JpZFxuICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgW3RpdGxlXT1cInRhYmxlVGl0bGUgfCB0cmFuc2xhdGVcIlxuICAgIFtsb2FkaW5nSXRlbXNMYWJlbF09XCJsb2FkaW5nSXRlbXNMYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgW2xvYWRNb3JlSXRlbXNMYWJlbF09XCJsb2FkTW9yZUl0ZW1zTGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgIFtwYWdpbmF0aW9uXT1cInBhZ2luYXRpb25cIlxuICAgIFtzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrXT1cInNlcnZlclNpZGVEYXRhQ2FsbGJhY2tcIlxuICAgIFtyZWZyZXNoXT1cInJlZnJlc2hcIlxuICAgIFtoaWRlUmVsb2FkXT1cInRydWVcIlxuICA+XG4gICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgW2ljb25dPVwic3RhdHM/LnNpemUgPiAwID8gJ3NlYXJjaCcgOiAnZGF5LXZpZXcnXCJcbiAgICAgIFt0aXRsZV09XCJzdGF0cz8uc2l6ZSA+IDAgPyAobm9SZXN1bHRzTWVzc2FnZSB8IHRyYW5zbGF0ZSkgOiAobm9EYXRhTWVzc2FnZSB8IHRyYW5zbGF0ZSlcIlxuICAgICAgW3N1YnRpdGxlXT1cInN0YXRzPy5zaXplID4gMCA/IChub1Jlc3VsdHNTdWJ0aXRsZSB8IHRyYW5zbGF0ZSkgOiAobm9EYXRhU3VidGl0bGUgfCB0cmFuc2xhdGUpXCJcbiAgICAgICplbXB0eVN0YXRlQ29udGV4dD1cImxldCBzdGF0c1wiXG4gICAgICBbaG9yaXpvbnRhbF09XCJzdGF0cz8uc2l6ZSA+IDBcIlxuICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cblxuICAgIDxjOHktY29sdW1uIG5hbWU9XCJuYW1lXCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8YVxuICAgICAgICAgIHRpdGxlPVwie3sgY29udGV4dC52YWx1ZSB9fVwiXG4gICAgICAgICAgW3JvdXRlckxpbmtdPVwiWyd0b3BpYycsIGNvbnRleHQuaXRlbS5pZF1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgY29udGV4dC52YWx1ZSB9fVxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2M4eS1jb2x1bW4+XG5cbiAgICA8Yzh5LWNvbHVtbiBuYW1lPVwibXNnUmF0ZUluXCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8c3BhbiB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIHwgbnVtYmVyIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvYzh5LWNvbHVtbj5cblxuICAgIDxjOHktY29sdW1uIG5hbWU9XCJtc2dSYXRlT3V0XCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8c3BhbiB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIHwgbnVtYmVyIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvYzh5LWNvbHVtbj5cblxuICAgIDxjOHktY29sdW1uIG5hbWU9XCJzdWJzY3JpYmVyc1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqYzh5Q2VsbFJlbmRlcmVyRGVmPVwibGV0IGNvbnRleHRcIj5cbiAgICAgICAgPGFcbiAgICAgICAgICB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cIlxuICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsndG9waWMnLCBjb250ZXh0Lml0ZW0uaWQsICdzdWJzY3JpYmVycyddXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9jOHktY29sdW1uPlxuXG4gICAgPGM4eS1jb2x1bW4gbmFtZT1cImJhY2tsb2dTaXplXCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8c3BhbiB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBieXRlczogMiA6IHRydWUgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIHwgYnl0ZXM6IDIgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9jOHktY29sdW1uPlxuXG4gICAgPGM4eS1jb2x1bW4gbmFtZT1cImJhY2tsb2dVc2FnZVBlcmNlbnRhZ2VcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKmM4eUNlbGxSZW5kZXJlckRlZj1cImxldCBjb250ZXh0XCI+XG4gICAgICAgIDxzcGFuIHRpdGxlPVwie3sgY29udGV4dC52YWx1ZSAvIDEwMCB8IHBlcmNlbnQ6ICcxLjAtMicgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIC8gMTAwIHwgcGVyY2VudDogJzEuMC0yJyB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2M4eS1jb2x1bW4+XG4gIDwvYzh5LWRhdGEtZ3JpZD5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { AlertService, BaseColumn, gettext, ModalService, Status } from '@c8y/ngx-components';
|
|
3
|
+
import { MessagingSubscribersService } from '../../../api/services/messaging-subscribers.service';
|
|
4
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class TopicSubscribersDataGridService {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.subscribersService = inject(MessagingSubscribersService);
|
|
9
|
+
this.alertService = inject(AlertService);
|
|
10
|
+
this.modalService = inject(ModalService);
|
|
11
|
+
this.translateService = inject(TranslateService);
|
|
12
|
+
}
|
|
13
|
+
getColumns() {
|
|
14
|
+
return [
|
|
15
|
+
this.createColumn({
|
|
16
|
+
name: 'name',
|
|
17
|
+
header: gettext('Name'),
|
|
18
|
+
path: 'name',
|
|
19
|
+
filterable: true,
|
|
20
|
+
filteringConfig: {
|
|
21
|
+
fields: [
|
|
22
|
+
{
|
|
23
|
+
key: 'name',
|
|
24
|
+
type: 'input',
|
|
25
|
+
props: {
|
|
26
|
+
label: gettext('Filter subscribers by partial name'),
|
|
27
|
+
placeholder: 'mySubscriber',
|
|
28
|
+
required: true
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
getFilter(model) {
|
|
33
|
+
return model.name;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}),
|
|
37
|
+
this.createColumn({
|
|
38
|
+
name: 'activeClients',
|
|
39
|
+
header: gettext('Connected clients'),
|
|
40
|
+
path: 'activeClients'
|
|
41
|
+
}),
|
|
42
|
+
this.createColumn({
|
|
43
|
+
name: 'messageAckRate',
|
|
44
|
+
header: gettext('Acknowledgment rate (msg/s)'),
|
|
45
|
+
path: 'messageAckRate'
|
|
46
|
+
}),
|
|
47
|
+
this.createColumn({
|
|
48
|
+
name: 'lastAcknowledgeDate',
|
|
49
|
+
header: gettext('Last acknowledged'),
|
|
50
|
+
path: 'lastAcknowledgeDate',
|
|
51
|
+
sortingConfig: {
|
|
52
|
+
pathSortingConfigs: [
|
|
53
|
+
{
|
|
54
|
+
path: 'lastAcknowledgeTimestamp'
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
}),
|
|
59
|
+
this.createColumn({
|
|
60
|
+
name: 'unackMsgBacklog',
|
|
61
|
+
header: gettext('Unacknowledged messages'),
|
|
62
|
+
path: 'unackMsgBacklog'
|
|
63
|
+
}),
|
|
64
|
+
this.createColumn({
|
|
65
|
+
name: 'backlogUsagePercentage',
|
|
66
|
+
header: gettext('Used backlog'),
|
|
67
|
+
path: 'backlogUsagePercentage',
|
|
68
|
+
sortOrder: 'desc'
|
|
69
|
+
})
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
async getServerSideData(tenantId, namespaceId, topicId, topicType, dataSourceModifier) {
|
|
73
|
+
const subscriberFilters = this.getSubscriberFilters(tenantId, namespaceId, topicId, topicType, dataSourceModifier);
|
|
74
|
+
const { res, data, paging } = await this.subscribersService.list(subscriberFilters);
|
|
75
|
+
const filteredSize = paging.totalElements;
|
|
76
|
+
const size = (await this.subscribersService.list({
|
|
77
|
+
...subscriberFilters,
|
|
78
|
+
currentPage: 1,
|
|
79
|
+
pageSize: 1
|
|
80
|
+
})).paging.totalPages;
|
|
81
|
+
return {
|
|
82
|
+
res,
|
|
83
|
+
data: data.map(subscriber => ({
|
|
84
|
+
...subscriber,
|
|
85
|
+
lastAcknowledgeDate: this.getLastAcknowledgeDate(subscriber),
|
|
86
|
+
id: subscriber.name
|
|
87
|
+
})),
|
|
88
|
+
paging,
|
|
89
|
+
size,
|
|
90
|
+
filteredSize
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
async unsubscribeSubscriber(subscriber, refreshCallback) {
|
|
94
|
+
const confirmationTitle = gettext('Unsubscribe "{{ subscriberName }}"?');
|
|
95
|
+
const confirmationMessage = subscriber.activeClients > 0
|
|
96
|
+
? gettext('You are about to unsubscribe "{{ subscriberName }}" which has active clients. Do you want to proceed?')
|
|
97
|
+
: gettext('You are about to unsubscribe "{{ subscriberName }}". Do you want to proceed?');
|
|
98
|
+
try {
|
|
99
|
+
const subscriberName = subscriber.name;
|
|
100
|
+
await this.modalService.confirm(this.translateService.instant(confirmationTitle, {
|
|
101
|
+
subscriberName
|
|
102
|
+
}), this.translateService.instant(confirmationMessage, {
|
|
103
|
+
subscriberName
|
|
104
|
+
}), Status.DANGER, {
|
|
105
|
+
ok: gettext('Unsubscribe')
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
// cancel
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
await this.subscribersService.delete(subscriber);
|
|
114
|
+
this.alertService.success(this.translateService.instant(gettext('Subscriber "{{ subscriberName }}" unsubscribed.'), {
|
|
115
|
+
subscriberName: subscriber.name
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
this.alertService.addServerFailure(error);
|
|
120
|
+
}
|
|
121
|
+
refreshCallback();
|
|
122
|
+
}
|
|
123
|
+
async bulkUnsubscribeSubscribers(subscribers, refreshCallback) {
|
|
124
|
+
const anySubscriberHasActiveClients = subscribers.some(subscriber => subscriber.activeClients > 0);
|
|
125
|
+
const confirmationTitle = gettext('Unsubscribe {{ numberOfSubscribers }} subscribers?');
|
|
126
|
+
const confirmationMessage = anySubscriberHasActiveClients
|
|
127
|
+
? gettext('You are about to unsubscribe {{ numberOfSubscribers }} subscribers. Some of them have active clients. Do you want to proceed?')
|
|
128
|
+
: gettext('You are about to unsubscribe {{ numberOfSubscribers }} subscribers. Do you want to proceed?');
|
|
129
|
+
try {
|
|
130
|
+
const numberOfSubscribers = subscribers.length;
|
|
131
|
+
await this.modalService.confirm(this.translateService.instant(confirmationTitle, {
|
|
132
|
+
numberOfSubscribers
|
|
133
|
+
}), this.translateService.instant(confirmationMessage, {
|
|
134
|
+
numberOfSubscribers
|
|
135
|
+
}), Status.DANGER, {
|
|
136
|
+
ok: gettext('Unsubscribe')
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
// cancel
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const results = await Promise.allSettled(subscribers.map(sub => this.subscribersService
|
|
144
|
+
.delete(sub)
|
|
145
|
+
.then(() => ({
|
|
146
|
+
success: true,
|
|
147
|
+
name: sub.name
|
|
148
|
+
}))
|
|
149
|
+
.catch(error => ({
|
|
150
|
+
success: false,
|
|
151
|
+
name: sub.name,
|
|
152
|
+
error
|
|
153
|
+
}))));
|
|
154
|
+
const failed = results
|
|
155
|
+
.filter(result => result.status === 'fulfilled' && result.value.success === false)
|
|
156
|
+
.map(result => result.value);
|
|
157
|
+
const succeeded = results
|
|
158
|
+
.filter(result => result.status === 'fulfilled' && result.value.success === true)
|
|
159
|
+
.map(result => result.value);
|
|
160
|
+
if (failed.length === 0) {
|
|
161
|
+
this.alertService.success(this.translateService.instant(gettext('{{ numberOfSubscribers }} subscribers unsubscribed.'), { numberOfSubscribers: succeeded.length }));
|
|
162
|
+
}
|
|
163
|
+
else if (succeeded.length === 0) {
|
|
164
|
+
const errorMessage = this.translateService.instant(gettext('Failed to unsubscribe {{ numberOfSubscribers }} subscribers.'), {
|
|
165
|
+
numberOfSubscribers: failed.length
|
|
166
|
+
});
|
|
167
|
+
const details = `${failed.map(f => `'${f.name}': ${f.error.data.message}`).join('\n')}`;
|
|
168
|
+
this.alertService.danger(errorMessage, details);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Some succeeded, some failed
|
|
172
|
+
const nonUnsubscribedSubscribers = failed.map(s => s.name).join(', ');
|
|
173
|
+
const message = this.translateService.instant(gettext(`Successfully unsubscribed {{ count }} subscribers.<br/>Failed to unsubscribe: {{ nonUnsubscribedSubscribers }}.`), { count: succeeded.length, nonUnsubscribedSubscribers });
|
|
174
|
+
const details = `${failed.map(f => `'${f.name}': ${f.error.data.message}`).join('\n')}`;
|
|
175
|
+
this.alertService.warning(message, details);
|
|
176
|
+
}
|
|
177
|
+
refreshCallback();
|
|
178
|
+
}
|
|
179
|
+
createColumn(columnProps) {
|
|
180
|
+
const column = new BaseColumn();
|
|
181
|
+
Object.assign(column, columnProps);
|
|
182
|
+
return column;
|
|
183
|
+
}
|
|
184
|
+
getSubscriberFilters(tenantId, namespaceId, topicId, topicType, dataSourceModifier) {
|
|
185
|
+
const subscriberFilters = {
|
|
186
|
+
tenant: tenantId,
|
|
187
|
+
namespace: namespaceId,
|
|
188
|
+
topic: topicId,
|
|
189
|
+
type: topicType,
|
|
190
|
+
currentPage: dataSourceModifier.pagination.currentPage,
|
|
191
|
+
pageSize: dataSourceModifier.pagination.pageSize
|
|
192
|
+
};
|
|
193
|
+
return dataSourceModifier.columns.reduce((subscriberFilters, column) => {
|
|
194
|
+
if (column.filterable) {
|
|
195
|
+
if (column.filterPredicate) {
|
|
196
|
+
subscriberFilters[column.path] = column.filterPredicate;
|
|
197
|
+
}
|
|
198
|
+
if (column.externalFilterQuery) {
|
|
199
|
+
subscriberFilters[column.path] = column.filteringConfig.getFilter(column.externalFilterQuery);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (column.sortable && column.sortOrder) {
|
|
203
|
+
const sortPath = column.sortingConfig?.pathSortingConfigs?.[0]?.path || column.path;
|
|
204
|
+
subscriberFilters.sort = `${sortPath},${column.sortOrder}`;
|
|
205
|
+
}
|
|
206
|
+
return subscriberFilters;
|
|
207
|
+
}, subscriberFilters);
|
|
208
|
+
}
|
|
209
|
+
getLastAcknowledgeDate(subscriber) {
|
|
210
|
+
const lastAcknowledgeDate = new Date(subscriber.lastAcknowledgeTimestamp);
|
|
211
|
+
return lastAcknowledgeDate.getTime() > 0 ? lastAcknowledgeDate : null;
|
|
212
|
+
}
|
|
213
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicSubscribersDataGridService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
214
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicSubscribersDataGridService, providedIn: 'root' }); }
|
|
215
|
+
}
|
|
216
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicSubscribersDataGridService, decorators: [{
|
|
217
|
+
type: Injectable,
|
|
218
|
+
args: [{ providedIn: 'root' }]
|
|
219
|
+
}] });
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtc3Vic2NyaWJlcnMtZGF0YS1ncmlkLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9tZXNzYWdpbmctbWFuYWdlbWVudC9tZXNzYWdpbmcvdG9waWMvdG9waWMtc3Vic2NyaWJlcnMtdmlldy90b3BpYy1zdWJzY3JpYmVycy1kYXRhLWdyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFVBQVUsRUFHVixPQUFPLEVBQ1AsWUFBWSxFQUVaLE1BQU0sRUFDUCxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBSWxHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUl2RCxNQUFNLE9BQU8sK0JBQStCO0lBRDVDO1FBRVksdUJBQWtCLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDM0QsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEMsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEMscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7S0EwUnJEO0lBeFJDLFVBQVU7UUFDUixPQUFPO1lBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDaEIsSUFBSSxFQUFFLE1BQU07Z0JBQ1osTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxNQUFNO2dCQUNaLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixlQUFlLEVBQUU7b0JBQ2YsTUFBTSxFQUFFO3dCQUNOOzRCQUNFLEdBQUcsRUFBRSxNQUFNOzRCQUNYLElBQUksRUFBRSxPQUFPOzRCQUNiLEtB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QyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVPLHNCQUFzQixDQUFDLFVBQStCO1FBQzVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDMUUsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEUsQ0FBQzsrR0E3UlUsK0JBQStCO21IQUEvQiwrQkFBK0IsY0FEbEIsTUFBTTs7NEZBQ25CLCtCQUErQjtrQkFEM0MsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgQmFzZUNvbHVtbixcbiAgQ29sdW1uLFxuICBEYXRhU291cmNlTW9kaWZpZXIsXG4gIGdldHRleHQsXG4gIE1vZGFsU2VydmljZSxcbiAgU2VydmVyU2lkZURhdGFSZXN1bHQsXG4gIFN0YXR1c1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IE1lc3NhZ2luZ1N1YnNjcmliZXJzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwaS9zZXJ2aWNlcy9tZXNzYWdpbmctc3Vic2NyaWJlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdUb3BpY1R5cGUgfSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWwvdG9waWNUeXBlJztcbmltcG9ydCB7IE1lc3NhZ2luZ1N1YnNjcmliZXJGaWx0ZXJzIH0gZnJvbSAnLi4vLi4vLi4vYXBpL21vZGVsL3N1YnNjcmliZXJGaWx0ZXJzJztcbmltcG9ydCB7IE1lc3NhZ2luZ1N1YnNjcmliZXIgfSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWwvc3Vic2NyaWJlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdTdWJzY3JpYmVyVG9EZWxldGUgfSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWwvc3Vic2NyaWJlclRvRGVsZXRlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUb3BpY1N1YnNjcmliZXJzRGF0YUdyaWRTZXJ2aWNlIHtcbiAgcHJvdGVjdGVkIHN1YnNjcmliZXJzU2VydmljZSA9IGluamVjdChNZXNzYWdpbmdTdWJzY3JpYmVyc1NlcnZpY2UpO1xuICBwcml2YXRlIGFsZXJ0U2VydmljZSA9IGluamVjdChBbGVydFNlcnZpY2UpO1xuICBwcml2YXRlIG1vZGFsU2VydmljZSA9IGluamVjdChNb2RhbFNlcnZpY2UpO1xuICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgZ2V0Q29sdW1ucygpOiBDb2x1bW5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY3JlYXRlQ29sdW1uKHtcbiAgICAgICAgbmFtZTogJ25hbWUnLFxuICAgICAgICBoZWFkZXI6IGdldHRleHQoJ05hbWUnKSxcbiAgICAgICAgcGF0aDogJ25hbWUnLFxuICAgICAgICBmaWx0ZXJhYmxlOiB0cnVlLFxuICAgICAgICBmaWx0ZXJpbmdDb25maWc6IHtcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiAnbmFtZScsXG4gICAgICAgICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IGdldHRleHQoJ0ZpbHRlciBzdWJzY3JpYmVycyBieSBwYXJ0aWFsIG5hbWUnKSxcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ215U3Vic2NyaWJlcicsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgZ2V0RmlsdGVyKG1vZGVsOiB7IG5hbWU6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgICAgICAgICAgIHJldHVybiBtb2RlbC5uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0aGlzLmNyZWF0ZUNvbHVtbih7XG4gICAgICAgIG5hbWU6ICdhY3RpdmVDbGllbnRzJyxcbiAgICAgICAgaGVhZGVyOiBnZXR0ZXh0KCdDb25uZWN0ZWQgY2xpZW50cycpLFxuICAgICAgICBwYXRoOiAnYWN0aXZlQ2xpZW50cydcbiAgICAgIH0pLFxuICAgICAgdGhpcy5jcmVhdGVDb2x1bW4oe1xuICAgICAgICBuYW1lOiAnbWVzc2FnZUFja1JhdGUnLFxuICAgICAgICBoZWFkZXI6IGdldHRleHQoJ0Fja25vd2xlZGdtZW50IHJhdGUgKG1zZy9zKScpLFxuICAgICAgICBwYXRoOiAnbWVzc2FnZUFja1JhdGUnXG4gICAgICB9KSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sdW1uKHtcbiAgICAgICAgbmFtZTogJ2xhc3RBY2tub3dsZWRnZURhdGUnLFxuICAgICAgICBoZWFkZXI6IGdldHRleHQoJ0xhc3QgYWNrbm93bGVkZ2VkJyksXG4gICAgICAgIHBhdGg6ICdsYXN0QWNrbm93bGVkZ2VEYXRlJyxcbiAgICAgICAgc29ydGluZ0NvbmZpZzoge1xuICAgICAgICAgIHBhdGhTb3J0aW5nQ29uZmlnczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiAnbGFzdEFja25vd2xlZGdlVGltZXN0YW1wJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0aGlzLmNyZWF0ZUNvbHVtbih7XG4gICAgICAgIG5hbWU6ICd1bmFja01zZ0JhY2tsb2cnLFxuICAgICAgICBoZWFkZXI6IGdldHRleHQoJ1VuYWNrbm93bGVkZ2VkIG1lc3NhZ2VzJyksXG4gICAgICAgIHBhdGg6ICd1bmFja01zZ0JhY2tsb2cnXG4gICAgICB9KSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sdW1uKHtcbiAgICAgICAgbmFtZTogJ2JhY2tsb2dVc2FnZVBlcmNlbnRhZ2UnLFxuICAgICAgICBoZWFkZXI6IGdldHRleHQoJ1VzZWQgYmFja2xvZycpLFxuICAgICAgICBwYXRoOiAnYmFja2xvZ1VzYWdlUGVyY2VudGFnZScsXG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnXG4gICAgICB9KVxuICAgIF07XG4gIH1cblxuICBhc3luYyBnZXRTZXJ2ZXJTaWRlRGF0YShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG5hbWVzcGFjZUlkOiBzdHJpbmcsXG4gICAgdG9waWNJZDogc3RyaW5nLFxuICAgIHRvcGljVHlwZTogTWVzc2FnaW5nVG9waWNUeXBlLFxuICAgIGRhdGFTb3VyY2VNb2RpZmllcjogRGF0YVNvdXJjZU1vZGlmaWVyXG4gICk6IFByb21pc2U8U2VydmVyU2lkZURhdGFSZXN1bHQ+IHtcbiAgICBjb25zdCBzdWJzY3JpYmVyRmlsdGVycyA9IHRoaXMuZ2V0U3Vic2NyaWJlckZpbHRlcnMoXG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIG5hbWVzcGFjZUlkLFxuICAgICAgdG9waWNJZCxcbiAgICAgIHRvcGljVHlwZSxcbiAgICAgIGRhdGFTb3VyY2VNb2RpZmllclxuICAgICk7XG4gICAgY29uc3QgeyByZXMsIGRhdGEsIHBhZ2luZyB9ID0gYXdhaXQgdGhpcy5zdWJzY3JpYmVyc1NlcnZpY2UubGlzdChzdWJzY3JpYmVyRmlsdGVycyk7XG4gICAgY29uc3QgZmlsdGVyZWRTaXplID0gcGFnaW5nLnRvdGFsRWxlbWVudHM7XG4gICAgY29uc3Qgc2l6ZSA9IChcbiAgICAgIGF3YWl0IHRoaXMuc3Vic2NyaWJlcnNTZXJ2aWNlLmxpc3Qoe1xuICAgICAgICAuLi5zdWJzY3JpYmVyRmlsdGVycyxcbiAgICAgICAgY3VycmVudFBhZ2U6IDEsXG4gICAgICAgIHBhZ2VTaXplOiAxXG4gICAgICB9KVxuICAgICkucGFnaW5nLnRvdGFsUGFnZXM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVzLFxuICAgICAgZGF0YTogZGF0YS5tYXAoc3Vic2NyaWJlciA9PiAoe1xuICAgICAgICAuLi5zdWJzY3JpYmVyLFxuICAgICAgICBsYXN0QWNrbm93bGVkZ2VEYXRlOiB0aGlzLmdldExhc3RBY2tub3dsZWRnZURhdGUoc3Vic2NyaWJlciksXG4gICAgICAgIGlkOiBzdWJzY3JpYmVyLm5hbWVcbiAgICAgIH0pKSxcbiAgICAgIHBhZ2luZyxcbiAgICAgIHNpemUsXG4gICAgICBmaWx0ZXJlZFNpemVcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdW5zdWJzY3JpYmVTdWJzY3JpYmVyKFxuICAgIHN1YnNjcmliZXI6IE1lc3NhZ2luZ1N1YnNjcmliZXJUb0RlbGV0ZSxcbiAgICByZWZyZXNoQ2FsbGJhY2s6ICgpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlybWF0aW9uVGl0bGUgPSBnZXR0ZXh0KCdVbnN1YnNjcmliZSBcInt7IHN1YnNjcmliZXJOYW1lIH19XCI/Jyk7XG4gICAgY29uc3QgY29uZmlybWF0aW9uTWVzc2FnZSA9XG4gICAgICBzdWJzY3JpYmVyLmFjdGl2ZUNsaWVudHMgPiAwXG4gICAgICAgID8gZ2V0dGV4dChcbiAgICAgICAgICAgICdZb3UgYXJlIGFib3V0IHRvIHVuc3Vic2NyaWJlIFwie3sgc3Vic2NyaWJlck5hbWUgfX1cIiB3aGljaCBoYXMgYWN0aXZlIGNsaWVudHMuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/J1xuICAgICAgICAgIClcbiAgICAgICAgOiBnZXR0ZXh0KCdZb3UgYXJlIGFib3V0IHRvIHVuc3Vic2NyaWJlIFwie3sgc3Vic2NyaWJlck5hbWUgfX1cIi4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3Vic2NyaWJlck5hbWUgPSBzdWJzY3JpYmVyLm5hbWU7XG4gICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5jb25maXJtKFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChjb25maXJtYXRpb25UaXRsZSwge1xuICAgICAgICAgIHN1YnNjcmliZXJOYW1lXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChjb25maXJtYXRpb25NZXNzYWdlLCB7XG4gICAgICAgICAgc3Vic2NyaWJlck5hbWVcbiAgICAgICAgfSksXG4gICAgICAgIFN0YXR1cy5EQU5HRVIsXG4gICAgICAgIHtcbiAgICAgICAgICBvazogZ2V0dGV4dCgnVW5zdWJzY3JpYmUnKVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGNhbmNlbFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnN1YnNjcmliZXJzU2VydmljZS5kZWxldGUoc3Vic2NyaWJlcik7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdTdWJzY3JpYmVyIFwie3sgc3Vic2NyaWJlck5hbWUgfX1cIiB1bnN1YnNjcmliZWQuJyksIHtcbiAgICAgICAgICBzdWJzY3JpYmVyTmFtZTogc3Vic2NyaWJlci5uYW1lXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICB9XG4gICAgcmVmcmVzaENhbGxiYWNrKCk7XG4gIH1cblxuICBhc3luYyBidWxrVW5zdWJzY3JpYmVTdWJzY3JpYmVycyhcbiAgICBzdWJzY3JpYmVyczogTWVzc2FnaW5nU3Vic2NyaWJlclRvRGVsZXRlW10sXG4gICAgcmVmcmVzaENhbGxiYWNrOiAoKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFueVN1YnNjcmliZXJIYXNBY3RpdmVDbGllbnRzID0gc3Vic2NyaWJlcnMuc29tZShcbiAgICAgIHN1YnNjcmliZXIgPT4gc3Vic2NyaWJlci5hY3RpdmVDbGllbnRzID4gMFxuICAgICk7XG5cbiAgICBjb25zdCBjb25maXJtYXRpb25UaXRsZSA9IGdldHRleHQoJ1Vuc3Vic2NyaWJlIHt7IG51bWJlck9mU3Vic2NyaWJlcnMgfX0gc3Vic2NyaWJlcnM/Jyk7XG4gICAgY29uc3QgY29uZmlybWF0aW9uTWVzc2FnZSA9IGFueVN1YnNjcmliZXJIYXNBY3RpdmVDbGllbnRzXG4gICAgICA/IGdldHRleHQoXG4gICAgICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gdW5zdWJzY3JpYmUge3sgbnVtYmVyT2ZTdWJzY3JpYmVycyB9fSBzdWJzY3JpYmVycy4gU29tZSBvZiB0aGVtIGhhdmUgYWN0aXZlIGNsaWVudHMuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/J1xuICAgICAgICApXG4gICAgICA6IGdldHRleHQoXG4gICAgICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gdW5zdWJzY3JpYmUge3sgbnVtYmVyT2ZTdWJzY3JpYmVycyB9fSBzdWJzY3JpYmVycy4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8nXG4gICAgICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbnVtYmVyT2ZTdWJzY3JpYmVycyA9IHN1YnNjcmliZXJzLmxlbmd0aDtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGNvbmZpcm1hdGlvblRpdGxlLCB7XG4gICAgICAgICAgbnVtYmVyT2ZTdWJzY3JpYmVyc1xuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoY29uZmlybWF0aW9uTWVzc2FnZSwge1xuICAgICAgICAgIG51bWJlck9mU3Vic2NyaWJlcnNcbiAgICAgICAgfSksXG4gICAgICAgIFN0YXR1cy5EQU5HRVIsXG4gICAgICAgIHtcbiAgICAgICAgICBvazogZ2V0dGV4dCgnVW5zdWJzY3JpYmUnKVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGNhbmNlbFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBzdWJzY3JpYmVycy5tYXAoc3ViID0+XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnNTZXJ2aWNlXG4gICAgICAgICAgLmRlbGV0ZShzdWIpXG4gICAgICAgICAgLnRoZW4oKCkgPT4gKHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBuYW1lOiBzdWIubmFtZVxuICAgICAgICAgIH0pKVxuICAgICAgICAgIC5jYXRjaChlcnJvciA9PiAoe1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBuYW1lOiBzdWIubmFtZSxcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgfSkpXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHNcbiAgICAgIC5maWx0ZXIocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZS5zdWNjZXNzID09PSBmYWxzZSlcbiAgICAgIC5tYXAocmVzdWx0ID0+IChyZXN1bHQgYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxhbnk+KS52YWx1ZSk7XG5cbiAgICBjb25zdCBzdWNjZWVkZWQgPSByZXN1bHRzXG4gICAgICAuZmlsdGVyKHJlc3VsdCA9PiByZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByZXN1bHQudmFsdWUuc3VjY2VzcyA9PT0gdHJ1ZSlcbiAgICAgIC5tYXAocmVzdWx0ID0+IChyZXN1bHQgYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxhbnk+KS52YWx1ZSk7XG5cbiAgICBpZiAoZmFpbGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgZ2V0dGV4dCgne3sgbnVtYmVyT2ZTdWJzY3JpYmVycyB9fSBzdWJzY3JpYmVycyB1bnN1YnNjcmliZWQuJyksXG4gICAgICAgICAgeyBudW1iZXJPZlN1YnNjcmliZXJzOiBzdWNjZWVkZWQubGVuZ3RoIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHN1Y2NlZWRlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICBnZXR0ZXh0KCdGYWlsZWQgdG8gdW5zdWJzY3JpYmUge3sgbnVtYmVyT2ZTdWJzY3JpYmVycyB9fSBzdWJzY3JpYmVycy4nKSxcbiAgICAgICAge1xuICAgICAgICAgIG51bWJlck9mU3Vic2NyaWJlcnM6IGZhaWxlZC5sZW5ndGhcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRldGFpbHMgPSBgJHtmYWlsZWQubWFwKGYgPT4gYCcke2YubmFtZX0nOiAke2YuZXJyb3IuZGF0YS5tZXNzYWdlfWApLmpvaW4oJ1xcbicpfWA7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5kYW5nZXIoZXJyb3JNZXNzYWdlLCBkZXRhaWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU29tZSBzdWNjZWVkZWQsIHNvbWUgZmFpbGVkXG4gICAgICBjb25zdCBub25VbnN1YnNjcmliZWRTdWJzY3JpYmVycyA9IGZhaWxlZC5tYXAocyA9PiBzLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgYFN1Y2Nlc3NmdWxseSB1bnN1YnNjcmliZWQge3sgY291bnQgfX0gc3Vic2NyaWJlcnMuPGJyLz5GYWlsZWQgdG8gdW5zdWJzY3JpYmU6IHt7IG5vblVuc3Vic2NyaWJlZFN1YnNjcmliZXJzIH19LmBcbiAgICAgICAgKSxcbiAgICAgICAgeyBjb3VudDogc3VjY2VlZGVkLmxlbmd0aCwgbm9uVW5zdWJzY3JpYmVkU3Vic2NyaWJlcnMgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRldGFpbHMgPSBgJHtmYWlsZWQubWFwKGYgPT4gYCcke2YubmFtZX0nOiAke2YuZXJyb3IuZGF0YS5tZXNzYWdlfWApLmpvaW4oJ1xcbicpfWA7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS53YXJuaW5nKG1lc3NhZ2UsIGRldGFpbHMpO1xuICAgIH1cblxuICAgIHJlZnJlc2hDYWxsYmFjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb2x1bW4oY29sdW1uUHJvcHM6IFBhcnRpYWw8QmFzZUNvbHVtbj4pOiBCYXNlQ29sdW1uIHtcbiAgICBjb25zdCBjb2x1bW4gPSBuZXcgQmFzZUNvbHVtbigpO1xuICAgIE9iamVjdC5hc3NpZ24oY29sdW1uLCBjb2x1bW5Qcm9wcyk7XG4gICAgcmV0dXJuIGNvbHVtbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3Vic2NyaWJlckZpbHRlcnMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBuYW1lc3BhY2VJZDogc3RyaW5nLFxuICAgIHRvcGljSWQ6IHN0cmluZyxcbiAgICB0b3BpY1R5cGU6IE1lc3NhZ2luZ1RvcGljVHlwZSxcbiAgICBkYXRhU291cmNlTW9kaWZpZXI6IERhdGFTb3VyY2VNb2RpZmllclxuICApOiBNZXNzYWdpbmdTdWJzY3JpYmVyRmlsdGVycyB7XG4gICAgY29uc3Qgc3Vic2NyaWJlckZpbHRlcnM6IE1lc3NhZ2luZ1N1YnNjcmliZXJGaWx0ZXJzID0ge1xuICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlSWQsXG4gICAgICB0b3BpYzogdG9waWNJZCxcbiAgICAgIHR5cGU6IHRvcGljVHlwZSxcbiAgICAgIGN1cnJlbnRQYWdlOiBkYXRhU291cmNlTW9kaWZpZXIucGFnaW5hdGlvbi5jdXJyZW50UGFnZSxcbiAgICAgIHBhZ2VTaXplOiBkYXRhU291cmNlTW9kaWZpZXIucGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgIH07XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZU1vZGlmaWVyLmNvbHVtbnMucmVkdWNlKChzdWJzY3JpYmVyRmlsdGVycywgY29sdW1uKSA9PiB7XG4gICAgICBpZiAoY29sdW1uLmZpbHRlcmFibGUpIHtcbiAgICAgICAgaWYgKGNvbHVtbi5maWx0ZXJQcmVkaWNhdGUpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyRmlsdGVyc1tjb2x1bW4ucGF0aF0gPSBjb2x1bW4uZmlsdGVyUHJlZGljYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbi5leHRlcm5hbEZpbHRlclF1ZXJ5KSB7XG4gICAgICAgICAgc3Vic2NyaWJlckZpbHRlcnNbY29sdW1uLnBhdGhdID0gY29sdW1uLmZpbHRlcmluZ0NvbmZpZy5nZXRGaWx0ZXIoXG4gICAgICAgICAgICBjb2x1bW4uZXh0ZXJuYWxGaWx0ZXJRdWVyeVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uc29ydE9yZGVyKSB7XG4gICAgICAgIGNvbnN0IHNvcnRQYXRoID0gY29sdW1uLnNvcnRpbmdDb25maWc/LnBhdGhTb3J0aW5nQ29uZmlncz8uWzBdPy5wYXRoIHx8IGNvbHVtbi5wYXRoO1xuICAgICAgICBzdWJzY3JpYmVyRmlsdGVycy5zb3J0ID0gYCR7c29ydFBhdGh9LCR7Y29sdW1uLnNvcnRPcmRlcn1gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3Vic2NyaWJlckZpbHRlcnM7XG4gICAgfSwgc3Vic2NyaWJlckZpbHRlcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXN0QWNrbm93bGVkZ2VEYXRlKHN1YnNjcmliZXI6IE1lc3NhZ2luZ1N1YnNjcmliZXIpOiBEYXRlIHtcbiAgICBjb25zdCBsYXN0QWNrbm93bGVkZ2VEYXRlID0gbmV3IERhdGUoc3Vic2NyaWJlci5sYXN0QWNrbm93bGVkZ2VUaW1lc3RhbXApO1xuICAgIHJldHVybiBsYXN0QWNrbm93bGVkZ2VEYXRlLmdldFRpbWUoKSA+IDAgPyBsYXN0QWNrbm93bGVkZ2VEYXRlIDogbnVsbDtcbiAgfVxufVxuIl19
|