feat: expose MinIO operator console
CI / Typecheck, test & build (push) Successful in 3m4s
CI / Deploy to Cloudflare Workers (push) Successful in 1m33s

This commit is contained in:
2026-09-06 22:57:00 +08:00
parent c03617a6e6
commit e3fcaa4d38
5 changed files with 101 additions and 1 deletions
+71
View File
@@ -0,0 +1,71 @@
import { createFileRoute } from '@tanstack/react-router'
import { useState } from 'react'
import { openInternalSurface } from '@/api/modules/internal-surfaces'
import { PERM, requirePermission } from '@/auth/permissions'
import { PageHeader } from '@/components/page-header'
import { Button } from '@/components/ui/button'
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from '@/components/ui/card'
import { handleApiError } from '@/lib/errors'
export const Route = createFileRoute('/_authed/minio-console')({
beforeLoad: () => requirePermission(PERM.MINIO_CONSOLE_ACCESS),
component: MinioConsolePage,
})
function MinioConsolePage() {
const [busy, setBusy] = useState(false)
const open = async () => {
setBusy(true)
const tab = window.open('about:blank', '_blank')
try {
const res = await openInternalSurface('minio-console')
if (tab) {
tab.opener = null
tab.location.replace(res.data.url)
} else {
window.location.assign(res.data.url)
}
} catch (error) {
tab?.close()
handleApiError(error)
} finally {
setBusy(false)
}
}
return (
<div>
<PageHeader
title="对象存储管理台"
description="在浏览器中检查和管理 MinIO 对象存储"
/>
<Card className="max-w-lg">
<CardHeader>
<CardTitle className="text-base"></CardTitle>
<CardDescription>
60
30
</CardDescription>
</CardHeader>
<CardContent className="space-y-4">
<p className="text-muted-foreground text-sm">
使 MinIO
线访
</p>
<Button onClick={open} disabled={busy}>
{busy ? '正在打开…' : '打开对象存储管理台'}
</Button>
</CardContent>
</Card>
</div>
)
}