From 3db3a6a1c4b972888fa8441dc63c729662dc8426 Mon Sep 17 00:00:00 2001 From: Valentin Date: Sun, 6 Feb 2022 18:39:05 +0200 Subject: [PATCH 1/3] updated edit dossier modal to be in read-only mode when there is not owner set --- ...edit-dossier-download-package.component.ts | 2 +- .../edit-dossier-dialog.component.ts | 16 +++--- .../edit-dossier-team.component.html | 52 ++++++++++--------- .../edit-dossier-team.component.ts | 9 ++-- .../edit-dossier-general-info.component.html | 2 +- .../edit-dossier-general-info.component.ts | 2 +- .../src/app/services/permissions.service.ts | 4 +- 7 files changed, 49 insertions(+), 38 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts index 7338c9590..6df62c19a 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts @@ -74,7 +74,7 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS (await firstValueFrom(this._reportTemplateController.getAvailableReportTemplates(this.dossier.dossierTemplateId))) || []; this.form = this._getForm(); - if (!this._permissionsService.canEditDossier()) { + if (!this._permissionsService.canEditDossier(this.dossier)) { this.form.disable(); } } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts index 486375e34..367f3e9a1 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts @@ -15,6 +15,7 @@ import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; import { EditDossierTeamComponent } from './edit-dossier-team/edit-dossier-team.component'; import { PermissionsService } from '@services/permissions.service'; +import { UserService } from '@services/user.service'; type Section = 'dossierInfo' | 'downloadPackage' | 'dossierDictionary' | 'members' | 'dossierAttributes' | 'deletedDocuments'; @@ -34,7 +35,8 @@ export class EditDossierDialogComponent extends BaseDialogComponent { @ViewChild(EditDossierTeamComponent) membersComponent: EditDossierTeamComponent; @ViewChild(EditDossierAttributesComponent) attributesComponent: EditDossierAttributesComponent; @ViewChild(EditDossierDeletedDocumentsComponent) deletedDocumentsComponent: EditDossierDeletedDocumentsComponent; - private _dossierName: string; + + private _dossier: Dossier; constructor( private readonly _toaster: Toaster, @@ -42,6 +44,7 @@ export class EditDossierDialogComponent extends BaseDialogComponent { private readonly _changeRef: ChangeDetectorRef, private readonly _loadingService: LoadingService, private readonly _permissionsService: PermissionsService, + private readonly _userService: UserService, protected readonly _injector: Injector, protected readonly _dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) @@ -82,9 +85,7 @@ export class EditDossierDialogComponent extends BaseDialogComponent { }, ]; - this.dossier$ = this._dossiersService - .getEntityChanged$(_data.dossierId) - .pipe(tap(dossier => (this._dossierName = dossier.dossierName))); + this.dossier$ = this._dossiersService.getEntityChanged$(_data.dossierId).pipe(tap(dossier => (this._dossier = dossier))); this.activeNav = _data.section || 'dossierInfo'; } @@ -112,7 +113,10 @@ export class EditDossierDialogComponent extends BaseDialogComponent { } get showActionButtons(): boolean { - return !['deletedDocuments'].includes(this.activeNav) && this._permissionsService.canEditDossier(); + return ( + (['members'].includes(this.activeNav) && this._userService.currentUser.isManager) || + (!['deletedDocuments'].includes(this.activeNav) && this._permissionsService.canEditDossier(this._dossier)) + ); } get changed(): boolean { @@ -133,7 +137,7 @@ export class EditDossierDialogComponent extends BaseDialogComponent { this._loadingService.stop(); if (result.success) { - this._toaster.success(_('edit-dossier-dialog.change-successful'), { params: { dossierName: this._dossierName } }); + this._toaster.success(_('edit-dossier-dialog.change-successful'), { params: { dossierName: this._dossier.dossierName } }); } if (result.success && options?.closeAfterSave) { diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.html b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.html index 5d2809aec..5d2053801 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.html +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.html @@ -9,33 +9,37 @@ -
- -
- + +
+ +
- + +
+ +
+ +
{{ 'assign-dossier-owner.dialog.no-reviewers' | translate }}
-
{{ 'assign-dossier-owner.dialog.select-below' | translate }}
diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts index 9f92db656..3b9acd23b 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts @@ -6,6 +6,7 @@ import { Dossier, IDossierRequest } from '@red/domain'; import { AutoUnsubscribe } from '@iqser/common-ui'; import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { BehaviorSubject, firstValueFrom } from 'rxjs'; +import { PermissionsService } from '@services/permissions.service'; @Component({ selector: 'redaction-edit-dossier-team', @@ -19,14 +20,16 @@ export class EditDossierTeamComponent extends AutoUnsubscribe implements EditDos @Input() dossier: Dossier; - readonly ownersSelectOptions = this.userService.managerUsers.map(m => m.id); membersSelectOptions: string[] = []; + + readonly ownersSelectOptions = this.userService.managerUsers.map(m => m.id); readonly selectedReviewers$ = new BehaviorSubject([]); constructor( readonly userService: UserService, private readonly _formBuilder: FormBuilder, private readonly _dossiersService: DossiersService, + private readonly _permissionsService: PermissionsService, ) { super(); } @@ -48,7 +51,7 @@ export class EditDossierTeamComponent extends AutoUnsubscribe implements EditDos } get disabled() { - return !this.userService.currentUser.isManager; + return !this.userService.currentUser.isManager || !this.form.get('owner').value; } get changed() { @@ -149,7 +152,7 @@ export class EditDossierTeamComponent extends AutoUnsubscribe implements EditDos owner: [ { value: this.dossier?.ownerId, - disabled: this.disabled, + disabled: !this.userService.currentUser.isManager, }, Validators.required, ], diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html index aebea6535..0af613641 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html @@ -53,7 +53,7 @@ diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts index 4925acddb..55bc3065e 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts @@ -69,7 +69,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti ngOnInit() { this._filterInvalidDossierTemplates(); this.form = this._getForm(); - if (!this.permissionsService.canEditDossier()) { + if (!this.permissionsService.canEditDossier(this.dossier)) { this.form.disable(); } this.hasDueDate = !!this.dossier.dueDate; diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index a69c5e6a7..4ad6f6d6b 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -123,8 +123,8 @@ export class PermissionsService { return dossier.ownerId === this._userService.currentUser.id; } - canEditDossier(user = this._userService.currentUser) { - return user.isManager; + canEditDossier(dossier: Dossier, user = this._userService.currentUser): boolean { + return user.isManager && !!dossier?.ownerId; } isAdmin(user = this._userService.currentUser): boolean { From 7a00abf8412e2e30427242411219379ca251bf4b Mon Sep 17 00:00:00 2001 From: Valentin Mihai Date: Mon, 7 Feb 2022 11:33:57 +0200 Subject: [PATCH 2/3] added missing owner hint when edit dossier dialog is opened and there is no owner set --- .../edit-dossier-dialog.component.ts | 10 ++++++++-- apps/red-ui/src/assets/i18n/de.json | 10 +--------- apps/red-ui/src/assets/i18n/en.json | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts index 367f3e9a1..1b2cfceed 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectorRef, Component, Inject, Injector, ViewChild } from '@angular/core'; +import { AfterViewInit, ChangeDetectorRef, Component, Inject, Injector, ViewChild } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { Dossier } from '@red/domain'; import { EditDossierGeneralInfoComponent } from './general-info/edit-dossier-general-info.component'; @@ -23,7 +23,7 @@ type Section = 'dossierInfo' | 'downloadPackage' | 'dossierDictionary' | 'member templateUrl: './edit-dossier-dialog.component.html', styleUrls: ['./edit-dossier-dialog.component.scss'], }) -export class EditDossierDialogComponent extends BaseDialogComponent { +export class EditDossierDialogComponent extends BaseDialogComponent implements AfterViewInit { readonly navItems: { key: Section; title?: string; sideNavTitle?: string }[]; readonly iconButtonTypes = IconButtonTypes; activeNav: Section; @@ -89,6 +89,12 @@ export class EditDossierDialogComponent extends BaseDialogComponent { this.activeNav = _data.section || 'dossierInfo'; } + ngAfterViewInit() { + if (!this._dossier.ownerId) { + this._toaster.error(_('edit-dossier-dialog.missing-owner')); + } + } + get activeNavItem(): { key: string; title?: string } { return this.navItems.find(item => item.key === this.activeNav); } diff --git a/apps/red-ui/src/assets/i18n/de.json b/apps/red-ui/src/assets/i18n/de.json index 33bd2c739..07269c939 100644 --- a/apps/red-ui/src/assets/i18n/de.json +++ b/apps/red-ui/src/assets/i18n/de.json @@ -146,15 +146,6 @@ "plural": "" }, "annotation-actions": { - "resize": { - "label": "Größe ändern" - }, - "resize-accept": { - "label": "Größe speichern" - }, - "resize-cancel": { - "label": "Größenänderung abbrechen" - }, "accept-recommendation": { "label": "Empfehlung annehmen" }, @@ -956,6 +947,7 @@ } }, "header": "{dossierName} bearbeiten", + "missing-owner": "", "nav-items": { "choose-download": "Wählen Sie die Dokumente für Ihr Download-Paket aus:", "deleted-documents": "Gelöschte Dokumente", diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index 5f60b49ec..2771a953f 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -296,7 +296,6 @@ "suggestion-add": "Suggested redaction", "suggestion-add-dictionary": "Suggested dictionary add", "suggestion-change-legal-basis": "Suggested change legal basis", - "suggestion-force-redaction": "Suggestion force redaction", "suggestion-force-redaction": "Suggestion force hint", "suggestion-recategorize-image": "Suggested recategorize image", "suggestion-remove": "Suggested local removal", @@ -967,6 +966,7 @@ } }, "header": "Edit {dossierName}", + "missing-owner": "You cannot edit the dossier because the owner is missing!", "nav-items": { "choose-download": "Choose what is included at download:", "deleted-documents": "Deleted Documents", From 563fe3dcef491b731c87bbdbcbd207186eef0e57 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 7 Feb 2022 11:06:32 +0100 Subject: [PATCH 3/3] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3213 -> 3213 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b17263d9..da8c108e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.204.0", + "version": "3.205.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 08d817c51c07770a15a57461a7e7382ed8dc3743..0b87eb3741a08c7d3f9109236327725c54b322d3 100644 GIT binary patch delta 3142 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 delta 3144 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