@tuki-io/tuki-widgets 0.0.126 → 0.0.128
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/contact-center/cc-readiness/cc-readiness.module.d.ts +19 -0
- package/contact-center/cc-readiness/cc-readiness.service.d.ts +12 -0
- package/contact-center/cc-readiness/components/card/card.component.d.ts +6 -0
- package/contact-center/cc-readiness/types/cc-readiness.d.ts +20 -0
- package/contact-center/cc-readiness/widgets/licences-requirement/licences-requirement.component.d.ts +52 -0
- package/contact-center/cc-readiness/widgets/summary-grid/summary-grid.component.d.ts +26 -0
- package/contact-center/index.d.ts +5 -0
- package/contact-center/public-api.d.ts +3 -0
- package/contact-center/shared/api.endpoints.d.ts +6 -0
- package/contact-center/shared/api.service.d.ts +20 -0
- package/contact-center/shared/material.module.d.ts +15 -0
- package/contact-center/shared/shared.module.d.ts +10 -0
- package/esm2020/contact-center/cc-readiness/cc-readiness.module.mjs +71 -0
- package/esm2020/contact-center/cc-readiness/cc-readiness.service.mjs +35 -0
- package/esm2020/contact-center/cc-readiness/components/card/card.component.mjs +13 -0
- package/esm2020/contact-center/cc-readiness/types/cc-readiness.mjs +5 -0
- package/esm2020/contact-center/cc-readiness/widgets/licences-requirement/licences-requirement.component.mjs +187 -0
- package/esm2020/contact-center/cc-readiness/widgets/summary-grid/summary-grid.component.mjs +47 -0
- package/esm2020/contact-center/public-api.mjs +4 -0
- package/esm2020/contact-center/shared/api.endpoints.mjs +7 -0
- package/esm2020/contact-center/shared/api.service.mjs +86 -0
- package/esm2020/contact-center/shared/material.module.mjs +76 -0
- package/esm2020/contact-center/shared/shared.module.mjs +33 -0
- package/esm2020/contact-center/tuki-io-tuki-widgets-contact-center.mjs +5 -0
- package/esm2020/di2mt/shared/services/api.service.mjs +1 -1
- package/esm2020/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2020/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.mjs +2 -2
- package/esm2020/user-device-manage/src/app.constants.mjs +4 -2
- package/esm2020/user-device-manage/src/classes/deviceProfile.mjs +34 -0
- package/esm2020/user-device-manage/src/device-info/device-info.component.mjs +11 -5
- package/esm2020/user-device-manage/src/device-manage-widget.component.mjs +34 -13
- package/esm2020/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
- package/esm2020/user-device-manage/src/pipes/mac-address.pipe.mjs +26 -0
- package/esm2020/user-device-manage/src/services/user.service.mjs +69 -1
- package/esm2020/user-device-manage/src/shared/tk-page-section/page-section.component.mjs +1 -1
- package/esm2020/user-device-manage/src/user-device-manage.module.mjs +5 -2
- package/esm2020/user-device-manage/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-manage/src/app.constants.mjs +5 -1
- package/esm2020/user-manage/src/classes/line-association-interface.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-directory.mjs +3 -2
- package/esm2020/user-manage/src/classes/line.mjs +1 -1
- package/esm2020/user-manage/src/classes/pagination.mjs +1 -1
- package/esm2020/user-manage/src/device-list/device-list.component.mjs +4 -3
- package/esm2020/user-manage/src/device-list/device-row/device-row.component.mjs +3 -3
- package/esm2020/user-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
- package/esm2020/user-manage/src/services/user.service.mjs +46 -4
- package/esm2020/user-manage/src/user-info/user-info.component.mjs +3 -3
- package/esm2020/user-manage/src/user-manage-widget.component.mjs +18 -7
- package/esm2020/user-manage/src/user-manage.module.mjs +1 -1
- package/esm2020/user-manage/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/users-list/src/users-list.component.mjs +7 -3
- package/esm2020/users-list/src/utils/app-loader/app-loader.mjs +3 -3
- package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs +433 -0
- package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs.map +1 -0
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +4 -4
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +172 -23
- package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +77 -21
- package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +8 -4
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs +430 -0
- package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs.map +1 -0
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +4 -4
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +177 -23
- package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +80 -21
- package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +8 -4
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/package.json +9 -1
- package/user-device-manage/src/app.constants.d.ts +2 -0
- package/user-device-manage/src/classes/deviceProfile.d.ts +24 -0
- package/user-device-manage/src/device-info/device-info.component.d.ts +4 -1
- package/user-device-manage/src/device-manage-widget.component.d.ts +6 -2
- package/user-device-manage/src/pipes/mac-address.pipe.d.ts +7 -0
- package/user-device-manage/src/services/user.service.d.ts +10 -0
- package/user-device-manage/src/user-device-manage.module.d.ts +8 -7
- package/user-manage/src/app.constants.d.ts +4 -0
- package/user-manage/src/classes/line-association-interface.d.ts +1 -0
- package/user-manage/src/classes/line-directory.d.ts +1 -0
- package/user-manage/src/classes/line.d.ts +1 -0
- package/user-manage/src/services/user.service.d.ts +3 -1
- package/user-manage/src/user-manage-widget.component.d.ts +2 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./widgets/licences-requirement/licences-requirement.component";
|
|
3
|
+
import * as i2 from "./widgets/summary-grid/summary-grid.component";
|
|
4
|
+
import * as i3 from "./components/card/card.component";
|
|
5
|
+
import * as i4 from "@angular/common";
|
|
6
|
+
import * as i5 from "@angular/common/http";
|
|
7
|
+
import * as i6 from "ng-apexcharts";
|
|
8
|
+
import * as i7 from "@angular/material/table";
|
|
9
|
+
import * as i8 from "@angular/material/button";
|
|
10
|
+
import * as i9 from "@angular/material/checkbox";
|
|
11
|
+
import * as i10 from "@angular/material/select";
|
|
12
|
+
import * as i11 from "@angular/material/progress-spinner";
|
|
13
|
+
import * as i12 from "@angular/material/core";
|
|
14
|
+
import * as i13 from "@angular/material/paginator";
|
|
15
|
+
export declare class CcReadinessModule {
|
|
16
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CcReadinessModule, never>;
|
|
17
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<CcReadinessModule, [typeof i1.LicencesRequirementComponent, typeof i2.SummaryGridComponent, typeof i3.CardComponent], [typeof i4.CommonModule, typeof i5.HttpClientModule, typeof i6.NgApexchartsModule, typeof i7.MatTableModule, typeof i8.MatButtonModule, typeof i9.MatCheckboxModule, typeof i10.MatSelectModule, typeof i11.MatProgressSpinnerModule, typeof i12.MatOptionModule, typeof i13.MatPaginatorModule, typeof i10.MatSelectModule], [typeof i1.LicencesRequirementComponent, typeof i2.SummaryGridComponent]>;
|
|
18
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<CcReadinessModule>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { UccxServerEntityStats, WebexLicenseUsageSummary } from './types/cc-readiness';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class CcReadinessService {
|
|
5
|
+
private readonly api;
|
|
6
|
+
constructor();
|
|
7
|
+
fetchUccxServerEntityStats(customerId: number): Observable<UccxServerEntityStats[]>;
|
|
8
|
+
fetchWebexLicenseUsageSummary(customerId: number): Observable<WebexLicenseUsageSummary[]>;
|
|
9
|
+
setToken(token: string): void;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CcReadinessService, never>;
|
|
11
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<CcReadinessService>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
export declare class CardComponent {
|
|
3
|
+
title: string;
|
|
4
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CardComponent, never>;
|
|
5
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CardComponent, "tk-card", never, { "title": "title"; }, {}, never, ["card-content"], false, never>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type EntityType = 'applications' | 'triggers' | 'contactServiceQueues' | 'resources' | 'resourceGroups' | 'skills' | 'xml' | 'scripts' | 'audioPrompts' | 'teams' | 'phonebooks' | 'wrapUpCodes';
|
|
2
|
+
export interface UccxServerEntityStats {
|
|
3
|
+
uccxIp: string;
|
|
4
|
+
counts: {
|
|
5
|
+
[key in EntityType]: number;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export interface WebexLicenseFeatureUsage {
|
|
9
|
+
feature: 'PERSON' | 'ORPHANED_DEVICE';
|
|
10
|
+
totalCount: number;
|
|
11
|
+
usageCount: number;
|
|
12
|
+
unUsedCount: number;
|
|
13
|
+
}
|
|
14
|
+
export interface WebexLicenseUsageSummary {
|
|
15
|
+
webexReadinessLicenseStats: WebexLicenseFeatureUsage[];
|
|
16
|
+
totalProfessionalLicenseCount: number;
|
|
17
|
+
totalWorkspaceProfessionalLicenseCount: number;
|
|
18
|
+
professionalWebexReadinessTotalLicenseStatCoverage: number;
|
|
19
|
+
workspaceWebexReadinessTotalLicenseStatCoverage: number;
|
|
20
|
+
}
|
package/contact-center/cc-readiness/widgets/licences-requirement/licences-requirement.component.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';
|
|
2
|
+
import { ApexChart, ApexDataLabels, ApexLegend, ApexNonAxisChartSeries, ApexPlotOptions } from 'ng-apexcharts';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
interface LicenseLegendItem {
|
|
5
|
+
label: string;
|
|
6
|
+
count: number;
|
|
7
|
+
percentage: number;
|
|
8
|
+
color: string;
|
|
9
|
+
}
|
|
10
|
+
interface LicenseTableRow {
|
|
11
|
+
label: string;
|
|
12
|
+
value: number;
|
|
13
|
+
}
|
|
14
|
+
interface LicenseChartOptions {
|
|
15
|
+
series: ApexNonAxisChartSeries;
|
|
16
|
+
chart: ApexChart;
|
|
17
|
+
labels: string[];
|
|
18
|
+
colors: string[];
|
|
19
|
+
legend: ApexLegend;
|
|
20
|
+
plotOptions: ApexPlotOptions;
|
|
21
|
+
dataLabels: ApexDataLabels;
|
|
22
|
+
}
|
|
23
|
+
interface LicenseRequirementViewModel {
|
|
24
|
+
chartOptions: LicenseChartOptions;
|
|
25
|
+
legendItems: LicenseLegendItem[];
|
|
26
|
+
rows: LicenseTableRow[];
|
|
27
|
+
totalRequired: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class LicencesRequirementComponent implements OnInit, OnDestroy, OnChanges {
|
|
30
|
+
customerId: number;
|
|
31
|
+
token: string;
|
|
32
|
+
private readonly ccReadinessService;
|
|
33
|
+
private subscription?;
|
|
34
|
+
viewModel: LicenseRequirementViewModel | null;
|
|
35
|
+
loading: boolean;
|
|
36
|
+
error: boolean;
|
|
37
|
+
filters: string[];
|
|
38
|
+
selectedSummaryIndex: number;
|
|
39
|
+
private summary;
|
|
40
|
+
ngOnInit(): void;
|
|
41
|
+
ngOnDestroy(): void;
|
|
42
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
43
|
+
onFilterChange(index: number): void;
|
|
44
|
+
private loadSummaries;
|
|
45
|
+
private selectFilter;
|
|
46
|
+
private mapSummaryToViewModel;
|
|
47
|
+
private buildChartOptions;
|
|
48
|
+
private normalizePercentage;
|
|
49
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LicencesRequirementComponent, never>;
|
|
50
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LicencesRequirementComponent, "cc-licenses-requirement", never, { "customerId": "customerId"; "token": "token"; }, {}, never, never, false, never>;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { OnInit } from "@angular/core";
|
|
2
|
+
import { Observable } from "rxjs";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
interface SummaryGridCount {
|
|
5
|
+
name: string;
|
|
6
|
+
value: number;
|
|
7
|
+
}
|
|
8
|
+
interface SummaryGridItem {
|
|
9
|
+
uccxIp: string;
|
|
10
|
+
counts: SummaryGridCount[];
|
|
11
|
+
}
|
|
12
|
+
export declare class SummaryGridComponent implements OnInit {
|
|
13
|
+
customerId: number;
|
|
14
|
+
token: string;
|
|
15
|
+
private readonly ccReadinessService;
|
|
16
|
+
readonly ENTITY_CONFIG: {
|
|
17
|
+
[key: string]: {
|
|
18
|
+
label: string;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
data$: Observable<SummaryGridItem[]>;
|
|
22
|
+
ngOnInit(): void;
|
|
23
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SummaryGridComponent, never>;
|
|
24
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SummaryGridComponent, "cc-summary-grid", never, { "customerId": "customerId"; "token": "token"; }, {}, never, never, false, never>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class APIService {
|
|
5
|
+
private httpClient;
|
|
6
|
+
token: any;
|
|
7
|
+
apiUrl: string;
|
|
8
|
+
constructor(httpClient: HttpClient);
|
|
9
|
+
fetch(url: string, params?: any, cache?: boolean): Observable<any>;
|
|
10
|
+
post(url: string, body: any, params?: {}): Observable<any>;
|
|
11
|
+
postExtended(url: string, body?: null, params?: {}, headers?: {}): Observable<import("@angular/common/http").HttpResponse<Object>>;
|
|
12
|
+
put(url: string, body?: null, params?: {}): Observable<Object>;
|
|
13
|
+
delete(url: string, params?: {}): Observable<Object>;
|
|
14
|
+
fetchPagination(url: string, pageSize: number, pageNumber: number, additionalParams?: {}, cache?: boolean): Observable<any>;
|
|
15
|
+
private prepareEncodedParams;
|
|
16
|
+
private getHeaders;
|
|
17
|
+
private getParameterByName;
|
|
18
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<APIService, never>;
|
|
19
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<APIService>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "@angular/material/progress-bar";
|
|
3
|
+
import * as i2 from "@angular/material/tooltip";
|
|
4
|
+
import * as i3 from "@angular/material/table";
|
|
5
|
+
import * as i4 from "@angular/material/checkbox";
|
|
6
|
+
import * as i5 from "@angular/material/button";
|
|
7
|
+
import * as i6 from "@angular/material/icon";
|
|
8
|
+
import * as i7 from "@angular/material/form-field";
|
|
9
|
+
import * as i8 from "@angular/material/input";
|
|
10
|
+
import * as i9 from "@angular/material/select";
|
|
11
|
+
export declare class MaterialModule {
|
|
12
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MaterialModule, never>;
|
|
13
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<MaterialModule, never, [typeof i1.MatProgressBarModule, typeof i2.MatTooltipModule, typeof i3.MatTableModule, typeof i4.MatCheckboxModule, typeof i5.MatButtonModule, typeof i6.MatIconModule, typeof i7.MatFormFieldModule, typeof i8.MatInputModule, typeof i9.MatSelectModule], [typeof i1.MatProgressBarModule, typeof i2.MatTooltipModule, typeof i3.MatTableModule, typeof i4.MatCheckboxModule, typeof i5.MatButtonModule, typeof i6.MatIconModule, typeof i7.MatFormFieldModule, typeof i8.MatInputModule, typeof i9.MatSelectModule]>;
|
|
14
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<MaterialModule>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "@angular/common";
|
|
3
|
+
import * as i2 from "./material.module";
|
|
4
|
+
import * as i3 from "ng-apexcharts";
|
|
5
|
+
import * as i4 from "@angular/common/http";
|
|
6
|
+
export declare class SharedModule {
|
|
7
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SharedModule, never>;
|
|
8
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<SharedModule, never, [typeof i1.CommonModule, typeof i2.MaterialModule, typeof i3.NgApexchartsModule, typeof i4.HttpClientModule], [typeof i2.MaterialModule]>;
|
|
9
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<SharedModule>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { HttpClientModule } from '@angular/common/http';
|
|
4
|
+
import { LicencesRequirementComponent } from './widgets/licences-requirement/licences-requirement.component';
|
|
5
|
+
import { SummaryGridComponent } from './widgets/summary-grid/summary-grid.component';
|
|
6
|
+
import { CardComponent } from './components/card/card.component';
|
|
7
|
+
import { NgApexchartsModule } from 'ng-apexcharts';
|
|
8
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
9
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
10
|
+
import { MatOptionModule } from '@angular/material/core';
|
|
11
|
+
import { MatPaginatorModule } from '@angular/material/paginator';
|
|
12
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
13
|
+
import { MatSelectModule } from '@angular/material/select';
|
|
14
|
+
import { MatTableModule } from '@angular/material/table';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
export class CcReadinessModule {
|
|
17
|
+
}
|
|
18
|
+
CcReadinessModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
19
|
+
CcReadinessModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessModule, declarations: [LicencesRequirementComponent,
|
|
20
|
+
SummaryGridComponent,
|
|
21
|
+
CardComponent], imports: [CommonModule,
|
|
22
|
+
HttpClientModule,
|
|
23
|
+
NgApexchartsModule,
|
|
24
|
+
MatTableModule,
|
|
25
|
+
MatButtonModule,
|
|
26
|
+
MatCheckboxModule,
|
|
27
|
+
MatSelectModule,
|
|
28
|
+
MatProgressSpinnerModule,
|
|
29
|
+
MatOptionModule,
|
|
30
|
+
MatPaginatorModule,
|
|
31
|
+
MatSelectModule], exports: [LicencesRequirementComponent,
|
|
32
|
+
SummaryGridComponent] });
|
|
33
|
+
CcReadinessModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessModule, imports: [CommonModule,
|
|
34
|
+
HttpClientModule,
|
|
35
|
+
NgApexchartsModule,
|
|
36
|
+
MatTableModule,
|
|
37
|
+
MatButtonModule,
|
|
38
|
+
MatCheckboxModule,
|
|
39
|
+
MatSelectModule,
|
|
40
|
+
MatProgressSpinnerModule,
|
|
41
|
+
MatOptionModule,
|
|
42
|
+
MatPaginatorModule,
|
|
43
|
+
MatSelectModule] });
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessModule, decorators: [{
|
|
45
|
+
type: NgModule,
|
|
46
|
+
args: [{
|
|
47
|
+
declarations: [
|
|
48
|
+
LicencesRequirementComponent,
|
|
49
|
+
SummaryGridComponent,
|
|
50
|
+
CardComponent
|
|
51
|
+
],
|
|
52
|
+
imports: [
|
|
53
|
+
CommonModule,
|
|
54
|
+
HttpClientModule,
|
|
55
|
+
NgApexchartsModule,
|
|
56
|
+
MatTableModule,
|
|
57
|
+
MatButtonModule,
|
|
58
|
+
MatCheckboxModule,
|
|
59
|
+
MatSelectModule,
|
|
60
|
+
MatProgressSpinnerModule,
|
|
61
|
+
MatOptionModule,
|
|
62
|
+
MatPaginatorModule,
|
|
63
|
+
MatSelectModule
|
|
64
|
+
],
|
|
65
|
+
exports: [
|
|
66
|
+
LicencesRequirementComponent,
|
|
67
|
+
SummaryGridComponent
|
|
68
|
+
]
|
|
69
|
+
}]
|
|
70
|
+
}] });
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2MtcmVhZGluZXNzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9jb250YWN0LWNlbnRlci9jYy1yZWFkaW5lc3MvY2MtcmVhZGluZXNzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUM3RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUE0QnpELE1BQU0sT0FBTyxpQkFBaUI7OytHQUFqQixpQkFBaUI7Z0hBQWpCLGlCQUFpQixpQkF0QjFCLDRCQUE0QjtRQUM1QixvQkFBb0I7UUFDcEIsYUFBYSxhQUdiLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIsa0JBQWtCO1FBQ2xCLGNBQWM7UUFDZCxlQUFlO1FBQ2YsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZix3QkFBd0I7UUFDeEIsZUFBZTtRQUNmLGtCQUFrQjtRQUNsQixlQUFlLGFBR2YsNEJBQTRCO1FBQzVCLG9CQUFvQjtnSEFHWCxpQkFBaUIsWUFqQjFCLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIsa0JBQWtCO1FBQ2xCLGNBQWM7UUFDZCxlQUFlO1FBQ2YsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZix3QkFBd0I7UUFDeEIsZUFBZTtRQUNmLGtCQUFrQjtRQUNsQixlQUFlOzRGQU9OLGlCQUFpQjtrQkF4QjdCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLDRCQUE0Qjt3QkFDNUIsb0JBQW9CO3dCQUNwQixhQUFhO3FCQUNkO29CQUNELE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLHdCQUF3Qjt3QkFDeEIsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLGVBQWU7cUJBQ2hCO29CQUNELE9BQU8sRUFBRTt3QkFDUCw0QkFBNEI7d0JBQzVCLG9CQUFvQjtxQkFDckI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBMaWNlbmNlc1JlcXVpcmVtZW50Q29tcG9uZW50IH0gZnJvbSAnLi93aWRnZXRzL2xpY2VuY2VzLXJlcXVpcmVtZW50L2xpY2VuY2VzLXJlcXVpcmVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFN1bW1hcnlHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi93aWRnZXRzL3N1bW1hcnktZ3JpZC9zdW1tYXJ5LWdyaWQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2FyZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jYXJkL2NhcmQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTmdBcGV4Y2hhcnRzTW9kdWxlIH0gZnJvbSAnbmctYXBleGNoYXJ0cyc7XHJcbmltcG9ydCB7IE1hdGVyaWFsTW9kdWxlIH0gZnJvbSAnLi4vc2hhcmVkL21hdGVyaWFsLm1vZHVsZSc7XHJcbmltcG9ydCB7IFNoYXJlZE1vZHVsZSB9IGZyb20gJy4uL3NoYXJlZC9zaGFyZWQubW9kdWxlJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcblxyXG5cclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICBMaWNlbmNlc1JlcXVpcmVtZW50Q29tcG9uZW50LFxyXG4gICAgU3VtbWFyeUdyaWRDb21wb25lbnQsXHJcbiAgICBDYXJkQ29tcG9uZW50XHJcbiAgXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBIdHRwQ2xpZW50TW9kdWxlLFxyXG4gICAgTmdBcGV4Y2hhcnRzTW9kdWxlLFxyXG4gICAgTWF0VGFibGVNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcclxuICAgIE1hdE9wdGlvbk1vZHVsZSxcclxuICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZVxyXG4gIF0sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgTGljZW5jZXNSZXF1aXJlbWVudENvbXBvbmVudCxcclxuICAgIFN1bW1hcnlHcmlkQ29tcG9uZW50XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2NSZWFkaW5lc3NNb2R1bGUgeyB9XHJcbiJdfQ==
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { APIService } from '../shared/api.service';
|
|
3
|
+
import { API } from '../shared/api.endpoints';
|
|
4
|
+
import { map } from 'rxjs';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class CcReadinessService {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.api = inject(APIService);
|
|
9
|
+
}
|
|
10
|
+
fetchUccxServerEntityStats(customerId) {
|
|
11
|
+
return this.api.fetch(API.READINESS.UCCX_SERVER_ENTITY_STATS(customerId))
|
|
12
|
+
.pipe(map((stats) => {
|
|
13
|
+
stats.forEach(stat => {
|
|
14
|
+
// @ts-ignore
|
|
15
|
+
delete stat.counts.reasonCodes;
|
|
16
|
+
});
|
|
17
|
+
return stats;
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
fetchWebexLicenseUsageSummary(customerId) {
|
|
21
|
+
return this.api.fetch(API.READINESS.LICENSE_USAGE_SUMMARY(customerId));
|
|
22
|
+
}
|
|
23
|
+
setToken(token) {
|
|
24
|
+
this.api.token = token;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
CcReadinessService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
28
|
+
CcReadinessService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessService, providedIn: 'root' });
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessService, decorators: [{
|
|
30
|
+
type: Injectable,
|
|
31
|
+
args: [{
|
|
32
|
+
providedIn: 'root'
|
|
33
|
+
}]
|
|
34
|
+
}], ctorParameters: function () { return []; } });
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2MtcmVhZGluZXNzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvY29udGFjdC1jZW50ZXIvY2MtcmVhZGluZXNzL2NjLXJlYWRpbmVzcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQVUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUMsT0FBTyxFQUFjLEdBQUcsRUFBMEIsTUFBTSxNQUFNLENBQUM7O0FBSy9ELE1BQU0sT0FBTyxrQkFBa0I7SUFHN0I7UUFGaUIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxQixDQUFDO0lBRWpCLDBCQUEwQixDQUFDLFVBQWtCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN0RSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBOEIsRUFBRSxFQUFFO1lBQzNDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25CLGFBQWE7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxVQUFrQjtRQUM5QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQWE7UUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7O2dIQXRCVSxrQkFBa0I7b0hBQWxCLGtCQUFrQixjQUZqQixNQUFNOzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBUElTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVWNjeFNlcnZlckVudGl0eVN0YXRzLCBXZWJleExpY2Vuc2VVc2FnZVN1bW1hcnkgfSBmcm9tICcuL3R5cGVzL2NjLXJlYWRpbmVzcyc7XHJcbmltcG9ydCB7IEFQSSB9IGZyb20gJy4uL3NoYXJlZC9hcGkuZW5kcG9pbnRzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDY1JlYWRpbmVzc1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpID0gaW5qZWN0KEFQSVNlcnZpY2UpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBmZXRjaFVjY3hTZXJ2ZXJFbnRpdHlTdGF0cyhjdXN0b21lcklkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFVjY3hTZXJ2ZXJFbnRpdHlTdGF0c1tdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hcGkuZmV0Y2goQVBJLlJFQURJTkVTUy5VQ0NYX1NFUlZFUl9FTlRJVFlfU1RBVFMoY3VzdG9tZXJJZCkpXHJcbiAgICAgIC5waXBlKG1hcCgoc3RhdHM6IFVjY3hTZXJ2ZXJFbnRpdHlTdGF0c1tdKSA9PiB7XHJcbiAgICAgICAgc3RhdHMuZm9yRWFjaChzdGF0ID0+IHtcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIGRlbGV0ZSBzdGF0LmNvdW50cy5yZWFzb25Db2RlcztcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gc3RhdHM7XHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGZldGNoV2ViZXhMaWNlbnNlVXNhZ2VTdW1tYXJ5KGN1c3RvbWVySWQ6IG51bWJlcik6IE9ic2VydmFibGU8V2ViZXhMaWNlbnNlVXNhZ2VTdW1tYXJ5W10+IHtcclxuICAgIHJldHVybiB0aGlzLmFwaS5mZXRjaChBUEkuUkVBRElORVNTLkxJQ0VOU0VfVVNBR0VfU1VNTUFSWShjdXN0b21lcklkKSk7XHJcbiAgfVxyXG5cclxuICBzZXRUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmFwaS50b2tlbiA9IHRva2VuO1xyXG4gIH1cclxufSJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Component, Input } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class CardComponent {
|
|
4
|
+
}
|
|
5
|
+
CardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6
|
+
CardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CardComponent, selector: "tk-card", inputs: { title: "title" }, ngImport: i0, template: "<article class=\"card\">\r\n <header class=\"card__header\">\r\n <h2>{{ title }}</h2>\r\n <!--<div class=\"card__menu-button\">\r\n <img width=\"18\" src=\"assets/icons/menu_icon.png\" alt=\"Menu Icon\">\r\n </div>-->\r\n </header>\r\n <div class=\"card__content\">\r\n <ng-content select=\"card-content\"></ng-content>\r\n </div>\r\n</article>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";:host{display:block;height:100%;box-sizing:border-box}.card{font-family:Inter,Inter,sans-serif;background-color:#fff;border-radius:1rem;padding:2rem;border:1px solid hsla(0,0%,0%,.2);min-width:300px;max-width:100%;height:100%;display:flex;flex-direction:column;box-sizing:border-box;gap:2.5rem}.card__header{position:relative;display:flex;align-items:center;justify-content:space-between}.card__header h2{font-size:16px;margin:0}.card__header .card__menu-button{position:relative;display:flex;align-items:center}.card__content{display:flex;flex-direction:column;gap:2.5rem;flex-grow:1}\n"] });
|
|
7
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardComponent, decorators: [{
|
|
8
|
+
type: Component,
|
|
9
|
+
args: [{ selector: 'tk-card', template: "<article class=\"card\">\r\n <header class=\"card__header\">\r\n <h2>{{ title }}</h2>\r\n <!--<div class=\"card__menu-button\">\r\n <img width=\"18\" src=\"assets/icons/menu_icon.png\" alt=\"Menu Icon\">\r\n </div>-->\r\n </header>\r\n <div class=\"card__content\">\r\n <ng-content select=\"card-content\"></ng-content>\r\n </div>\r\n</article>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";:host{display:block;height:100%;box-sizing:border-box}.card{font-family:Inter,Inter,sans-serif;background-color:#fff;border-radius:1rem;padding:2rem;border:1px solid hsla(0,0%,0%,.2);min-width:300px;max-width:100%;height:100%;display:flex;flex-direction:column;box-sizing:border-box;gap:2.5rem}.card__header{position:relative;display:flex;align-items:center;justify-content:space-between}.card__header h2{font-size:16px;margin:0}.card__header .card__menu-button{position:relative;display:flex;align-items:center}.card__content{display:flex;flex-direction:column;gap:2.5rem;flex-grow:1}\n"] }]
|
|
10
|
+
}], propDecorators: { title: [{
|
|
11
|
+
type: Input
|
|
12
|
+
}] } });
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvY29udGFjdC1jZW50ZXIvY2MtcmVhZGluZXNzL2NvbXBvbmVudHMvY2FyZC9jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9jb250YWN0LWNlbnRlci9jYy1yZWFkaW5lc3MvY29tcG9uZW50cy9jYXJkL2NhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBT2pELE1BQU0sT0FBTyxhQUFhOzsyR0FBYixhQUFhOytGQUFiLGFBQWEsMkVDUDFCLGlaQVdBOzRGREphLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0ksU0FBUzs4QkFLVixLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd0ay1jYXJkJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NhcmQuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FyZENvbXBvbmVudCB7XHJcbiAgICBASW5wdXQoKSB0aXRsZSE6IHN0cmluZztcclxufSIsIjxhcnRpY2xlIGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgPGhlYWRlciBjbGFzcz1cImNhcmRfX2hlYWRlclwiPlxyXG4gICAgICAgIDxoMj57eyB0aXRsZSB9fTwvaDI+XHJcbiAgICAgICAgPCEtLTxkaXYgY2xhc3M9XCJjYXJkX19tZW51LWJ1dHRvblwiPlxyXG4gICAgICAgICAgICA8aW1nIHdpZHRoPVwiMThcIiBzcmM9XCJhc3NldHMvaWNvbnMvbWVudV9pY29uLnBuZ1wiIGFsdD1cIk1lbnUgSWNvblwiPlxyXG4gICAgICAgIDwvZGl2Pi0tPlxyXG4gICAgPC9oZWFkZXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZF9fY29udGVudFwiPlxyXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNhcmQtY29udGVudFwiPjwvbmctY29udGVudD5cclxuICAgIDwvZGl2PlxyXG48L2FydGljbGU+XHJcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
;
|
|
2
|
+
;
|
|
3
|
+
;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2MtcmVhZGluZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL2NvbnRhY3QtY2VudGVyL2NjLXJlYWRpbmVzcy90eXBlcy9jYy1yZWFkaW5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0JDLENBQUM7QUFPRCxDQUFDO0FBUUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEVudGl0eVR5cGUgPVxyXG4gICAgfCAnYXBwbGljYXRpb25zJ1xyXG4gICAgfCAndHJpZ2dlcnMnXHJcbiAgICB8ICdjb250YWN0U2VydmljZVF1ZXVlcydcclxuICAgIHwgJ3Jlc291cmNlcydcclxuICAgIHwgJ3Jlc291cmNlR3JvdXBzJ1xyXG4gICAgfCAnc2tpbGxzJ1xyXG4gICAgfCAneG1sJ1xyXG4gICAgfCAnc2NyaXB0cydcclxuICAgIHwgJ2F1ZGlvUHJvbXB0cydcclxuICAgIHwgJ3RlYW1zJ1xyXG4gICAgLy8gfCAncmVhc29uQ29kZXMnXHJcbiAgICB8ICdwaG9uZWJvb2tzJ1xyXG4gICAgfCAnd3JhcFVwQ29kZXMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVY2N4U2VydmVyRW50aXR5U3RhdHMge1xyXG4gICAgdWNjeElwOiBzdHJpbmc7XHJcbiAgICBjb3VudHM6IHsgW2tleSBpbiBFbnRpdHlUeXBlXTogbnVtYmVyIH1cclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgV2ViZXhMaWNlbnNlRmVhdHVyZVVzYWdlIHtcclxuICAgIGZlYXR1cmU6ICdQRVJTT04nIHwgJ09SUEhBTkVEX0RFVklDRScsXHJcbiAgICB0b3RhbENvdW50OiBudW1iZXIsXHJcbiAgICB1c2FnZUNvdW50OiBudW1iZXIsXHJcbiAgICB1blVzZWRDb3VudDogbnVtYmVyXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFdlYmV4TGljZW5zZVVzYWdlU3VtbWFyeSB7XHJcbiAgICB3ZWJleFJlYWRpbmVzc0xpY2Vuc2VTdGF0czogV2ViZXhMaWNlbnNlRmVhdHVyZVVzYWdlW10sXHJcbiAgICB0b3RhbFByb2Zlc3Npb25hbExpY2Vuc2VDb3VudDogbnVtYmVyLFxyXG4gICAgdG90YWxXb3Jrc3BhY2VQcm9mZXNzaW9uYWxMaWNlbnNlQ291bnQ6IG51bWJlcixcclxuICAgIHByb2Zlc3Npb25hbFdlYmV4UmVhZGluZXNzVG90YWxMaWNlbnNlU3RhdENvdmVyYWdlOiBudW1iZXIsXHJcbiAgICB3b3Jrc3BhY2VXZWJleFJlYWRpbmVzc1RvdGFsTGljZW5zZVN0YXRDb3ZlcmFnZTogbnVtYmVyXHJcbn07Il19
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { Component, Input, inject } from '@angular/core';
|
|
2
|
+
import { catchError, finalize, of } from 'rxjs';
|
|
3
|
+
import { CcReadinessService } from '../../cc-readiness.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
import * as i2 from "ng-apexcharts";
|
|
7
|
+
import * as i3 from "@angular/material/select";
|
|
8
|
+
import * as i4 from "@angular/material/core";
|
|
9
|
+
import * as i5 from "../../components/card/card.component";
|
|
10
|
+
const LEGEND_COLORS = {
|
|
11
|
+
existing: '#16A693',
|
|
12
|
+
missing: '#808080'
|
|
13
|
+
};
|
|
14
|
+
export class LicencesRequirementComponent {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.ccReadinessService = inject(CcReadinessService);
|
|
17
|
+
this.viewModel = null;
|
|
18
|
+
this.loading = false;
|
|
19
|
+
this.error = false;
|
|
20
|
+
this.filters = ['All', 'Professional licenses', 'Workspace licenses'];
|
|
21
|
+
this.selectedSummaryIndex = 0;
|
|
22
|
+
this.summary = null;
|
|
23
|
+
}
|
|
24
|
+
ngOnInit() {
|
|
25
|
+
this.loadSummaries();
|
|
26
|
+
}
|
|
27
|
+
ngOnDestroy() {
|
|
28
|
+
this.subscription?.unsubscribe();
|
|
29
|
+
}
|
|
30
|
+
ngOnChanges(changes) {
|
|
31
|
+
if ((changes['customerId'] && !changes['customerId'].firstChange) ||
|
|
32
|
+
(changes['token'] && !changes['token'].firstChange)) {
|
|
33
|
+
this.loadSummaries();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
onFilterChange(index) {
|
|
37
|
+
if (!isNaN(index) && index >= 0 && index < this.filters.length) {
|
|
38
|
+
this.selectFilter(index);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
loadSummaries() {
|
|
42
|
+
const numericCustomerId = Number(this.customerId);
|
|
43
|
+
if (!numericCustomerId || !this.token) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.subscription?.unsubscribe();
|
|
47
|
+
this.loading = true;
|
|
48
|
+
this.error = false;
|
|
49
|
+
this.viewModel = null;
|
|
50
|
+
this.selectedSummaryIndex = 0;
|
|
51
|
+
this.ccReadinessService.setToken(this.token);
|
|
52
|
+
this.subscription = this.ccReadinessService.fetchWebexLicenseUsageSummary(numericCustomerId)
|
|
53
|
+
.pipe(catchError(error => {
|
|
54
|
+
console.error('Unable to load Webex license usage summary', error);
|
|
55
|
+
this.error = true;
|
|
56
|
+
return of([]);
|
|
57
|
+
}), finalize(() => this.loading = false))
|
|
58
|
+
.subscribe(items => {
|
|
59
|
+
console.log('Raw API response:', items);
|
|
60
|
+
// Handle both array and single object responses
|
|
61
|
+
if (Array.isArray(items) && items.length > 0) {
|
|
62
|
+
this.summary = items[0];
|
|
63
|
+
}
|
|
64
|
+
else if (items && typeof items === 'object' && !Array.isArray(items)) {
|
|
65
|
+
// If single object returned, use it directly
|
|
66
|
+
this.summary = items;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
this.summary = null;
|
|
70
|
+
}
|
|
71
|
+
console.log('Processed summary:', this.summary);
|
|
72
|
+
this.selectFilter(0);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
selectFilter(index) {
|
|
76
|
+
this.selectedSummaryIndex = index;
|
|
77
|
+
if (!this.summary) {
|
|
78
|
+
this.viewModel = null;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this.viewModel = this.mapSummaryToViewModel(this.summary, index);
|
|
82
|
+
console.log('Created viewModel for filter index', index, ':', this.viewModel);
|
|
83
|
+
}
|
|
84
|
+
mapSummaryToViewModel(summary, filterIndex) {
|
|
85
|
+
console.log('Mapping summary to viewModel:', summary, 'filterIndex:', filterIndex);
|
|
86
|
+
// Extract data from webexReadinessLicenseStats and license counts
|
|
87
|
+
const personStat = summary.webexReadinessLicenseStats?.find(stat => stat.feature === 'PERSON');
|
|
88
|
+
const deviceStat = summary.webexReadinessLicenseStats?.find(stat => stat.feature === 'ORPHANED_DEVICE');
|
|
89
|
+
const professionalNeeded = personStat?.totalCount ?? 0;
|
|
90
|
+
const workspaceNeeded = deviceStat?.totalCount ?? 0;
|
|
91
|
+
const professionalOwned = Number(summary.totalProfessionalLicenseCount ?? 0);
|
|
92
|
+
const workspaceOwned = Number(summary.totalWorkspaceProfessionalLicenseCount ?? 0);
|
|
93
|
+
// Filter data based on selection
|
|
94
|
+
let existingCount;
|
|
95
|
+
let missingCount;
|
|
96
|
+
let rows;
|
|
97
|
+
if (filterIndex === 0) {
|
|
98
|
+
// All - show both
|
|
99
|
+
existingCount = professionalOwned + workspaceOwned;
|
|
100
|
+
const totalNeeded = professionalNeeded + workspaceNeeded;
|
|
101
|
+
missingCount = Math.max(0, totalNeeded - existingCount);
|
|
102
|
+
rows = [
|
|
103
|
+
{ label: 'Professional licenses', value: professionalNeeded },
|
|
104
|
+
{ label: 'Workspace licenses', value: workspaceNeeded }
|
|
105
|
+
];
|
|
106
|
+
}
|
|
107
|
+
else if (filterIndex === 1) {
|
|
108
|
+
// Professional licenses only
|
|
109
|
+
existingCount = professionalOwned;
|
|
110
|
+
missingCount = Math.max(0, professionalNeeded - professionalOwned);
|
|
111
|
+
rows = [{ label: 'Professional licenses', value: professionalNeeded }];
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// Workspace licenses only
|
|
115
|
+
existingCount = workspaceOwned;
|
|
116
|
+
missingCount = Math.max(0, workspaceNeeded - workspaceOwned);
|
|
117
|
+
rows = [{ label: 'Workspace licenses', value: workspaceNeeded }];
|
|
118
|
+
}
|
|
119
|
+
const totalLicenses = existingCount + missingCount;
|
|
120
|
+
const legendItems = [
|
|
121
|
+
{
|
|
122
|
+
label: 'Existing licenses',
|
|
123
|
+
count: existingCount,
|
|
124
|
+
percentage: totalLicenses > 0 ? (existingCount / totalLicenses) * 100 : 0,
|
|
125
|
+
color: LEGEND_COLORS.existing
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
label: 'Missing licenses',
|
|
129
|
+
count: missingCount,
|
|
130
|
+
percentage: totalLicenses > 0 ? (missingCount / totalLicenses) * 100 : 0,
|
|
131
|
+
color: LEGEND_COLORS.missing
|
|
132
|
+
}
|
|
133
|
+
];
|
|
134
|
+
console.log('Legend items:', legendItems);
|
|
135
|
+
console.log('Table rows:', rows);
|
|
136
|
+
const totalRequired = rows.reduce((acc, row) => acc + row.value, 0);
|
|
137
|
+
return {
|
|
138
|
+
chartOptions: this.buildChartOptions(legendItems),
|
|
139
|
+
legendItems,
|
|
140
|
+
rows,
|
|
141
|
+
totalRequired
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
buildChartOptions(legendItems) {
|
|
145
|
+
return {
|
|
146
|
+
series: legendItems.map(item => item.count),
|
|
147
|
+
chart: {
|
|
148
|
+
type: 'donut',
|
|
149
|
+
height: 220
|
|
150
|
+
},
|
|
151
|
+
labels: legendItems.map(item => item.label),
|
|
152
|
+
colors: legendItems.map(item => item.color),
|
|
153
|
+
legend: {
|
|
154
|
+
show: false
|
|
155
|
+
},
|
|
156
|
+
plotOptions: {
|
|
157
|
+
pie: {
|
|
158
|
+
donut: {
|
|
159
|
+
size: '75%'
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
dataLabels: {
|
|
164
|
+
enabled: false
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
normalizePercentage(value) {
|
|
169
|
+
if (!isFinite(value)) {
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
// Convert decimal to percentage (0.9487 → 94.9)
|
|
173
|
+
const percentage = value * 100;
|
|
174
|
+
return Math.round(percentage * 10) / 10;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
LicencesRequirementComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LicencesRequirementComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
178
|
+
LicencesRequirementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: LicencesRequirementComponent, selector: "cc-licenses-requirement", inputs: { customerId: "customerId", token: "token" }, usesOnChanges: true, ngImport: i0, template: "<tk-card title=\"Licenses requirement\">\r\n <ng-container ngProjectAs=\"card-content\">\r\n <div\r\n class=\"widget-body\"\r\n *ngIf=\"!loading && !error && viewModel; else widgetState\"\r\n >\r\n <div class=\"left-section\">\r\n <mat-select\r\n [(value)]=\"selectedSummaryIndex\"\r\n (selectionChange)=\"onFilterChange($event.value)\"\r\n class=\"filter-select\"\r\n >\r\n <mat-option *ngFor=\"let option of filters; index as i\" [value]=\"i\">\r\n {{ option }}\r\n </mat-option>\r\n </mat-select>\r\n\r\n <div class=\"chart-section\">\r\n <div class=\"chart-wrapper\">\r\n <apx-chart\r\n [series]=\"viewModel.chartOptions.series\"\r\n [chart]=\"viewModel.chartOptions.chart\"\r\n [labels]=\"viewModel.chartOptions.labels\"\r\n [colors]=\"viewModel.chartOptions.colors\"\r\n [legend]=\"viewModel.chartOptions.legend\"\r\n [plotOptions]=\"viewModel.chartOptions.plotOptions\"\r\n [dataLabels]=\"viewModel.chartOptions.dataLabels\"\r\n >\r\n </apx-chart>\r\n </div>\r\n <div class=\"legend\">\r\n <div class=\"legend-item\" *ngFor=\"let item of viewModel.legendItems\">\r\n <span\r\n class=\"legend-marker\"\r\n [style.backgroundColor]=\"item.color\"\r\n ></span>\r\n <span class=\"legend-label\">{{ item.label }}</span>\r\n <span class=\"legend-value\">{{ item.count | number }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"divider\" aria-hidden=\"true\"></div>\r\n\r\n <div class=\"table-section\">\r\n <div class=\"table-header\">\r\n <span>License</span>\r\n <span>Required</span>\r\n </div>\r\n <div class=\"table-row\" *ngFor=\"let row of viewModel.rows\">\r\n <span>{{ row.label }}</span>\r\n <span>{{ row.value | number }}</span>\r\n </div>\r\n <div class=\"table-row total-row\">\r\n <span>Total</span>\r\n <span>{{ viewModel.totalRequired | number }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #widgetState>\r\n <div class=\"state-message\" *ngIf=\"loading\">\r\n Loading license requirements\u2026\r\n </div>\r\n <div class=\"state-message error\" *ngIf=\"!loading && error\">\r\n Unable to load license requirements.\r\n </div>\r\n <div class=\"state-message\" *ngIf=\"!loading && !error && !viewModel\">\r\n No license data available.\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n</tk-card>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";:host{display:block;width:100%;box-sizing:border-box}.filter-select{font-family:Inter,Inter,sans-serif;font-size:14px;min-width:140px;border:1px solid #e5e7eb;border-radius:.5rem;padding:.5rem .75rem;background-color:#fff}.filter-select:hover{border-color:#d1d5db}:host ::ng-deep .filter-select.mat-mdc-select{border:1px solid #e5e7eb;border-radius:.5rem;background-color:#fff}:host ::ng-deep .filter-select.mat-mdc-select:hover{border-color:#d1d5db}:host ::ng-deep .filter-select.mat-mdc-select.mat-focused{border-color:#16a693}:host ::ng-deep .filter-select .mat-mdc-select-trigger{font-size:14px;padding:.5rem .75rem}:host ::ng-deep .filter-select .mat-mdc-select-value{color:#111827}:host ::ng-deep .filter-select .mat-mdc-select-arrow-wrapper{padding-left:.5rem}.widget-body{display:flex;gap:2.5rem;align-items:flex-start}.left-section{flex:2;display:flex;flex-direction:column;gap:1rem}.chart-section{display:flex;gap:1.5rem;align-items:center}.chart-wrapper{width:220px;min-height:220px;flex-shrink:0}.chart-wrapper apx-chart{width:220px!important;height:220px!important}.legend{display:flex;flex-direction:column;gap:.75rem}.legend-item{display:flex;align-items:center;gap:.5rem;font-family:Inter,Inter,sans-serif;font-size:14px}.legend-marker{width:14px;height:14px;border-radius:50%;display:inline-flex}.legend-label{color:#4b5563}.legend-value{margin-left:auto;font-weight:600;color:#111827}.divider{width:1px;min-height:200px;align-self:stretch;background:#e5e7eb}.table-section{flex:3;display:flex;flex-direction:column;gap:.75rem;font-family:Inter,Inter,sans-serif}.table-header,.table-row{display:flex;justify-content:space-between;font-size:14px}.table-header{font-weight:600;color:#6b7280;padding-bottom:.5rem;border-bottom:1px solid #e5e7eb}.table-row{color:#111827}.total-row{font-weight:700;margin-top:.5rem;padding-top:.5rem;border-top:1px solid #e5e7eb}.state-message{font-family:Inter,Inter,sans-serif;font-size:14px;color:#6b7280}.state-message.error{color:#b91c1c}@media (max-width: 960px){.widget-body{flex-direction:column}.divider{display:none}.chart-section{justify-content:space-between}}:host ::ng-deep .apexcharts-legend{display:none!important}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ChartComponent, selector: "apx-chart", inputs: ["chart", "annotations", "colors", "dataLabels", "series", "stroke", "labels", "legend", "markers", "noData", "fill", "tooltip", "plotOptions", "responsive", "xaxis", "yaxis", "forecastDataPoints", "grid", "states", "title", "subtitle", "theme", "autoUpdateSeries"] }, { kind: "component", type: i3.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i5.CardComponent, selector: "tk-card", inputs: ["title"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
|
|
179
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LicencesRequirementComponent, decorators: [{
|
|
180
|
+
type: Component,
|
|
181
|
+
args: [{ selector: 'cc-licenses-requirement', template: "<tk-card title=\"Licenses requirement\">\r\n <ng-container ngProjectAs=\"card-content\">\r\n <div\r\n class=\"widget-body\"\r\n *ngIf=\"!loading && !error && viewModel; else widgetState\"\r\n >\r\n <div class=\"left-section\">\r\n <mat-select\r\n [(value)]=\"selectedSummaryIndex\"\r\n (selectionChange)=\"onFilterChange($event.value)\"\r\n class=\"filter-select\"\r\n >\r\n <mat-option *ngFor=\"let option of filters; index as i\" [value]=\"i\">\r\n {{ option }}\r\n </mat-option>\r\n </mat-select>\r\n\r\n <div class=\"chart-section\">\r\n <div class=\"chart-wrapper\">\r\n <apx-chart\r\n [series]=\"viewModel.chartOptions.series\"\r\n [chart]=\"viewModel.chartOptions.chart\"\r\n [labels]=\"viewModel.chartOptions.labels\"\r\n [colors]=\"viewModel.chartOptions.colors\"\r\n [legend]=\"viewModel.chartOptions.legend\"\r\n [plotOptions]=\"viewModel.chartOptions.plotOptions\"\r\n [dataLabels]=\"viewModel.chartOptions.dataLabels\"\r\n >\r\n </apx-chart>\r\n </div>\r\n <div class=\"legend\">\r\n <div class=\"legend-item\" *ngFor=\"let item of viewModel.legendItems\">\r\n <span\r\n class=\"legend-marker\"\r\n [style.backgroundColor]=\"item.color\"\r\n ></span>\r\n <span class=\"legend-label\">{{ item.label }}</span>\r\n <span class=\"legend-value\">{{ item.count | number }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"divider\" aria-hidden=\"true\"></div>\r\n\r\n <div class=\"table-section\">\r\n <div class=\"table-header\">\r\n <span>License</span>\r\n <span>Required</span>\r\n </div>\r\n <div class=\"table-row\" *ngFor=\"let row of viewModel.rows\">\r\n <span>{{ row.label }}</span>\r\n <span>{{ row.value | number }}</span>\r\n </div>\r\n <div class=\"table-row total-row\">\r\n <span>Total</span>\r\n <span>{{ viewModel.totalRequired | number }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #widgetState>\r\n <div class=\"state-message\" *ngIf=\"loading\">\r\n Loading license requirements\u2026\r\n </div>\r\n <div class=\"state-message error\" *ngIf=\"!loading && error\">\r\n Unable to load license requirements.\r\n </div>\r\n <div class=\"state-message\" *ngIf=\"!loading && !error && !viewModel\">\r\n No license data available.\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n</tk-card>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";:host{display:block;width:100%;box-sizing:border-box}.filter-select{font-family:Inter,Inter,sans-serif;font-size:14px;min-width:140px;border:1px solid #e5e7eb;border-radius:.5rem;padding:.5rem .75rem;background-color:#fff}.filter-select:hover{border-color:#d1d5db}:host ::ng-deep .filter-select.mat-mdc-select{border:1px solid #e5e7eb;border-radius:.5rem;background-color:#fff}:host ::ng-deep .filter-select.mat-mdc-select:hover{border-color:#d1d5db}:host ::ng-deep .filter-select.mat-mdc-select.mat-focused{border-color:#16a693}:host ::ng-deep .filter-select .mat-mdc-select-trigger{font-size:14px;padding:.5rem .75rem}:host ::ng-deep .filter-select .mat-mdc-select-value{color:#111827}:host ::ng-deep .filter-select .mat-mdc-select-arrow-wrapper{padding-left:.5rem}.widget-body{display:flex;gap:2.5rem;align-items:flex-start}.left-section{flex:2;display:flex;flex-direction:column;gap:1rem}.chart-section{display:flex;gap:1.5rem;align-items:center}.chart-wrapper{width:220px;min-height:220px;flex-shrink:0}.chart-wrapper apx-chart{width:220px!important;height:220px!important}.legend{display:flex;flex-direction:column;gap:.75rem}.legend-item{display:flex;align-items:center;gap:.5rem;font-family:Inter,Inter,sans-serif;font-size:14px}.legend-marker{width:14px;height:14px;border-radius:50%;display:inline-flex}.legend-label{color:#4b5563}.legend-value{margin-left:auto;font-weight:600;color:#111827}.divider{width:1px;min-height:200px;align-self:stretch;background:#e5e7eb}.table-section{flex:3;display:flex;flex-direction:column;gap:.75rem;font-family:Inter,Inter,sans-serif}.table-header,.table-row{display:flex;justify-content:space-between;font-size:14px}.table-header{font-weight:600;color:#6b7280;padding-bottom:.5rem;border-bottom:1px solid #e5e7eb}.table-row{color:#111827}.total-row{font-weight:700;margin-top:.5rem;padding-top:.5rem;border-top:1px solid #e5e7eb}.state-message{font-family:Inter,Inter,sans-serif;font-size:14px;color:#6b7280}.state-message.error{color:#b91c1c}@media (max-width: 960px){.widget-body{flex-direction:column}.divider{display:none}.chart-section{justify-content:space-between}}:host ::ng-deep .apexcharts-legend{display:none!important}\n"] }]
|
|
182
|
+
}], propDecorators: { customerId: [{
|
|
183
|
+
type: Input
|
|
184
|
+
}], token: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}] } });
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGljZW5jZXMtcmVxdWlyZW1lbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL2NvbnRhY3QtY2VudGVyL2NjLXJlYWRpbmVzcy93aWRnZXRzL2xpY2VuY2VzLXJlcXVpcmVtZW50L2xpY2VuY2VzLXJlcXVpcmVtZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9jb250YWN0LWNlbnRlci9jYy1yZWFkaW5lc3Mvd2lkZ2V0cy9saWNlbmNlcy1yZXF1aXJlbWVudC9saWNlbmNlcy1yZXF1aXJlbWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRHLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7QUFnQ2hFLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLFFBQVEsRUFBRSxTQUFTO0lBQ25CLE9BQU8sRUFBRSxTQUFTO0NBQ25CLENBQUM7QUFPRixNQUFNLE9BQU8sNEJBQTRCO0lBTHpDO1FBU21CLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBR2pFLGNBQVMsR0FBdUMsSUFBSSxDQUFDO1FBQ3JELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUVkLFlBQU8sR0FBYSxDQUFDLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQzNFLHlCQUFvQixHQUFHLENBQUMsQ0FBQztRQUVqQixZQUFPLEdBQW9DLElBQUksQ0FB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RCxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDM0MsTUFBTSxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzNDLE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsS0FBSzthQUNaO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLEdBQUcsRUFBRTtvQkFDSCxLQUFLLEVBQUU7d0JBQ0wsSUFBSSxFQUFFLEtBQUs7cUJBQ1o7aUJBQ0Y7YUFDRjtZQUNELFVBQVUsRUFBRTtnQkFDVixPQUFPLEVBQUUsS0FBSzthQUNmO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxLQUFhO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDcEIsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUNELGdEQUFnRDtRQUNoRCxNQUFNLFVBQVUsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzFDLENBQUM7OzBIQTlMVSw0QkFBNEI7OEdBQTVCLDRCQUE0QiwwSUM3Q3pDLGd3RkEwRUE7NEZEN0JhLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSx5QkFBeUI7OEJBSzFCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFwZXhDaGFydCwgQXBleERhdGFMYWJlbHMsIEFwZXhMZWdlbmQsIEFwZXhOb25BeGlzQ2hhcnRTZXJpZXMsIEFwZXhQbG90T3B0aW9ucyB9IGZyb20gJ25nLWFwZXhjaGFydHMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaW5hbGl6ZSwgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDY1JlYWRpbmVzc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jYy1yZWFkaW5lc3Muc2VydmljZSc7XHJcbmltcG9ydCB7IFdlYmV4TGljZW5zZVVzYWdlU3VtbWFyeSB9IGZyb20gJy4uLy4uL3R5cGVzL2NjLXJlYWRpbmVzcyc7XHJcblxyXG5pbnRlcmZhY2UgTGljZW5zZUxlZ2VuZEl0ZW0ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgY291bnQ6IG51bWJlcjtcclxuICBwZXJjZW50YWdlOiBudW1iZXI7XHJcbiAgY29sb3I6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIExpY2Vuc2VUYWJsZVJvdyB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTGljZW5zZUNoYXJ0T3B0aW9ucyB7XHJcbiAgc2VyaWVzOiBBcGV4Tm9uQXhpc0NoYXJ0U2VyaWVzO1xyXG4gIGNoYXJ0OiBBcGV4Q2hhcnQ7XHJcbiAgbGFiZWxzOiBzdHJpbmdbXTtcclxuICBjb2xvcnM6IHN0cmluZ1tdO1xyXG4gIGxlZ2VuZDogQXBleExlZ2VuZDtcclxuICBwbG90T3B0aW9uczogQXBleFBsb3RPcHRpb25zO1xyXG4gIGRhdGFMYWJlbHM6IEFwZXhEYXRhTGFiZWxzO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTGljZW5zZVJlcXVpcmVtZW50Vmlld01vZGVsIHtcclxuICBjaGFydE9wdGlvbnM6IExpY2Vuc2VDaGFydE9wdGlvbnM7XHJcbiAgbGVnZW5kSXRlbXM6IExpY2Vuc2VMZWdlbmRJdGVtW107XHJcbiAgcm93czogTGljZW5zZVRhYmxlUm93W107XHJcbiAgdG90YWxSZXF1aXJlZDogbnVtYmVyO1xyXG59XHJcblxyXG5jb25zdCBMRUdFTkRfQ09MT1JTID0ge1xyXG4gIGV4aXN0aW5nOiAnIzE2QTY5MycsXHJcbiAgbWlzc2luZzogJyM4MDgwODAnXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NjLWxpY2Vuc2VzLXJlcXVpcmVtZW50JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbGljZW5jZXMtcmVxdWlyZW1lbnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2xpY2VuY2VzLXJlcXVpcmVtZW50LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIExpY2VuY2VzUmVxdWlyZW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBjdXN0b21lcklkITogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHRva2VuITogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNjUmVhZGluZXNzU2VydmljZSA9IGluamVjdChDY1JlYWRpbmVzc1NlcnZpY2UpO1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICB2aWV3TW9kZWw6IExpY2Vuc2VSZXF1aXJlbWVudFZpZXdNb2RlbCB8IG51bGwgPSBudWxsO1xyXG4gIGxvYWRpbmcgPSBmYWxzZTtcclxuICBlcnJvciA9IGZhbHNlO1xyXG5cclxuICBmaWx0ZXJzOiBzdHJpbmdbXSA9IFsnQWxsJywgJ1Byb2Zlc3Npb25hbCBsaWNlbnNlcycsICdXb3Jrc3BhY2UgbGljZW5zZXMnXTtcclxuICBzZWxlY3RlZFN1bW1hcnlJbmRleCA9IDA7XHJcblxyXG4gIHByaXZhdGUgc3VtbWFyeTogV2ViZXhMaWNlbnNlVXNhZ2VTdW1tYXJ5IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkU3VtbWFyaWVzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKChjaGFuZ2VzWydjdXN0b21lcklkJ10gJiYgIWNoYW5nZXNbJ2N1c3RvbWVySWQnXS5maXJzdENoYW5nZSkgfHxcclxuICAgICAgKGNoYW5nZXNbJ3Rva2VuJ10gJiYgIWNoYW5nZXNbJ3Rva2VuJ10uZmlyc3RDaGFuZ2UpKSB7XHJcbiAgICAgIHRoaXMubG9hZFN1bW1hcmllcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25GaWx0ZXJDaGFuZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKCFpc05hTihpbmRleCkgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuZmlsdGVycy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RGaWx0ZXIoaW5kZXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkU3VtbWFyaWVzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbnVtZXJpY0N1c3RvbWVySWQgPSBOdW1iZXIodGhpcy5jdXN0b21lcklkKTtcclxuICAgIGlmICghbnVtZXJpY0N1c3RvbWVySWQgfHwgIXRoaXMudG9rZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZXJyb3IgPSBmYWxzZTtcclxuICAgIHRoaXMudmlld01vZGVsID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdW1tYXJ5SW5kZXggPSAwO1xyXG5cclxuICAgIHRoaXMuY2NSZWFkaW5lc3NTZXJ2aWNlLnNldFRva2VuKHRoaXMudG9rZW4pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNjUmVhZGluZXNzU2VydmljZS5mZXRjaFdlYmV4TGljZW5zZVVzYWdlU3VtbWFyeShudW1lcmljQ3VzdG9tZXJJZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gbG9hZCBXZWJleCBsaWNlbnNlIHVzYWdlIHN1bW1hcnknLCBlcnJvcik7XHJcbiAgICAgICAgICB0aGlzLmVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybiBvZjxXZWJleExpY2Vuc2VVc2FnZVN1bW1hcnlbXT4oW10pO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoaXRlbXMgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdSYXcgQVBJIHJlc3BvbnNlOicsIGl0ZW1zKTtcclxuICAgICAgICAvLyBIYW5kbGUgYm90aCBhcnJheSBhbmQgc2luZ2xlIG9iamVjdCByZXNwb25zZXNcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykgJiYgaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5zdW1tYXJ5ID0gaXRlbXNbMF07XHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtcyAmJiB0eXBlb2YgaXRlbXMgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xyXG4gICAgICAgICAgLy8gSWYgc2luZ2xlIG9iamVjdCByZXR1cm5lZCwgdXNlIGl0IGRpcmVjdGx5XHJcbiAgICAgICAgICB0aGlzLnN1bW1hcnkgPSBpdGVtcyBhcyB1bmtub3duIGFzIFdlYmV4TGljZW5zZVVzYWdlU3VtbWFyeTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zdW1tYXJ5ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdQcm9jZXNzZWQgc3VtbWFyeTonLCB0aGlzLnN1bW1hcnkpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0RmlsdGVyKDApO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VsZWN0RmlsdGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdW1tYXJ5SW5kZXggPSBpbmRleDtcclxuICAgIGlmICghdGhpcy5zdW1tYXJ5KSB7XHJcbiAgICAgIHRoaXMudmlld01vZGVsID0gbnVsbDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3TW9kZWwgPSB0aGlzLm1hcFN1bW1hcnlUb1ZpZXdNb2RlbCh0aGlzLnN1bW1hcnksIGluZGV4KTtcclxuICAgIGNvbnNvbGUubG9nKCdDcmVhdGVkIHZpZXdNb2RlbCBmb3IgZmlsdGVyIGluZGV4JywgaW5kZXgsICc6JywgdGhpcy52aWV3TW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBTdW1tYXJ5VG9WaWV3TW9kZWwoc3VtbWFyeTogV2ViZXhMaWNlbnNlVXNhZ2VTdW1tYXJ5LCBmaWx0ZXJJbmRleDogbnVtYmVyKTogTGljZW5zZVJlcXVpcmVtZW50Vmlld01vZGVsIHtcclxuICAgIGNvbnNvbGUubG9nKCdNYXBwaW5nIHN1bW1hcnkgdG8gdmlld01vZGVsOicsIHN1bW1hcnksICdmaWx0ZXJJbmRleDonLCBmaWx0ZXJJbmRleCk7XHJcblxyXG4gICAgLy8gRXh0cmFjdCBkYXRhIGZyb20gd2ViZXhSZWFkaW5lc3NMaWNlbnNlU3RhdHMgYW5kIGxpY2Vuc2UgY291bnRzXHJcbiAgICBjb25zdCBwZXJzb25TdGF0ID0gc3VtbWFyeS53ZWJleFJlYWRpbmVzc0xpY2Vuc2VTdGF0cz8uZmluZChzdGF0ID0+IHN0YXQuZmVhdHVyZSA9PT0gJ1BFUlNPTicpO1xyXG4gICAgY29uc3QgZGV2aWNlU3RhdCA9IHN1bW1hcnkud2ViZXhSZWFkaW5lc3NMaWNlbnNlU3RhdHM/LmZpbmQoc3RhdCA9PiBzdGF0LmZlYXR1cmUgPT09ICdPUlBIQU5FRF9ERVZJQ0UnKTtcclxuXHJcbiAgICBjb25zdCBwcm9mZXNzaW9uYWxOZWVkZWQgPSBwZXJzb25TdGF0Py50b3RhbENvdW50ID8/IDA7XHJcbiAgICBjb25zdCB3b3Jrc3BhY2VOZWVkZWQgPSBkZXZpY2VTdGF0Py50b3RhbENvdW50ID8/IDA7XHJcblxyXG4gICAgY29uc3QgcHJvZmVzc2lvbmFsT3duZWQgPSBOdW1iZXIoc3VtbWFyeS50b3RhbFByb2Zlc3Npb25hbExpY2Vuc2VDb3VudCA/PyAwKTtcclxuICAgIGNvbnN0IHdvcmtzcGFjZU93bmVkID0gTnVtYmVyKHN1bW1hcnkudG90YWxXb3Jrc3BhY2VQcm9mZXNzaW9uYWxMaWNlbnNlQ291bnQgPz8gMCk7XHJcblxyXG4gICAgLy8gRmlsdGVyIGRhdGEgYmFzZWQgb24gc2VsZWN0aW9uXHJcbiAgICBsZXQgZXhpc3RpbmdDb3VudDogbnVtYmVyO1xyXG4gICAgbGV0IG1pc3NpbmdDb3VudDogbnVtYmVyO1xyXG4gICAgbGV0IHJvd3M6IExpY2Vuc2VUYWJsZVJvd1tdO1xyXG5cclxuICAgIGlmIChmaWx0ZXJJbmRleCA9PT0gMCkge1xyXG4gICAgICAvLyBBbGwgLSBzaG93IGJvdGhcclxuICAgICAgZXhpc3RpbmdDb3VudCA9IHByb2Zlc3Npb25hbE93bmVkICsgd29ya3NwYWNlT3duZWQ7XHJcbiAgICAgIGNvbnN0IHRvdGFsTmVlZGVkID0gcHJvZmVzc2lvbmFsTmVlZGVkICsgd29ya3NwYWNlTmVlZGVkO1xyXG4gICAgICBtaXNzaW5nQ291bnQgPSBNYXRoLm1heCgwLCB0b3RhbE5lZWRlZCAtIGV4aXN0aW5nQ291bnQpO1xyXG5cclxuICAgICAgcm93cyA9IFtcclxuICAgICAgICB7IGxhYmVsOiAnUHJvZmVzc2lvbmFsIGxpY2Vuc2VzJywgdmFsdWU6IHByb2Zlc3Npb25hbE5lZWRlZCB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdXb3Jrc3BhY2UgbGljZW5zZXMnLCB2YWx1ZTogd29ya3NwYWNlTmVlZGVkIH1cclxuICAgICAgXTtcclxuICAgIH0gZWxzZSBpZiAoZmlsdGVySW5kZXggPT09IDEpIHtcclxuICAgICAgLy8gUHJvZmVzc2lvbmFsIGxpY2Vuc2VzIG9ubHlcclxuICAgICAgZXhpc3RpbmdDb3VudCA9IHByb2Zlc3Npb25hbE93bmVkO1xyXG4gICAgICBtaXNzaW5nQ291bnQgPSBNYXRoLm1heCgwLCBwcm9mZXNzaW9uYWxOZWVkZWQgLSBwcm9mZXNzaW9uYWxPd25lZCk7XHJcblxyXG4gICAgICByb3dzID0gW3sgbGFiZWw6ICdQcm9mZXNzaW9uYWwgbGljZW5zZXMnLCB2YWx1ZTogcHJvZmVzc2lvbmFsTmVlZGVkIH1dO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gV29ya3NwYWNlIGxpY2Vuc2VzIG9ubHlcclxuICAgICAgZXhpc3RpbmdDb3VudCA9IHdvcmtzcGFjZU93bmVkO1xyXG4gICAgICBtaXNzaW5nQ291bnQgPSBNYXRoLm1heCgwLCB3b3Jrc3BhY2VOZWVkZWQgLSB3b3Jrc3BhY2VPd25lZCk7XHJcblxyXG4gICAgICByb3dzID0gW3sgbGFiZWw6ICdXb3Jrc3BhY2UgbGljZW5zZXMnLCB2YWx1ZTogd29ya3NwYWNlTmVlZGVkIH1dO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRvdGFsTGljZW5zZXMgPSBleGlzdGluZ0NvdW50ICsgbWlzc2luZ0NvdW50O1xyXG5cclxuICAgIGNvbnN0IGxlZ2VuZEl0ZW1zOiBMaWNlbnNlTGVnZW5kSXRlbVtdID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdFeGlzdGluZyBsaWNlbnNlcycsXHJcbiAgICAgICAgY291bnQ6IGV4aXN0aW5nQ291bnQsXHJcbiAgICAgICAgcGVyY2VudGFnZTogdG90YWxMaWNlbnNlcyA+IDAgPyAoZXhpc3RpbmdDb3VudCAvIHRvdGFsTGljZW5zZXMpICogMTAwIDogMCxcclxuICAgICAgICBjb2xvcjogTEVHRU5EX0NPTE9SUy5leGlzdGluZ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdNaXNzaW5nIGxpY2Vuc2VzJyxcclxuICAgICAgICBjb3VudDogbWlzc2luZ0NvdW50LFxyXG4gICAgICAgIHBlcmNlbnRhZ2U6IHRvdGFsTGljZW5zZXMgPiAwID8gKG1pc3NpbmdDb3VudCAvIHRvdGFsTGljZW5zZXMpICogMTAwIDogMCxcclxuICAgICAgICBjb2xvcjogTEVHRU5EX0NPTE9SUy5taXNzaW5nXHJcbiAgICAgIH1cclxuICAgIF07XHJcblxyXG4gICAgY29uc29sZS5sb2coJ0xlZ2VuZCBpdGVtczonLCBsZWdlbmRJdGVtcyk7XHJcbiAgICBjb25zb2xlLmxvZygnVGFibGUgcm93czonLCByb3dzKTtcclxuXHJcbiAgICBjb25zdCB0b3RhbFJlcXVpcmVkID0gcm93cy5yZWR1Y2UoKGFjYywgcm93KSA9PiBhY2MgKyByb3cudmFsdWUsIDApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNoYXJ0T3B0aW9uczogdGhpcy5idWlsZENoYXJ0T3B0aW9ucyhsZWdlbmRJdGVtcyksXHJcbiAgICAgIGxlZ2VuZEl0ZW1zLFxyXG4gICAgICByb3dzLFxyXG4gICAgICB0b3RhbFJlcXVpcmVkXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZENoYXJ0T3B0aW9ucyhsZWdlbmRJdGVtczogTGljZW5zZUxlZ2VuZEl0ZW1bXSk6IExpY2Vuc2VDaGFydE9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VyaWVzOiBsZWdlbmRJdGVtcy5tYXAoaXRlbSA9PiBpdGVtLmNvdW50KSxcclxuICAgICAgY2hhcnQ6IHtcclxuICAgICAgICB0eXBlOiAnZG9udXQnLFxyXG4gICAgICAgIGhlaWdodDogMjIwXHJcbiAgICAgIH0sXHJcbiAgICAgIGxhYmVsczogbGVnZW5kSXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5sYWJlbCksXHJcbiAgICAgIGNvbG9yczogbGVnZW5kSXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5jb2xvciksXHJcbiAgICAgIGxlZ2VuZDoge1xyXG4gICAgICAgIHNob3c6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIHBsb3RPcHRpb25zOiB7XHJcbiAgICAgICAgcGllOiB7XHJcbiAgICAgICAgICBkb251dDoge1xyXG4gICAgICAgICAgICBzaXplOiAnNzUlJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZGF0YUxhYmVsczoge1xyXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5vcm1hbGl6ZVBlcmNlbnRhZ2UodmFsdWU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIC8vIENvbnZlcnQgZGVjaW1hbCB0byBwZXJjZW50YWdlICgwLjk0ODcg4oaSIDk0LjkpXHJcbiAgICBjb25zdCBwZXJjZW50YWdlID0gdmFsdWUgKiAxMDA7XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChwZXJjZW50YWdlICogMTApIC8gMTA7XHJcbiAgfVxyXG59XHJcbiIsIjx0ay1jYXJkIHRpdGxlPVwiTGljZW5zZXMgcmVxdWlyZW1lbnRcIj5cclxuICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwiY2FyZC1jb250ZW50XCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwid2lkZ2V0LWJvZHlcIlxyXG4gICAgICAqbmdJZj1cIiFsb2FkaW5nICYmICFlcnJvciAmJiB2aWV3TW9kZWw7IGVsc2Ugd2lkZ2V0U3RhdGVcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGVmdC1zZWN0aW9uXCI+XHJcbiAgICAgICAgPG1hdC1zZWxlY3RcclxuICAgICAgICAgIFsodmFsdWUpXT1cInNlbGVjdGVkU3VtbWFyeUluZGV4XCJcclxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiXHJcbiAgICAgICAgICBjbGFzcz1cImZpbHRlci1zZWxlY3RcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyczsgaW5kZXggYXMgaVwiIFt2YWx1ZV09XCJpXCI+XHJcbiAgICAgICAgICAgIHt7IG9wdGlvbiB9fVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXNlY3Rpb25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxhcHgtY2hhcnRcclxuICAgICAgICAgICAgICBbc2VyaWVzXT1cInZpZXdNb2RlbC5jaGFydE9wdGlvbnMuc2VyaWVzXCJcclxuICAgICAgICAgICAgICBbY2hhcnRdPVwidmlld01vZGVsLmNoYXJ0T3B0aW9ucy5jaGFydFwiXHJcbiAgICAgICAgICAgICAgW2xhYmVsc109XCJ2aWV3TW9kZWwuY2hhcnRPcHRpb25zLmxhYmVsc1wiXHJcbiAgICAgICAgICAgICAgW2NvbG9yc109XCJ2aWV3TW9kZWwuY2hhcnRPcHRpb25zLmNvbG9yc1wiXHJcbiAgICAgICAgICAgICAgW2xlZ2VuZF09XCJ2aWV3TW9kZWwuY2hhcnRPcHRpb25zLmxlZ2VuZFwiXHJcbiAgICAgICAgICAgICAgW3Bsb3RPcHRpb25zXT1cInZpZXdNb2RlbC5jaGFydE9wdGlvbnMucGxvdE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFtkYXRhTGFiZWxzXT1cInZpZXdNb2RlbC5jaGFydE9wdGlvbnMuZGF0YUxhYmVsc1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9hcHgtY2hhcnQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygdmlld01vZGVsLmxlZ2VuZEl0ZW1zXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibGVnZW5kLW1hcmtlclwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cIml0ZW0uY29sb3JcIlxyXG4gICAgICAgICAgICAgID48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsZWdlbmQtbGFiZWxcIj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGVnZW5kLXZhbHVlXCI+e3sgaXRlbS5jb3VudCB8IG51bWJlciB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXNlY3Rpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8c3Bhbj5MaWNlbnNlPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4+UmVxdWlyZWQ8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2Ygdmlld01vZGVsLnJvd3NcIj5cclxuICAgICAgICAgIDxzcGFuPnt7IHJvdy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuPnt7IHJvdy52YWx1ZSB8IG51bWJlciB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcm93IHRvdGFsLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4+VG90YWw8L3NwYW4+XHJcbiAgICAgICAgICA8c3Bhbj57eyB2aWV3TW9kZWwudG90YWxSZXF1aXJlZCB8IG51bWJlciB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI3dpZGdldFN0YXRlPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdGUtbWVzc2FnZVwiICpuZ0lmPVwibG9hZGluZ1wiPlxyXG4gICAgICAgIExvYWRpbmcgbGljZW5zZSByZXF1aXJlbWVudHPigKZcclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0ZS1tZXNzYWdlIGVycm9yXCIgKm5nSWY9XCIhbG9hZGluZyAmJiBlcnJvclwiPlxyXG4gICAgICAgIFVuYWJsZSB0byBsb2FkIGxpY2Vuc2UgcmVxdWlyZW1lbnRzLlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN0YXRlLW1lc3NhZ2VcIiAqbmdJZj1cIiFsb2FkaW5nICYmICFlcnJvciAmJiAhdmlld01vZGVsXCI+XHJcbiAgICAgICAgTm8gbGljZW5zZSBkYXRhIGF2YWlsYWJsZS5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L3RrLWNhcmQ+XHJcbiJdfQ==
|