From 76a9fcece4e5dedc6374137e8958b86d637f9cc5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Tue, 11 Oct 2022 16:15:21 +0200
Subject: [PATCH] Add button for refreshing and creating s3 keys

#16
---
 src/assets/main.css                         |  4 +++
 src/components/BucketView.vue               |  2 +-
 src/components/Modals/CopyObjectModal.vue   |  4 +--
 src/components/Modals/CreateFolderModal.vue |  4 +--
 src/components/Modals/PermissionModal.vue   |  2 +-
 src/components/Modals/UploadObjectModal.vue |  4 +--
 src/views/object-storage/S3KeysView.vue     | 33 ++++++++++++++++++++-
 7 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/src/assets/main.css b/src/assets/main.css
index 5bd0568..a78c1e6 100644
--- a/src/assets/main.css
+++ b/src/assets/main.css
@@ -4,3 +4,7 @@ body {
     max-height: 100vh;
     background: #181818;
 }
+
+.top-toast {
+    top: 4rem;
+}
diff --git a/src/components/BucketView.vue b/src/components/BucketView.vue
index 804b35f..feab82d 100644
--- a/src/components/BucketView.vue
+++ b/src/components/BucketView.vue
@@ -515,7 +515,7 @@ watch(
 </script>
 
 <template>
-  <div class="toast-container position-fixed top-0 end-0 p-3">
+  <div class="toast-container position-fixed top-toast end-0 p-3">
     <div
       role="alert"
       aria-live="assertive"
diff --git a/src/components/Modals/CopyObjectModal.vue b/src/components/Modals/CopyObjectModal.vue
index 2a9198b..26e5d41 100644
--- a/src/components/Modals/CopyObjectModal.vue
+++ b/src/components/Modals/CopyObjectModal.vue
@@ -90,7 +90,7 @@ onMounted(() => {
 </script>
 
 <template>
-  <div class="toast-container position-fixed top-0 end-0 p-3">
+  <div class="toast-container position-fixed top-toast end-0 p-3">
     <div
       role="alert"
       aria-live="assertive"
@@ -110,7 +110,7 @@ onMounted(() => {
       </div>
     </div>
   </div>
-  <div class="toast-container position-fixed top-0 end-0 p-3">
+  <div class="toast-container position-fixed top-toast end-0 p-3">
     <div
       role="alert"
       aria-live="assertive"
diff --git a/src/components/Modals/CreateFolderModal.vue b/src/components/Modals/CreateFolderModal.vue
index d789c8f..bbff4f9 100644
--- a/src/components/Modals/CreateFolderModal.vue
+++ b/src/components/Modals/CreateFolderModal.vue
@@ -79,7 +79,7 @@ onMounted(() => {
 </script>
 
 <template>
-  <div class="toast-container position-fixed top-0 end-0 p-3">
+  <div class="toast-container position-fixed top-toast end-0 p-3">
     <div
       role="alert"
       aria-live="assertive"
@@ -99,7 +99,7 @@ onMounted(() => {
       </div>
     </div>
   </div>
-  <div class="toast-container position-fixed top-0 end-0 p-3">
+  <div class="toast-container position-fixed top-toast end-0 p-3">
     <div
       role="alert"
       aria-live="assertive"
diff --git a/src/components/Modals/PermissionModal.vue b/src/components/Modals/PermissionModal.vue
index a470e2f..a76048e 100644
--- a/src/components/Modals/PermissionModal.vue
+++ b/src/components/Modals/PermissionModal.vue
@@ -290,7 +290,7 @@ onMounted(() => {
       confirmedDeletePermission(permission.bucket_name, permission.uid)
     "
   />
-  <div class="toast-container position-fixed top-0 end-0 p-3">
+  <div class="toast-container position-fixed top-toast end-0 p-3">
     <div
       role="alert"
       aria-live="assertive"
diff --git a/src/components/Modals/UploadObjectModal.vue b/src/components/Modals/UploadObjectModal.vue
index dc86f55..a46e9d3 100644
--- a/src/components/Modals/UploadObjectModal.vue
+++ b/src/components/Modals/UploadObjectModal.vue
@@ -124,7 +124,7 @@ onMounted(() => {
 </script>
 
 <template>
-  <div class="toast-container position-fixed top-0 end-0 p-3">
+  <div class="toast-container position-fixed top-toast end-0 p-3">
     <div
       role="alert"
       aria-live="assertive"
@@ -144,7 +144,7 @@ onMounted(() => {
       </div>
     </div>
   </div>
-  <div class="toast-container position-fixed top-0 end-0 p-3">
+  <div class="toast-container position-fixed top-toast end-0 p-3">
     <div
       role="alert"
       aria-live="assertive"
diff --git a/src/views/object-storage/S3KeysView.vue b/src/views/object-storage/S3KeysView.vue
index 6493368..170c9cd 100644
--- a/src/views/object-storage/S3KeysView.vue
+++ b/src/views/object-storage/S3KeysView.vue
@@ -1,5 +1,6 @@
 <script setup lang="ts">
 import S3KeyView from "@/components/S3KeyView.vue";
+import BootstrapIcon from "@/components/BootstrapIcon.vue";
 import { reactive, onMounted, computed } from "vue";
 import type { ComputedRef } from "vue";
 import type { S3Key } from "@/client";
@@ -36,6 +37,9 @@ const allowKeyDeletion: ComputedRef<boolean> = computed(
 function refreshKeys(uid: string) {
   KeyService.keyGetUserKeys(uid)
     .then((keys) => {
+      if (keyState.activeKey >= keys.length) {
+        keyState.activeKey = keys.length - 1;
+      }
       keyState.keys = keys;
     })
     .catch((err) => console.error(err))
@@ -58,6 +62,19 @@ function deleteKey(accessKey: string) {
   }
 }
 
+function createKey() {
+  if (allowKeyDeletion.value && authStore.user != null) {
+    KeyService.keyCreateUserKey(authStore.user.uid)
+      .then((s3key) => {
+        keyState.keys.push(s3key);
+        keyState.keys = [...keyState.keys].sort((keyA, keyB) =>
+          keyA.access_key > keyB.access_key ? 1 : -1
+        );
+      })
+      .catch((err) => console.error(err));
+  }
+}
+
 onMounted(() => {
   successToast = new Toast("#successKeyToast");
   if (authStore.user != null) {
@@ -67,7 +84,7 @@ onMounted(() => {
 </script>
 
 <template>
-  <div class="toast-container position-fixed top-0 end-0 p-3">
+  <div class="toast-container position-fixed top-toast end-0 p-3">
     <div
       role="alert"
       aria-live="assertive"
@@ -95,6 +112,20 @@ onMounted(() => {
   </div>
   <div class="row m-2 mt-4">
     <div class="col-4">
+      <div class="d-flex justify-content-between mb-4">
+        <button
+          type="button"
+          class="btn btn-light"
+          @click="refreshKeys(authStore.user?.uid ?? 'impossible')"
+        >
+          <bootstrap-icon icon="arrow-clockwise" />
+          <span class="visually-hidden">Refresh S3 Keys</span>
+        </button>
+        <button type="button" class="btn btn-light" @click="createKey">
+          <bootstrap-icon icon="plus-lg" />
+          <span class="visually-hidden">Create S3 Key</span>
+        </button>
+      </div>
       <div v-if="keyState.initialLoading" class="placeholder-glow">
         <a
           v-for="n in 3"
-- 
GitLab