From ae0fe6cbb4e5d2984d82552518abb38b38fad05c Mon Sep 17 00:00:00 2001 From: sumeyyeKurtulus Date: Thu, 22 Aug 2024 16:44:00 +0300 Subject: [PATCH 1/7] add: hierarchical check for permission selection --- .../permission-management.component.ts | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) 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, From 8becd973973882baf5aca378b2b215a670bf1cbb Mon Sep 17 00:00:00 2001 From: sumeyyeKurtulus Date: Tue, 27 Aug 2024 08:55:54 +0300 Subject: [PATCH 2/7] =?UTF-8?q?update:=20permission=20selection=20rules=20?= =?UTF-8?q?are=20met=20=F0=9F=99=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../permission-management.component.ts | 64 +++++++++++-------- 1 file changed, 39 insertions(+), 25 deletions(-) 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( From 7867d473414261899a9c38b8b1bf16c124fc5097 Mon Sep 17 00:00:00 2001 From: sumeyyeKurtulus Date: Tue, 3 Sep 2024 11:04:17 +0300 Subject: [PATCH 3/7] fix: logic to grant permissions in a right way --- .../permission-management.component.ts | 100 +++++++++--------- 1 file changed, 49 insertions(+), 51 deletions(-) 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 cabc903d95..31bbc19ab4 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 @@ -171,23 +171,14 @@ 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.setTabCheckboxState(); this.setGrantCheckboxState(); @@ -195,31 +186,58 @@ export class PermissionManagementComponent }, 0); } - setParentClicked(clickedPermission: PermissionGrantInfoDto) { - const parentPermissions: PermissionGrantInfoDto[] = findAllParentPermissions( - this.permissions, - clickedPermission, - ); + 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) { - 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 => { - parentPermissions.forEach(parent => { - if (per.name === parent.name) { - per.isGranted = true; - } - }); - return per; + let updatedIsGranted = per.isGranted; + + if (per.parentName === clickedPermission.name && !clickedPermission.isGranted) { + updatedIsGranted = false; + } + + if (parentNames.has(per.name)) { + updatedIsGranted = true; + } + + return { ...per, isGranted: updatedIsGranted }; }); } return; } this.permissions = this.permissions.map(per => { - const root = findRootParent(this.permissions, per); - if (root) { - if (root.name === clickedPermission.name && !root.isGranted) { - 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; @@ -385,10 +403,9 @@ export class PermissionManagementComponent } } -function traverseParentPermissions( +function findParentPermissions( permissions: PermissionGrantInfoDto[], permission: PermissionGrantInfoDto, - collectAll = false, ): PermissionGrantInfoDto[] { const permissionMap = new Map(permissions.map(p => [p.name, p])); let currentPermission = permissionMap.get(permission.name) ?? null; @@ -401,30 +418,11 @@ function traverseParentPermissions( } parentPermissions.push(parentPermission); currentPermission = parentPermission; - - if (!collectAll) { - break; - } } 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( permissions: PermissionGrantInfoDto[], permission: PermissionGrantInfoDto, From 8e1a5879739ad4761107fa0b3cfd84f30072722f Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 3 Sep 2024 11:30:56 +0300 Subject: [PATCH 4/7] Update road-map.md --- docs/en/release-info/road-map.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/en/release-info/road-map.md b/docs/en/release-info/road-map.md index 7bba375001..6c14efefda 100644 --- a/docs/en/release-info/road-map.md +++ b/docs/en/release-info/road-map.md @@ -4,18 +4,17 @@ This document provides a road map, release schedule, and planned features for th ## Next Versions -### v8.2 +### v8.3 -The next version will be 8.2 and planned to release the stable 8.2 version in June 2024. We will be mostly working on the following topics: +The next version will be 8.3 and we will be mostly working on the following topics: -* ABP Studio Community Edition -* Blazor Full-Stack UI ([#18289](https://github.com/abpframework/abp/issues/18289)) -* Angular Universal ([#15782](https://github.com/abpframework/abp/issues/15782)) -* Upgrading React Native template to the latest major release 0.72.7 ([#18191](https://github.com/abpframework/abp/issues/18191)) -* Deployment Documents Improvements ([#15034](https://github.com/abpframework/abp/issues/15034)) -* Improvements on the existing features and provide more guides. +* CMS Kit: Marked Items/Favorites & Approvement System for Comments +* Docs Module: Added Google Translation Support & Introducing the Single Project Mode +* Using DBFunction for Global Query Filters +* Upgrade Angular Version to v18.1.x +* Improvements on the existing features and provide more guides... -See the [8.2 milestone](https://github.com/abpframework/abp/milestone/95) for all the issues we've planned to work on. +See the [8.3 milestone](https://github.com/abpframework/abp/milestone/106) for all the issues we've planned to work on. ## Backlog Items From dc8d930b07273234b5f2d2ba6e4c91875bce07a5 Mon Sep 17 00:00:00 2001 From: selman koc <64414348+skoc10@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:06:25 +0300 Subject: [PATCH 5/7] Update version to release 8.2.3 --- common.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common.props b/common.props index 12d4871ea1..26b2c2f91a 100644 --- a/common.props +++ b/common.props @@ -1,8 +1,8 @@ latest - 8.2.2 - 3.2.2 + 8.2.3 + 3.2.3 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ From 3ba90465c015fef9bd670f5d0eb73daf79099b80 Mon Sep 17 00:00:00 2001 From: sumeyyeKurtulus Date: Tue, 3 Sep 2024 16:40:51 +0300 Subject: [PATCH 6/7] update: fixing the logic error for `setTabCheckboxState` function --- .../src/lib/components/permission-management.component.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 31bbc19ab4..8ad2fd2320 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 @@ -180,9 +180,9 @@ export class PermissionManagementComponent setTimeout(() => { this.updatePermissionStatus(clickedPermission); this.updateSelectedGroupPermissions(clickedPermission); + this.setParentClicked(clickedPermission); this.setTabCheckboxState(); this.setGrantCheckboxState(); - this.setParentClicked(clickedPermission); }, 0); } @@ -254,13 +254,13 @@ export class PermissionManagementComponent } setTabCheckboxState() { - const selectableGroupPermissions = this.selectedGroupPermissions.filter(per => + const selectablePermissions = this.permissions.filter(per => per.grantedProviders.every(p => p.providerName === this.providerName), ); - const selectedPermissions = selectableGroupPermissions.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 === selectableGroupPermissions.length) { + if (selectedPermissions.length === selectablePermissions.length) { element.indeterminate = false; this.selectThisTab = true; } else if (selectedPermissions.length === 0) { From 819f3d16a1209b928466d6aef585e47f4e2e0cd8 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 4 Sep 2024 10:32:25 +0800 Subject: [PATCH 7/7] Update abp-8-2.md --- docs/en/release-info/migration-guides/abp-8-2.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/en/release-info/migration-guides/abp-8-2.md b/docs/en/release-info/migration-guides/abp-8-2.md index 0a70af9796..cd904f052e 100644 --- a/docs/en/release-info/migration-guides/abp-8-2.md +++ b/docs/en/release-info/migration-guides/abp-8-2.md @@ -51,8 +51,13 @@ If the flag icon has been specified while defining the localization languages, t In this version, ABP Framework provides a new UI option called **Blazor Full-Stack WebApp**. We have already created an introduction/migration guide for you to check it: [Migrating to Blazor Web App](abp-8-2-blazor-web-app.md) > Please read the documentation carefully if you are considering migrating your existing **Blazor** project to **Blazor WebApp**. + +## Angular UI + +In this version, the Angular UI has been updated to use the Angular version 17.3.0 and Nx version to 19.0.0. See the PR for more information: [#19915](https://github.com/abpframework/abp/pull/19915/) + ## Session Management Infrastructure The **Session Management** feature allows you to prevent concurrent login and manage user sessions. -In this version, a new entity called `IdentitySession` has been added to the framework and you should create a new migration and apply it to your database. +In this version, a new entity called `IdentitySession` has been added to the framework and you should create a new migration and apply it to your database. \ No newline at end of file