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/24 13:08:09 UTC

[airavata-django-portal] 03/03: AIRAVATA-3034 user storage breadcrumbs

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

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

commit 2620f18fbff8e16916aff35b0568fd3167bc5e9d
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Thu May 23 20:49:25 2019 -0400

    AIRAVATA-3034 user storage breadcrumbs
---
 django_airavata/apps/api/serializers.py            |  1 +
 .../js/models/UserStoragePath.js                   |  5 +++
 django_airavata/apps/api/views.py                  | 10 +++++
 .../storage/UserStoragePathBreadcrumb.vue          | 39 +++++++++++++++++++
 .../components/storage/UserStoragePathViewer.vue   | 45 ++++++++++++++--------
 5 files changed, 83 insertions(+), 17 deletions(-)

diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index 2f7c726..a37a0ac 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -774,6 +774,7 @@ class UserStorageDirectorySerializer(serializers.Serializer):
 class UserStoragePathSerializer(serializers.Serializer):
     directories = UserStorageDirectorySerializer(many=True)
     files = UserStorageFileSerializer(many=True)
+    parts = serializers.ListField(child=serializers.CharField())
     # uploaded is populated after a file upload
     uploaded = DataProductSerializer(read_only=True)
 
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/UserStoragePath.js b/django_airavata/apps/api/static/django_airavata_api/js/models/UserStoragePath.js
index 108a7fd..3653f65 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/UserStoragePath.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/UserStoragePath.js
@@ -12,6 +12,11 @@ const FIELDS = [
     name: "directories",
     type: UserStorageDirectory,
     list: true
+  },
+  {
+    name: "parts",
+    type: "string",
+    list: true
   }
 ];
 
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index a51028b..94eed4f 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -1377,9 +1377,19 @@ class UserStoragePathView(APIView):
         }
         if uploaded is not None:
             data['uploaded'] = uploaded
+        data['parts'] = self._split_path(path)
         serializer = self.serializer_class(data, context={'request': request})
         return Response(serializer.data)
 
+    def _split_path(self, path):
+        head, tail = os.path.split(path)
+        if head != "":
+            return self._split_path(head) + [tail]
+        elif tail != "":
+            return [tail]
+        else:
+            return []
+
 
 class WorkspacePreferencesView(APIView):
     serializer_class = serializers.WorkspacePreferencesSerializer
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/UserStoragePathBreadcrumb.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/UserStoragePathBreadcrumb.vue
new file mode 100644
index 0000000..0860a83
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/UserStoragePathBreadcrumb.vue
@@ -0,0 +1,39 @@
+<template>
+  <b-breadcrumb :items="items"></b-breadcrumb>
+</template>
+
+<script>
+export default {
+  name: "user-storage-path-breadcrumb",
+  props: {
+    parts: {
+      type: Array,
+      required: true
+    }
+  },
+  computed: {
+    items() {
+      const homeItem = [
+        {
+          text: "Home",
+          to: { path: "/~/" }
+        }
+      ];
+      if (this.parts) {
+        const subparts = [];
+        const partsItems = this.parts.map(part => {
+          subparts.push(part);
+          return {
+            text: part,
+            to: { path: "/~/" + subparts.join("/") + "/" }
+          };
+        });
+        return homeItem.concat(partsItems);
+      } else {
+        return homeItem;
+      }
+    }
+  }
+};
+</script>
+
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/UserStoragePathViewer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/UserStoragePathViewer.vue
index 350ce99..5ff9587 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/UserStoragePathViewer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/UserStoragePathViewer.vue
@@ -1,24 +1,32 @@
 <template>
-  <b-table
-    :fields="fields"
-    :items="items"
-  >
-    <template
-      slot="name"
-      slot-scope="data"
+  <div>
+    <user-storage-path-breadcrumb
+      v-if="userStoragePath"
+      :parts="userStoragePath.parts"
+    />
+    <b-table
+      :fields="fields"
+      :items="items"
     >
-      <router-link
-        v-if="data.item.type === 'dir'"
-        :to="'/~/' + data.item.path"
-      >{{ data.item.name }}</router-link>
-      <b-link
-        v-else
-        :href="data.item.downloadURL"
-      >{{ data.item.name }}</b-link>
-    </template>
-  </b-table>
+      <template
+        slot="name"
+        slot-scope="data"
+      >
+        <router-link
+          v-if="data.item.type === 'dir'"
+          :to="'/~/' + data.item.path"
+        >{{ data.item.name }}</router-link>
+        <b-link
+          v-else
+          :href="data.item.downloadURL"
+        >{{ data.item.name }}</b-link>
+      </template>
+    </b-table>
+  </div>
 </template>
 <script>
+import UserStoragePathBreadcrumb from "./UserStoragePathBreadcrumb.vue";
+
 export default {
   name: "user-storage-path-viewer",
   props: {
@@ -26,6 +34,9 @@ export default {
       required: true
     }
   },
+  components: {
+    UserStoragePathBreadcrumb
+  },
   computed: {
     fields() {
       return [