From 06c6ed18a6ed6c32a04a066c58dc2bf55881a9ad Mon Sep 17 00:00:00 2001
From: Marie Verdonck <maria.verdonck@atmire.com>
Date: Mon, 30 Mar 2020 11:49:07 +0200
Subject: [PATCH] [groups/epeople admin pages] No adding current active group
 itself as own subgroup: * Added message if trying to add current group (that
 is being edited) as own subgroup * Removed possible add/delete button from
 current group being edited in subgroups list, replace with message

---
 resources/i18n/en.json5                       |  4 ++
 .../subgroups-list.component.html             |  6 ++-
 .../subgroup-list/subgroups-list.component.ts | 52 +++++++++++++------
 3 files changed, 45 insertions(+), 17 deletions(-)

diff --git a/resources/i18n/en.json5 b/resources/i18n/en.json5
index e099f475b4..f4eab6329c 100644
--- a/resources/i18n/en.json5
+++ b/resources/i18n/en.json5
@@ -349,6 +349,8 @@
 
   "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"",
 
+  "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group",
+
   "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"",
 
   "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"",
@@ -359,6 +361,8 @@
 
   "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.",
 
+  "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.",
+
   "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID",
 
   "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.",
diff --git a/src/app/+admin/admin-access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html b/src/app/+admin/admin-access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html
index 4901e4cfe0..9558b9da98 100644
--- a/src/app/+admin/admin-access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html
+++ b/src/app/+admin/admin-access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html
@@ -42,14 +42,16 @@
                  [routerLink]="[groupDataService.getGroupEditPageRouterLink(group)]">{{group.name}}</a></td>
           <td>
             <div class="btn-group edit-field">
-              <button *ngIf="(isSubgroupOfGroup(group) | async)"
+              <button *ngIf="(isSubgroupOfGroup(group) | async) && !(isActiveGroup(group) | async)"
                       (click)="deleteSubgroupFromGroup(group)"
                       class="btn btn-outline-danger btn-sm deleteButton"
                       title="{{messagePrefix + '.table.edit.buttons.remove' | translate: {name: group.name} }}">
                 <i class="fas fa-trash-alt fa-fw"></i>
               </button>
 
-              <button *ngIf="!(isSubgroupOfGroup(group) | async)"
+              <p *ngIf="(isActiveGroup(group) | async)">{{ messagePrefix + '.table.edit.currentGroup' | translate }}</p>
+
+              <button *ngIf="!(isSubgroupOfGroup(group) | async) && !(isActiveGroup(group) | async)"
                       (click)="addSubgroupToGroup(group)"
                       class="btn btn-outline-primary btn-sm addButton"
                       title="{{messagePrefix + '.table.edit.buttons.add' | translate: {name: group.name} }}">
diff --git a/src/app/+admin/admin-access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts b/src/app/+admin/admin-access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts
index 09d38c7c3e..b7092dd5e2 100644
--- a/src/app/+admin/admin-access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts
+++ b/src/app/+admin/admin-access-control/group-registry/group-form/subgroup-list/subgroups-list.component.ts
@@ -115,23 +115,41 @@ export class SubgroupsListComponent implements OnInit, OnDestroy {
    */
   isSubgroupOfGroup(possibleSubgroup: Group): Observable<boolean> {
     return this.groupDataService.getActiveGroup().pipe(take(1),
-      mergeMap((group: Group) => {
-        if (group != null) {
-          return this.groupDataService.findAllByHref(group._links.subgroups.href, {
-            currentPage: 0,
-            elementsPerPage: Number.MAX_SAFE_INTEGER
-          })
-            .pipe(
-              getSucceededRemoteData(),
-              getRemoteDataPayload(),
-              map((listTotalGroups: PaginatedList<Group>) => listTotalGroups.page.filter((groupInList: Group) => groupInList.id === possibleSubgroup.id)),
-              map((groups: Group[]) => groups.length > 0))
-        } else {
+      mergeMap((activeGroup: Group) => {
+        if (activeGroup != null) {
+          if (activeGroup.uuid === possibleSubgroup.uuid) {
+            return observableOf(false);
+          } else {
+            return this.groupDataService.findAllByHref(activeGroup._links.subgroups.href, {
+              currentPage: 0,
+              elementsPerPage: Number.MAX_SAFE_INTEGER
+            })
+              .pipe(
+                getSucceededRemoteData(),
+                getRemoteDataPayload(),
+                map((listTotalGroups: PaginatedList<Group>) => listTotalGroups.page.filter((groupInList: Group) => groupInList.id === possibleSubgroup.id)),
+                map((groups: Group[]) => groups.length > 0))
+          }
+        } else  {
           return observableOf(false);
         }
       }));
   }
 
+  /**
+   * Whether or not the given group is the current group being edited
+   * @param group Group that is possibly the current group being edited
+   */
+  isActiveGroup(group: Group): Observable<boolean> {
+    return this.groupDataService.getActiveGroup().pipe(take(1),
+      mergeMap((activeGroup: Group) => {
+        if (activeGroup != null && activeGroup.uuid === group.uuid) {
+            return observableOf(true);
+        }
+        return observableOf(false);
+      }));
+  }
+
   /**
    * Deletes given subgroup from the group currently being edited
    * @param subgroup  Group we want to delete from the subgroups of the group currently being edited
@@ -155,9 +173,13 @@ export class SubgroupsListComponent implements OnInit, OnDestroy {
   addSubgroupToGroup(subgroup: Group) {
     this.groupDataService.getActiveGroup().pipe(take(1)).subscribe((activeGroup: Group) => {
       if (activeGroup != null) {
-        const response = this.groupDataService.addSubGroupToGroup(activeGroup, subgroup);
-        this.showNotifications('addSubgroup', response, subgroup.name, activeGroup);
-        this.forceUpdateGroups(activeGroup);
+        if (activeGroup.uuid !== subgroup.uuid) {
+          const response = this.groupDataService.addSubGroupToGroup(activeGroup, subgroup);
+          this.showNotifications('addSubgroup', response, subgroup.name, activeGroup);
+          this.forceUpdateGroups(activeGroup);
+        } else {
+          this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.failure.subgroupToAddIsActiveGroup'));
+        }
       } else {
         this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.failure.noActiveGroup'));
       }
-- 
GitLab