diff --git a/VERSION b/VERSION index 5bd0c3a..c3c6aef 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.126 +1.1.127 diff --git a/cmd/edgeguard-api/main.go b/cmd/edgeguard-api/main.go index a95880d..4f3c19b 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.126" +var version = "1.1.127" func main() { addr := os.Getenv("EDGEGUARD_API_ADDR") diff --git a/cmd/edgeguard-ctl/main.go b/cmd/edgeguard-ctl/main.go index 6818507..8bda143 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.126" +var version = "1.1.127" const usage = `edgeguard-ctl — EdgeGuard CLI diff --git a/cmd/edgeguard-scheduler/main.go b/cmd/edgeguard-scheduler/main.go index 2e8a49b..2615648 100644 --- a/cmd/edgeguard-scheduler/main.go +++ b/cmd/edgeguard-scheduler/main.go @@ -41,7 +41,7 @@ import ( "git.netcell-it.de/projekte/edgeguard-native/internal/services/tlscerts" ) -var version = "1.1.126" +var version = "1.1.127" 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 df5bfe9..9266f99 100644 --- a/management-ui/src/pages/Alerts/index.tsx +++ b/management-ui/src/pages/Alerts/index.tsx @@ -147,7 +147,7 @@ export default function AlertsPage() { }) const quickToggle = useMutation({ mutationFn: async ({ id, row, checked }: { id: number; row: Channel; checked: boolean }) => { - await apiClient.put(`/alerts/channels/${id}`, buildPayload({ ...row, active: checked } as ChannelFormValues)) + await apiClient.put(`/alerts/channels/${id}`, { ...row, active: checked }) }, onSuccess: () => { void qc.invalidateQueries({ queryKey: ['alerts', 'channels'] }) }, onError: (e: Error) => message.error(e.message), @@ -284,11 +284,14 @@ export default function AlertsPage() { subtitle={t('alerts.intro')} extra={ - + + + } /> diff --git a/management-ui/src/pages/Diagnostics/index.tsx b/management-ui/src/pages/Diagnostics/index.tsx index a93bd67..1bf9899 100644 --- a/management-ui/src/pages/Diagnostics/index.tsx +++ b/management-ui/src/pages/Diagnostics/index.tsx @@ -11,6 +11,7 @@ import { useTranslation } from 'react-i18next' import apiClient, { isEnvelope } from '../../api/client' import PageHeader from '../../components/PageHeader' +import { useAuthStore } from '../../stores/auth' const { Text } = Typography @@ -30,7 +31,7 @@ interface DiagResult { // - Eigene Input-Form // - "Ausführen"-Button → POST /diagnostics/ // - Output-Pane mit monospace-Output, Status-Tag (OK/Error), Dauer -function ToolCard({ icon, title, intro, children, result, loading, run }: { +function ToolCard({ icon, title, intro, children, result, loading, run, disabled }: { icon: React.ReactNode title: string intro: string @@ -38,6 +39,7 @@ function ToolCard({ icon, title, intro, children, result, loading, run }: { result: DiagResult | null loading: boolean run: () => void + disabled?: boolean }) { const { t } = useTranslation() return ( @@ -45,10 +47,12 @@ function ToolCard({ icon, title, intro, children, result, loading, run }: { size="small" title={{icon}{title}} extra={ - + + + } > {intro} @@ -84,6 +88,7 @@ function ToolCard({ icon, title, intro, children, result, loading, run }: { export default function DiagnosticsPage() { const { t } = useTranslation() + const isViewer = useAuthStore((s) => s.user?.role) === 'viewer' const [pingTarget, setPingTarget] = useState('1.1.1.1') const [traceTarget, setTraceTarget] = useState('1.1.1.1') @@ -145,11 +150,12 @@ export default function DiagnosticsPage() { result={pingRes} loading={ping.isPending} run={() => ping.mutate()} + disabled={isViewer} > setPingTarget(e.target.value)} - onPressEnter={() => ping.mutate()} /> + onPressEnter={() => { if (!isViewer) ping.mutate() }} /> @@ -160,11 +166,12 @@ export default function DiagnosticsPage() { result={traceRes} loading={trace.isPending} run={() => trace.mutate()} + disabled={isViewer} > setTraceTarget(e.target.value)} - onPressEnter={() => trace.mutate()} /> + onPressEnter={() => { if (!isViewer) trace.mutate() }} /> @@ -175,12 +182,13 @@ export default function DiagnosticsPage() { result={digRes} loading={dig.isPending} run={() => dig.mutate()} + disabled={isViewer} > setDigName(e.target.value)} - onPressEnter={() => dig.mutate()} + onPressEnter={() => { if (!isViewer) dig.mutate() }} style={{ flex: 1 }} /> setCurlUrl(e.target.value)} - onPressEnter={() => curl.mutate()} /> + onPressEnter={() => { if (!isViewer) curl.mutate() }} /> @@ -214,12 +223,13 @@ export default function DiagnosticsPage() { result={tcpRes} loading={tcp.isPending} run={() => tcp.mutate()} + disabled={isViewer} > setTcpHost(e.target.value)} - onPressEnter={() => tcp.mutate()} + onPressEnter={() => { if (!isViewer) tcp.mutate() }} style={{ flex: 1 }} />