You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2019/05/31 18:18:18 UTC

[airavata-django-portal] 03/05: AIRAVATA-3040 Put gateway groups at top of list

This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit 89bb973dc7f5399c911b43884ec06321e894d4a4
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Thu May 30 12:55:33 2019 -0400

    AIRAVATA-3040 Put gateway groups at top of list
---
 .../components/users/UserGroupMembershipEditor.vue | 94 ++++++++++++++++------
 .../static/django_airavata_api/js/models/Group.js  |  4 +
 2 files changed, 74 insertions(+), 24 deletions(-)

diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserGroupMembershipEditor.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserGroupMembershipEditor.vue
index ba8a940..2695827 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserGroupMembershipEditor.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserGroupMembershipEditor.vue
@@ -2,14 +2,36 @@
   <b-form-group label="Groups">
     <b-form-checkbox-group
       :checked="selected"
-      :options="options"
+      :options="userDefinedGroupOptions"
       @input="groupsUpdated"
       stacked
-    ></b-form-checkbox-group>
+    >
+      <template slot="first">
+        <b-form-checkbox
+          v-if="gatewayUsersGroupOption"
+          :value="gatewayUsersGroupOption.value"
+          :disabled="gatewayUsersGroupOption.disabled"
+        >{{ gatewayUsersGroupOption.text }} <b-badge>Default</b-badge>
+        </b-form-checkbox>
+        <b-form-checkbox
+          v-if="adminsGroupOption"
+          :value="adminsGroupOption.value"
+          :disabled="adminsGroupOption.disabled"
+        >{{ adminsGroupOption.text }} <b-badge>Admins</b-badge>
+        </b-form-checkbox>
+        <b-form-checkbox
+          v-if="readOnlyAdminsGroupOption"
+          :value="readOnlyAdminsGroupOption.value"
+          :disabled="readOnlyAdminsGroupOption.disabled"
+        >{{ readOnlyAdminsGroupOption.text }} <b-badge>Read Only Admins</b-badge>
+        </b-form-checkbox>
+      </template>
+    </b-form-checkbox-group>
   </b-form-group>
 </template>
 
 <script>
+import { utils } from "django-airavata-api";
 import { mixins } from "django-airavata-common-ui";
 export default {
   name: "user-group-membership-editor",
@@ -28,28 +50,43 @@ export default {
     selected() {
       return this.data.map(g => g.id);
     },
-    options() {
-      const options = this.data.map(g => {
-        return {
-          text: g.name,
-          value: g.id,
-          disabled: true
-        };
+    combinedGroups() {
+      const groups = {};
+      this.value.concat(this.editableGroups).forEach(g => {
+        groups[g.id] = g;
       });
-      this.editableGroups.forEach(g => {
-        const editableOption = options.find(opt => opt.value === g.id);
-        if (editableOption) {
-          editableOption.disabled = false;
-        } else {
-          options.push({
-            text: g.name,
-            value: g.id,
-            disabled: false
-          });
-        }
-      });
-      // TODO: sort the options?
-      return options;
+      return Object.values(groups);
+    },
+    userDefinedGroups() {
+      return this.combinedGroups
+        ? this.combinedGroups.filter(g => {
+            return (
+              !g.isDefaultGatewayUsersGroup &&
+              !g.isGatewayAdminsGroup &&
+              !g.isReadOnlyGatewayAdminsGroup
+            );
+          })
+        : [];
+    },
+    userDefinedGroupOptions() {
+      const options = this.userDefinedGroups.map(g =>
+        this.createGroupOption(g)
+      );
+      return utils.StringUtils.sortIgnoreCase(options, o => o.text);
+    },
+    gatewayUsersGroupOption() {
+      const group = this.combinedGroups.find(g => g.isDefaultGatewayUsersGroup);
+      return group ? this.createGroupOption(group) : null;
+    },
+    adminsGroupOption() {
+      const group = this.combinedGroups.find(g => g.isGatewayAdminsGroup);
+      return group ? this.createGroupOption(group) : null;
+    },
+    readOnlyAdminsGroupOption() {
+      const group = this.combinedGroups.find(
+        g => g.isReadOnlyGatewayAdminsGroup
+      );
+      return group ? this.createGroupOption(group) : null;
     }
   },
   methods: {
@@ -57,7 +94,9 @@ export default {
       // Check for added groups
       for (const checkedGroupId of checkedGroups) {
         if (!this.data.find(g => g.id === checkedGroupId)) {
-          const addedGroup = this.editableGroups.find(g => g.id === checkedGroupId);
+          const addedGroup = this.editableGroups.find(
+            g => g.id === checkedGroupId
+          );
           this.data.push(addedGroup);
         }
       }
@@ -68,6 +107,13 @@ export default {
           this.data.splice(groupIndex, 1);
         }
       }
+    },
+    createGroupOption(group) {
+      return {
+        text: group.name,
+        value: group.id,
+        disabled: !group.userHasWriteAccess
+      };
     }
   }
 };
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/Group.js b/django_airavata/apps/api/static/django_airavata_api/js/models/Group.js
index 77e12cd..fff93c0 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/Group.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/Group.js
@@ -57,4 +57,8 @@ export default class Group extends BaseModel {
   get isAdminGroup() {
     return this.isReadOnlyGatewayAdminsGroup || this.isGatewayAdminsGroup;
   }
+
+  get userHasWriteAccess() {
+    return this.isOwner || this.isAdmin;
+  }
 }