Browse Source

fix: logic to grant permissions in a right way

pull/20598/head
sumeyyeKurtulus 2 years ago
parent
commit
7867d47341
  1. 100
      npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts

100
npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts

@ -171,23 +171,14 @@ export class PermissionManagementComponent
} }
onClickCheckbox(clickedPermission: PermissionGrantInfoDto) { onClickCheckbox(clickedPermission: PermissionGrantInfoDto) {
if ( const { isGranted, grantedProviders } = clickedPermission;
clickedPermission.isGranted && if (isGranted && this.isGrantedByOtherProviderName(grantedProviders)) {
this.isGrantedByOtherProviderName(clickedPermission.grantedProviders)
)
return; return;
}
this.setSelectedGroup(this.selectedGroup); this.setSelectedGroup(this.selectedGroup);
setTimeout(() => { setTimeout(() => {
this.permissions = this.permissions.map(per => { this.updatePermissionStatus(clickedPermission);
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.updateSelectedGroupPermissions(clickedPermission); this.updateSelectedGroupPermissions(clickedPermission);
this.setTabCheckboxState(); this.setTabCheckboxState();
this.setGrantCheckboxState(); this.setGrantCheckboxState();
@ -195,31 +186,58 @@ export class PermissionManagementComponent
}, 0); }, 0);
} }
setParentClicked(clickedPermission: PermissionGrantInfoDto) { updatePermissionStatus(clickedPermission: PermissionGrantInfoDto) {
const parentPermissions: PermissionGrantInfoDto[] = findAllParentPermissions( this.permissions = this.permissions.map(permission => {
this.permissions, const isExactMatch = clickedPermission.name == permission.name;
clickedPermission, 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) { if (clickedPermission.parentName) {
if (parentPermissions.length) { const parentPermissions = findParentPermissions(this.permissions, clickedPermission);
if (parentPermissions.length > 0) {
const parentNames = new Set(parentPermissions.map(parent => parent.name));
this.permissions = this.permissions.map(per => { this.permissions = this.permissions.map(per => {
parentPermissions.forEach(parent => { let updatedIsGranted = per.isGranted;
if (per.name === parent.name) {
per.isGranted = true; if (per.parentName === clickedPermission.name && !clickedPermission.isGranted) {
} updatedIsGranted = false;
}); }
return per;
if (parentNames.has(per.name)) {
updatedIsGranted = true;
}
return { ...per, isGranted: updatedIsGranted };
}); });
} }
return; return;
} }
this.permissions = this.permissions.map(per => { this.permissions = this.permissions.map(per => {
const root = findRootParent(this.permissions, per); const parents = findParentPermissions(this.permissions, per);
if (root) { if (parents.length > 0) {
if (root.name === clickedPermission.name && !root.isGranted) { const rootParent = parents[parents.length - 1];
per.isGranted = false;
if (rootParent.name === clickedPermission.name && !rootParent.isGranted) {
return { ...per, isGranted: false };
} }
} }
return per; return per;
@ -385,10 +403,9 @@ export class PermissionManagementComponent
} }
} }
function traverseParentPermissions( function findParentPermissions(
permissions: PermissionGrantInfoDto[], permissions: PermissionGrantInfoDto[],
permission: PermissionGrantInfoDto, permission: PermissionGrantInfoDto,
collectAll = false,
): PermissionGrantInfoDto[] { ): PermissionGrantInfoDto[] {
const permissionMap = new Map(permissions.map(p => [p.name, p])); const permissionMap = new Map(permissions.map(p => [p.name, p]));
let currentPermission = permissionMap.get(permission.name) ?? null; let currentPermission = permissionMap.get(permission.name) ?? null;
@ -401,30 +418,11 @@ function traverseParentPermissions(
} }
parentPermissions.push(parentPermission); parentPermissions.push(parentPermission);
currentPermission = parentPermission; currentPermission = parentPermission;
if (!collectAll) {
break;
}
} }
return parentPermissions; 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( function findMargin(
permissions: PermissionGrantInfoDto[], permissions: PermissionGrantInfoDto[],
permission: PermissionGrantInfoDto, permission: PermissionGrantInfoDto,

Loading…
Cancel
Save