diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts index 2609d92198..4cb90a0fff 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts @@ -49,9 +49,8 @@ type PermissionWithGroupName = PermissionGrantInfoDto & { }) export class PermissionManagementComponent implements - PermissionManagement.PermissionManagementComponentInputs, - PermissionManagement.PermissionManagementComponentOutputs -{ + PermissionManagement.PermissionManagementComponentInputs, + PermissionManagement.PermissionManagementComponentOutputs { @Input() readonly providerName!: string; @@ -118,7 +117,7 @@ export class PermissionManagementComponent trackByFn: TrackByFunction = (_, item) => item.name; - constructor(protected service: PermissionsService, protected configState: ConfigStateService) {} + constructor(protected service: PermissionsService, protected configState: ConfigStateService) { } getChecked(name: string) { return (this.permissions.find(per => per.name === name) || { isGranted: false }).isGranted; @@ -131,21 +130,19 @@ export class PermissionManagementComponent return; } - const margin = `margin-${ - (document.body.dir as LocaleDirection) === 'rtl' ? 'right' : 'left' - }.px`; + const margin = `margin-${(document.body.dir as LocaleDirection) === 'rtl' ? 'right' : 'left' + }.px`; const permissions = (this.data.groups.find(group => group.name === this.selectedGroup?.name) || {}).permissions || []; - this.selectedGroupPermissions = permissions.map( permission => - ({ - ...permission, - style: { [margin]: findMargin(permissions, permission) }, - isGranted: (this.permissions.find(per => per.name === permission.name) || {}).isGranted, - } as unknown as PermissionWithStyle), + ({ + ...permission, + style: { [margin]: findMargin(permissions, permission) }, + isGranted: (this.permissions.find(per => per.name === permission.name) || {}).isGranted, + } as unknown as PermissionWithStyle), ); } @@ -174,7 +171,7 @@ export class PermissionManagementComponent this.isGrantedByOtherProviderName(clickedPermission.grantedProviders) ) return; - + this.setSelectedGroup(this.selectedGroup); setTimeout(() => { this.permissions = this.permissions.map(per => { if (clickedPermission.name === per.name) { @@ -186,11 +183,55 @@ export class PermissionManagementComponent } return per; }); + this.updateSelectedGroupPermissions(clickedPermission); this.setTabCheckboxState(); this.setGrantCheckboxState(); + this.setParentClicked(clickedPermission); }, 0); } + setParentClicked(clickedPermissions: PermissionGrantInfoDto) { + let childPermissionGrantedCount = 0; + let parentPermission: PermissionGrantInfoDto; + + if (clickedPermissions.parentName) { + this.permissions.forEach(per => { + if (per.name === clickedPermissions.parentName) { + parentPermission = per; + } + }) + this.permissions.forEach(per => { + if (parentPermission.name === per.parentName) { + per.isGranted && childPermissionGrantedCount++; + } + }) + if (childPermissionGrantedCount === 1 && !parentPermission.isGranted) { + this.permissions = this.permissions.map(per => { + if (per.name === parentPermission.name) { + per.isGranted = true; + } + return per; + }) + } + return; + } + this.permissions = this.permissions.map(per => { + if (per.parentName === clickedPermissions.name) { + per.isGranted = false; + } + return per; + }) + } + + updateSelectedGroupPermissions(clickedPermissions: PermissionGrantInfoDto) { + this.selectedGroupPermissions = this.selectedGroupPermissions.map(per => { + if (per.name === clickedPermissions.name) { + per.isGranted = !per.isGranted + } + return per; + }) + } + setTabCheckboxState() { const selectableGroupPermissions = this.selectedGroupPermissions.filter(per => per.grantedProviders.every(p => p.providerName === this.providerName), @@ -254,6 +295,7 @@ export class PermissionManagementComponent this.selectThisTab = !this.selectAllTab; this.setTabCheckboxState(); } + this.onChangeGroup(this.selectedGroup); } onChangeGroup(group: PermissionGroupDto) { @@ -268,7 +310,7 @@ export class PermissionManagementComponent const changedPermissions: UpdatePermissionDto[] = this.permissions .filter(per => (unchangedPermissions.find(unchanged => unchanged.name === per.name) || {}).isGranted === - per.isGranted + per.isGranted ? false : true, )