From a7d1cbfdcdc6f50ea09ec48e2d2c63130f006371 Mon Sep 17 00:00:00 2001 From: Kohaku-Blueleaf <59680068+KohakuBlueleaf@users.noreply.github.com> Date: Sat, 18 Oct 2025 18:29:41 +0800 Subject: [PATCH] update storage display method --- src/kohaku-hub-admin/src/pages/storage.vue | 178 ++++----------------- src/kohaku-hub-admin/src/utils/api.js | 8 +- src/kohakuhub/api/admin/routers/storage.py | 56 ++++++- 3 files changed, 82 insertions(+), 160 deletions(-) diff --git a/src/kohaku-hub-admin/src/pages/storage.vue b/src/kohaku-hub-admin/src/pages/storage.vue index 91a279e..6374098 100644 --- a/src/kohaku-hub-admin/src/pages/storage.vue +++ b/src/kohaku-hub-admin/src/pages/storage.vue @@ -10,11 +10,8 @@ import dayjs from "dayjs"; const router = useRouter(); const adminStore = useAdminStore(); -const buckets = ref([]); const objects = ref([]); -const loadingBuckets = ref(false); -const loadingObjects = ref(false); -const selectedBucket = ref(null); +const loading = ref(false); const currentPath = ref(""); const pathParts = ref([]); @@ -64,34 +61,10 @@ function checkAuth() { return true; } -async function loadBuckets() { +async function loadObjects(prefix = "") { if (!checkAuth()) return; - loadingBuckets.value = true; - try { - const response = await listS3Buckets(adminStore.token); - buckets.value = response.buckets; - } catch (error) { - console.error("Failed to load buckets:", error); - if (error.response?.status === 401 || error.response?.status === 403) { - ElMessage.error("Invalid admin token. Please login again."); - adminStore.logout(); - router.push("/login"); - } else { - ElMessage.error( - error.response?.data?.detail?.error || "Failed to load S3 buckets", - ); - } - } finally { - loadingBuckets.value = false; - } -} - -async function loadObjects(bucket, prefix = "") { - if (!checkAuth()) return; - - loadingObjects.value = true; - selectedBucket.value = bucket; + loading.value = true; currentPath.value = prefix; // Update breadcrumb path parts @@ -102,7 +75,8 @@ async function loadObjects(bucket, prefix = "") { } try { - const response = await listS3Objects(adminStore.token, bucket.name, { + // Just list objects from the default configured bucket + const response = await listS3Objects(adminStore.token, "", { prefix, limit: 1000, }); @@ -110,33 +84,33 @@ async function loadObjects(bucket, prefix = "") { } catch (error) { console.error("Failed to load objects:", error); ElMessage.error( - error.response?.data?.detail?.error || "Failed to load S3 objects", + error.response?.data?.detail?.error || "Failed to load storage objects", ); } finally { - loadingObjects.value = false; + loading.value = false; } } function navigateToFolder(folderName) { const newPath = currentPath.value + folderName + "/"; - loadObjects(selectedBucket.value, newPath); + loadObjects(newPath); } function navigateToBreadcrumb(index) { if (index === -1) { - // Navigate to bucket root - loadObjects(selectedBucket.value, ""); + // Navigate to root + loadObjects(""); } else { // Navigate to specific path level const newPath = pathParts.value.slice(0, index + 1).join("/") + "/"; - loadObjects(selectedBucket.value, newPath); + loadObjects(newPath); } } function navigateUp() { if (pathParts.value.length === 0) { - // Already at root, go back to buckets - clearObjectView(); + // Already at root + return; } else { // Go up one level navigateToBreadcrumb(pathParts.value.length - 2); @@ -147,32 +121,6 @@ function formatDate(dateStr) { return dayjs(dateStr).format("YYYY-MM-DD HH:mm:ss"); } -function getBucketProgress(bucket) { - // Return percentage for visual display - if (!bucket.total_size) return 0; - // Max 100GB for visual purposes - const maxSize = 100 * 1000 * 1000 * 1000; - return Math.min((bucket.total_size / maxSize) * 100, 100); -} - -function getBucketColor(bucket) { - const progress = getBucketProgress(bucket); - if (progress > 80) return "danger"; - if (progress > 50) return "warning"; - return "success"; -} - -function handleBrowseBucket(bucket) { - loadObjects(bucket, ""); -} - -function clearObjectView() { - selectedBucket.value = null; - objects.value = []; - currentPath.value = ""; - pathParts.value = []; -} - function getFileIcon(fileName) { const ext = fileName.split(".").pop().toLowerCase(); const iconMap = { @@ -200,7 +148,7 @@ function getFileIcon(fileName) { } onMounted(() => { - loadBuckets(); + loadObjects(""); // Load root directly }); @@ -209,94 +157,26 @@ onMounted(() => {

- S3 Storage Browser + Storage Browser

- Refresh + + Refresh +
- - - - - - -
-
-
-
-
-
-

- {{ bucket.name }} -

-

- {{ formatDate(bucket.creation_date) }} -

-
-
-
- -
-
- Size: - {{ - formatBytes(bucket.total_size) - }} -
-
- Objects: - {{ - bucket.object_count.toLocaleString() - }} -
-
- - - -
- Error: {{ bucket.error }} -
-
-
- - - - + +