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 8503a2bd81..4ea265fc7e 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 @@ -195,13 +195,13 @@ export class PermissionManagementComponent }, 0); } - setParentClicked(clickedPermissions: PermissionGrantInfoDto) { + setParentClicked(clickedPermission: PermissionGrantInfoDto) { let childPermissionGrantedCount = 0; let parentPermission: PermissionGrantInfoDto; - if (clickedPermissions.parentName) { + if (clickedPermission.parentName) { this.permissions.forEach(per => { - if (per.name === clickedPermissions.parentName) { + if (per.name === clickedPermission.parentName) { parentPermission = per; } }); @@ -220,9 +220,11 @@ export class PermissionManagementComponent } return; } + this.permissions = this.permissions.map(per => { - if (per.parentName === clickedPermissions.name) { - per.isGranted = false; + const root = findRootParent(this.permissions, per); + if (root && root.name === clickedPermission.name) { + per.isGranted = root.isGranted; } return per; }); @@ -387,6 +389,28 @@ export class PermissionManagementComponent } } +function findRootParent( + permissions: PermissionGrantInfoDto[], + permission: PermissionGrantInfoDto, +): PermissionGrantInfoDto | null { + if (!permissions.length) { + return null; + } + + const permissionMap = new Map(permissions.map(p => [p.name, p])); + let currentPermission = permissionMap.get(permission.name) ?? null; + + while (currentPermission && currentPermission.parentName) { + const parentPermission = permissionMap.get(currentPermission.parentName); + if (!parentPermission) { + break; + } + currentPermission = parentPermission; + } + + return currentPermission; +} + function findMargin( permissions: PermissionGrantInfoDto[], permission: PermissionGrantInfoDto,