feat(rbac): RBAC-Audit abschliessen — Viewer-Sperre für alle verbleibenden Seiten (1.1.93)

Domains, Backends (inkl. ServerPanel), Backups/History und Alerts:
isViewer-Check + disabled Switches, Tooltip-wrapped Add-Buttons,
bedingte Delete/Restore-Render (Viewer → disabled Tooltip statt Popconfirm).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Debian
2026-05-24 16:39:24 +02:00
parent d3a3b93c1b
commit 0856c2fc10
8 changed files with 132 additions and 90 deletions

View File

@@ -12,6 +12,7 @@ import ActionButtons from '../../components/ActionButtons'
import StatusDot from '../../components/StatusDot'
import apiClient, { isEnvelope } from '../../api/client'
import { useAuthStore } from '../../stores/auth'
interface Domain {
id: number
@@ -95,6 +96,7 @@ export default function DomainsPage() {
const { t } = useTranslation()
const qc = useQueryClient()
const navigate = useNavigate()
const isViewer = useAuthStore((s) => s.user?.role) === 'viewer'
const { data, isLoading } = useQuery({
queryKey: ['domains'],
@@ -234,6 +236,7 @@ export default function DomainsPage() {
<Switch
size="small"
checked={v}
disabled={isViewer}
loading={quickToggle.isPending && quickToggle.variables?.id === row.id}
onChange={(checked) => quickToggle.mutate({ id: row.id, row, checked })}
/>
@@ -322,9 +325,11 @@ export default function DomainsPage() {
dataSource={data ?? []}
columns={columns}
extraActions={
<Button type="primary" icon={<PlusOutlined />} onClick={openCreate}>
{t('domains.addDomain')}
</Button>
<Tooltip title={isViewer ? t('auth.viewerBadge') : undefined}>
<Button type="primary" icon={<PlusOutlined />} onClick={openCreate} disabled={isViewer}>
{t('domains.addDomain')}
</Button>
</Tooltip>
}
emptyContent={
<EmptyState
@@ -332,9 +337,11 @@ export default function DomainsPage() {
title={t('domains.emptyTitle')}
description={t('domains.emptyDesc')}
action={
<Button type="primary" icon={<PlusOutlined />} onClick={openCreate}>
{t('domains.addDomain')}
</Button>
<Tooltip title={isViewer ? t('auth.viewerBadge') : undefined}>
<Button type="primary" icon={<PlusOutlined />} onClick={openCreate} disabled={isViewer}>
{t('domains.addDomain')}
</Button>
</Tooltip>
}
/>
}