{
await firstValueFrom(this._loadWatermark());
}
@@ -79,19 +93,21 @@ export class WatermarkScreenComponent implements OnInit {
async save(): Promise
{
const watermark: IWatermark = this.form.getRawValue();
- const observable = watermark.text
- ? this._watermarkService.saveWatermark(watermark, this.#dossierTemplateId)
- : this._watermarkService.deleteWatermark(this.#dossierTemplateId);
-
try {
await firstValueFrom(
- observable.pipe(
- switchMap(() => this._loadWatermark()),
+ this._watermarkService.saveWatermark(watermark).pipe(
tap(() => {
this._toaster.success(
- watermark.text ? _('watermark-screen.action.change-success') : _('watermark-screen.action.delete-success'),
+ watermark.id ? _('watermark-screen.action.change-success') : _('watermark-screen.action.created-success'),
);
}),
+ tap(async () => {
+ if (!watermark.id) {
+ await this._router.navigate([`/main/admin/dossier-templates/${this.#dossierTemplateId}/watermarks`]);
+ } else {
+ await firstValueFrom(this._loadWatermark());
+ }
+ }),
),
);
} catch (error) {
@@ -114,10 +130,11 @@ export class WatermarkScreenComponent implements OnInit {
}
private _loadWatermark(): Observable {
- return this._watermarkService.getWatermark(this.#dossierTemplateId).pipe(
+ return this._watermarkService.getWatermark(this.#watermarkId).pipe(
catchError(() => of(DEFAULT_WATERMARK)),
tap(watermark => {
this._watermark = watermark;
+ this._watermark.dossierTemplateId = this.#dossierTemplateId;
this.form.setValue({ ...watermark });
this._loadViewer();
}),
@@ -199,12 +216,19 @@ export class WatermarkScreenComponent implements OnInit {
const defaultFormControl = [{ ...defaultValue }, Validators.required];
return this._formBuilder.group({
- text: [{ ...defaultValue }],
+ id: [{ ...defaultValue }],
+ name: [{ ...defaultFormControl }],
+ enabled: [{ ...defaultValue }],
+ dossierTemplateId: [{ ...defaultValue }],
+ text: [{ ...defaultFormControl }],
hexColor: [...defaultFormControl],
opacity: [...defaultFormControl],
fontSize: [...defaultFormControl],
fontType: [...defaultFormControl],
orientation: [...defaultFormControl],
+ createdBy: [{ ...defaultValue }],
+ dateAdded: [{ ...defaultValue }],
+ dateModified: [{ ...defaultValue }],
});
}
}
diff --git a/apps/red-ui/src/app/modules/admin/screens/watermarks-listing/watermarks-listing-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/watermarks-listing/watermarks-listing-screen.component.html
new file mode 100644
index 000000000..51a35dd1a
--- /dev/null
+++ b/apps/red-ui/src/app/modules/admin/screens/watermarks-listing/watermarks-listing-screen.component.html
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ watermark.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ watermark.dateAdded | date: 'd MMM yyyy' }}
+
+
+
+
+
+ {{ watermark.dateModified | date: 'd MMM yyyy' }}
+
+
+
+
+
+
diff --git a/apps/red-ui/src/app/modules/admin/screens/watermarks-listing/watermarks-listing-screen.component.scss b/apps/red-ui/src/app/modules/admin/screens/watermarks-listing/watermarks-listing-screen.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/red-ui/src/app/modules/admin/screens/watermarks-listing/watermarks-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/watermarks-listing/watermarks-listing-screen.component.ts
new file mode 100644
index 000000000..9aa05c702
--- /dev/null
+++ b/apps/red-ui/src/app/modules/admin/screens/watermarks-listing/watermarks-listing-screen.component.ts
@@ -0,0 +1,106 @@
+import { ChangeDetectionStrategy, Component, forwardRef, Injector, OnInit } from '@angular/core';
+import {
+ CircleButtonTypes,
+ ConfirmationDialogInput,
+ DefaultListingServices,
+ IconButtonTypes,
+ ListingComponent,
+ LoadingService,
+ TableColumnConfig,
+ Toaster,
+} from '@iqser/common-ui';
+import { DOSSIER_TEMPLATE_ID, User, Watermark } from '@red/domain';
+import { UserService } from '../../../../services/user.service';
+import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
+import { firstValueFrom } from 'rxjs';
+import { WatermarkService } from '../../../../services/entity-services/watermark.service';
+import { ActivatedRoute } from '@angular/router';
+import { AdminDialogService } from '../../services/admin-dialog.service';
+
+@Component({
+ templateUrl: './watermarks-listing-screen.component.html',
+ styleUrls: ['./watermarks-listing-screen.component.scss'],
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ providers: [...DefaultListingServices, { provide: ListingComponent, useExisting: forwardRef(() => WatermarksListingScreenComponent) }],
+})
+export class WatermarksListingScreenComponent extends ListingComponent implements OnInit {
+ private readonly _dossierTemplateId: string;
+
+ readonly iconButtonTypes = IconButtonTypes;
+ readonly circleButtonTypes = CircleButtonTypes;
+ readonly currentUser: User;
+
+ readonly tableColumnConfigs: TableColumnConfig[] = [
+ { label: _('watermarks-listing.table-col-names.name'), width: '2fr' },
+ { label: _('watermarks-listing.table-col-names.status'), class: 'flex-center' },
+ { label: _('watermarks-listing.table-col-names.created-by'), class: 'user-column' },
+ { label: _('watermarks-listing.table-col-names.created-on') },
+ { label: _('watermarks-listing.table-col-names.modified-on') },
+ ];
+ readonly tableHeaderLabel: string = _('watermarks-listing.table-header.title');
+
+ constructor(
+ protected readonly _injector: Injector,
+ private readonly _route: ActivatedRoute,
+ private readonly _userService: UserService,
+ private readonly _loadingService: LoadingService,
+ private readonly _watermarkService: WatermarkService,
+ private readonly _dialogService: AdminDialogService,
+ private readonly _toaster: Toaster,
+ ) {
+ super(_injector);
+ this.currentUser = _userService.currentUser;
+ this._dossierTemplateId = _route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID);
+ }
+
+ async ngOnInit(): Promise {
+ await this._loadData();
+ }
+
+ private async _loadData(): Promise {
+ this._loadingService.start();
+
+ try {
+ const response = await firstValueFrom(this._watermarkService.getWatermarks(this._dossierTemplateId));
+ const watermarkConfig = response?.map(item => new Watermark(item)) || [];
+ this.entitiesService.setEntities(watermarkConfig);
+ } catch (e) {}
+
+ this._loadingService.stop();
+ }
+
+ async openConfirmDeleteWatermarkDialog($event: MouseEvent, watermark: Watermark): Promise {
+ const isUsed = await firstValueFrom(this._watermarkService.isWatermarkUsed(watermark.id));
+
+ if (!isUsed) {
+ await this._deleteWatermark(watermark);
+ return;
+ }
+
+ const data = new ConfirmationDialogInput({
+ question: _('watermarks-listing.watermark-is-used'),
+ });
+ this._dialogService.openDialog('confirm', $event, data, async () => {
+ await this._deleteWatermark(watermark);
+ });
+ }
+
+ private async _deleteWatermark(watermark: Watermark): Promise {
+ this._loadingService.start();
+ await firstValueFrom(this._watermarkService.deleteWatermark(watermark.id));
+ this._toaster.success(_('watermarks-listing.action.delete-success'));
+ await this._loadData();
+ this._loadingService.stop();
+ }
+
+ async toggleStatus(watermark?: Watermark): Promise {
+ watermark.enabled = !watermark.enabled;
+ this._loadingService.start();
+ await firstValueFrom(this._watermarkService.saveWatermark(watermark));
+ this._loadingService.stop();
+ }
+
+ getRouterLink(watermark: Watermark = null): string {
+ return `/main/admin/dossier-templates/${this._dossierTemplateId}/watermarks/${watermark ? watermark.id : 0}`;
+ }
+}
diff --git a/apps/red-ui/src/app/modules/admin/services/digital-signature.service.ts b/apps/red-ui/src/app/modules/admin/services/digital-signature.service.ts
index 6024e3322..b9c8fcda0 100644
--- a/apps/red-ui/src/app/modules/admin/services/digital-signature.service.ts
+++ b/apps/red-ui/src/app/modules/admin/services/digital-signature.service.ts
@@ -1,6 +1,6 @@
import { Injectable, Injector } from '@angular/core';
import { filterEach, GenericService, RequiredParam, Validate } from '@iqser/common-ui';
-import { filter, forkJoin, Observable, of } from 'rxjs';
+import { forkJoin, Observable, of } from 'rxjs';
import {
IDigitalSignatureRequest,
IKmsDigitalSignature,
@@ -8,7 +8,7 @@ import {
IPkcsDigitalSignature,
IPkcsDigitalSignatureRequest,
} from '@red/domain';
-import { catchError, map, tap } from 'rxjs/operators';
+import { catchError, map } from 'rxjs/operators';
@Injectable()
export class DigitalSignatureService extends GenericService {
diff --git a/apps/red-ui/src/app/modules/file-preview/services/stamp.service.ts b/apps/red-ui/src/app/modules/file-preview/services/stamp.service.ts
index 5f629fd30..91a7617e3 100644
--- a/apps/red-ui/src/app/modules/file-preview/services/stamp.service.ts
+++ b/apps/red-ui/src/app/modules/file-preview/services/stamp.service.ts
@@ -43,7 +43,7 @@ export class StampService {
if (this._viewModeService.isRedacted) {
const dossier = this._state.dossier;
- if (dossier.watermarkPreviewEnabled) {
+ if (dossier.previewWatermarkId) {
await this._stampPreview(pdfDoc, dossier.dossierTemplateId);
}
} else {
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.html b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.html
index f34253b43..01bf251c1 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.html
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.html
@@ -15,17 +15,41 @@
>
-