Merge branch 'RED-8872' into 'master'

RED-8872: Disable editing team members for dossier in inactive template

Closes RED-8872

See merge request redactmanager/red-ui!416
This commit is contained in:
Valentin-Gabriel Mihai 2024-05-15 22:38:01 +02:00
commit a7009beed5
3 changed files with 27 additions and 24 deletions

View File

@ -35,8 +35,6 @@ interface NavItem {
providers: [dossiersServiceProvider], providers: [dossiersServiceProvider],
}) })
export class EditDossierDialogComponent extends BaseDialogComponent implements AfterViewInit { export class EditDossierDialogComponent extends BaseDialogComponent implements AfterViewInit {
readonly #currentUser = getCurrentUser<User>();
private _dossier: Dossier;
readonly roles = Roles; readonly roles = Roles;
navItems: NavItem[] = []; navItems: NavItem[] = [];
readonly iconButtonTypes = IconButtonTypes; readonly iconButtonTypes = IconButtonTypes;
@ -47,6 +45,8 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A
@ViewChild(EditDossierDictionaryComponent) dictionaryComponent: EditDossierDictionaryComponent; @ViewChild(EditDossierDictionaryComponent) dictionaryComponent: EditDossierDictionaryComponent;
@ViewChild(EditDossierTeamComponent) membersComponent: EditDossierTeamComponent; @ViewChild(EditDossierTeamComponent) membersComponent: EditDossierTeamComponent;
@ViewChild(EditDossierAttributesComponent) attributesComponent: EditDossierAttributesComponent; @ViewChild(EditDossierAttributesComponent) attributesComponent: EditDossierAttributesComponent;
readonly #currentUser = getCurrentUser<User>();
#dossier: Dossier;
constructor( constructor(
readonly iqserPermissionsService: IqserPermissionsService, readonly iqserPermissionsService: IqserPermissionsService,
@ -61,13 +61,13 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A
readonly configService: ConfigService, readonly configService: ConfigService,
) { ) {
super(_dialogRef, true); super(_dialogRef, true);
this.dossier$ = this._dossiersService.getEntityChanged$(_data.dossierId).pipe( this.dossier$ = this._dossiersService.getEntityChanged$(this._data.dossierId).pipe(
tap(dossier => { tap(dossier => {
this._dossier = dossier; this.#dossier = dossier;
this._initializeNavItems(); this._initializeNavItems();
}), }),
); );
this.activeNav = _data.section || 'dossierInfo'; this.activeNav = this._data.section || 'dossierInfo';
} }
get activeNavItem(): NavItem { get activeNavItem(): NavItem {
@ -94,11 +94,11 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A
get showActionButtons(): boolean { get showActionButtons(): boolean {
return ( return (
(['dossierDictionary'].includes(this.activeNav) && this._permissionsService.canEditDossierDictionary(this._dossier)) || (['dossierDictionary'].includes(this.activeNav) && this._permissionsService.canEditDossierDictionary(this.#dossier)) ||
(['members'].includes(this.activeNav) && (['members'].includes(this.activeNav) &&
this.#currentUser.isManager && this.#currentUser.isManager &&
this.iqserPermissionsService.has(Roles.dossiers.edit)) || this.iqserPermissionsService.has(Roles.dossiers.edit)) ||
this._permissionsService.canEditDossier(this._dossier) this._permissionsService.canEditDossier(this.#dossier)
); );
} }
@ -115,7 +115,7 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A
} }
ngAfterViewInit() { ngAfterViewInit() {
if (!this._dossier.ownerId) { if (!this.#dossier.ownerId) {
this._toaster.error(_('edit-dossier-dialog.missing-owner')); this._toaster.error(_('edit-dossier-dialog.missing-owner'));
} }
} }
@ -126,7 +126,7 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A
this._loadingService.stop(); this._loadingService.stop();
if (result.success) { if (result.success) {
this._toaster.success(_('edit-dossier-dialog.change-successful'), { params: { dossierName: this._dossier.dossierName } }); this._toaster.success(_('edit-dossier-dialog.change-successful'), { params: { dossierName: this.#dossier.dossierName } });
} }
if (result.success && options?.closeAfterSave) { if (result.success && options?.closeAfterSave) {
@ -159,21 +159,21 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A
key: 'dossierInfo', key: 'dossierInfo',
title: _('edit-dossier-dialog.nav-items.general-info'), title: _('edit-dossier-dialog.nav-items.general-info'),
sideNavTitle: _('edit-dossier-dialog.nav-items.dossier-info'), sideNavTitle: _('edit-dossier-dialog.nav-items.dossier-info'),
readonly: !this._dossier.isActive || !this._permissionsService.canEditDossier(this._dossier), readonly: !this.#dossier.isActive || !this._permissionsService.canEditDossier(this.#dossier),
helpModeKey: 'edit_dossier_dossier_info_DIALOG', helpModeKey: 'edit_dossier_dossier_info_DIALOG',
}, },
{ {
key: 'downloadPackage', key: 'downloadPackage',
title: _('edit-dossier-dialog.nav-items.choose-download'), title: _('edit-dossier-dialog.nav-items.choose-download'),
sideNavTitle: _('edit-dossier-dialog.nav-items.download-package'), sideNavTitle: _('edit-dossier-dialog.nav-items.download-package'),
readonly: !this._permissionsService.canEditDossier(this._dossier), readonly: !this._permissionsService.canEditDossier(this.#dossier),
helpModeKey: 'edit_dossier_download_package_DIALOG', helpModeKey: 'edit_dossier_download_package_DIALOG',
}, },
{ {
key: 'dossierDictionary', key: 'dossierDictionary',
sideNavTitle: _('edit-dossier-dialog.nav-items.dictionary'), sideNavTitle: _('edit-dossier-dialog.nav-items.dictionary'),
title: _('edit-dossier-dialog.nav-items.dossier-dictionary'), title: _('edit-dossier-dialog.nav-items.dossier-dictionary'),
readonly: !this._permissionsService.canEditDossierDictionary(this._dossier), readonly: !this._permissionsService.canEditDossierDictionary(this.#dossier),
helpModeKey: 'edit_dossier_dossier_dictionary_DIALOG', helpModeKey: 'edit_dossier_dossier_dictionary_DIALOG',
hide: this.configService.values.IS_DOCUMINE, hide: this.configService.values.IS_DOCUMINE,
}, },
@ -181,13 +181,13 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A
key: 'members', key: 'members',
title: _('edit-dossier-dialog.nav-items.team-members'), title: _('edit-dossier-dialog.nav-items.team-members'),
sideNavTitle: _('edit-dossier-dialog.nav-items.members'), sideNavTitle: _('edit-dossier-dialog.nav-items.members'),
readonly: !this._permissionsService.canEditTeamMembers(), readonly: !this._permissionsService.canEditTeamMembers(this.#dossier),
helpModeKey: 'edit_dossier_members_DIALOG', helpModeKey: 'edit_dossier_members_DIALOG',
}, },
{ {
key: 'dossierAttributes', key: 'dossierAttributes',
title: _('edit-dossier-dialog.nav-items.dossier-attributes'), title: _('edit-dossier-dialog.nav-items.dossier-attributes'),
readonly: !this._permissionsService.canEditDossierAttributes(this._dossier), readonly: !this._permissionsService.canEditDossierAttributes(this.#dossier),
helpModeKey: 'edit_dossier_dossier_attributes_DIALOG', helpModeKey: 'edit_dossier_dossier_attributes_DIALOG',
}, },
]; ];

View File

@ -19,26 +19,26 @@ import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-doss
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class EditDossierTeamComponent implements EditDossierSectionInterface, OnChanges { export class EditDossierTeamComponent implements EditDossierSectionInterface, OnChanges {
readonly #userService = inject(UserService);
readonly #dossiersService = inject(DossiersService);
readonly #permissionsService = inject(PermissionsService);
readonly #filesService = inject(FilesService);
form = this.#getForm(); form = this.#getForm();
readonly #formValue$ = this.form.valueChanges;
searchQuery = ''; searchQuery = '';
@Input() dossier: Dossier; @Input() dossier: Dossier;
membersSelectOptions: string[] = []; membersSelectOptions: string[] = [];
readonly isDocumine = getConfig().IS_DOCUMINE;
readonly #userService = inject(UserService);
readonly ownersSelectOptions = this.#userService.all.filter(u => u.isManager).map(m => m.id); readonly ownersSelectOptions = this.#userService.all.filter(u => u.isManager).map(m => m.id);
readonly #dossiersService = inject(DossiersService);
readonly #permissionsService = inject(PermissionsService);
readonly #filesService = inject(FilesService);
readonly #formValue$ = this.form.valueChanges;
readonly selectedReviewers$ = this.#formValue$.pipe(map(v => v.members.filter(m => !v.approvers.includes(m)))); readonly selectedReviewers$ = this.#formValue$.pipe(map(v => v.members.filter(m => !v.approvers.includes(m))));
readonly selectedApprovers$ = this.#formValue$.pipe(map(v => v.approvers)); readonly selectedApprovers$ = this.#formValue$.pipe(map(v => v.approvers));
readonly isDocumine = getConfig().IS_DOCUMINE;
get valid(): boolean { get valid(): boolean {
return this.form.valid; return this.form.valid;
} }
get disabled() { get disabled() {
return !this.#permissionsService.canEditTeamMembers() || !this.form.get('owner').value; return !this.#permissionsService.canEditTeamMembers(this.dossier) || !this.form.get('owner').value;
} }
get hasOwner() { get hasOwner() {
@ -175,7 +175,7 @@ export class EditDossierTeamComponent implements EditDossierSectionInterface, On
#resetForm() { #resetForm() {
this.form.reset( this.form.reset(
{ {
owner: { value: this.dossier.ownerId, disabled: !this.#permissionsService.canEditTeamMembers() }, owner: { value: this.dossier.ownerId, disabled: !this.#permissionsService.canEditTeamMembers(this.dossier) },
approvers: this.#sortByName([...this.dossier.approverIds]), approvers: this.#sortByName([...this.dossier.approverIds]),
members: this.#sortByName([...this.dossier.memberIds]), members: this.#sortByName([...this.dossier.memberIds]),
} as unknown, } as unknown,

View File

@ -18,6 +18,7 @@ import { FilesMapService } from '@services/files/files-map.service';
import { Roles } from '@users/roles'; import { Roles } from '@users/roles';
import { UserPreferenceService } from '@users/user-preference.service'; import { UserPreferenceService } from '@users/user-preference.service';
import { UserService } from '@users/user.service'; import { UserService } from '@users/user.service';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class PermissionsService { export class PermissionsService {
@ -29,6 +30,7 @@ export class PermissionsService {
private readonly _featuresService: FeaturesService, private readonly _featuresService: FeaturesService,
private readonly _userPreferenceService: UserPreferenceService, private readonly _userPreferenceService: UserPreferenceService,
private readonly _iqserPermissionsService: IqserPermissionsService, private readonly _iqserPermissionsService: IqserPermissionsService,
private readonly _dossierTemplatesService: DossierTemplatesService,
) {} ) {}
get #userId(): string { get #userId(): string {
@ -313,8 +315,9 @@ export class PermissionsService {
return dossier.isActive && this.isOwner(dossier) && this._iqserPermissionsService.has(Roles.dossierAttributes.write); return dossier.isActive && this.isOwner(dossier) && this._iqserPermissionsService.has(Roles.dossierAttributes.write);
} }
canEditTeamMembers(): boolean { canEditTeamMembers(dossier: Dossier): boolean {
return this._iqserPermissionsService.has(Roles.dossiers.edit) && this.isManager(); const dossierTemplate = this._dossierTemplatesService.find(dossier.dossierTemplateId);
return this._iqserPermissionsService.has(Roles.dossiers.edit) && this.isManager() && dossierTemplate.isActive;
} }
isAdmin(): boolean { isAdmin(): boolean {