From bfed48421bbe7f9bff8cd3fea448881921060885 Mon Sep 17 00:00:00 2001 From: Noooste <83548733+Noooste@users.noreply.github.com> Date: Sun, 19 Apr 2026 22:11:22 +0200 Subject: [PATCH] feat: implement UI redesign with updated button styles and new components Signed-off-by: Noooste <83548733+Noooste@users.noreply.github.com> --- .gitignore | 5 +- frontend/public/fonts/LICENSE.txt | 93 +++ frontend/public/fonts/geist-mono-400.woff2 | Bin 0 -> 50328 bytes frontend/public/fonts/geist-mono-500.woff2 | Bin 0 -> 51480 bytes frontend/public/fonts/geist-sans-400.woff2 | Bin 0 -> 45168 bytes frontend/public/fonts/geist-sans-500.woff2 | Bin 0 -> 46296 bytes frontend/public/fonts/geist-sans-600.woff2 | Bin 0 -> 46464 bytes frontend/src/App.tsx | 35 +- .../src/components/auth/BasicLoginForm.tsx | 2 +- .../src/components/buckets/BucketListView.tsx | 30 +- .../buckets/BucketSettingsDialog.tsx | 196 ------ .../buckets/BucketWebsiteDialog.tsx | 133 ---- .../components/buckets/CreateBucketDialog.tsx | 29 +- .../buckets/CreateDirectoryDialog.tsx | 25 +- .../components/buckets/DeleteBucketDialog.tsx | 49 -- .../components/buckets/DeleteObjectDialog.tsx | 17 +- .../components/buckets/ObjectBrowserView.tsx | 6 +- .../components/buckets/ObjectDetailsView.tsx | 367 +++++------ .../src/components/buckets/ObjectsTable.tsx | 6 +- frontend/src/components/buckets/index.ts | 2 - .../components/layout/bucket-detail-shell.tsx | 105 ++++ frontend/src/components/layout/layout.tsx | 53 +- frontend/src/components/layout/sidebar.tsx | 174 +++--- .../src/components/layout/theme-toggle.tsx | 2 +- frontend/src/components/layout/top-bar.tsx | 97 +++ frontend/src/components/ui/badge.tsx | 26 +- frontend/src/components/ui/breadcrumb.tsx | 44 ++ frontend/src/components/ui/button.tsx | 47 +- frontend/src/components/ui/confirm-dialog.tsx | 69 +++ .../ui/dangerous-confirm-dialog.tsx | 91 +++ frontend/src/components/ui/dialog.tsx | 211 ++++--- frontend/src/components/ui/empty-state.tsx | 32 + frontend/src/components/ui/icon-tile.tsx | 36 ++ frontend/src/components/ui/input.tsx | 30 +- frontend/src/components/ui/page-header.tsx | 28 + frontend/src/components/ui/tabs.tsx | 11 +- frontend/src/index.css | 103 ++- frontend/src/pages/AccessControl.tsx | 586 +++++++++--------- frontend/src/pages/BucketObjects.tsx | 122 ++++ frontend/src/pages/BucketPermissions.tsx | 183 ++++++ frontend/src/pages/BucketSettings.tsx | 139 +++++ frontend/src/pages/BucketWebsite.tsx | 145 +++++ frontend/src/pages/Buckets.tsx | 305 ++------- frontend/src/pages/Cluster.tsx | 10 +- frontend/src/pages/Dashboard.tsx | 433 +++++++------ frontend/tailwind.config.js | 12 + 46 files changed, 2418 insertions(+), 1671 deletions(-) create mode 100644 frontend/public/fonts/LICENSE.txt create mode 100644 frontend/public/fonts/geist-mono-400.woff2 create mode 100644 frontend/public/fonts/geist-mono-500.woff2 create mode 100644 frontend/public/fonts/geist-sans-400.woff2 create mode 100644 frontend/public/fonts/geist-sans-500.woff2 create mode 100644 frontend/public/fonts/geist-sans-600.woff2 delete mode 100644 frontend/src/components/buckets/BucketSettingsDialog.tsx delete mode 100644 frontend/src/components/buckets/BucketWebsiteDialog.tsx delete mode 100644 frontend/src/components/buckets/DeleteBucketDialog.tsx create mode 100644 frontend/src/components/layout/bucket-detail-shell.tsx create mode 100644 frontend/src/components/layout/top-bar.tsx create mode 100644 frontend/src/components/ui/breadcrumb.tsx create mode 100644 frontend/src/components/ui/confirm-dialog.tsx create mode 100644 frontend/src/components/ui/dangerous-confirm-dialog.tsx create mode 100644 frontend/src/components/ui/empty-state.tsx create mode 100644 frontend/src/components/ui/icon-tile.tsx create mode 100644 frontend/src/components/ui/page-header.tsx create mode 100644 frontend/src/pages/BucketObjects.tsx create mode 100644 frontend/src/pages/BucketPermissions.tsx create mode 100644 frontend/src/pages/BucketSettings.tsx create mode 100644 frontend/src/pages/BucketWebsite.tsx diff --git a/.gitignore b/.gitignore index 3961f0a..2534c22 100644 --- a/.gitignore +++ b/.gitignore @@ -63,4 +63,7 @@ garage.toml backend/docs/ config.yaml -docs/**/*.md \ No newline at end of file +docs/**/*.md + +# Superpowers brainstorm / session scratch +.superpowers/ \ No newline at end of file diff --git a/frontend/public/fonts/LICENSE.txt b/frontend/public/fonts/LICENSE.txt new file mode 100644 index 0000000..61f6f4b --- /dev/null +++ b/frontend/public/fonts/LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font.git) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/frontend/public/fonts/geist-mono-400.woff2 b/frontend/public/fonts/geist-mono-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..25b7962e85833b54c40027c449a51da1cb60707d GIT binary patch literal 50328 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 literal 0 HcmV?d00001 diff --git a/frontend/public/fonts/geist-mono-500.woff2 b/frontend/public/fonts/geist-mono-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..dac059088d12a35e7fa1fcf5813837096fa69a11 GIT binary patch literal 51480 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 Zz@>zUzI6SMAiq7WRO6W*65!|x004%$o_PQO literal 0 HcmV?d00001 diff --git a/frontend/public/fonts/geist-sans-400.woff2 b/frontend/public/fonts/geist-sans-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2d46108116e69c3d28f0cad41062250b0f0c2a08 GIT binary patch literal 45168 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 A+yDRo literal 0 HcmV?d00001 diff --git a/frontend/public/fonts/geist-sans-500.woff2 b/frontend/public/fonts/geist-sans-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3d8653583efbd99a4334ef8c5793fcc235b86ee7 GIT binary patch literal 46296 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 + return ( + + ); } function App() { @@ -49,7 +67,14 @@ function App() { > } /> } /> - } /> + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> } /> diff --git a/frontend/src/components/auth/BasicLoginForm.tsx b/frontend/src/components/auth/BasicLoginForm.tsx index 4d337f2..7cb2d8a 100644 --- a/frontend/src/components/auth/BasicLoginForm.tsx +++ b/frontend/src/components/auth/BasicLoginForm.tsx @@ -99,7 +99,7 @@ export function BasicLoginForm({ showOIDC = false, config }: BasicLoginFormProps +
+ + onSearchChange(e.target.value)} + className="pl-8" + />
{/* Buckets Table */} @@ -99,14 +91,14 @@ export function BucketListView({ {bucket.name} {bucket.websiteAccess && ( - + Website )} - {bucket.region || 'default'} + {bucket.region || 'default'} {bucket.objectCount?.toLocaleString() || 0} {bucket.size ? formatBytes(bucket.size) : '0 B'} diff --git a/frontend/src/components/buckets/BucketSettingsDialog.tsx b/frontend/src/components/buckets/BucketSettingsDialog.tsx deleted file mode 100644 index 5426551..0000000 --- a/frontend/src/components/buckets/BucketSettingsDialog.tsx +++ /dev/null @@ -1,196 +0,0 @@ -import { useState, useEffect } from 'react'; -import { Button } from '@/components/ui/button'; -import { Checkbox } from '@/components/ui/checkbox'; -import { Select, SelectOption } from '@/components/ui/select'; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, -} from '@/components/ui/dialog'; -import { useAccessKeys } from '@/hooks/useApi'; -import type { Bucket } from '@/types'; -import { toast } from 'sonner'; - -interface BucketSettingsDialogProps { - open: boolean; - onOpenChange: (open: boolean) => void; - bucket: Bucket | null; - onGrantPermission: (bucketName: string, accessKeyId: string, permissions: { read: boolean; write: boolean; owner: boolean }) => Promise; -} - -export function BucketSettingsDialog({ open, onOpenChange, bucket, onGrantPermission }: BucketSettingsDialogProps) { - const { data: availableKeys = [] } = useAccessKeys(); - const [selectedAccessKey, setSelectedAccessKey] = useState(''); - const [permissionRead, setPermissionRead] = useState(false); - const [permissionWrite, setPermissionWrite] = useState(false); - const [permissionOwner, setPermissionOwner] = useState(false); - - useEffect(() => { - if (open && bucket) { - resetForm(); - } - }, [open, bucket]); - - const resetForm = () => { - setSelectedAccessKey(''); - setPermissionRead(false); - setPermissionWrite(false); - setPermissionOwner(false); - }; - - const handleAccessKeyChange = (accessKeyId: string) => { - setSelectedAccessKey(accessKeyId); - - if (!accessKeyId) { - setPermissionRead(false); - setPermissionWrite(false); - setPermissionOwner(false); - return; - } - - const selectedKey = availableKeys.find(key => key.accessKeyId === accessKeyId); - if (selectedKey && bucket) { - const bucketPermission = selectedKey.permissions.find( - perm => perm.bucketName === bucket.name || perm.bucketId === bucket.name - ); - - if (bucketPermission) { - setPermissionRead(bucketPermission.read); - setPermissionWrite(bucketPermission.write); - setPermissionOwner(bucketPermission.owner); - } else { - setPermissionRead(false); - setPermissionWrite(false); - setPermissionOwner(false); - } - } - }; - - const handleGrantPermission = async () => { - if (!bucket || !selectedAccessKey) { - toast.error('Please select an access key'); - return; - } - - if (!permissionRead && !permissionWrite && !permissionOwner) { - toast.error('Please select at least one permission'); - return; - } - - const success = await onGrantPermission(bucket.name, selectedAccessKey, { - read: permissionRead, - write: permissionWrite, - owner: permissionOwner, - }); - - if (success) { - resetForm(); - onOpenChange(false); - } - }; - - return ( - - - - Bucket Settings - {bucket?.name} - - Grant access key permissions for this bucket - - -
-
- - -

- Choose which access key should have permissions on this bucket. Current permissions will be displayed when selected. -

-
- -
- -
-
- setPermissionRead(checked as boolean)} - /> -
- -

- Allows reading objects from the bucket (GetObject, HeadObject, ListObjects) -

-
-
- -
- setPermissionWrite(checked as boolean)} - /> -
- -

- Allows writing and deleting objects in the bucket (PutObject, DeleteObject) -

-
-
- -
- setPermissionOwner(checked as boolean)} - /> -
- -

- Allows managing bucket settings and policies (DeleteBucket, PutBucketPolicy) -

-
-
-
-
-
- - - - -
-
- ); -} diff --git a/frontend/src/components/buckets/BucketWebsiteDialog.tsx b/frontend/src/components/buckets/BucketWebsiteDialog.tsx deleted file mode 100644 index 0a116a3..0000000 --- a/frontend/src/components/buckets/BucketWebsiteDialog.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import { useState, useEffect } from 'react'; -import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, -} from '@/components/ui/dialog'; -import { Badge } from '@/components/ui/badge'; -import { Switch } from '@/components/ui/switch'; -import type { Bucket } from '@/types'; - -interface BucketWebsiteDialogProps { - open: boolean; - onOpenChange: (open: boolean) => void; - bucket: Bucket | null; - onSave: ( - bucketName: string, - payload: { enabled: boolean; indexDocument?: string; errorDocument?: string } - ) => Promise; -} - -export function BucketWebsiteDialog({ - open, - onOpenChange, - bucket, - onSave, -}: BucketWebsiteDialogProps) { - const [enabled, setEnabled] = useState(false); - const [indexDocument, setIndexDocument] = useState('index.html'); - const [errorDocument, setErrorDocument] = useState(''); - const [saving, setSaving] = useState(false); - - useEffect(() => { - if (open && bucket) { - setEnabled(bucket.websiteAccess); - setIndexDocument(bucket.websiteConfig?.indexDocument ?? 'index.html'); - setErrorDocument(bucket.websiteConfig?.errorDocument ?? ''); - } - }, [open, bucket]); - - const handleSave = async () => { - if (!bucket) return; - setSaving(true); - const success = await onSave(bucket.name, { - enabled, - indexDocument: enabled ? indexDocument : undefined, - errorDocument: enabled && errorDocument ? errorDocument : undefined, - }); - setSaving(false); - if (success) onOpenChange(false); - }; - - return ( - - - - Website Hosting — {bucket?.name} - - Configure this bucket to serve a static website. - - - -
-
-
-

Website access

-

- Allow public HTTP access to bucket objects -

-
-
- - {enabled ? 'Enabled' : 'Disabled'} - - -
-
- - {enabled && ( -
-
- - setIndexDocument(e.target.value)} - placeholder="index.html" - /> -

- The file served when a directory is requested (e.g. index.html) -

-
- -
- - setErrorDocument(e.target.value)} - placeholder="404.html (optional)" - /> -

- The file served when an object is not found (optional) -

-
-
- )} -
- - - - - -
-
- ); -} diff --git a/frontend/src/components/buckets/CreateBucketDialog.tsx b/frontend/src/components/buckets/CreateBucketDialog.tsx index 6084cb3..d70dbdc 100644 --- a/frontend/src/components/buckets/CreateBucketDialog.tsx +++ b/frontend/src/components/buckets/CreateBucketDialog.tsx @@ -1,14 +1,17 @@ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; +import { Database } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Dialog, + DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; +import { IconTile } from '@/components/ui/icon-tile'; import { toast } from 'sonner'; interface CreateBucketDialogProps { @@ -20,6 +23,8 @@ interface CreateBucketDialogProps { export function CreateBucketDialog({ open, onOpenChange, onCreateBucket }: CreateBucketDialogProps) { const [bucketName, setBucketName] = useState(''); + useEffect(() => { if (!open) setBucketName(''); }, [open]); + const handleCreate = async () => { if (!bucketName) { toast.error('Please enter a bucket name'); @@ -37,15 +42,19 @@ export function CreateBucketDialog({ open, onOpenChange, onCreateBucket }: Creat - Create New Bucket - - Create a new storage bucket for your objects - + } tone="primary" size="md" /> +
+ Create New Bucket + + Create a new storage bucket for your objects + +
-
+
setBucketName(e.target.value)} @@ -59,13 +68,13 @@ export function CreateBucketDialog({ open, onOpenChange, onCreateBucket }: Creat Must be unique and follow DNS naming conventions

-
- - - - -
-
- ); -} diff --git a/frontend/src/components/buckets/DeleteObjectDialog.tsx b/frontend/src/components/buckets/DeleteObjectDialog.tsx index 7fa4179..ca25f4d 100644 --- a/frontend/src/components/buckets/DeleteObjectDialog.tsx +++ b/frontend/src/components/buckets/DeleteObjectDialog.tsx @@ -1,3 +1,4 @@ +import { Trash2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Dialog, @@ -7,6 +8,7 @@ import { DialogHeader, DialogTitle, } from '@/components/ui/dialog'; +import { IconTile } from '@/components/ui/icon-tile'; import type { S3Object } from '@/types'; interface DeleteObjectDialogProps { @@ -27,16 +29,19 @@ export function DeleteObjectDialog({ open, onOpenChange, object, onDeleteObject }; return ( - + - Delete Object - - Are you sure you want to delete "{object?.key}"? This action cannot be undone. - + } tone="destructive" size="md" /> +
+ Delete Object + + Are you sure you want to delete "{object?.key}"? This action cannot be undone. + +
- - diff --git a/frontend/src/components/buckets/ObjectDetailsView.tsx b/frontend/src/components/buckets/ObjectDetailsView.tsx index c71a248..cb73f98 100644 --- a/frontend/src/components/buckets/ObjectDetailsView.tsx +++ b/frontend/src/components/buckets/ObjectDetailsView.tsx @@ -1,21 +1,55 @@ import { useEffect, useState } from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate, useParams, Link } from 'react-router-dom'; import { objectsApi } from '@/lib/api'; import type { ObjectMetadata } from '@/types'; -import { Header } from '@/components/layout/header'; import { Button } from '@/components/ui/button'; -import { ArrowLeft, Download, Trash, Copy, File } from 'lucide-react'; +import { Badge } from '@/components/ui/badge'; +import { IconTile } from '@/components/ui/icon-tile'; +import { ConfirmDialog } from '@/components/ui/confirm-dialog'; +import { ArrowLeft, ChevronRight, Copy, Download, File, Loader2, Trash2 } from 'lucide-react'; import { toast } from 'sonner'; import { formatBytes } from '@/lib/file-utils'; +function formatDate(value: string) { + return new Date(value).toLocaleString(undefined, { + year: 'numeric', + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + }); +} + +function CardSection({ title, children }: { title: string; children: React.ReactNode }) { + return ( +
+
+

{title}

+
+ {children} +
+ ); +} + +function DetailRow({ label, children }: { label: string; children: React.ReactNode }) { + return ( +
+
{label}
+
{children}
+
+ ); +} + export function ObjectDetailsView() { const navigate = useNavigate(); const { bucketName, '*': encodedObjectKey } = useParams(); - // Decode the object key from the URL const objectKey = encodedObjectKey ? decodeURIComponent(encodedObjectKey) : undefined; + const [metadata, setMetadata] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); + const [deleteOpen, setDeleteOpen] = useState(false); + const [deleting, setDeleting] = useState(false); useEffect(() => { if (!bucketName || !objectKey) { @@ -23,7 +57,6 @@ export function ObjectDetailsView() { setIsLoading(false); return; } - const fetchMetadata = async () => { try { setIsLoading(true); @@ -32,240 +65,184 @@ export function ObjectDetailsView() { setMetadata(data); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load object metadata'); - console.error('Failed to fetch object metadata:', err); } finally { setIsLoading(false); } }; - fetchMetadata(); }, [bucketName, objectKey]); + const parentPath = objectKey?.split('/').slice(0, -1).join('/') ?? ''; + const fileName = objectKey?.split('/').pop() || objectKey || ''; + const backHref = `/buckets/${bucketName}/objects${parentPath ? `?prefix=${encodeURIComponent(parentPath + '/')}` : ''}`; + const pathSegments = parentPath ? parentPath.split('/').filter(Boolean) : []; + + const copy = (text: string, label = 'Copied') => { + navigator.clipboard.writeText(text); + toast.success(label); + }; + const handleDownload = async () => { if (!bucketName || !objectKey) return; - try { const blob = await objectsApi.get(bucketName, objectKey); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; - a.download = objectKey.split('/').pop() || 'download'; + a.download = fileName || 'download'; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); document.body.removeChild(a); toast.success('Download started'); - } catch (err) { - console.error('Download failed:', err); + } catch { + toast.error('Download failed'); } }; const handleDelete = async () => { if (!bucketName || !objectKey) return; - - if (!confirm(`Are you sure you want to delete "${objectKey}"?`)) { - return; - } - try { + setDeleting(true); await objectsApi.delete(bucketName, objectKey); - toast.success('Object deleted successfully'); - handleBackNavigation(); - } catch (err) { - console.error('Delete failed:', err); + toast.success('Object deleted'); + navigate(backHref); + } catch { + toast.error('Delete failed'); + } finally { + setDeleting(false); + setDeleteOpen(false); } }; - const handleBackNavigation = () => { - if (!bucketName) return; - - // Navigate back to the bucket explorer with the appropriate prefix - // Extract the folder path from the object key (everything before the last /) - const folderPath = objectKey?.split('/').slice(0, -1).join('/') || ''; - const prefix = folderPath ? `${folderPath}/` : ''; - - // Navigate to the bucket view with the correct prefix - navigate(`/buckets?bucket=${encodeURIComponent(bucketName)}${prefix ? `&prefix=${encodeURIComponent(prefix)}` : ''}`); - }; - - const copyToClipboard = (text: string) => { - navigator.clipboard.writeText(text); - toast.success('Copied to clipboard'); - }; - - const formatDate = (dateString: string) => { - const date = new Date(dateString); - return date.toLocaleString('en-US', { - year: 'numeric', - month: 'short', - day: 'numeric', - hour: '2-digit', - minute: '2-digit', - second: '2-digit', - timeZoneName: 'short', - }); - }; - if (isLoading) { return ( -
-
-
-
-
Loading object details...
-
-
+
+ Loading object details…
); } if (error || !metadata) { return ( -
-
-
- -
-
{error || 'Object not found'}
-
+
+ +
+ {error || 'Object not found'}
); } - const fileName = objectKey?.split('/').pop() || objectKey || ''; - const pathParts = objectKey?.split('/').filter(part => part) || []; - const parentPath = pathParts.slice(0, -1).join('/'); - return ( -
-
-
- {/* Back Button and Actions */} -
- -
- - -
-
- - {/* File Name Header */} -
-
- -
-
-
-

- {parentPath && ( - /{parentPath}/ - )} - {fileName} -

- -
-
-
- - {/* Object Details Section */} -
-
-

Object Details

-
-
-
-
Date Created
-
- {formatDate(metadata.lastModified)} -
-
-
-
Type
-
- {metadata.contentType || 'application/octet-stream'} -
-
-
-
Storage Class
-
- {metadata.storageClass || 'Standard'} -
-
-
-
Size
-
- {formatBytes(metadata.size)} -
-
-
-
- - {/* Custom Metadata Section */} - {metadata.metadata && Object.keys(metadata.metadata).length > 0 && ( -
-
-

Custom Metadata

-
-
- - - - - - - - - {Object.entries(metadata.metadata).map(([key, value]) => ( - - - - - ))} - -
- Key - - Value -
- {key} - {value}
-
-
- )} - - {/* Object Preview Section */} -
-
-

Object Preview

-
-
-

No preview available

-
-
+
+ {/* Back + breadcrumb */} +
+ + + Objects + + {pathSegments.map((seg, i) => ( + + + {seg} + + ))} + + {fileName}
+ + {/* Hero */} +
+
+ } tone="primary" size="lg" /> +
+

{fileName}

+ +
+ {formatBytes(metadata.size)} + {metadata.contentType || 'application/octet-stream'} + {metadata.storageClass && {metadata.storageClass}} +
+
+
+
+ + +
+
+ + {/* Details */} + +
+ {formatBytes(metadata.size)} + {metadata.contentType || 'application/octet-stream'} + {metadata.storageClass || 'Standard'} + {formatDate(metadata.lastModified)} + + + + {metadata.versionId && ( + + {metadata.versionId} + + )} +
+
+ + {/* Custom metadata */} + {metadata.metadata && Object.keys(metadata.metadata).length > 0 && ( + +
+ {Object.entries(metadata.metadata).map(([key, value]) => ( + + {value} + + ))} +
+
+ )} + + {/* Preview */} + +
+ No preview available for this object. +
+
+ +
); } diff --git a/frontend/src/components/buckets/ObjectsTable.tsx b/frontend/src/components/buckets/ObjectsTable.tsx index 0e1c9c3..4c5dea8 100644 --- a/frontend/src/components/buckets/ObjectsTable.tsx +++ b/frontend/src/components/buckets/ObjectsTable.tsx @@ -282,7 +282,7 @@ export function ObjectsTable({ {obj.storageClass && ( - {obj.storageClass} + {obj.storageClass} )} {obj.isFolder ? null : formatBytes(obj.size)} @@ -400,7 +400,7 @@ export function ObjectsTable({
+ +
+
+ + + {/* Tabs */} + + +
+ +
+
+ ); +} diff --git a/frontend/src/components/layout/layout.tsx b/frontend/src/components/layout/layout.tsx index c5122d0..6904016 100644 --- a/frontend/src/components/layout/layout.tsx +++ b/frontend/src/components/layout/layout.tsx @@ -1,36 +1,67 @@ -import { Outlet } from 'react-router-dom'; +import { Outlet, useLocation, useParams } from 'react-router-dom'; import { Sidebar } from './sidebar'; -import { useState } from 'react'; +import { TopBar } from './top-bar'; +import { useState, useMemo } from 'react'; import { Menu } from 'lucide-react'; import { Button } from '@/components/ui/button'; +import type { BreadcrumbItem } from '@/components/ui/breadcrumb'; + +function useCrumbs(): BreadcrumbItem[] { + const location = useLocation(); + const params = useParams(); + return useMemo(() => { + const path = location.pathname; + if (path === '/') return [{ label: 'Dashboard' }]; + if (path === '/cluster') return [{ label: 'Cluster' }]; + if (path === '/access') return [{ label: 'Access Control' }]; + if (path === '/buckets') return [{ label: 'Buckets' }]; + if (path.startsWith('/buckets/')) { + const bucketName = (params as { bucketName?: string }).bucketName ?? path.split('/')[2]; + const crumbs: BreadcrumbItem[] = [ + { label: 'Buckets', to: '/buckets' }, + { label: bucketName, to: `/buckets/${bucketName}/objects` }, + ]; + const segs = path.split('/').slice(3); // after /buckets/:name + if (segs[0] && segs[0] !== 'objects') { + const tabLabel = segs[0][0].toUpperCase() + segs[0].slice(1); + crumbs.push({ label: tabLabel }); + } + return crumbs; + } + return []; + }, [location.pathname, params]); +} export function Layout() { const [sidebarOpen, setSidebarOpen] = useState(false); + const crumbs = useCrumbs(); return ( -
- {/* Mobile menu button */} +
- {/* Mobile overlay */} {sidebarOpen && (
setSidebarOpen(false)} /> )} setSidebarOpen(false)} /> -
- -
+
+ +
+ +
+
); } diff --git a/frontend/src/components/layout/sidebar.tsx b/frontend/src/components/layout/sidebar.tsx index c7b846f..30e1f7f 100644 --- a/frontend/src/components/layout/sidebar.tsx +++ b/frontend/src/components/layout/sidebar.tsx @@ -1,8 +1,7 @@ -import {Link, useLocation} from 'react-router-dom'; -import {cn} from '@/lib/utils'; -import {Database, Key, LayoutDashboard, LogOut, Server, User} from 'lucide-react'; -import {useAuthStore} from '@/store/auth-store'; -import {Button} from '@/components/ui/button'; +import { Link, useLocation } from 'react-router-dom'; +import { cn } from '@/lib/utils'; +import { BookOpen, Database, Key, LayoutDashboard, Server } from 'lucide-react'; +import { useAuthStore } from '@/store/auth-store'; import { useQuery } from '@tanstack/react-query'; import { healthApi, garageApi } from '@/lib/api'; @@ -12,26 +11,25 @@ interface NavItem { icon: React.ComponentType<{ className?: string }>; } -const navItems: NavItem[] = [ +interface NavGroup { + label?: string; + items: NavItem[]; +} + +const navGroups: NavGroup[] = [ { - title: 'Dashboard', - href: '/', - icon: LayoutDashboard, + items: [{ title: 'Dashboard', href: '/', icon: LayoutDashboard }], }, { - title: 'Buckets', - href: '/buckets', - icon: Database, + label: 'Storage', + items: [{ title: 'Buckets', href: '/buckets', icon: Database }], }, { - title: 'Cluster', - href: '/cluster', - icon: Server, - }, - { - title: 'Access Control', - href: '/access', - icon: Key, + label: 'Cluster', + items: [ + { title: 'Cluster', href: '/cluster', icon: Server }, + { title: 'Access Control', href: '/access', icon: Key }, + ], }, ]; @@ -42,11 +40,7 @@ interface SidebarProps { export function Sidebar({ isOpen, onClose }: SidebarProps) { const location = useLocation(); - const { user, config, logout } = useAuthStore(); - - const handleLogout = () => { - logout(); - }; + const { config } = useAuthStore(); const { data: uiVersion } = useQuery({ queryKey: ['ui-version'], @@ -60,80 +54,80 @@ export function Sidebar({ isOpen, onClose }: SidebarProps) { queryFn: () => garageApi.getNodeInfo('self'), staleTime: 5 * 60 * 1000, retry: false, + enabled: !!(config && (config.admin.enabled || config.oidc.enabled)), }); - const garageVersion = nodeInfo - ? Object.values(nodeInfo.success)[0]?.garageVersion - : undefined; + const garageVersion = nodeInfo ? Object.values(nodeInfo.success)[0]?.garageVersion : undefined; + + const isActive = (href: string) => + href === '/' + ? location.pathname === '/' + : location.pathname === href || location.pathname.startsWith(href + '/'); return ( -
-
- Garage UI Logo - Garage UI +
+ + Garage UI
- - {config && (config.admin.enabled || config.oidc.enabled) && user && ( -
-
-
- -
-
-

{user.name || user.username}

- {user.email && ( -

{user.email}

- )} -
+
- )} - {(uiVersion || garageVersion) && ( -
- {uiVersion && `UI ${uiVersion}`} - {uiVersion && garageVersion && ' | '} - {garageVersion && `Garage ${garageVersion}`} -
- )} -
+ ))} + +
+ + + Documentation + + {(uiVersion || garageVersion) && ( +
+ {uiVersion && UI {uiVersion}} + {uiVersion && garageVersion && } + {garageVersion && Garage {garageVersion}} +
+ )} +
+ ); } diff --git a/frontend/src/components/layout/theme-toggle.tsx b/frontend/src/components/layout/theme-toggle.tsx index 817c760..9007720 100644 --- a/frontend/src/components/layout/theme-toggle.tsx +++ b/frontend/src/components/layout/theme-toggle.tsx @@ -14,7 +14,7 @@ export function ThemeToggle() { return ( - + {menuOpen && ( +
+
+
{user?.name || user?.username}
+ {user?.email && ( +
{user.email}
+ )} +
+ +
+ )} +
+ )} +
+
+ ); +} + +function ThemeMiniToggle({ + theme, + setTheme, +}: { + theme: 'light' | 'dark' | 'system'; + setTheme: (t: 'light' | 'dark' | 'system') => void; +}) { + const next = theme === 'dark' ? 'light' : theme === 'light' ? 'system' : 'dark'; + const Icon = theme === 'dark' ? Moon : theme === 'light' ? Sun : Monitor; + return ( + + ); +} diff --git a/frontend/src/components/ui/badge.tsx b/frontend/src/components/ui/badge.tsx index 50624aa..a998727 100644 --- a/frontend/src/components/ui/badge.tsx +++ b/frontend/src/components/ui/badge.tsx @@ -3,21 +3,23 @@ import { cva, type VariantProps } from 'class-variance-authority'; import { cn } from '@/lib/utils'; const badgeVariants = cva( - 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', + 'inline-flex items-center rounded-md border px-2 py-0.5 text-[12px] font-medium tracking-tight', { variants: { variant: { - default: 'border-transparent bg-primary text-primary-foreground hover:bg-primary', - secondary: - 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary', - destructive: - 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive', - outline: 'text-foreground', + neutral: + 'bg-[var(--card)] border-[var(--border)] text-[var(--muted-foreground)]', + success: + 'bg-[var(--success-soft)] border-transparent text-[color:#2ca02c] dark:text-[color:#73bf69]', + warning: + 'bg-[var(--accent-primary-soft)] border-[var(--accent-primary-border)] text-[var(--primary)]', + danger: + 'bg-[var(--danger-soft)] border-[var(--danger-border)] text-[var(--destructive)]', + primary: + 'bg-[var(--primary)] border-transparent text-[var(--primary-foreground)]', }, }, - defaultVariants: { - variant: 'default', - }, + defaultVariants: { variant: 'neutral' }, } ); @@ -25,8 +27,8 @@ export interface BadgeProps extends React.HTMLAttributes, VariantProps {} -function Badge({ className, variant, ...props }: BadgeProps) { +export function Badge({ className, variant, ...props }: BadgeProps) { return
; } -export { Badge, badgeVariants }; +export { badgeVariants }; diff --git a/frontend/src/components/ui/breadcrumb.tsx b/frontend/src/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..3a7597c --- /dev/null +++ b/frontend/src/components/ui/breadcrumb.tsx @@ -0,0 +1,44 @@ +import * as React from 'react'; +import { Link } from 'react-router-dom'; +import { ChevronRight } from 'lucide-react'; +import { cn } from '@/lib/utils'; + +export interface BreadcrumbItem { + label: string; + to?: string; +} + +interface BreadcrumbProps extends React.HTMLAttributes { + items: BreadcrumbItem[]; +} + +export function Breadcrumb({ items, className, ...props }: BreadcrumbProps) { + return ( + + ); +} diff --git a/frontend/src/components/ui/button.tsx b/frontend/src/components/ui/button.tsx index 62d6a63..1814792 100644 --- a/frontend/src/components/ui/button.tsx +++ b/frontend/src/components/ui/button.tsx @@ -3,28 +3,39 @@ import { cva, type VariantProps } from 'class-variance-authority'; import { cn } from '@/lib/utils'; const buttonVariants = cva( - 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none', + [ + 'inline-flex items-center justify-center gap-2 whitespace-nowrap', + 'rounded-md text-[14px] font-medium tracking-tight', + 'transition-colors ring-offset-background', + 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2', + 'disabled:pointer-events-none disabled:opacity-50', + '[&_svg]:h-3.5 [&_svg]:w-3.5 [&_svg]:shrink-0', + ].join(' '), { variants: { variant: { - default: 'bg-[#ff9329] text-black hover:bg-[#e58625] cursor-pointer', - default_disabled: 'bg-[#ff9329] text-black opacity-50 cursor-not-allowed', - secondary: 'border border-[#ff9329] text-[#ff9329] cursor-pointer', - destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive cursor-pointer', - outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground cursor-pointer', - outline_disabled: 'border border-input bg-background text-muted-foreground opacity-50 cursor-not-allowed', - ghost: 'hover:bg-accent hover:text-accent-foreground cursor-pointer', - link: 'text-primary underline-offset-4 hover:underline cursor-pointer', + primary: + 'bg-[var(--primary)] text-[var(--primary-foreground)] font-semibold hover:brightness-[1.04] cursor-pointer', + secondary: + 'bg-transparent border border-[var(--border)] text-[var(--foreground)] hover:bg-[var(--accent)] cursor-pointer', + ghost: + 'bg-transparent text-[var(--muted-foreground)] hover:bg-[var(--accent)] hover:text-[var(--foreground)] cursor-pointer', + destructive: + 'bg-[var(--destructive)] text-[var(--destructive-foreground)] font-semibold hover:brightness-[1.05] cursor-pointer', + link: + 'text-[var(--primary)] underline-offset-4 hover:underline cursor-pointer', }, size: { - default: 'h-10 px-4 py-2', - sm: 'h-9 rounded-md px-3', - lg: 'h-11 rounded-md px-8', - icon: 'h-10 w-10', + sm: 'h-8 px-3', + default: 'h-[38px] px-4', + lg: 'h-11 px-5', + 'icon-sm': 'h-8 w-8 p-0', + icon: 'h-[38px] w-[38px] p-0', + 'icon-lg': 'h-11 w-11 p-0', }, }, defaultVariants: { - variant: 'default', + variant: 'primary', size: 'default', }, } @@ -35,11 +46,9 @@ export interface ButtonProps VariantProps {} const Button = React.forwardRef( - ({ className, variant, size, ...props }, ref) => { - return ( - + + + +
+ ); +} diff --git a/frontend/src/components/ui/dangerous-confirm-dialog.tsx b/frontend/src/components/ui/dangerous-confirm-dialog.tsx new file mode 100644 index 0000000..6b35366 --- /dev/null +++ b/frontend/src/components/ui/dangerous-confirm-dialog.tsx @@ -0,0 +1,91 @@ +import * as React from 'react'; +import { Trash2 } from 'lucide-react'; +import { + Dialog, + DialogBody, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from './dialog'; +import { IconTile } from './icon-tile'; +import { Button } from './button'; +import { Input } from './input'; + +interface DangerousConfirmDialogProps { + open: boolean; + onOpenChange: (open: boolean) => void; + title: string; + description?: React.ReactNode; + /** Exact string the user must type to enable the confirm button. */ + confirmationText: string; + confirmLabel?: string; + cancelLabel?: string; + icon?: React.ReactNode; + loading?: boolean; + onConfirm: () => void | Promise; +} + +export function DangerousConfirmDialog({ + open, + onOpenChange, + title, + description, + confirmationText, + confirmLabel = 'Delete', + cancelLabel = 'Cancel', + icon, + loading = false, + onConfirm, +}: DangerousConfirmDialogProps) { + const [value, setValue] = React.useState(''); + React.useEffect(() => { if (!open) setValue(''); }, [open]); + + const matches = value === confirmationText; + + const submit = () => { if (matches && !loading) onConfirm(); }; + + return ( + + + + } tone="destructive" size="md" /> +
+ {title} + {description && {description}} +
+
+ +

+ This action cannot be undone. To confirm, type{' '} + + {confirmationText} + {' '} + below. +

+ setValue(e.target.value)} + onKeyDown={(e) => e.key === 'Enter' && submit()} + placeholder={confirmationText} + aria-label={`Type ${confirmationText} to confirm`} + /> +
+ + + + +
+
+ ); +} diff --git a/frontend/src/components/ui/dialog.tsx b/frontend/src/components/ui/dialog.tsx index 5ba1182..251da47 100644 --- a/frontend/src/components/ui/dialog.tsx +++ b/frontend/src/components/ui/dialog.tsx @@ -1,149 +1,201 @@ import * as React from 'react'; +import { createPortal } from 'react-dom'; import { X } from 'lucide-react'; import { cn } from '@/lib/utils'; +type DialogSize = 'standard' | 'form' | 'destructive'; + interface DialogContextValue { open: boolean; onOpenChange: (open: boolean) => void; + size: DialogSize; } const DialogContext = React.createContext(undefined); function useDialog() { - const context = React.useContext(DialogContext); - if (!context) { - throw new Error('useDialog must be used within a Dialog'); - } - return context; + const ctx = React.useContext(DialogContext); + if (!ctx) throw new Error('useDialog must be used within a Dialog'); + return ctx; } interface DialogProps { open?: boolean; onOpenChange?: (open: boolean) => void; + size?: DialogSize; children: React.ReactNode; } -const Dialog: React.FC = ({ open = false, onOpenChange, children }) => { - return ( - {}) }}> - {children} - - ); -}; +const Dialog: React.FC = ({ open = false, onOpenChange, size = 'standard', children }) => ( + {}), size }}> + {children} + +); -const DialogTrigger = React.forwardRef< - HTMLButtonElement, - React.ButtonHTMLAttributes ->(({ onClick, ...props }, ref) => { - const { onOpenChange } = useDialog(); - return ( - - + , + document.body, ); } ); DialogContent.displayName = 'DialogContent'; -const DialogHeader: React.FC> = ({ - className, - ...props -}) =>
; +const DialogHeader: React.FC> = ({ className, ...props }) => ( +
+); DialogHeader.displayName = 'DialogHeader'; -const DialogFooter: React.FC> = ({ - className, - ...props -}) => ( +const DialogBody: React.FC> = ({ className, ...props }) => ( +
+); +DialogBody.displayName = 'DialogBody'; + +const DialogFooter: React.FC> = ({ className, ...props }) => (
); DialogFooter.displayName = 'DialogFooter'; -const DialogTitle = React.forwardRef>( +const DialogTitleText = React.forwardRef>( ({ className, ...props }, ref) => (

) ); -DialogTitle.displayName = 'DialogTitle'; +DialogTitleText.displayName = 'DialogTitle'; -const DialogDescription = React.forwardRef< - HTMLParagraphElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -

-)); +const DialogDescription = React.forwardRef>( + ({ className, ...props }, ref) => ( +

+ ) +); DialogDescription.displayName = 'DialogDescription'; export { @@ -151,7 +203,8 @@ export { DialogTrigger, DialogContent, DialogHeader, + DialogBody, DialogFooter, - DialogTitle, + DialogTitleText as DialogTitle, DialogDescription, }; diff --git a/frontend/src/components/ui/empty-state.tsx b/frontend/src/components/ui/empty-state.tsx new file mode 100644 index 0000000..34bf2ac --- /dev/null +++ b/frontend/src/components/ui/empty-state.tsx @@ -0,0 +1,32 @@ +import * as React from 'react'; +import { IconTile } from './icon-tile'; +import { cn } from '@/lib/utils'; + +interface EmptyStateProps extends React.HTMLAttributes { + icon: React.ReactNode; + title: string; + description?: string; + action?: React.ReactNode; + tone?: 'primary' | 'neutral' | 'destructive'; +} + +export function EmptyState({ icon, title, description, action, tone = 'primary', className, ...props }: EmptyStateProps) { + return ( +

+ +
+

{title}

+ {description && ( +

{description}

+ )} +
+ {action &&
{action}
} +
+ ); +} diff --git a/frontend/src/components/ui/icon-tile.tsx b/frontend/src/components/ui/icon-tile.tsx new file mode 100644 index 0000000..05385d5 --- /dev/null +++ b/frontend/src/components/ui/icon-tile.tsx @@ -0,0 +1,36 @@ +import * as React from 'react'; +import { cn } from '@/lib/utils'; +import { cva, type VariantProps } from 'class-variance-authority'; + +const iconTileVariants = cva( + 'inline-flex items-center justify-center shrink-0 border', + { + variants: { + tone: { + primary: 'bg-[var(--accent-primary-soft)] border-[var(--accent-primary-border)] text-[var(--primary)]', + destructive: 'bg-[var(--danger-soft)] border-[var(--danger-border)] text-[var(--destructive)]', + neutral: 'bg-muted border-border text-muted-foreground', + }, + size: { + sm: 'h-8 w-8 rounded-md [&>svg]:h-4 [&>svg]:w-4', + md: 'h-10 w-10 rounded-lg [&>svg]:h-5 [&>svg]:w-5', + lg: 'h-14 w-14 rounded-xl [&>svg]:h-7 [&>svg]:w-7', + }, + }, + defaultVariants: { tone: 'primary', size: 'md' }, + } +); + +export interface IconTileProps + extends React.HTMLAttributes, + VariantProps { + icon: React.ReactNode; +} + +export function IconTile({ icon, tone, size, className, ...props }: IconTileProps) { + return ( +
+ {icon} +
+ ); +} diff --git a/frontend/src/components/ui/input.tsx b/frontend/src/components/ui/input.tsx index 6206c14..86084fb 100644 --- a/frontend/src/components/ui/input.tsx +++ b/frontend/src/components/ui/input.tsx @@ -1,22 +1,24 @@ import * as React from 'react'; import { cn } from '@/lib/utils'; -export interface InputProps extends React.InputHTMLAttributes {} +export type InputProps = React.InputHTMLAttributes; const Input = React.forwardRef( - ({ className, type, ...props }, ref) => { - return ( - - ); - } + ({ className, type, ...props }, ref) => ( + + ) ); Input.displayName = 'Input'; diff --git a/frontend/src/components/ui/page-header.tsx b/frontend/src/components/ui/page-header.tsx new file mode 100644 index 0000000..976dcb0 --- /dev/null +++ b/frontend/src/components/ui/page-header.tsx @@ -0,0 +1,28 @@ +import * as React from 'react'; +import { cn } from '@/lib/utils'; + +interface PageHeaderProps extends React.HTMLAttributes { + title: string; + subtitle?: React.ReactNode; + actions?: React.ReactNode; +} + +export function PageHeader({ title, subtitle, actions, className, ...props }: PageHeaderProps) { + return ( +
+
+

{title}

+ {subtitle && ( +
{subtitle}
+ )} +
+ {actions &&
{actions}
} +
+ ); +} diff --git a/frontend/src/components/ui/tabs.tsx b/frontend/src/components/ui/tabs.tsx index a8d8b74..4ef15b7 100644 --- a/frontend/src/components/ui/tabs.tsx +++ b/frontend/src/components/ui/tabs.tsx @@ -53,7 +53,7 @@ const TabsList = React.forwardRef( ({ className, value: triggerValue, onClick, ...props }, ref) => { const { value, onValueChange } = useTabs(); const isActive = value === triggerValue; - return ( + {maskable && ( + + )} + +

+
+ ); +} + export function AccessControl() { const [keys, setKeys] = useState([]); const [searchQuery, setSearchQuery] = useState(''); @@ -363,9 +439,7 @@ export function AccessControl() { return (
-
+
@@ -488,7 +562,7 @@ export function AccessControl() {
- + {key.status} @@ -496,12 +570,12 @@ export function AccessControl() {
{key.permissions.slice(0, 2).map((perm, idx) => ( - + {perm.bucketName}: {formatPermissions(perm)} ))} {key.permissions.length > 2 && ( - + +{key.permissions.length - 2} more )} @@ -566,123 +640,82 @@ export function AccessControl() {
{/* Create Key Dialog */} - - + + {newlyCreatedKey ? ( - // Success state - show the secret key <> - API Key Created Successfully - - Save your secret access key now. You won't be able to see it again. - + } tone="primary" size="md" /> +
+ API key created + + Copy your secret access key now — this is the only time it will be shown. + +
-
-
- -
{newlyCreatedKey.name}
+ +
+ +
{newlyCreatedKey.name}
-
- -
- { - navigator.clipboard.writeText(newlyCreatedKey.accessKeyId); - toast.success('Access Key ID copied to clipboard'); - }} - > - {newlyCreatedKey.accessKeyId} - - + + +
+ +
+

+ Save this key now +

+

+ The secret access key cannot be retrieved again. If lost, you'll need to create a new key. +

-
- -
- { - if (newlyCreatedKey.secretKey) { - navigator.clipboard.writeText(newlyCreatedKey.secretKey); - toast.success('Secret Access Key copied to clipboard'); - } - }} - > - {newlyCreatedKey.secretKey} - - -
-
-
-
- -
-

- Important: Save This Key Now -

-

- This is the only time you'll see the secret access key. Make sure to copy and save it securely. - If you lose it, you'll need to create a new key. -

-
-
-
-
+ - + ) : ( - // Creation form <> - Create API Key - - Create a new API key with optional bucket permissions - + } tone="primary" size="md" /> +
+ Create API key + + Generate a new access key pair. You can optionally grant bucket permissions in the same step. + +
-
-
- + +
+ setNewKeyName(e.target.value)} + autoFocus /> -

- A friendly name to identify this API key +

+ A friendly name to identify this key in the console.

- {/* Optional: Grant permissions during creation */} -
-
{/* Key Details Dialog */} - - + + - API Key Details - - View and manage your API key credentials and permissions - + } tone="primary" size="md" /> +
+ {viewingKey?.name || 'API key'} + View credentials and bucket permissions for this key. +
-
- {/* Key Name and Status */} -
-
- -
{viewingKey?.name}
-
-
- -
- - {viewingKey?.status} - -
-
-
- - {/* Access Key ID */} -
- + + {/* Meta strip */} +
- { - if (viewingKey?.accessKeyId) { - navigator.clipboard.writeText(viewingKey.accessKeyId); - setCopiedAccessKeyId(true); - setTimeout(() => setCopiedAccessKeyId(false), 2000); - toast.success('Access Key ID copied to clipboard'); - } - }} - > - {viewingKey?.accessKeyId} - - + + Status + + + {viewingKey?.status} +
-
- - {/* Secret Access Key */} -
- -
- {isLoadingDetailsSecretKey ? ( -
- - Loading secret key... -
- ) : ( - <> - { - if (detailsSecretKey) { - navigator.clipboard.writeText(detailsSecretKey); - setCopiedSecretKey(true); - setTimeout(() => setCopiedSecretKey(false), 2000); - toast.success('Secret Access Key copied to clipboard'); - } - }} - > - {'•'.repeat(40)} - - - - )} -
-
- - {/* Metadata */} -
-
- -
{viewingKey && formatDate(viewingKey.createdAt)}
+
+ + Created + + {viewingKey && formatDate(viewingKey.createdAt)} +
{viewingKey?.expiration && ( -
- -
{formatDate(viewingKey.expiration)}
+
+ + Expires + {formatDate(viewingKey.expiration)}
)}
+ {/* Credentials */} +
+ + +
+ {/* Bucket Permissions */} -
- +
+
+ + {viewingKey && viewingKey.permissions.length > 0 && ( + + {viewingKey.permissions.length} bucket + {viewingKey.permissions.length === 1 ? '' : 's'} + + )} +
{viewingKey && viewingKey.permissions.length > 0 ? ( -
+
{viewingKey.permissions.map((perm, idx) => ( -
-
-
{perm.bucketName}
-
- {formatPermissions(perm)} -
+
+
+ + {perm.bucketName}
-
- {perm.read && ( - - Read - - )} - {perm.write && ( - - Write - - )} - {perm.owner && ( - - Owner - - )} +
+ {perm.read && Read} + {perm.write && Write} + {perm.owner && Owner}
))}
) : ( -
-

- This key has no bucket permissions yet +

+

+ No bucket permissions yet.

)}
-
- + + - +
@@ -1266,13 +1234,13 @@ export function AccessControl() {

{bucketPermission.read && ( - Read + Read )} {bucketPermission.write && ( - Write + Write )} {bucketPermission.owner && ( - Owner + Owner )}

@@ -1302,9 +1270,9 @@ export function AccessControl() {

{perm.bucketName}
- {perm.read && R} - {perm.write && W} - {perm.owner && O} + {perm.read && R} + {perm.write && W} + {perm.owner && O}
))} @@ -1314,7 +1282,7 @@ export function AccessControl() { )}
- +
+
+ + +
+
+ +

Granted

+
+ {granted.length === 0 ? ( +
+ } + tone="neutral" + title="No access granted" + description="Grant at least one access key to make this bucket usable." + /> +
+ ) : ( +
    + {granted.map(({ key, perm }) => ( +
  • +
    +
    {key.name}
    +
    + {key.accessKeyId} +
    +
    +
    + {perm!.read && Read} + {perm!.write && Write} + {perm!.owner && Owner} +
    +
  • + ))} +
+ )} +
+ + ); +} + +function PermRow({ + id, + checked, + onChange, + title, + description, +}: { + id: string; + checked: boolean; + onChange: (v: boolean) => void; + title: string; + description: string; +}) { + return ( +
+ onChange(c as boolean)} /> +
+ +

{description}

+
+
+ ); +} diff --git a/frontend/src/pages/BucketSettings.tsx b/frontend/src/pages/BucketSettings.tsx new file mode 100644 index 0000000..781c8d2 --- /dev/null +++ b/frontend/src/pages/BucketSettings.tsx @@ -0,0 +1,139 @@ +import { useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { AlertTriangle, Info } from 'lucide-react'; +import { useBuckets, useDeleteBucket } from '@/hooks/useApi'; +import { Button } from '@/components/ui/button'; +import { Badge } from '@/components/ui/badge'; +import { EmptyState } from '@/components/ui/empty-state'; +import { DangerousConfirmDialog } from '@/components/ui/dangerous-confirm-dialog'; +import { toast } from 'sonner'; + +function formatBytes(n?: number) { + if (n == null) return '—'; + if (n < 1024) return `${n} B`; + const units = ['KB', 'MB', 'GB', 'TB']; + let v = n / 1024; + for (const u of units) { + if (v < 1024) return `${v.toFixed(v >= 10 ? 0 : 1)} ${u}`; + v /= 1024; + } + return `${v.toFixed(0)} PB`; +} + +function formatDate(iso?: string) { + if (!iso) return '—'; + try { + return new Date(iso).toLocaleString(); + } catch { + return iso; + } +} + +export function BucketSettings() { + const { bucketName = '' } = useParams<{ bucketName: string }>(); + const navigate = useNavigate(); + const { data: buckets = [], isLoading } = useBuckets(); + const bucket = buckets.find((b) => b.name === bucketName); + const deleteMutation = useDeleteBucket(); + + const [deleteOpen, setDeleteOpen] = useState(false); + const [deleting, setDeleting] = useState(false); + + if (isLoading) { + return
Loading…
; + } + if (!bucket) { + return ( +
+ } + tone="neutral" + title="Bucket not found" + description="The bucket you're looking for doesn't exist or you don't have access." + /> +
+ ); + } + + const confirmDelete = async () => { + setDeleting(true); + try { + await deleteMutation.mutateAsync(bucket.name); + toast.success('Bucket deleted'); + navigate('/buckets'); + } catch (err) { + toast.error(err instanceof Error ? err.message : 'Delete failed'); + setDeleting(false); + } + }; + + return ( +
+ {/* Info */} +
+
+ +

Bucket info

+
+
+ {bucket.name}} /> + + + + + + {bucket.websiteAccess ? 'Enabled' : 'Disabled'} + + } + /> +
+
+ + {/* Danger zone */} +
+
+

Danger zone

+

+ Destructive actions for this bucket. +

+
+
+
+
Delete bucket
+
+ All objects in this bucket will be permanently removed. +
+
+ +
+
+ + { + if (!o && !deleting) setDeleteOpen(false); + }} + title={`Delete bucket "${bucket.name}"?`} + description="This action cannot be undone." + confirmationText={bucket.name} + confirmLabel="Delete bucket" + loading={deleting} + onConfirm={confirmDelete} + /> +
+ ); +} + +function Field({ label, value }: { label: string; value: React.ReactNode }) { + return ( +
+
{label}
+
{value}
+
+ ); +} diff --git a/frontend/src/pages/BucketWebsite.tsx b/frontend/src/pages/BucketWebsite.tsx new file mode 100644 index 0000000..e174614 --- /dev/null +++ b/frontend/src/pages/BucketWebsite.tsx @@ -0,0 +1,145 @@ +import { useEffect, useState } from 'react'; +import { useParams } from 'react-router-dom'; +import { useQueryClient } from '@tanstack/react-query'; +import { AlertTriangle, Globe } from 'lucide-react'; +import { useBuckets } from '@/hooks/useApi'; +import { bucketsApi } from '@/lib/api'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Switch } from '@/components/ui/switch'; +import { Badge } from '@/components/ui/badge'; +import { EmptyState } from '@/components/ui/empty-state'; +import { toast } from 'sonner'; + +export function BucketWebsite() { + const { bucketName = '' } = useParams<{ bucketName: string }>(); + const queryClient = useQueryClient(); + const { data: buckets = [], isLoading } = useBuckets(); + const bucket = buckets.find((b) => b.name === bucketName); + + const [enabled, setEnabled] = useState(false); + const [indexDocument, setIndexDocument] = useState('index.html'); + const [errorDocument, setErrorDocument] = useState(''); + const [saving, setSaving] = useState(false); + + // Sync local form state whenever the underlying bucket changes. + useEffect(() => { + if (!bucket) return; + setEnabled(bucket.websiteAccess); + setIndexDocument(bucket.websiteConfig?.indexDocument ?? 'index.html'); + setErrorDocument(bucket.websiteConfig?.errorDocument ?? ''); + }, [bucket?.name, bucket?.websiteAccess, bucket?.websiteConfig?.indexDocument, bucket?.websiteConfig?.errorDocument]); + + if (isLoading) { + return
Loading…
; + } + if (!bucket) { + return ( +
+ } + tone="neutral" + title="Bucket not found" + description="The bucket you're looking for doesn't exist or you don't have access." + /> +
+ ); + } + + const wasEnabled = bucket.websiteAccess; + const disabling = wasEnabled && !enabled; + + const handleReset = () => { + setEnabled(bucket.websiteAccess); + setIndexDocument(bucket.websiteConfig?.indexDocument ?? 'index.html'); + setErrorDocument(bucket.websiteConfig?.errorDocument ?? ''); + }; + + const handleSave = async () => { + setSaving(true); + try { + await bucketsApi.updateBucketWebsite(bucketName, { + enabled, + indexDocument: enabled ? indexDocument : undefined, + errorDocument: enabled && errorDocument ? errorDocument : undefined, + }); + await queryClient.invalidateQueries({ queryKey: ['buckets'] }); + toast.success(disabling ? 'Website disabled' : 'Website configuration updated'); + } catch (err) { + toast.error(err instanceof Error ? err.message : 'Save failed'); + } finally { + setSaving(false); + } + }; + + const saveDisabled = saving || (enabled && !indexDocument); + + return ( +
+
+
+ +

Static website hosting

+
+ +
+
+
+

Website access

+

+ Allow public HTTP access to bucket objects +

+
+
+ + {enabled ? 'Enabled' : 'Disabled'} + + +
+
+ + {enabled && ( +
+
+ + setIndexDocument(e.target.value)} + placeholder="index.html" + /> +

+ The file served when a directory is requested (e.g. index.html) +

+
+ +
+ + setErrorDocument(e.target.value)} + placeholder="404.html (optional)" + /> +

+ The file served when an object is not found (optional) +

+
+
+ )} +
+ +
+ + +
+
+
+ ); +} diff --git a/frontend/src/pages/Buckets.tsx b/frontend/src/pages/Buckets.tsx index 9e66dba..d35f308 100644 --- a/frontend/src/pages/Buckets.tsx +++ b/frontend/src/pages/Buckets.tsx @@ -1,289 +1,90 @@ -import { useState, useEffect } from 'react'; -import { useQueryClient } from '@tanstack/react-query'; -import { useSearchParams } from 'react-router-dom'; -import { Header } from '@/components/layout/header'; -import { useBuckets, useCreateBucket, useDeleteBucket, useGrantBucketPermission } from '@/hooks/useApi'; -import { useBucketObjects } from '@/hooks/useBucketObjects'; +import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Plus } from 'lucide-react'; +import { useBuckets, useCreateBucket, useDeleteBucket } from '@/hooks/useApi'; import { BucketListView } from '@/components/buckets/BucketListView'; -import { ObjectBrowserView } from '@/components/buckets/ObjectBrowserView'; import { CreateBucketDialog } from '@/components/buckets/CreateBucketDialog'; -import { DeleteBucketDialog } from '@/components/buckets/DeleteBucketDialog'; -import { BucketSettingsDialog } from '@/components/buckets/BucketSettingsDialog'; -import { BucketWebsiteDialog } from '@/components/buckets/BucketWebsiteDialog'; +import { DangerousConfirmDialog } from '@/components/ui/dangerous-confirm-dialog'; +import { PageHeader } from '@/components/ui/page-header'; +import { Button } from '@/components/ui/button'; import type { Bucket } from '@/types'; import { toast } from 'sonner'; -import { bucketsApi } from '@/lib/api'; export function Buckets() { - const [searchParams, setSearchParams] = useSearchParams(); - - // Bucket state + const navigate = useNavigate(); const [searchQuery, setSearchQuery] = useState(''); - const [createDialogOpen, setCreateDialogOpen] = useState(false); - const [deleteBucketDialogOpen, setDeleteBucketDialogOpen] = useState(false); - const [selectedBucket, setSelectedBucket] = useState(null); - const [settingsDialogOpen, setSettingsDialogOpen] = useState(false); - const [settingsBucket, setSettingsBucket] = useState(null); - const [websiteDialogOpen, setWebsiteDialogOpen] = useState(false); - const [websiteBucket, setWebsiteBucket] = useState(null); + const [createOpen, setCreateOpen] = useState(false); + const [deleteTarget, setDeleteTarget] = useState(null); + const [deleting, setDeleting] = useState(false); - // Object browser state - initialize from URL params - const [viewingBucket, setViewingBucket] = useState(searchParams.get('bucket')); - const [currentPath, setCurrentPath] = useState(searchParams.get('prefix') || ''); - const [objectSearchQuery, setObjectSearchQuery] = useState(''); - const [initialPageToken, setInitialPageToken] = useState( - searchParams.get('page') || undefined - ); - const [initialItemsPerPage, setInitialItemsPerPage] = useState( - parseInt(searchParams.get('limit') || '25', 10) - ); + const { data: buckets = [], isLoading } = useBuckets(); + const createMutation = useCreateBucket(); + const deleteMutation = useDeleteBucket(); - // Sync URL params with state on mount and when URL changes - useEffect(() => { - const bucketParam = searchParams.get('bucket'); - const prefixParam = searchParams.get('prefix') || ''; - const pageParam = searchParams.get('page') || undefined; - const limitParam = parseInt(searchParams.get('limit') || '25', 10); - - if (bucketParam !== viewingBucket) { - setViewingBucket(bucketParam); - } - if (prefixParam !== currentPath) { - setCurrentPath(prefixParam); - } - setInitialPageToken(pageParam); - setInitialItemsPerPage(limitParam); - }, [searchParams]); - - // Custom hooks - const queryClient = useQueryClient(); - const { data: buckets = [], isLoading: bucketsLoading } = useBuckets(); - const createBucketMutation = useCreateBucket(); - const deleteBucketMutation = useDeleteBucket(); - const grantPermissionMutation = useGrantBucketPermission(); - const { - objects, - isLoading: objectsLoading, - isRefreshing, - isNavigating, - isTruncated, - nextContinuationToken, - itemsPerPage, - setItemsPerPage, - uploadFiles, - uploadTasks, - deleteObject, - deleteMultipleObjects, - createDirectory, - fetchObjects - } = useBucketObjects( - viewingBucket, - currentPath - ); - - const handleViewBucket = (bucketName: string) => { - setViewingBucket(bucketName); - setCurrentPath(''); - setObjectSearchQuery(''); - setSearchParams({ bucket: bucketName }); - }; - - const handleBackToBuckets = () => { - setViewingBucket(null); - setCurrentPath(''); - setObjectSearchQuery(''); - setSearchParams({}); - }; - - const handleNavigateToFolder = (path: string) => { - setCurrentPath(path); - if (viewingBucket) { - const params: Record = { bucket: viewingBucket }; - if (path) { - params.prefix = path; - } - // Reset pagination when navigating to a new folder - setSearchParams(params); - } - }; - - const handlePageChange = (token?: string) => { - fetchObjects(token); - // Update URL with page token - if (viewingBucket) { - const params: Record = { bucket: viewingBucket }; - if (currentPath) { - params.prefix = currentPath; - } - if (token) { - params.page = token; - } - if (itemsPerPage !== 25) { - params.limit = itemsPerPage.toString(); - } - setSearchParams(params); - } - }; - - const handleItemsPerPageChange = (count: number) => { - setItemsPerPage(count); - // Update URL with new limit - if (viewingBucket) { - const params: Record = { bucket: viewingBucket }; - if (currentPath) { - params.prefix = currentPath; - } - if (count !== 25) { - params.limit = count.toString(); - } - setSearchParams(params); - } - }; - - const handleOpenSettings = (bucket: Bucket) => { - setSettingsBucket(bucket); - setSettingsDialogOpen(true); - }; - - const handleOpenWebsiteSettings = (bucket: Bucket) => { - setWebsiteBucket(bucket); - setWebsiteDialogOpen(true); - }; - - const handleSaveWebsite = async ( - bucketName: string, - payload: { enabled: boolean; indexDocument?: string; errorDocument?: string } - ): Promise => { - try { - await bucketsApi.updateBucketWebsite(bucketName, payload); - queryClient.invalidateQueries({ queryKey: ['buckets'] }); - toast.success('Website configuration updated'); - return true; - } catch { - return false; - } - }; - - const handleRefreshObjects = async () => { - if (isRefreshing) return; - try { - await fetchObjects(undefined, true); - toast.success('Objects refreshed successfully'); - } catch (error) { - console.error('Refresh error:', error); - } - }; - - // Wrapper functions for mutations to match dialog APIs const createBucket = async (name: string, region?: string) => { try { - await createBucketMutation.mutateAsync({ name, region }); + await createMutation.mutateAsync({ name, region }); + toast.success(`Bucket "${name}" created`); return true; - } catch (error) { + } catch (err) { + toast.error(err instanceof Error ? err.message : 'Create failed'); return false; } }; - const deleteBucket = async (name: string) => { + const confirmDelete = async () => { + if (!deleteTarget) return; + setDeleting(true); try { - await deleteBucketMutation.mutateAsync(name); - return true; - } catch (error) { - return false; + await deleteMutation.mutateAsync(deleteTarget.name); + toast.success('Bucket deleted'); + setDeleteTarget(null); + } catch (err) { + toast.error(err instanceof Error ? err.message : 'Delete failed'); + } finally { + setDeleting(false); } }; - const grantPermission = async ( - bucketName: string, - accessKeyId: string, - permissions: { read: boolean; write: boolean; owner: boolean } - ) => { - try { - await grantPermissionMutation.mutateAsync({ bucketName, accessKeyId, permissions }); - return true; - } catch (error) { - return false; - } - }; - - // If viewing a bucket's objects, show the object browser view - if (viewingBucket) { - return ( - - ); - } - - // Default view: show buckets list return (
-
+ setCreateOpen(true)}> + Create bucket + + } + />
setCreateDialogOpen(true)} - onDeleteBucket={(bucket) => { - setSelectedBucket(bucket); - setDeleteBucketDialogOpen(true); - }} + onViewBucket={(name) => navigate(`/buckets/${name}/objects`)} + onOpenSettings={(b) => navigate(`/buckets/${b.name}/settings`)} + onWebsiteSettings={(b) => navigate(`/buckets/${b.name}/website`)} + onDeleteBucket={(b) => setDeleteTarget(b)} />
- {/* Dialogs */} - - - - - !o && setDeleteTarget(null)} + title={deleteTarget ? `Delete bucket "${deleteTarget.name}"?` : ''} + description="All objects in this bucket will be permanently removed." + confirmationText={deleteTarget?.name ?? ''} + confirmLabel="Delete bucket" + loading={deleting} + onConfirm={confirmDelete} />
); diff --git a/frontend/src/pages/Cluster.tsx b/frontend/src/pages/Cluster.tsx index 4a52ce3..9693306 100644 --- a/frontend/src/pages/Cluster.tsx +++ b/frontend/src/pages/Cluster.tsx @@ -1,5 +1,5 @@ import {Card, CardContent, CardDescription, CardHeader, CardTitle} from '@/components/ui/card'; -import {Header} from '@/components/layout/header'; +import {PageHeader} from '@/components/ui/page-header'; import {formatBytes} from '@/lib/file-utils'; import {Activity, AlertCircle, CheckCircle2, Clock, Cpu, Database, Info, Network, Server, XCircle,} from 'lucide-react'; import {useQuery} from '@tanstack/react-query'; @@ -83,7 +83,7 @@ export function Cluster() { if (isLoading) { return (
-
+
@@ -96,7 +96,7 @@ export function Cluster() { return (
-
+
{/* Cluster Health Overview */}
@@ -215,7 +215,7 @@ export function Cluster() {
Status
- + {nodeStatus.label}
@@ -393,7 +393,7 @@ export function Cluster() {
Garage Features
{(info as LocalNodeInfo).garageFeatures!.map((feature) => ( - + {feature} ))} diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx index acd5730..18a61ea 100644 --- a/frontend/src/pages/Dashboard.tsx +++ b/frontend/src/pages/Dashboard.tsx @@ -1,244 +1,237 @@ -import {Card, CardContent, CardDescription, CardHeader, CardTitle} from '@/components/ui/card'; -import {Header} from '@/components/layout/header'; -import {formatBytes} from '@/lib/file-utils'; -import {AlertCircle, Database, FolderOpen, HardDrive, Server, Zap} from 'lucide-react'; -import {BucketUsageChart} from '@/components/charts/BucketUsageChart'; -import {useDashboardData} from '@/hooks/useApi'; -import type {ClusterHealth} from '@/types'; +import { AlertCircle, Database, FolderOpen, HardDrive, Server, Zap } from 'lucide-react'; +import { PageHeader } from '@/components/ui/page-header'; +import { IconTile } from '@/components/ui/icon-tile'; +import { EmptyState } from '@/components/ui/empty-state'; +import { BucketUsageChart } from '@/components/charts/BucketUsageChart'; +import { useDashboardData } from '@/hooks/useApi'; +import { formatBytes } from '@/lib/file-utils'; +import type { ClusterHealth } from '@/types'; + +type StatTone = 'primary' | 'destructive' | 'neutral'; +type HealthLabel = 'Healthy' | 'Degraded' | 'Unhealthy' | 'Unknown'; + +function deriveHealth(health: ClusterHealth | null): { label: HealthLabel; tone: StatTone } { + if (!health) return { label: 'Unknown', tone: 'neutral' }; + if ( + health.storageNodesUp === health.storageNodes && + health.partitionsAllOk === health.partitions && + health.connectedNodes === health.knownNodes + ) return { label: 'Healthy', tone: 'primary' }; + if (health.storageNodesUp > 0 && health.partitionsQuorum > 0) return { label: 'Degraded', tone: 'primary' }; + return { label: 'Unhealthy', tone: 'destructive' }; +} export function Dashboard() { const { metrics: metricsQuery, buckets: bucketsQuery, health: healthQuery, isLoading } = useDashboardData(); - const metrics = metricsQuery.data; - const buckets = bucketsQuery.data || []; - const clusterHealth = healthQuery.data; - - const getHealthStatus = (health: ClusterHealth | null) => { - if (!health) return { color: 'text-gray-500', label: 'Unknown', icon: AlertCircle }; - if ( - health.storageNodesUp === health.storageNodes && - health.partitionsAllOk === health.partitions && - health.connectedNodes === health.knownNodes - ) { - return { color: 'text-green-500', label: 'Healthy', icon: Zap }; - } - if ( - health.storageNodesUp > 0 && - health.partitionsQuorum > 0 - ) { - return { color: 'text-yellow-500', label: 'Degraded', icon: AlertCircle }; - } - return { color: 'text-red-500', label: 'Unhealthy', icon: AlertCircle }; - }; - - const healthStatus = getHealthStatus(clusterHealth ?? null); - - if (isLoading) { - return ( -
-
-
-
-
-

Loading dashboard...

-
-
-
- ); - } + const buckets = bucketsQuery.data ?? []; + const clusterHealth = healthQuery.data ?? null; + const health = deriveHealth(clusterHealth); return (
-
-
- {/* Top Stats Grid */} -
- - - Total Storage - - - -
- {metrics ? formatBytes(metrics.totalSize) : '---'} -
-

- Across {metrics?.bucketCount || 0} buckets -

-
-
+ - - - Total Objects - - - -
- {metrics?.objectCount.toLocaleString() || '---'} -
-

- Files and folders -

-
-
- - - - Buckets - - - -
{metrics?.bucketCount || '---'}
-

- Active storage buckets -

-
-
+ {isLoading ? ( +
+
+
+

Loading dashboard…

+
+ ) : ( +
+ {/* KPI row */} +
+ } + /> + } + /> + } + /> + : } + iconTone={health.tone} + /> +
- {/* Cluster Status */} -
- - - Cluster Status - - - -
-
- {healthStatus.label} -
-
-

- {clusterHealth?.connectedNodes || 0}/{clusterHealth?.knownNodes || 0} nodes connected -

-
-
+ {/* Cluster row */} +
+ } + /> + } + /> + } + /> +
- - - Storage Nodes - - - -
- {clusterHealth?.storageNodesUp || 0}/{clusterHealth?.storageNodes || 0} -
-

- Healthy storage nodes -

-
-
- - - - Partitions - - - -
- {clusterHealth?.partitionsAllOk || 0}/{clusterHealth?.partitions || 0} -
-

- Healthy partitions -

-
-
-
- - {/* Charts Row 1 */} -
- {/* Bucket Usage Chart */} - - - Storage Usage by Bucket - Distribution of storage across buckets - - + {/* Charts */} +
+ {metrics?.usageByBucket && metrics.usageByBucket.length > 0 ? ( ) : ( -
No data available
+
No data available
)} - -
+ - {/* Bucket Details Table */} - - - Storage Usage by Bucket (Table) - Detailed breakdown of storage across all buckets - - -
- {metrics?.usageByBucket && metrics.usageByBucket.length > 0 ? ( - metrics.usageByBucket.map((bucket) => ( -
-
- {bucket.bucketName} -
- - {bucket.objectCount.toLocaleString()} objects - - {formatBytes(bucket.size)} - - {bucket.percentage.toFixed(1)}% - -
-
-
-
-
+ + {metrics?.usageByBucket && metrics.usageByBucket.length > 0 ? ( +
+ {metrics.usageByBucket.map((bucket) => ( +
+
+ {bucket.bucketName} +
+ {bucket.objectCount.toLocaleString()} objects + {formatBytes(bucket.size)} + {bucket.percentage.toFixed(1)}%
- )) - ) : ( -
No buckets available
- )} -
- - -
- - {/* Recent Buckets */} - - - Recent Buckets - Your most recently created buckets - - -
- {buckets.slice(0, 5).map((bucket) => ( -
-
-
- +
+
+
+
-
-

{bucket.name}

-

+ ))} +

+ ) : ( +
No buckets available
+ )} + +
+ + {/* Recent buckets */} + + {buckets.length === 0 ? ( + } + title="No buckets yet" + description="Create your first bucket from the Buckets page to start storing objects." + tone="neutral" + /> + ) : ( +
    + {buckets.slice(0, 5).map((bucket) => ( +
  • + } tone="primary" size="md" /> +
    +

    {bucket.name}

    +

    Created {new Date(bucket.creationDate).toLocaleDateString()}

    -
-
-

{bucket.objectCount?.toLocaleString()} objects

-

- {bucket.size ? formatBytes(bucket.size) : '---'} -

-
-
- ))} -
- -
-
+
+

{bucket.objectCount?.toLocaleString() ?? '—'} objects

+

+ {bucket.size ? formatBytes(bucket.size) : '—'} +

+
+ + ))} + + )} + +
+ )}
); } + +function StatCard({ + label, + value, + sub, + icon, + iconTone = 'primary', + valueTone = 'neutral', +}: { + label: string; + value: string; + sub?: string; + icon: React.ReactNode; + iconTone?: StatTone; + valueTone?: StatTone; +}) { + const valueColor = + valueTone === 'primary' + ? 'text-[var(--primary)]' + : valueTone === 'destructive' + ? 'text-[var(--destructive)]' + : 'text-[var(--foreground)]'; + return ( +
+
+ + {label} + + +
+
+ {value} +
+ {sub &&
{sub}
} +
+ ); +} + +function Card({ + title, + description, + children, +}: { + title: string; + description?: string; + children: React.ReactNode; +}) { + return ( +
+
+

{title}

+ {description &&

{description}

} +
+
{children}
+
+ ); +} diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js index 92408a9..c4bbd50 100644 --- a/frontend/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -7,6 +7,10 @@ export default { ], theme: { extend: { + fontFamily: { + sans: ['Geist Sans', '-apple-system', 'BlinkMacSystemFont', '"Segoe UI"', 'system-ui', 'sans-serif'], + mono: ['Geist Mono', 'ui-monospace', '"SF Mono"', 'Menlo', 'Consolas', 'monospace'], + }, colors: { border: 'var(--border)', input: 'var(--input)', @@ -16,6 +20,8 @@ export default { primary: { DEFAULT: 'var(--primary)', foreground: 'var(--primary-foreground)', + soft: 'var(--accent-primary-soft)', + softBorder: 'var(--accent-primary-border)', }, secondary: { DEFAULT: 'var(--secondary)', @@ -24,6 +30,11 @@ export default { destructive: { DEFAULT: 'var(--destructive)', foreground: 'var(--destructive-foreground)', + soft: 'var(--danger-soft)', + softBorder: 'var(--danger-border)', + }, + success: { + soft: 'var(--success-soft)', }, muted: { DEFAULT: 'var(--muted)', @@ -41,6 +52,7 @@ export default { DEFAULT: 'var(--card)', foreground: 'var(--card-foreground)', }, + sunken: 'var(--surface-sunken)', }, borderRadius: { lg: 'var(--radius)',