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 4ea265fc7e..cabc903d95 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 @@ -196,25 +196,19 @@ export class PermissionManagementComponent } setParentClicked(clickedPermission: PermissionGrantInfoDto) { - let childPermissionGrantedCount = 0; - let parentPermission: PermissionGrantInfoDto; + const parentPermissions: PermissionGrantInfoDto[] = findAllParentPermissions( + this.permissions, + clickedPermission, + ); if (clickedPermission.parentName) { - this.permissions.forEach(per => { - if (per.name === clickedPermission.parentName) { - parentPermission = per; - } - }); - this.permissions.forEach(per => { - if (parentPermission.name === per.parentName) { - per.isGranted && childPermissionGrantedCount++; - } - }); - if (childPermissionGrantedCount === 1 && !parentPermission.isGranted) { + if (parentPermissions.length) { this.permissions = this.permissions.map(per => { - if (per.name === parentPermission.name) { - per.isGranted = true; - } + parentPermissions.forEach(parent => { + if (per.name === parent.name) { + per.isGranted = true; + } + }); return per; }); } @@ -223,8 +217,10 @@ export class PermissionManagementComponent this.permissions = this.permissions.map(per => { const root = findRootParent(this.permissions, per); - if (root && root.name === clickedPermission.name) { - per.isGranted = root.isGranted; + if (root) { + if (root.name === clickedPermission.name && !root.isGranted) { + per.isGranted = false; + } } return per; }); @@ -389,26 +385,44 @@ export class PermissionManagementComponent } } -function findRootParent( +function traverseParentPermissions( permissions: PermissionGrantInfoDto[], permission: PermissionGrantInfoDto, -): PermissionGrantInfoDto | null { - if (!permissions.length) { - return null; - } - + collectAll = false, +): PermissionGrantInfoDto[] { const permissionMap = new Map(permissions.map(p => [p.name, p])); let currentPermission = permissionMap.get(permission.name) ?? null; + const parentPermissions: PermissionGrantInfoDto[] = []; while (currentPermission && currentPermission.parentName) { const parentPermission = permissionMap.get(currentPermission.parentName); if (!parentPermission) { break; } + parentPermissions.push(parentPermission); currentPermission = parentPermission; + + if (!collectAll) { + break; + } } - return currentPermission; + return parentPermissions; +} + +function findRootParent( + permissions: PermissionGrantInfoDto[], + permission: PermissionGrantInfoDto, +): PermissionGrantInfoDto | null { + const parentPermissions = traverseParentPermissions(permissions, permission); + return parentPermissions.length ? parentPermissions[parentPermissions.length - 1] : null; +} + +function findAllParentPermissions( + permissions: PermissionGrantInfoDto[], + permission: PermissionGrantInfoDto, +): PermissionGrantInfoDto[] { + return traverseParentPermissions(permissions, permission, true); } function findMargin(