@ -171,58 +171,74 @@ export class PermissionManagementComponent
}
onClickCheckbox ( clickedPermission : PermissionGrantInfoDto ) {
if (
clickedPermission . isGranted &&
this . isGrantedByOtherProviderName ( clickedPermission . grantedProviders )
)
const { isGranted , grantedProviders } = clickedPermission ;
if ( isGranted && this . isGrantedByOtherProviderName ( grantedProviders ) ) {
return ;
}
this . setSelectedGroup ( this . selectedGroup ) ;
setTimeout ( ( ) = > {
this . permissions = this . permissions . map ( per = > {
if ( clickedPermission . name === per . name ) {
return { . . . per , isGranted : ! per . isGranted } ;
} else if ( clickedPermission . name === per . parentName && clickedPermission . isGranted ) {
return { . . . per , isGranted : false } ;
} else if ( clickedPermission . parentName === per . name && ! clickedPermission . isGranted ) {
return { . . . per , isGranted : true } ;
}
return per ;
} ) ;
this . updatePermissionStatus ( clickedPermission ) ;
this . updateSelectedGroupPermissions ( clickedPermission ) ;
this . setParentClicked ( clickedPermission ) ;
this . setTabCheckboxState ( ) ;
this . setGrantCheckboxState ( ) ;
this . setParentClicked ( clickedPermission ) ;
} , 0 ) ;
}
setParentClicked ( clickedPermissions : PermissionGrantInfoDto ) {
let childPermissionGrantedCount = 0 ;
let parentPermission : PermissionGrantInfoDto ;
updatePermissionStatus ( clickedPermission : PermissionGrantInfoDto ) {
this . permissions = this . permissions . map ( permission = > {
const isExactMatch = clickedPermission . name == permission . name ;
const isParentOfPermission = clickedPermission . parentName === permission . name ;
const isChildOfPermission = clickedPermission . name === permission . parentName ;
if ( isExactMatch ) {
return { . . . permission , isGranted : ! permission . isGranted } ;
}
if ( isChildOfPermission && permission . isGranted ) {
return { . . . permission , isGranted : false } ;
}
if ( isParentOfPermission && ! permission . isGranted ) {
return { . . . permission , isGranted : true } ;
}
return permission ;
} ) ;
}
setParentClicked ( clickedPermission : PermissionGrantInfoDto ) {
if ( clickedPermission . parentName ) {
const parentPermissions = findParentPermissions ( this . permissions , clickedPermission ) ;
if ( parentPermissions . length > 0 ) {
const parentNames = new Set ( parentPermissions . map ( parent = > parent . name ) ) ;
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 ;
let updatedIsGranted = per . isGranted ;
if ( per . parentName === clickedPermission . name && ! clickedPermission . isGranted ) {
updatedIsGranted = false ;
}
if ( parentNames . has ( per . name ) ) {
updatedIsGranted = true ;
}
return per ;
return { . . . per , isGranted : updatedIsGranted } ;
} ) ;
}
return ;
}
this . permissions = this . permissions . map ( per = > {
if ( per . parentName === clickedPermissions . name ) {
per . isGranted = false ;
const parents = findParentPermissions ( this . permissions , per ) ;
if ( parents . length > 0 ) {
const rootParent = parents [ parents . length - 1 ] ;
if ( rootParent . name === clickedPermission . name && ! rootParent . isGranted ) {
return { . . . per , isGranted : false } ;
}
}
return per ;
} ) ;
@ -238,13 +254,13 @@ export class PermissionManagementComponent
}
setTabCheckboxState() {
const selectableGroup Permissions = this . selectedGrou pP ermissions. filter ( per = >
const selectablePermissions = this . permissions . filter ( per = >
per . grantedProviders . every ( p = > p . providerName === this . providerName ) ,
) ;
const selectedPermissions = selectableGroup Permissions . filter ( per = > per . isGranted ) ;
const selectedPermissions = selectablePermissions . filter ( per = > per . isGranted ) ;
const element = document . querySelector ( '#select-all-in-this-tabs' ) as any ;
if ( selectedPermissions . length === selectableGroup Permissions . length ) {
if ( selectedPermissions . length === selectablePermissions . length ) {
element . indeterminate = false ;
this . selectThisTab = true ;
} else if ( selectedPermissions . length === 0 ) {
@ -387,6 +403,26 @@ export class PermissionManagementComponent
}
}
function findParentPermissions (
permissions : PermissionGrantInfoDto [ ] ,
permission : PermissionGrantInfoDto ,
) : 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 ;
}
return parentPermissions ;
}
function findMargin (
permissions : PermissionGrantInfoDto [ ] ,
permission : PermissionGrantInfoDto ,