From c4d121332ef24e9856bb6fb42732eabf880e291e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Tue, 6 Sep 2022 17:20:04 +0200
Subject: [PATCH] Add view object details modal

#15
---
 src/components/BucketView.vue               | 23 ++++++-
 src/components/Modals/ObjectDetailModal.vue | 70 +++++++++++++++++++++
 2 files changed, 92 insertions(+), 1 deletion(-)
 create mode 100644 src/components/Modals/ObjectDetailModal.vue

diff --git a/src/components/BucketView.vue b/src/components/BucketView.vue
index 2a9c4f0..7dbfd4c 100644
--- a/src/components/BucketView.vue
+++ b/src/components/BucketView.vue
@@ -15,6 +15,7 @@ import PermissionListModal from "@/components/Modals/PermissionListModal.vue";
 import UploadObjectModal from "@/components/Modals/UploadObjectModal.vue";
 import CopyObjectModal from "@/components/Modals/CopyObjectModal.vue";
 import PermissionModal from "@/components/Modals/PermissionModal.vue";
+import ObjectDetailModal from "@/components/Modals/ObjectDetailModal.vue";
 import CreateFolderModal from "@/components/Modals/CreateFolderModal.vue";
 import {
   S3Client,
@@ -121,6 +122,12 @@ const objectState = reactive({
   deletedItem: "",
   editObjectKey: "",
   copyObjectKey: "",
+  viewDetailObject: {
+    key: "",
+    size: 0,
+    bucket: "",
+    last_modified: "2022-01-01",
+  },
 } as {
   objects: S3ObjectMetaInformation[];
   loading: boolean;
@@ -130,6 +137,7 @@ const objectState = reactive({
   deletedItem: string;
   editObjectKey: string;
   copyObjectKey: string;
+  viewDetailObject: S3ObjectMetaInformation;
 });
 
 // Watcher
@@ -743,7 +751,15 @@ watch(
                 <!-- Dropdown menu -->
                 <ul class="dropdown-menu dropdown-menu-dark">
                   <li>
-                    <button class="dropdown-item" type="button">Details</button>
+                    <button
+                      class="dropdown-item"
+                      type="button"
+                      data-bs-toggle="modal"
+                      data-bs-target="#detail-object-modal"
+                      @click="objectState.viewDetailObject = obj"
+                    >
+                      Details
+                    </button>
                   </li>
                   <li>
                     <button
@@ -831,6 +847,11 @@ watch(
         modal-label="some-label"
         :available-buckets="props.writableBuckets"
       />
+      <object-detail-modal
+        :s3-object="objectState.viewDetailObject"
+        modalID="detail-object-modal"
+        modal-label="some-label"
+      />
     </div>
   </div>
 </template>
diff --git a/src/components/Modals/ObjectDetailModal.vue b/src/components/Modals/ObjectDetailModal.vue
new file mode 100644
index 0000000..26f9be9
--- /dev/null
+++ b/src/components/Modals/ObjectDetailModal.vue
@@ -0,0 +1,70 @@
+<script setup lang="ts">
+import BootstrapModal from "@/components/Modals/BootstrapModal.vue";
+import type { S3ObjectMetaInformation } from "@/client";
+import dayjs from "dayjs";
+import fileSize from "filesize";
+
+const props = defineProps<{
+  modalID: string;
+  modalLabel: string;
+  s3Object: S3ObjectMetaInformation;
+}>();
+</script>
+
+<template>
+  <bootstrap-modal
+    :modalID="modalID"
+    :static-backdrop="true"
+    :modal-label="modalLabel"
+  >
+    <template v-slot:header>
+      <h4>Object Details</h4>
+    </template>
+    <template v-slot:body>
+      <div class="container-fluid">
+        <table class="table table-hover table-sm table-borderless">
+          <tbody>
+            <tr>
+              <th scope="row" class="col-4">Bucket</th>
+              <td class="col-8">{{ props.s3Object.bucket }}</td>
+            </tr>
+            <tr>
+              <th scope="row">Name</th>
+              <td>{{ props.s3Object.key }}</td>
+            </tr>
+            <tr>
+              <th scope="row">Content Type</th>
+              <td>text/plain</td>
+            </tr>
+            <tr>
+              <th scope="row">Timestamp</th>
+              <td>
+                {{
+                  dayjs(props.s3Object.last_modified).format(
+                    "YYYY-MM-DD HH:mm:ss"
+                  )
+                }}
+              </td>
+            </tr>
+            <tr>
+              <th scope="row">Size</th>
+              <td>{{ fileSize(props.s3Object.size) }}</td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+    </template>
+    <template v-slot:footer>
+      <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
+        Close
+      </button>
+    </template>
+  </bootstrap-modal>
+</template>
+
+<style scoped>
+th {
+  font-weight: bold;
+  text-align: end;
+}
+</style>
-- 
GitLab