Edit dossier permissions

This commit is contained in:
Adina Țeudan 2022-03-01 16:26:00 +02:00
parent d4cbf647ad
commit 6fecb84aa5
12 changed files with 128 additions and 82 deletions

View File

@ -50,7 +50,7 @@ export class EditDossierAttributesComponent implements EditDossierSectionInterfa
}
get disabled(): boolean {
return !this._permissionsService.isOwner(this.dossier);
return !this._permissionsService.canHardDeleteOrRestore(this.dossier);
}
get valid(): boolean {

View File

@ -164,7 +164,10 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
}
private _canPerformActions(file: File): boolean {
return this._userService.currentUser.isManager || this._permissionsService.canDeleteFile(file);
return (
this._permissionsService.canHardDeleteOrRestore(this.dossier) &&
(this._userService.currentUser.isManager || this._permissionsService.canDeleteFile(file))
);
}
private _canRestore(file: File, restoreDate: string): boolean {

View File

@ -57,8 +57,8 @@ export class EditDossierDictionaryComponent implements EditDossierSectionInterfa
async ngOnInit() {
this._loadingService.start();
this.canEdit = this._permissionsService.canEditDossier(this.dossier);
this.canEditDisplayName = this._permissionsService.isOwner(this.dossier);
this.canEdit = this._permissionsService.canEditDossierDictionary(this.dossier);
this.canEditDisplayName = this._permissionsService.canEditDossierDictionaryDisplayName(this.dossier);
await this._updateDossierDictionary();
this.form = this._getForm();
this._loadingService.stop();
@ -121,7 +121,7 @@ export class EditDossierDictionaryComponent implements EditDossierSectionInterfa
addToDictionaryAction: [
{
value: this.dossierDictionary.addToDictionaryAction,
disabled: !this._permissionsService.isOwner(this.dossier),
disabled: !this._permissionsService.canEditDossierDictionaryAddAction(this.dossier),
},
],
});

View File

@ -1,17 +1,31 @@
<form *ngIf="form" [formGroup]="form">
<redaction-select
[label]="'report-type.label' | translate: { length: reportTypesLength }"
[optionTemplate]="reportTemplateOptionTemplate"
[options]="availableReportTypes"
[valueMapper]="reportTemplateValueMapper"
class="mr-16"
formControlName="reportTemplateIds"
></redaction-select>
<redaction-select
[label]="'download-type.label' | translate: { length: downloadFileTypesLength }"
[options]="downloadTypes"
formControlName="downloadFileTypes"
></redaction-select>
<div>
<redaction-select
[label]="'report-type.label' | translate: { length: reportTypesLength }"
[optionTemplate]="reportTemplateOptionTemplate"
[options]="availableReportTypes"
[valueMapper]="reportTemplateValueMapper"
class="mr-16"
formControlName="reportTemplateIds"
></redaction-select>
<redaction-select
[label]="'download-type.label' | translate: { length: downloadFileTypesLength }"
[options]="downloadTypes"
formControlName="downloadFileTypes"
></redaction-select>
</div>
<div class="mt-32 mb-14">
<mat-checkbox class="watermark" color="primary" formControlName="watermarkEnabled">
{{ 'edit-dossier-dialog.general-info.form.watermark' | translate }}
</mat-checkbox>
</div>
<div>
<mat-checkbox class="watermark-preview" color="primary" formControlName="watermarkPreviewEnabled">
{{ 'edit-dossier-dialog.general-info.form.watermark-preview' | translate }}
</mat-checkbox>
</div>
</form>
<ng-template #reportTemplateOptionTemplate let-option="option">

View File

@ -10,4 +10,9 @@ redaction-select {
form {
height: calc(100% - 44px);
display: flex;
flex-direction: column;
> div {
display: flex;
}
}

View File

@ -40,9 +40,17 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS
return this.form.controls['downloadFileTypes']?.value?.length || 0;
}
get changed() {
if (this.form) {
for (const key of Object.keys(this.form.getRawValue())) {
get changed(): boolean {
if (!this.form) {
return false;
}
for (const key of Object.keys(this.form.getRawValue())) {
if (key.startsWith('watermark')) {
if (this.dossier[key] !== this.form.get(key).value) {
return true;
}
} else {
if (this.dossier[key].length !== this.form.get(key).value.length) {
return true;
}
@ -86,6 +94,8 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS
...this.dossier,
downloadFileTypes: this.form.get('downloadFileTypes').value,
reportTemplateIds: this.form.get('reportTemplateIds').value,
watermarkEnabled: this.form.get('watermarkEnabled').value,
watermarkPreviewEnabled: this.form.get('watermarkPreviewEnabled').value,
};
const updatedDossier = await firstValueFrom(this._dossiersService.createOrUpdate(dossier));
@ -96,6 +106,8 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS
this.form.reset({
downloadFileTypes: this.dossier.downloadFileTypes,
reportTemplateIds: this.dossier.reportTemplateIds,
watermarkEnabled: this.dossier.watermarkEnabled,
watermarkPreviewEnabled: this.dossier.watermarkPreviewEnabled,
});
}
@ -104,6 +116,8 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS
{
reportTemplateIds: [this.dossier.reportTemplateIds],
downloadFileTypes: [this.dossier.downloadFileTypes],
watermarkEnabled: [this.dossier.watermarkEnabled],
watermarkPreviewEnabled: [this.dossier.watermarkPreviewEnabled],
},
{
validators: control =>

View File

@ -5,13 +5,10 @@
<div class="dialog-content">
<iqser-side-nav [title]="'edit-dossier-dialog.side-nav-title' | translate">
<div
(click)="changeTab(item.key)"
*ngFor="let item of navItems"
[class.active]="item.key === activeNav"
[translate]="item.sideNavTitle || item.title"
class="item"
></div>
<div (click)="changeTab(item.key)" *ngFor="let item of navItems" [class.active]="item.key === activeNav" class="item">
{{ item.sideNavTitle || item.title | translate }}
<mat-icon *ngIf="item.readonly" svgIcon="red:read-only"></mat-icon>
</div>
</iqser-side-nav>
<div>
@ -53,9 +50,9 @@
(click)="save()"
[disabled]="disabled || !valid || !changed"
color="primary"
id="editDossierSaveButton"
mat-flat-button
type="button"
id="editDossierSaveButton"
>
{{ 'edit-dossier-dialog.actions.save' | translate }}
</button>
@ -72,5 +69,5 @@
</div>
</div>
<iqser-circle-button class="dialog-close" icon="iqser:close" (action)="close()" id="editDossierCloseButton"></iqser-circle-button>
<iqser-circle-button (action)="close()" class="dialog-close" icon="iqser:close" id="editDossierCloseButton"></iqser-circle-button>
</section>

View File

@ -26,7 +26,7 @@ type Section = 'dossierInfo' | 'downloadPackage' | 'dossierDictionary' | 'member
providers: [dossiersServiceProvider],
})
export class EditDossierDialogComponent extends BaseDialogComponent implements AfterViewInit {
readonly navItems: { key: Section; title?: string; sideNavTitle?: string }[];
navItems: { key: Section; title?: string; sideNavTitle?: string; readonly?: boolean }[] = [];
readonly iconButtonTypes = IconButtonTypes;
activeNav: Section;
readonly dossier$: Observable<Dossier>;
@ -56,38 +56,12 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A
},
) {
super(_injector, _dialogRef, true);
this.navItems = [
{
key: 'dossierInfo',
title: _('edit-dossier-dialog.nav-items.general-info'),
sideNavTitle: _('edit-dossier-dialog.nav-items.dossier-info'),
},
{
key: 'downloadPackage',
title: _('edit-dossier-dialog.nav-items.choose-download'),
sideNavTitle: _('edit-dossier-dialog.nav-items.download-package'),
},
{
key: 'dossierDictionary',
sideNavTitle: _('edit-dossier-dialog.nav-items.dictionary'),
title: _('edit-dossier-dialog.nav-items.dossier-dictionary'),
},
{
key: 'members',
title: _('edit-dossier-dialog.nav-items.team-members'),
sideNavTitle: _('edit-dossier-dialog.nav-items.members'),
},
{
key: 'dossierAttributes',
title: _('edit-dossier-dialog.nav-items.dossier-attributes'),
},
{
key: 'deletedDocuments',
sideNavTitle: _('edit-dossier-dialog.nav-items.deleted-documents'),
},
];
this.dossier$ = this._activeDossiersService.getEntityChanged$(_data.dossierId).pipe(tap(dossier => (this._dossier = dossier)));
this.dossier$ = this._activeDossiersService.getEntityChanged$(_data.dossierId).pipe(
tap(dossier => {
this._dossier = dossier;
this._initializeNavItems();
}),
);
this.activeNav = _data.section || 'dossierInfo';
}
@ -173,4 +147,41 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A
this.activeNav = key;
}
}
private _initializeNavItems(): void {
this.navItems = [
{
key: 'dossierInfo',
title: _('edit-dossier-dialog.nav-items.general-info'),
sideNavTitle: _('edit-dossier-dialog.nav-items.dossier-info'),
readonly: !this._dossier.isActive,
},
{
key: 'downloadPackage',
title: _('edit-dossier-dialog.nav-items.choose-download'),
sideNavTitle: _('edit-dossier-dialog.nav-items.download-package'),
},
{
key: 'dossierDictionary',
sideNavTitle: _('edit-dossier-dialog.nav-items.dictionary'),
title: _('edit-dossier-dialog.nav-items.dossier-dictionary'),
readonly: !this._permissionsService.canEditDossierDictionary(this._dossier),
},
{
key: 'members',
title: _('edit-dossier-dialog.nav-items.team-members'),
sideNavTitle: _('edit-dossier-dialog.nav-items.members'),
},
{
key: 'dossierAttributes',
title: _('edit-dossier-dialog.nav-items.dossier-attributes'),
readonly: !this._permissionsService.canEditDossierAttributes(this._dossier),
},
{
key: 'deletedDocuments',
sideNavTitle: _('edit-dossier-dialog.nav-items.deleted-documents'),
readonly: !this._permissionsService.canHardDeleteOrRestore(this._dossier),
},
];
}
}

View File

@ -38,18 +38,6 @@
type="text"
></textarea>
</div>
<div>
<mat-checkbox class="watermark" color="primary" formControlName="watermarkEnabled">
{{ 'edit-dossier-dialog.general-info.form.watermark' | translate }}
</mat-checkbox>
</div>
<div>
<mat-checkbox class="watermark-preview" color="primary" formControlName="watermarkPreviewEnabled">
{{ 'edit-dossier-dialog.general-info.form.watermark-preview' | translate }}
</mat-checkbox>
</div>
</div>
<div class="flex fields-container">

View File

@ -105,8 +105,6 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
dossierTemplateId: this.dossier.dossierTemplateId,
dossierStatusId: this.dossier.dossierStatusId,
description: this.dossier.description,
watermarkEnabled: this.dossier.watermarkEnabled,
watermarkPreviewEnabled: this.dossier.watermarkPreviewEnabled,
dueDate: this.dossier.dueDate,
});
}
@ -116,8 +114,6 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
...this.dossier,
dossierName: this.form.get('dossierName').value,
description: this.form.get('description').value,
watermarkEnabled: this.form.get('watermarkEnabled').value,
watermarkPreviewEnabled: this.form.get('watermarkPreviewEnabled').value,
dueDate: this.hasDueDate ? this.form.get('dueDate').value : undefined,
dossierTemplateId: this.form.get(DOSSIER_TEMPLATE_ID).value,
dossierStatusId: this.form.get('dossierStatusId').value,
@ -171,8 +167,6 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
dossierStatusId: [formFieldWithArchivedCheck(this.dossier.dossierStatusId)],
description: [formFieldWithArchivedCheck(this.dossier.description)],
dueDate: [formFieldWithArchivedCheck(this.dossier.dueDate)],
watermarkEnabled: [this.dossier.watermarkEnabled],
watermarkPreviewEnabled: [this.dossier.watermarkPreviewEnabled],
});
}

View File

@ -75,6 +75,10 @@ export class PermissionsService {
return files.reduce((acc, _file) => this._canDeleteFile(_file, dossier) && acc, true);
}
canHardDeleteOrRestore(dossier: Dossier): boolean {
return dossier.isActive;
}
canOcrFile(file: File | File[]): boolean {
const files = file instanceof File ? [file] : file;
const dossier = this._getDossier(files[0]);
@ -170,6 +174,22 @@ export class PermissionsService {
return user.isManager && !!dossier?.ownerId;
}
canEditDossierDictionary(dossier: Dossier, user = this._userService.currentUser): boolean {
return dossier.isActive && this.canEditDossier(dossier, user);
}
canEditDossierDictionaryDisplayName(dossier: Dossier, user = this._userService.currentUser): boolean {
return dossier.isActive && this.isOwner(dossier, user);
}
canEditDossierDictionaryAddAction(dossier: Dossier, user = this._userService.currentUser): boolean {
return dossier.isActive && this.isOwner(dossier, user);
}
canEditDossierAttributes(dossier: Dossier, user = this._userService.currentUser): boolean {
return dossier.isActive && this.isOwner(dossier, user);
}
isAdmin(user = this._userService.currentUser): boolean {
return user.isAdmin;
}

@ -1 +1 @@
Subproject commit 242789330301767bc38fe62651ea777297159bb3
Subproject commit d141625d5f3c8f0c57b10f3e341af26ac64402b9