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={
- }
- onClick={() => testFire.mutate()}
- loading={testFire.isPending}>
- {t('alerts.test')}
-
+
+ }
+ onClick={() => testFire.mutate()}
+ loading={testFire.isPending}
+ disabled={isViewer}>
+ {t('alerts.test')}
+
+
}
/>
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={
- }>
- {t('diag.run')}
-
+
+ }>
+ {t('diag.run')}
+
+
}
>
{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 }} />