diff --git a/apps/red-ui/src/app/modules/admin/screens/license/license-chart/license-chart.component.ts b/apps/red-ui/src/app/modules/admin/screens/license/license-chart/license-chart.component.ts index 90461cc10..a307d819b 100644 --- a/apps/red-ui/src/app/modules/admin/screens/license/license-chart/license-chart.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/license/license-chart/license-chart.component.ts @@ -87,6 +87,10 @@ export class LicenseChartComponent { } } + if (cumulativePages !== this._licenseService.currentInfo.numberOfAnalyzedPages) { + this._licenseService.wipeStoredReportsAndReloadSelectedLicenseData(); + } + return cumulativePagesSeries; } @@ -120,11 +124,9 @@ export class LicenseChartComponent { } #totalLicensedPagesSeries(dateRanges: List) { - const processingPages = this._licenseService.processingPages; - return dateRanges.map(dateRange => ({ name: verboseDate(dateRange), - value: processingPages, + value: this._licenseService.totalLicensedNumberOfPages, })); } } diff --git a/apps/red-ui/src/app/modules/admin/screens/license/license-screen/license-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/license/license-screen/license-screen.component.html index 860edd4d3..e76d8daae 100644 --- a/apps/red-ui/src/app/modules/admin/screens/license/license-screen/license-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/license/license-screen/license-screen.component.html @@ -37,7 +37,7 @@
- +
@@ -58,36 +58,42 @@
{{ 'license-info-screen.licensed-page-count' | translate }}
-
{{ totalLicensedNumberOfPages }}
+
{{ licenseService.totalLicensedNumberOfPages }}
-
{{ currentInfo.numberOfAnalyzedPages }}
+
{{ licenseService.currentInfo.numberOfAnalyzedPages }}
-
{{ currentInfo.numberOfOcrPages }}
+
{{ licenseService.currentInfo.numberOfOcrPages }}
- {{ 'license-info-screen.total-analyzed' | translate: { date: totalInfo.startDate | date: 'longDate' } }} + {{ + 'license-info-screen.total-analyzed' + | translate: { date: licenseService.totalInfo.startDate | date: 'longDate' } + }}
-
{{ totalInfo.numberOfAnalyzedPages }}
+
{{ licenseService.totalInfo.numberOfAnalyzedPages }}
-
{{ currentInfo.numberOfAnalyzedPages }} ({{ analysisPercentageOfLicense | number: '1.0-2' }}%)
+
+ {{ licenseService.currentInfo.numberOfAnalyzedPages }} + ({{ analysisPercentageOfLicense$ | async | number: '1.0-2' }}%) +
-
+
-
{{ unlicensedInfo.numberOfAnalyzedPages }}
+
{{ licenseService.unlicensedInfo.numberOfAnalyzedPages }}
diff --git a/apps/red-ui/src/app/modules/admin/screens/license/license-screen/license-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/license/license-screen/license-screen.component.ts index 128915d7e..899ea30c1 100644 --- a/apps/red-ui/src/app/modules/admin/screens/license/license-screen/license-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/license/license-screen/license-screen.component.ts @@ -6,10 +6,8 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { UserService } from '@services/user.service'; import { RouterHistoryService } from '@services/router-history.service'; import { LicenseService } from '../../../../../services/license.service'; -import { ILicense, ILicenseReport } from '@red/domain'; -import dayjs from 'dayjs'; import { UserPreferenceService } from '@services/user-preference.service'; -import { firstValueFrom } from 'rxjs'; +import { map } from 'rxjs/operators'; @Component({ templateUrl: './license-screen.component.html', @@ -26,11 +24,7 @@ export class LicenseScreenComponent implements OnInit { }, ]; - currentInfo: ILicenseReport = {}; - totalInfo: ILicenseReport = {}; - unlicensedInfo: ILicenseReport = {}; - analysisPercentageOfLicense = 100; - totalLicensedNumberOfPages: number; + readonly analysisPercentageOfLicense$ = this.licenseService.selectedLicense$.pipe(map(() => this.getAnalysisPercentageOfLicense())); constructor( readonly configService: ConfigService, @@ -45,31 +39,13 @@ export class LicenseScreenComponent implements OnInit { } async ngOnInit() { - await firstValueFrom(this.licenseService.loadLicense()); - this.totalLicensedNumberOfPages = this.licenseService.processingPages; - await this.loadLicenseData(this.licenseService.selectedLicense); + await this.licenseService.loadLicenseData(); } - async loadLicenseData(license: ILicense) { - const startDate = dayjs(license.validFrom); - const endDate = dayjs(license.validUntil); - - const currentConfig = { - startDate: startDate.toDate(), - endDate: endDate.toDate(), - }; - const reports: Promise[] = [this.licenseService.getReport(currentConfig), this.licenseService.getReport({})]; - - if (endDate.isBefore(dayjs())) { - const unlicensedConfig = { - startDate: endDate.toDate(), - }; - reports.push(this.licenseService.getReport(unlicensedConfig)); - } - - [this.currentInfo, this.totalInfo, this.unlicensedInfo] = await Promise.all(reports); - this.analysisPercentageOfLicense = - this.totalLicensedNumberOfPages > 0 ? (this.currentInfo.numberOfAnalyzedPages / this.totalLicensedNumberOfPages) * 100 : 100; + getAnalysisPercentageOfLicense() { + const totalLicensedNumberOfPages = this.licenseService.totalLicensedNumberOfPages; + const numberOfAnalyzedPages = this.licenseService.currentInfo.numberOfAnalyzedPages; + return totalLicensedNumberOfPages > 0 ? (numberOfAnalyzedPages / totalLicensedNumberOfPages) * 100 : 100; } sendMail(): void { @@ -80,18 +56,13 @@ export class LicenseScreenComponent implements OnInit { const lineBreak = '%0D%0A'; const body = [ this._translateService.instant('license-info-screen.email.body.analyzed', { - pages: this.currentInfo.numberOfAnalyzedPages, + pages: this.licenseService.currentInfo.numberOfAnalyzedPages, }), this._translateService.instant('license-info-screen.email.body.licensed', { - pages: this.totalLicensedNumberOfPages, + pages: this.licenseService.totalLicensedNumberOfPages, }), ].join(lineBreak); const mail = this.licenseService.selectedLicense.licensedToEmail; window.location.href = `mailto:${mail}?subject=${subject}&body=${body}`; } - - licenseChanged(license: ILicense) { - this.totalLicensedNumberOfPages = this.licenseService.processingPages; - return this.loadLicenseData(license); - } } diff --git a/apps/red-ui/src/app/modules/admin/screens/license/license-select/license-select.component.ts b/apps/red-ui/src/app/modules/admin/screens/license/license-select/license-select.component.ts index 5eb14ea8a..ecb78ad6b 100644 --- a/apps/red-ui/src/app/modules/admin/screens/license/license-select/license-select.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/license/license-select/license-select.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Output } from '@angular/core'; +import { Component } from '@angular/core'; import { LicenseService } from '@services/license.service'; import { ILicense } from '@red/domain'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; @@ -15,7 +15,6 @@ const translations = { styleUrls: ['./license-select.component.scss'], }) export class LicenseSelectComponent { - @Output() readonly valueChanges = new EventEmitter(); value: ILicense; licenses$ = this.licenseService.licenseData$.pipe( map(data => data.licenses), @@ -32,8 +31,8 @@ export class LicenseSelectComponent { return id === this.licenseService.activeLicenseId ? translations.active : translations.inactive; } - licenseChanged($event: ILicense) { - this.valueChanges.emit($event); - this.licenseService.setSelectedLicense($event); + async licenseChanged(license: ILicense) { + await this.licenseService.loadLicenseData(license); + this.licenseService.setSelectedLicense(license); } } diff --git a/apps/red-ui/src/app/modules/admin/screens/license/license.module.ts b/apps/red-ui/src/app/modules/admin/screens/license/license.module.ts index d1dcd8fe9..5830ecd7d 100644 --- a/apps/red-ui/src/app/modules/admin/screens/license/license.module.ts +++ b/apps/red-ui/src/app/modules/admin/screens/license/license.module.ts @@ -2,7 +2,6 @@ import { NgModule } from '@angular/core'; import { LicenseScreenComponent } from './license-screen/license-screen.component'; import { LicenseSelectComponent } from './license-select/license-select.component'; import { LicenseChartComponent } from './license-chart/license-chart.component'; -import { LicenseService } from '../../../../services/license.service'; import { RouterModule, Routes } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { MatSelectModule } from '@angular/material/select'; @@ -36,6 +35,5 @@ const routes: Routes = [ NgxChartsModule, IqserListingModule, ], - providers: [LicenseService], }) export class LicenseModule {} diff --git a/apps/red-ui/src/app/services/license.service.ts b/apps/red-ui/src/app/services/license.service.ts index 6a3132eb4..aa66c4dd9 100644 --- a/apps/red-ui/src/app/services/license.service.ts +++ b/apps/red-ui/src/app/services/license.service.ts @@ -4,6 +4,8 @@ import { ILicense, ILicenseReport, ILicenseReportRequest, ILicenses } from '@red import { BehaviorSubject, firstValueFrom, Observable, of } from 'rxjs'; import { catchError, filter, tap } from 'rxjs/operators'; import { LICENSE_STORAGE_KEY } from '../modules/admin/screens/license/utils/constants'; +import dayjs from 'dayjs'; +import { NGXLogger } from 'ngx-logger'; export function getStoredReports() { const rawStoredReports = localStorage.getItem(LICENSE_STORAGE_KEY); @@ -47,13 +49,22 @@ export class LicenseService extends GenericService { readonly licenseData$: Observable; readonly selectedLicense$: Observable; activeLicenseId: string; + totalLicensedNumberOfPages = 0; + currentInfo: ILicenseReport = {}; + totalInfo: ILicenseReport = {}; + unlicensedInfo: ILicenseReport = {}; protected readonly _defaultModelPath = 'report'; readonly #licenseData$ = new BehaviorSubject(undefined); readonly #selectedLicense$ = new BehaviorSubject(undefined); - constructor() { + constructor(private readonly _logger: NGXLogger) { super(); - this.selectedLicense$ = this.#selectedLicense$.pipe(filter(license => !!license)); + this.selectedLicense$ = this.#selectedLicense$.pipe( + filter(license => !!license), + tap(license => { + this.totalLicensedNumberOfPages = this.getTotalLicensedNumberOfPages(license); + }), + ); this.licenseData$ = this.#licenseData$.pipe( filter(licenses => !!licenses), tap(data => (this.activeLicenseId = data.activeLicense)), @@ -64,11 +75,6 @@ export class LicenseService extends GenericService { return this.#selectedLicense$.value; } - get processingPages() { - const processingPagesFeature = this.#selectedLicense$.value?.features?.find(f => f.name === 'processingPages'); - return Number(processingPagesFeature?.value ?? '0'); - } - get activeLicense() { if (!this.#licenseData$.value) { return undefined; @@ -82,6 +88,37 @@ export class LicenseService extends GenericService { return this.activeLicense.features.find(f => f.name === 'pdftron').value; } + wipeStoredReportsAndReloadSelectedLicenseData() { + this._logger.info('[LICENSE] Wiping stored reports and reloading license data'); + this.storedReports = {}; + this.setSelectedLicense(this.selectedLicense); + } + + async loadLicenseData(license: ILicense = this.selectedLicense) { + const startDate = dayjs(license.validFrom); + const endDate = dayjs(license.validUntil); + + const currentConfig = { + startDate: startDate.toDate(), + endDate: endDate.toDate(), + }; + const reports: Promise[] = [this.getReport(currentConfig), this.getReport({})]; + + if (endDate.isBefore(dayjs())) { + const unlicensedConfig = { + startDate: endDate.toDate(), + }; + reports.push(this.getReport(unlicensedConfig)); + } + + [this.currentInfo, this.totalInfo, this.unlicensedInfo] = await Promise.all(reports); + } + + getTotalLicensedNumberOfPages(license: ILicense) { + const processingPagesFeature = license.features?.find(f => f.name === 'processingPages'); + return Number(processingPagesFeature?.value ?? '0'); + } + setDefaultSelectedLicense() { this.setSelectedLicense(this.activeLicense); }