diff --git a/apps/red-ui/src/app/app.module.ts b/apps/red-ui/src/app/app.module.ts
index f1b55a336..469f657d1 100644
--- a/apps/red-ui/src/app/app.module.ts
+++ b/apps/red-ui/src/app/app.module.ts
@@ -144,7 +144,7 @@ export const appModuleFactory = (config: AppConfig) => {
enabled: false,
},
PDF: {
- enabled: true,
+ enabled: false,
},
FILE: {
enabled: true,
@@ -155,6 +155,15 @@ export const appModuleFactory = (config: AppConfig) => {
STATS: {
enabled: false,
},
+ REDACTION_LOG: {
+ enabled: false,
+ },
+ VIEWED_PAGES: {
+ enabled: false,
+ },
+ PAGES: {
+ enabled: false,
+ },
},
} as ILoggerConfig,
},
diff --git a/apps/red-ui/src/app/modules/admin/screens/license/components/chart/chart.component.ts b/apps/red-ui/src/app/modules/admin/screens/license/components/chart/chart.component.ts
index fb9a9e314..1cda6e89a 100644
--- a/apps/red-ui/src/app/modules/admin/screens/license/components/chart/chart.component.ts
+++ b/apps/red-ui/src/app/modules/admin/screens/license/components/chart/chart.component.ts
@@ -41,6 +41,7 @@ export class ChartComponent implements OnChanges {
text: this.yAxisLabel,
padding: { bottom: 20 },
},
+ min: 0,
},
y1: {
display: this.secondaryAxis,
@@ -50,6 +51,7 @@ export class ChartComponent implements OnChanges {
text: this.yAxisLabelRight,
padding: { bottom: 20 },
},
+ min: 0,
},
},
plugins: {
diff --git a/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-capacity.component.html b/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-capacity.component.html
new file mode 100644
index 000000000..66f61dd5c
--- /dev/null
+++ b/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-capacity.component.html
@@ -0,0 +1,62 @@
+
+
+
+
+
+
{{ licenseService.currentLicenseReport.activeFilesUploadedBytes | size }}
+
+
+
+
+
{{ licenseService.currentLicenseReport.archivedFilesUploadedBytes | size }}
+
+
+
+
{{ licenseService.currentLicenseReport.trashFilesUploadedBytes | size }}
+
+
+
+
+
+ {{ licenseService.currentLicenseReport.totalFilesUploadedBytes | size }}
+
+ ({{ uploadedBytesCapacityPercentage | number : '1.0-2' }}%)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ 'license-info-screen.capacity.storage-capacity' | translate }}
+
+
+
+
+ {{ 'license-info-screen.capacity.exceeded-capacity' | translate }}
+
+
+
diff --git a/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-capacity.component.scss b/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-capacity.component.scss
new file mode 100644
index 000000000..eb954eec9
--- /dev/null
+++ b/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-capacity.component.scss
@@ -0,0 +1,49 @@
+:host {
+ display: contents;
+}
+
+.grid-container {
+ width: calc(100% - 40px);
+ display: grid;
+ grid-template-columns: 1fr 2fr 2fr;
+ margin: 20px;
+
+ .donut-chart-wrapper {
+ grid-row: 2 / span 4;
+ grid-column: 3;
+ width: fit-content;
+ }
+
+ .row {
+ display: contents;
+
+ > div {
+ padding: 8px 20px;
+
+ &:first-of-type {
+ font-weight: 600;
+ }
+ }
+
+ &:hover {
+ > div {
+ background-color: var(--iqser-alt-background);
+ }
+ }
+ }
+
+ .section-title {
+ grid-column: span 3;
+ padding: 20px 20px 8px;
+ margin-bottom: 8px;
+ border-bottom: 1px solid var(--iqser-separator);
+ }
+
+ redaction-chart {
+ grid-column: span 3;
+ }
+}
+
+.exceeded-capacity {
+ color: var(--iqser-red-1);
+}
diff --git a/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-storage.component.ts b/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-capacity.component.ts
similarity index 84%
rename from apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-storage.component.ts
rename to apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-capacity.component.ts
index 4795e4b96..912c03c6a 100644
--- a/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-storage.component.ts
+++ b/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-capacity.component.ts
@@ -10,15 +10,15 @@ import { getLabelsFromLicense, getLineConfig } from '../../utils/functions';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@Component({
- selector: 'red-license-storage',
- templateUrl: './license-storage.component.html',
- styleUrls: ['./license-storage.component.scss'],
+ selector: 'red-license-capacity',
+ templateUrl: './license-capacity.component.html',
+ styleUrls: ['./license-capacity.component.scss'],
})
-export class LicenseStorageComponent {
+export class LicenseCapacityComponent {
readonly formatSize = size;
uploadedBytesCapacityPercentage = -1;
donutChartConfig: DonutChartConfig[] = [];
- readonly data$ = this.licenseService.licenseData$.pipe(
+ readonly data$ = this.licenseService.selectedLicense$.pipe(
map(() => this.licenseService.currentLicenseReport),
tap(license => {
this.uploadedBytesCapacityPercentage = this.#getUploadedBytesCapacityPercentage(license);
@@ -44,22 +44,22 @@ export class LicenseStorageComponent {
{
value: license.activeFilesUploadedBytes,
color: ChartGreen,
- label: this._translateService.instant(_('license-info-screen.storage.active-documents')),
+ label: this._translateService.instant(_('license-info-screen.capacity.active-documents')),
},
{
value: license.archivedFilesUploadedBytes,
color: ChartBlue,
- label: this._translateService.instant(_('license-info-screen.storage.archived-documents')),
+ label: this._translateService.instant(_('license-info-screen.capacity.archived-documents')),
},
{
value: license.trashFilesUploadedBytes,
color: ChartRed,
- label: this._translateService.instant(_('license-info-screen.storage.trash-documents')),
+ label: this._translateService.instant(_('license-info-screen.capacity.trash-documents')),
},
{
- value: this.licenseService.uploadedBytesCapacity - license.totalFilesUploadedBytes,
+ value: Math.max(this.licenseService.uploadedBytesCapacity - license.totalFilesUploadedBytes, 0),
color: ChartGrey,
- label: this._translateService.instant(_('license-info-screen.storage.unused')),
+ label: this._translateService.instant(_('license-info-screen.capacity.unused')),
},
];
}
@@ -70,25 +70,25 @@ export class LicenseStorageComponent {
return [
{
data: monthlyData.flatMap(d => d.activeFilesUploadedBytes),
- label: this._translateService.instant('license-info-screen.storage.active-documents'),
+ label: this._translateService.instant('license-info-screen.capacity.active-documents'),
...getLineConfig(ChartGreen, false, 'origin'),
stack: 'storage',
},
{
data: monthlyData.flatMap(d => d.archivedFilesUploadedBytes),
- label: this._translateService.instant('license-info-screen.storage.archived-documents'),
+ label: this._translateService.instant('license-info-screen.capacity.archived-documents'),
...getLineConfig(ChartBlue, false, '-1'),
stack: 'storage',
},
{
data: monthlyData.flatMap(d => d.trashFilesUploadedBytes),
- label: this._translateService.instant('license-info-screen.storage.trash-documents'),
+ label: this._translateService.instant('license-info-screen.capacity.trash-documents'),
...getLineConfig(ChartRed, false, '-1'),
stack: 'storage',
},
{
data: monthlyData.flatMap(d => d.activeFilesUploadedBytes + d.archivedFilesUploadedBytes + d.trashFilesUploadedBytes),
- label: this._translateService.instant('license-info-screen.storage.all-documents'),
+ label: this._translateService.instant('license-info-screen.capacity.all-documents'),
...getLineConfig(ChartBlack, true, false),
borderWidth: 2,
},
diff --git a/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-storage.component.html b/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-storage.component.html
deleted file mode 100644
index 821f0489e..000000000
--- a/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-storage.component.html
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
{{ licenseService.currentLicenseReport.activeFilesUploadedBytes | size }}
-
-
-
-
-
{{ licenseService.currentLicenseReport.archivedFilesUploadedBytes | size }}
-
-
-
-
{{ licenseService.currentLicenseReport.trashFilesUploadedBytes | size }}
-
-
-
-
-
- {{ licenseService.currentLicenseReport.totalFilesUploadedBytes | size }}
-
- ({{ uploadedBytesCapacityPercentage | number : '1.0-2' }}%)
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-storage.component.scss b/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-storage.component.scss
deleted file mode 100644
index c0a071ff5..000000000
--- a/apps/red-ui/src/app/modules/admin/screens/license/components/license-storage/license-storage.component.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-:host {
- display: contents;
-}
-
-.donut-chart-wrapper {
- grid-row: 11 / span 4;
- grid-column: 3;
- width: fit-content;
-}
-
-.row {
- display: contents;
-
- > div {
- padding: 8px 20px;
-
- &:first-of-type {
- font-weight: 600;
- }
- }
-
- &:hover {
- > div {
- background-color: var(--iqser-alt-background);
- }
- }
-}
-
-.section-title {
- grid-column: span 3;
- padding: 20px 20px 8px;
- margin-bottom: 8px;
- border-bottom: 1px solid var(--iqser-separator);
-}
-
-redaction-chart {
- grid-column: span 3;
-}
diff --git a/apps/red-ui/src/app/modules/admin/screens/license/components/license-usage/license-usage.component.html b/apps/red-ui/src/app/modules/admin/screens/license/components/license-usage/license-usage.component.html
index 9aeee0700..6f979cc53 100644
--- a/apps/red-ui/src/app/modules/admin/screens/license/components/license-usage/license-usage.component.html
+++ b/apps/red-ui/src/app/modules/admin/screens/license/components/license-usage/license-usage.component.html
@@ -1,41 +1,43 @@
-
+
+
-
-
-
- {{ licenseService.analyzedPagesInCurrentLicensingPeriod }}
- ({{ analysisPercentageOfLicense$ | async | number : '1.0-2' }}%)
+
+
+
+ {{ licenseService.analyzedPagesInCurrentLicensingPeriod }}
+ ({{ analysisPercentageOfLicense$ | async | number : '1.0-2' }}%)
+
+
+
+
+
+
{{ licenseService.currentLicenseReport.numberOfOcrPages }}
+
+
+
+
+
{{ licenseService.unlicensedPages }}
+
+
+
+
+
+
{{ licenseService.allLicensesReport.numberOfAnalyzedPages }}
+
+
+
+
+
{{ licenseService.allLicensesReport.numberOfOcrPages }}
+
+
+
+
-
-
-
-
{{ licenseService.currentLicenseReport.numberOfOcrPages }}
-
-
-
-
-
{{ licenseService.unlicensedPages }}
-
-
-
-
-
-
{{ licenseService.allLicensesReport.numberOfAnalyzedPages }}
-
-
-
-
-
{{ licenseService.allLicensesReport.numberOfOcrPages }}
-
-
-
-
-
diff --git a/apps/red-ui/src/app/modules/admin/screens/license/components/license-usage/license-usage.component.scss b/apps/red-ui/src/app/modules/admin/screens/license/components/license-usage/license-usage.component.scss
index 2a35a4526..bdd488e9c 100644
--- a/apps/red-ui/src/app/modules/admin/screens/license/components/license-usage/license-usage.component.scss
+++ b/apps/red-ui/src/app/modules/admin/screens/license/components/license-usage/license-usage.component.scss
@@ -2,35 +2,42 @@
display: contents;
}
-.row {
- display: contents;
+.grid-container {
+ width: calc(100% - 40px);
+ display: grid;
+ grid-template-columns: 1fr 2fr 2fr;
+ margin: 20px;
- > div {
- padding: 8px 20px;
+ .row {
+ display: contents;
- &:first-of-type {
- font-weight: 600;
- }
-
- &:nth-child(2) {
- grid-column: span 2;
- }
- }
-
- &:hover {
> div {
- background-color: var(--iqser-alt-background);
+ padding: 8px 20px;
+
+ &:first-of-type {
+ font-weight: 600;
+ }
+
+ &:nth-child(2) {
+ grid-column: span 2;
+ }
+ }
+
+ &:hover {
+ > div {
+ background-color: var(--iqser-alt-background);
+ }
}
}
-}
-.section-title {
- grid-column: span 3;
- padding: 20px 20px 8px;
- margin-bottom: 8px;
- border-bottom: 1px solid var(--iqser-separator);
-}
+ .section-title {
+ grid-column: span 3;
+ padding: 20px 20px 8px;
+ margin-bottom: 8px;
+ border-bottom: 1px solid var(--iqser-separator);
+ }
-redaction-chart {
- grid-column: span 3;
+ redaction-chart {
+ grid-column: span 3;
+ }
}
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 7a642fc4b..4c210d01e 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
@@ -61,9 +61,14 @@
{{ licenseService.totalLicensedNumberOfPages }}
-
-
+
+
{{ 'license-info-screen.licensed-capacity' | translate }}
+
{{ licenseService.uploadedBytesCapacity | size }}
+
+
+
+
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 6ac357a00..70a40d2f9 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
@@ -10,7 +10,7 @@ import { CommonModule } from '@angular/common';
import { LicenseService } from '@services/license.service';
import { ChartComponent } from './components/chart/chart.component';
import { NgChartsModule } from 'ng2-charts';
-import { LicenseStorageComponent } from './components/license-storage/license-storage.component';
+import { LicenseCapacityComponent } from './components/license-storage/license-capacity.component';
import { LicenseUsageComponent } from './components/license-usage/license-usage.component';
import { DonutChartComponent } from '@shared/components/donut-chart/donut-chart.component';
@@ -25,7 +25,7 @@ const routes: Routes = [
];
@NgModule({
- declarations: [LicenseScreenComponent, LicenseSelectComponent, ChartComponent, LicenseStorageComponent, LicenseUsageComponent],
+ declarations: [LicenseScreenComponent, LicenseSelectComponent, ChartComponent, LicenseCapacityComponent, LicenseUsageComponent],
imports: [
RouterModule.forChild(routes),
CommonModule,
diff --git a/apps/red-ui/src/app/modules/dossier-overview/components/file-attribute/file-attribute.component.html b/apps/red-ui/src/app/modules/dossier-overview/components/file-attribute/file-attribute.component.html
index e27032dd8..d830632cb 100644
--- a/apps/red-ui/src/app/modules/dossier-overview/components/file-attribute/file-attribute.component.html
+++ b/apps/red-ui/src/app/modules/dossier-overview/components/file-attribute/file-attribute.component.html
@@ -1,5 +1,10 @@
-
+
{{ fileAttribute.label }}:
;
readonly viewedPages$ = inject(ViewedPagesMapService).get$(this.#state.fileId);
+ ngAfterViewInit() {
+ setTimeout(() => {
+ this.scrollToLastViewedPage();
+ }, 100);
+ }
+
+ scrollToLastViewedPage() {
+ const currentPdfPage = this._pdf.currentPage();
+ scrollIntoView(document.getElementById(`quick-nav-page-${currentPdfPage}`), {
+ behavior: 'smooth',
+ scrollMode: 'if-needed',
+ block: 'start',
+ inline: 'start',
+ });
+ }
+
pageSelectedByClick($event: number): void {
this._pdf.navigateTo($event);
}
diff --git a/apps/red-ui/src/app/modules/file-preview/services/file-data.service.ts b/apps/red-ui/src/app/modules/file-preview/services/file-data.service.ts
index 63cff5a04..aeec3258d 100644
--- a/apps/red-ui/src/app/modules/file-preview/services/file-data.service.ts
+++ b/apps/red-ui/src/app/modules/file-preview/services/file-data.service.ts
@@ -43,14 +43,14 @@ export function chronologicallyBy(property: (x: T) => string) {
@Injectable()
export class FileDataService extends EntitiesService {
+ readonly #annotations = signal([]);
+ readonly #earmarks = signal
{{ subtitles[0] }}
+
+
+
+
1"
diff --git a/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts b/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts
index 3ed10e3b4..e2925e41d 100644
--- a/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts
@@ -1,9 +1,9 @@
-import { Component, EventEmitter, Input, OnChanges, OnInit, Optional, Output } from '@angular/core';
+import { Component, EventEmitter, Input, OnChanges, OnInit, Optional, Output, TemplateRef } from '@angular/core';
import { DonutChartConfig } from '@red/domain';
import { IqserHelpModeModule } from '@iqser/common-ui';
import { Observable, of } from 'rxjs';
import { map } from 'rxjs/operators';
-import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
+import { AsyncPipe, NgForOf, NgIf, NgTemplateOutlet } from '@angular/common';
import { MatSelectModule } from '@angular/material/select';
import { FilterService, INestedFilter } from '@iqser/common-ui/lib/filtering';
import { get, shareLast } from '@iqser/common-ui/lib/utils';
@@ -14,10 +14,10 @@ import { StatusBarComponent } from '@iqser/common-ui/lib/shared';
templateUrl: './donut-chart.component.html',
styleUrls: ['./donut-chart.component.scss'],
standalone: true,
- imports: [NgForOf, NgIf, MatSelectModule, IqserHelpModeModule, StatusBarComponent, AsyncPipe],
+ imports: [NgForOf, NgIf, MatSelectModule, IqserHelpModeModule, StatusBarComponent, AsyncPipe, NgTemplateOutlet],
})
export class DonutChartComponent implements OnChanges, OnInit {
- @Input() subtitles: string[];
+ @Input() subtitles: string[] = [];
@Input() config: DonutChartConfig[] = [];
@Input() radius = 85;
@Input() strokeWidth = 20;
@@ -27,6 +27,7 @@ export class DonutChartComponent implements OnChanges, OnInit {
@Input() filterKey;
@Input() helpModeKey;
@Input() valueFormatter?: (value: number) => string;
+ @Input() subtitleTemplate?: TemplateRef;
@Output() readonly subtitleChanged = new EventEmitter();
@@ -36,10 +37,6 @@ export class DonutChartComponent implements OnChanges, OnInit {
size = 0;
filters$: Observable;
- constructor(@Optional() readonly filterService: FilterService) {
- // TODO: move this component to a separate module, split into smaller components, improve filters
- }
-
get circumference(): number {
return 2 * Math.PI * this.radius;
}
@@ -52,6 +49,10 @@ export class DonutChartComponent implements OnChanges, OnInit {
return this.totalType === 'sum' ? this.dataTotal : this.config.length;
}
+ constructor(@Optional() readonly filterService: FilterService) {
+ // TODO: move this component to a separate module, split into smaller components, improve filters
+ }
+
ngOnInit() {
const filterModels$ = this.filterService?.getFilterModels$(this.filterKey).pipe(
map(filters => filters ?? []),
diff --git a/apps/red-ui/src/app/modules/shared/dialogs/download-dialog/download-dialog.component.ts b/apps/red-ui/src/app/modules/shared/dialogs/download-dialog/download-dialog.component.ts
index 8485050a4..2af424ef7 100644
--- a/apps/red-ui/src/app/modules/shared/dialogs/download-dialog/download-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/shared/dialogs/download-dialog/download-dialog.component.ts
@@ -76,12 +76,11 @@ export class DownloadDialogComponent extends IqserDialogComponent type === DownloadFileTypes.REDACTED);
- return !hasReportTypes || (onlyRedactedVersionSelected && !this.hasApprovedFiles);
+ return onlyRedactedVersionSelected && !this.hasApprovedFiles;
}
override get valid() {
diff --git a/apps/red-ui/src/app/services/dossiers/dossier-changes.service.ts b/apps/red-ui/src/app/services/dossiers/dossier-changes.service.ts
index f7db33bd6..26e757263 100644
--- a/apps/red-ui/src/app/services/dossiers/dossier-changes.service.ts
+++ b/apps/red-ui/src/app/services/dossiers/dossier-changes.service.ts
@@ -35,7 +35,7 @@ export class DossiersChangesService extends GenericService implements O
changes.map(change => this.#load(change.dossierId).pipe(removeIfNotFound(change.dossierId)));
return this.hasChangesDetails$().pipe(
- tap(changes => this.#logger.info('[CHANGES] Dossier changes', changes)),
+ tap(changes => this.#logger.info('[DOSSIERS_CHANGES] Found changes', changes)),
switchMap(dossierChanges =>
forkJoin([...load(dossierChanges), this.#dashboardStatsService.loadAll().pipe(take(1))]).pipe(map(() => dossierChanges)),
),
@@ -45,9 +45,13 @@ export class DossiersChangesService extends GenericService implements O
hasChangesDetails$(): Observable {
const body = { value: this._lastCheckedForChanges.get(ROOT_CHANGES_KEY) };
const dateBeforeRequest = new Date(Date.now() - LAST_CHECKED_OFFSET).toISOString();
+
+ this.#logger.info('[DOSSIERS_CHANGES] Check with Last Checked Date', body.value);
+
return this._post(body, `${this._defaultModelPath}/changes/details`).pipe(
filter(changes => changes.length > 0),
tap(() => this._lastCheckedForChanges.set(ROOT_CHANGES_KEY, dateBeforeRequest)),
+ tap(() => this.#logger.info('[DOSSIERS_CHANGES] Save Last Checked Date value', dateBeforeRequest)),
);
}
diff --git a/apps/red-ui/src/app/services/license.service.ts b/apps/red-ui/src/app/services/license.service.ts
index d2cabf2b8..fbcd8d306 100644
--- a/apps/red-ui/src/app/services/license.service.ts
+++ b/apps/red-ui/src/app/services/license.service.ts
@@ -40,11 +40,6 @@ const defaultOnError: ILicenses = {
providedIn: 'root',
})
export class LicenseService extends GenericService {
- readonly #licenseData$ = new BehaviorSubject(undefined);
- readonly #selectedLicense$ = new BehaviorSubject(undefined);
- readonly #logger = inject(NGXLogger);
- readonly #toaster = inject(Toaster);
- protected readonly _defaultModelPath = 'report';
readonly licenseData$: Observable;
readonly selectedLicense$: Observable;
activeLicenseId: string;
@@ -53,29 +48,21 @@ export class LicenseService extends GenericService {
allLicensesReport: ILicenseReport = {};
unlicensedPages = 0;
analyzedPagesInCurrentLicensingPeriod = 0;
- uploadedBytesCapacity = 0;
-
- constructor() {
- super();
- this.selectedLicense$ = this.#selectedLicense$.pipe(filter(license => !!license));
- this.licenseData$ = this.#licenseData$.pipe(
- filter(licenses => !!licenses),
- tap(data => (this.activeLicenseId = data.activeLicense)),
- tap(() => {
- const activeLicense = this.activeLicense;
- if (!activeLicense) {
- return;
- }
- const uploadedBytesCapacity = this.activeLicense.features.find(f => f.name === 'uploadedBytesCapacity')?.value;
- this.uploadedBytesCapacity = uploadedBytesCapacity ? parseInt(uploadedBytesCapacity, 10) : 0;
- }),
- );
- }
+ protected readonly _defaultModelPath = 'report';
+ readonly #licenseData$ = new BehaviorSubject(undefined);
+ readonly #selectedLicense$ = new BehaviorSubject(undefined);
+ readonly #logger = inject(NGXLogger);
+ readonly #toaster = inject(Toaster);
get selectedLicense() {
return this.#selectedLicense$.value;
}
+ get uploadedBytesCapacity(): number {
+ const uploadedBytesCapacity = this.selectedLicense.features.find(f => f.name === 'uploadedBytesCapacity')?.value || '0';
+ return parseInt(uploadedBytesCapacity, 10);
+ }
+
get activeLicense() {
if (!this.#licenseData$.value) {
return undefined;
@@ -94,6 +81,15 @@ export class LicenseService extends GenericService {
return activeLicense.features.find(f => f.name === 'pdftron').value;
}
+ constructor() {
+ super();
+ this.selectedLicense$ = this.#selectedLicense$.pipe(filter(license => !!license));
+ this.licenseData$ = this.#licenseData$.pipe(
+ filter(licenses => !!licenses),
+ tap(data => (this.activeLicenseId = data.activeLicense)),
+ );
+ }
+
async loadLicenseData(license: ILicense = this.selectedLicense) {
this.totalLicensedNumberOfPages = this.getTotalLicensedNumberOfPages(license);
diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json
index 27011e43b..cc5cea4ca 100644
--- a/apps/red-ui/src/assets/i18n/redact/de.json
+++ b/apps/red-ui/src/assets/i18n/redact/de.json
@@ -473,7 +473,6 @@
"heading-with-name-and-link": "Ihr Benutzer verfügt nicht über die erforderlichen RED-*-Rollen, um auf diese Applikation zugreifen zu können. Bitte kontaktieren Sie {adminName}, um den Zugang anzufordern!",
"logout": "Ausloggen"
},
- "by": "von",
"change-legal-basis-dialog": {
"actions": {
"cancel": "Abbrechen",
@@ -1639,6 +1638,16 @@
},
"license-info-screen": {
"backend-version": "Backend-Version der Anwendung",
+ "capacity-details": "",
+ "capacity": {
+ "active-documents": "",
+ "all-documents": "",
+ "archived-documents": "",
+ "exceeded-capacity": "",
+ "storage-capacity": "",
+ "trash-documents": "",
+ "unused": ""
+ },
"copyright-claim-text": "Copyright © 2020 - {currentYear} knecon AG (powered by IQSER)",
"copyright-claim-title": "Copyright",
"current-analyzed": "In aktuellem Lizenzzeitraum analysierte Seiten",
@@ -1654,6 +1663,7 @@
"end-user-license-text": "Die Nutzung dieses Produkts unterliegt den Bedingungen der Endbenutzer-Lizenzvereinbarung für den RedactManager, sofern darin nichts anderweitig festgelegt.",
"end-user-license-title": "Endbenutzer-Lizenzvereinbarung",
"license-title": "",
+ "licensed-capacity": "",
"licensed-page-count": "Anzahl der lizenzierten Seiten",
"licensed-to": "Lizenziert für",
"licensing-details": "Lizenzdetails",
@@ -1668,15 +1678,6 @@
"active": "Aktiv",
"inactive": ""
},
- "storage-details": "",
- "storage": {
- "active-documents": "",
- "all-documents": "",
- "archived-documents": "",
- "storage-capacity": "",
- "trash-documents": "",
- "unused": ""
- },
"total-analyzed": "Seit {date} insgesamt analysierte Seiten",
"total-ocr-analyzed": "",
"unlicensed-analyzed": "Über Lizenz hinaus analysierte Seiten",
diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json
index ce89bcf51..8cc21d464 100644
--- a/apps/red-ui/src/assets/i18n/redact/en.json
+++ b/apps/red-ui/src/assets/i18n/redact/en.json
@@ -473,7 +473,6 @@
"heading-with-name-and-link": "Your user is successfully logged in but has no role assigned yet. Please contact {adminName} to assign appropriate roles.",
"logout": "Logout"
},
- "by": "by",
"change-legal-basis-dialog": {
"actions": {
"cancel": "Cancel",
@@ -1639,6 +1638,16 @@
},
"license-info-screen": {
"backend-version": "Backend Application Version",
+ "capacity-details": "Capacity Details",
+ "capacity": {
+ "active-documents": "Active Documents",
+ "all-documents": "Retention Capacity Used",
+ "archived-documents": "Archived Documents",
+ "exceeded-capacity": "Exceeded Capacity",
+ "storage-capacity": "Capacity",
+ "trash-documents": "Documents in Trash",
+ "unused": "Unused Storage"
+ },
"copyright-claim-text": "Copyright © 2020 - {currentYear} knecon AG (powered by IQSER)",
"copyright-claim-title": "Copyright Claim",
"current-analyzed": "Analyzed Pages in Licensing Period",
@@ -1654,6 +1663,7 @@
"end-user-license-text": "The use of this product is subject to the terms of the Redaction End User Agreement, unless otherwise specified therein.",
"end-user-license-title": "End User License Agreement",
"license-title": "License Title",
+ "licensed-capacity": "Licensed Capacity",
"licensed-page-count": "Licensed Pages",
"licensed-to": "Licensed to",
"licensing-details": "Licensing Details",
@@ -1668,15 +1678,6 @@
"active": "Active",
"inactive": "Inactive"
},
- "storage-details": "Storage Details",
- "storage": {
- "active-documents": "Active Documents",
- "all-documents": "Total Storage Used",
- "archived-documents": "Archived Documents",
- "storage-capacity": "Storage Capacity",
- "trash-documents": "Documents in Trash",
- "unused": "Unused Storage"
- },
"total-analyzed": "Total Analyzed Pages",
"total-ocr-analyzed": "Total OCR Processed Pages",
"unlicensed-analyzed": "Unlicensed Analyzed Pages",
diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json
index 268d843b0..6039ec1e7 100644
--- a/apps/red-ui/src/assets/i18n/scm/de.json
+++ b/apps/red-ui/src/assets/i18n/scm/de.json
@@ -473,7 +473,6 @@
"heading-with-name-and-link": "Ihr Benutzer verfügt nicht über die erforderlichen RED-*-Rollen, um auf diese Applikation zugreifen zu können. Bitte kontaktieren Sie {adminName}, um den Zugang anzufordern!",
"logout": "Ausloggen"
},
- "by": "von",
"change-legal-basis-dialog": {
"actions": {
"cancel": "Abbrechen",
@@ -1639,6 +1638,16 @@
},
"license-info-screen": {
"backend-version": "Backend-Version der Anwendung",
+ "capacity-details": "",
+ "capacity": {
+ "active-documents": "",
+ "all-documents": "",
+ "archived-documents": "",
+ "exceeded-capacity": "",
+ "storage-capacity": "",
+ "trash-documents": "",
+ "unused": ""
+ },
"copyright-claim-text": "Copyright © 2020 - {currentYear} knecon AG (powered by IQSER)",
"copyright-claim-title": "Copyright",
"current-analyzed": "In aktuellem Lizenzzeitraum analysierte Seiten",
@@ -1654,6 +1663,7 @@
"end-user-license-text": "Die Nutzung dieses Produkts unterliegt den Bedingungen der Endbenutzer-Lizenzvereinbarung für den RedactManager, sofern darin nichts anderweitig festgelegt.",
"end-user-license-title": "Endbenutzer-Lizenzvereinbarung",
"license-title": "",
+ "licensed-capacity": "",
"licensed-page-count": "Anzahl der lizenzierten Seiten",
"licensed-to": "Lizenziert für",
"licensing-details": "Lizenzdetails",
@@ -1668,15 +1678,6 @@
"active": "Aktiv",
"inactive": ""
},
- "storage-details": "",
- "storage": {
- "active-documents": "",
- "all-documents": "",
- "archived-documents": "",
- "storage-capacity": "",
- "trash-documents": "",
- "unused": ""
- },
"total-analyzed": "Seit {date} insgesamt analysierte Seiten",
"total-ocr-analyzed": "",
"unlicensed-analyzed": "Über Lizenz hinaus analysierte Seiten",
diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json
index c6a6af459..62b8845b5 100644
--- a/apps/red-ui/src/assets/i18n/scm/en.json
+++ b/apps/red-ui/src/assets/i18n/scm/en.json
@@ -473,7 +473,6 @@
"heading-with-name-and-link": "Your user is successfully logged in but has no role assigned yet. Please contact {adminName} to assign appropriate roles.",
"logout": "Logout"
},
- "by": "by",
"change-legal-basis-dialog": {
"actions": {
"cancel": "Cancel",
@@ -1639,6 +1638,16 @@
},
"license-info-screen": {
"backend-version": "Backend Application Version",
+ "capacity-details": "Capacity Details",
+ "capacity": {
+ "active-documents": "Active Documents",
+ "all-documents": "Retention Capacity Used",
+ "archived-documents": "Archived Documents",
+ "exceeded-capacity": "Exceeded Capacity",
+ "storage-capacity": "Capacity",
+ "trash-documents": "Documents in Trash",
+ "unused": "Unused Storage"
+ },
"copyright-claim-text": "Copyright © 2020 - {currentYear} knecon AG (powered by IQSER)",
"copyright-claim-title": "Copyright Claim",
"current-analyzed": "Analyzed Pages in Licensing Period",
@@ -1654,6 +1663,7 @@
"end-user-license-text": "The use of this product is subject to the terms of the Component End User Agreement, unless otherwise specified therein.",
"end-user-license-title": "End User License Agreement",
"license-title": "License Title",
+ "licensed-capacity": "Licensed Capacity",
"licensed-page-count": "Licensed pages",
"licensed-to": "Licensed to",
"licensing-details": "Licensing Details",
@@ -1668,15 +1678,6 @@
"active": "Active",
"inactive": "Inactive"
},
- "storage-details": "Storage Details",
- "storage": {
- "active-documents": "Active Documents",
- "all-documents": "Total Storage Used",
- "archived-documents": "Archived Documents",
- "storage-capacity": "Storage Capacity",
- "trash-documents": "Documents in Trash",
- "unused": "Unused Storage"
- },
"total-analyzed": "Total Analyzed Pages Since {date}",
"total-ocr-analyzed": "Total OCR Processed Pages Since {date}",
"unlicensed-analyzed": "Unlicensed Analyzed Pages",
@@ -1941,7 +1942,7 @@
"title": "Redact text"
}
},
- "redaction-abbreviation": "C",
+ "redaction-abbreviation": "A",
"references": "{count} {count, plural, one{reference} other{references}}",
"remove-redaction": {
"dialog": {
diff --git a/apps/red-ui/src/assets/icons/general/pdftron-action-add-annotation.svg b/apps/red-ui/src/assets/icons/general/pdftron-action-add-annotation.svg
new file mode 100644
index 000000000..0470f2fe2
--- /dev/null
+++ b/apps/red-ui/src/assets/icons/general/pdftron-action-add-annotation.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/apps/red-ui/src/assets/icons/general/pdftron-action-add-hint.svg b/apps/red-ui/src/assets/icons/general/pdftron-action-add-hint.svg
index 1fe57ac1b..e90c4b123 100644
--- a/apps/red-ui/src/assets/icons/general/pdftron-action-add-hint.svg
+++ b/apps/red-ui/src/assets/icons/general/pdftron-action-add-hint.svg
@@ -2,8 +2,8 @@