diff --git a/VERSION b/VERSION index 99f6a00..9a03ea6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.92 +1.1.93 diff --git a/cmd/edgeguard-api/main.go b/cmd/edgeguard-api/main.go index cdcafae..9801958 100644 --- a/cmd/edgeguard-api/main.go +++ b/cmd/edgeguard-api/main.go @@ -60,7 +60,7 @@ import ( usersvc "git.netcell-it.de/projekte/edgeguard-native/internal/services/users" ) -var version = "1.1.92" +var version = "1.1.93" func main() { addr := os.Getenv("EDGEGUARD_API_ADDR") diff --git a/cmd/edgeguard-ctl/main.go b/cmd/edgeguard-ctl/main.go index 4723801..ec313c3 100644 --- a/cmd/edgeguard-ctl/main.go +++ b/cmd/edgeguard-ctl/main.go @@ -11,7 +11,7 @@ import ( "git.netcell-it.de/projekte/edgeguard-native/internal/services/setup" ) -var version = "1.1.92" +var version = "1.1.93" const usage = `edgeguard-ctl — EdgeGuard CLI diff --git a/cmd/edgeguard-scheduler/main.go b/cmd/edgeguard-scheduler/main.go index a041ed9..b9561c9 100644 --- a/cmd/edgeguard-scheduler/main.go +++ b/cmd/edgeguard-scheduler/main.go @@ -35,7 +35,7 @@ import ( "git.netcell-it.de/projekte/edgeguard-native/internal/services/tlscerts" ) -var version = "1.1.92" +var version = "1.1.93" const ( // renewTickInterval — how often we re-evaluate expiring certs. diff --git a/management-ui/src/pages/Alerts/index.tsx b/management-ui/src/pages/Alerts/index.tsx index dd55ac2..ef50f20 100644 --- a/management-ui/src/pages/Alerts/index.tsx +++ b/management-ui/src/pages/Alerts/index.tsx @@ -13,6 +13,7 @@ import dayjs from 'dayjs' import apiClient, { isEnvelope } from '../../api/client' import PageHeader from '../../components/PageHeader' import EmptyState from '../../components/EmptyState' +import { useAuthStore } from '../../stores/auth' const { Text } = Typography @@ -66,6 +67,7 @@ function sevTag(s: AlertEvent['severity']) { export default function AlertsPage() { const { t } = useTranslation() const qc = useQueryClient() + const isViewer = useAuthStore((s) => s.user?.role) === 'viewer' const channels = useQuery({ queryKey: ['alerts', 'channels'], @@ -172,6 +174,7 @@ export default function AlertsPage() { quickToggle.mutate({ id: r.id, row: r, checked })} /> @@ -181,23 +184,29 @@ export default function AlertsPage() { title: t('common.actions'), key: 'a', width: 180, render: (_, r) => ( - - del.mutate(r.id)}> - - + + + + {isViewer + ? + : del.mutate(r.id)}> + + + } ), }, @@ -284,10 +293,12 @@ export default function AlertsPage() { label: t('alerts.tabs.channels'), children: ( } - onClick={openChannelCreate}> - {t('alerts.add')} - + + + }> } onClick={openChannelCreate}> - {t('alerts.add')} - + + + } /> ) }} /> diff --git a/management-ui/src/pages/Backends/index.tsx b/management-ui/src/pages/Backends/index.tsx index 5ee9adf..928180e 100644 --- a/management-ui/src/pages/Backends/index.tsx +++ b/management-ui/src/pages/Backends/index.tsx @@ -14,6 +14,7 @@ import PageHeader from '../../components/PageHeader' import ActionButtons from '../../components/ActionButtons' import apiClient, { isEnvelope } from '../../api/client' +import { useAuthStore } from '../../stores/auth' const { Text } = Typography @@ -119,6 +120,7 @@ export default function BackendsPage() { const { t } = useTranslation() const navigate = useNavigate() const qc = useQueryClient() + const isViewer = useAuthStore((s) => s.user?.role) === 'viewer' const { data, isLoading } = useQuery({ queryKey: ['backends'], queryFn: listBackends }) const { data: domains } = useQuery({ queryKey: ['domains'], queryFn: listDomains }) @@ -286,6 +288,7 @@ export default function BackendsPage() { quickToggle.mutate({ id: row.id, row, checked })} /> @@ -336,9 +339,11 @@ export default function BackendsPage() { rowExpandable: (record) => !!record.id, }} extraActions={ - + + + } emptyContent={ } onClick={openCreate}> - {t('backends.addBackend')} - + + + } /> } @@ -396,6 +403,7 @@ export default function BackendsPage() { function ServerPanel({ backendID }: { backendID: number }) { const { t } = useTranslation() const qc = useQueryClient() + const isViewer = useAuthStore((s) => s.user?.role) === 'viewer' const [open, setOpen] = useState(false) const [editing, setEditing] = useState(null) const [form] = Form.useForm() @@ -462,6 +470,7 @@ function ServerPanel({ backendID }: { backendID: number }) { quickToggle.mutate({ id: row.id, row, checked })} /> @@ -471,17 +480,23 @@ function ServerPanel({ backendID }: { backendID: number }) { title: t('common.actions'), key: 'a', width: 160, render: (_, r) => ( - - del.mutate(r.id)}> - - + + + + {isViewer + ? + : del.mutate(r.id)}> + + + } ), }, @@ -491,13 +506,15 @@ function ServerPanel({ backendID }: { backendID: number }) {
{t('backends.server.intro')} - + + +
s.user?.role) === 'viewer' const [msg, msgCtx] = message.useMessage() const list = useQuery({ @@ -223,30 +225,30 @@ export default function HistoryTab() { disabled={row.status !== 'success'} >{t('backups.download')} - startRestore(row)} - disabled={row.status !== 'success'} - > - - - del.mutate(row.id)} - okButtonProps={{ danger: true }} - > - - + {isViewer + ? + : startRestore(row)} + disabled={row.status !== 'success'} + > + + + } + {isViewer + ? + : del.mutate(row.id)} + okButtonProps={{ danger: true }} + > + + + } ), }, @@ -320,14 +322,17 @@ export default function HistoryTab() { {t('common.refresh')} - + + + diff --git a/management-ui/src/pages/Domains/index.tsx b/management-ui/src/pages/Domains/index.tsx index d352ea4..0925af6 100644 --- a/management-ui/src/pages/Domains/index.tsx +++ b/management-ui/src/pages/Domains/index.tsx @@ -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() { quickToggle.mutate({ id: row.id, row, checked })} /> @@ -322,9 +325,11 @@ export default function DomainsPage() { dataSource={data ?? []} columns={columns} extraActions={ - + + + } emptyContent={ } onClick={openCreate}> - {t('domains.addDomain')} - + + + } /> }