From 6e52dc0620ef00fa180e419871d17e2b466a0811 Mon Sep 17 00:00:00 2001 From: Debian Date: Sun, 24 May 2026 12:42:37 +0200 Subject: [PATCH] fix(ui): fehlende onError-Handler + i18n in Backends/Domains/Dashboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Backends: create + del Mutations bekommen onError; 'Backup'-Tag → t() - Domains: create + del Mutations bekommen onError - Dashboard: LicenseChip-Texte ('License OK', 'Trial') in t() überführt; useTranslation() direkt in der Komponente verwendet - en/de: dashboard.licenseOk/licenseTrial/licenseTrialDays ergänzt Co-Authored-By: Claude Sonnet 4.6 --- VERSION | 2 +- cmd/edgeguard-api/main.go | 2 +- cmd/edgeguard-ctl/main.go | 2 +- cmd/edgeguard-scheduler/main.go | 2 +- management-ui/src/i18n/locales/de/common.json | 5 ++++- management-ui/src/i18n/locales/en/common.json | 5 ++++- management-ui/src/pages/Backends/index.tsx | 4 +++- management-ui/src/pages/Dashboard/index.tsx | 12 ++++++++---- management-ui/src/pages/Domains/index.tsx | 2 ++ 9 files changed, 25 insertions(+), 11 deletions(-) diff --git a/VERSION b/VERSION index a1b3d6b..ccc213c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.83 +1.1.84 diff --git a/cmd/edgeguard-api/main.go b/cmd/edgeguard-api/main.go index db6c14b..90182aa 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.83" +var version = "1.1.84" func main() { addr := os.Getenv("EDGEGUARD_API_ADDR") diff --git a/cmd/edgeguard-ctl/main.go b/cmd/edgeguard-ctl/main.go index be8a726..be83705 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.83" +var version = "1.1.84" const usage = `edgeguard-ctl — EdgeGuard CLI diff --git a/cmd/edgeguard-scheduler/main.go b/cmd/edgeguard-scheduler/main.go index 16f093b..c8800bf 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.83" +var version = "1.1.84" const ( // renewTickInterval — how often we re-evaluate expiring certs. diff --git a/management-ui/src/i18n/locales/de/common.json b/management-ui/src/i18n/locales/de/common.json index 23bff95..42f8443 100644 --- a/management-ui/src/i18n/locales/de/common.json +++ b/management-ui/src/i18n/locales/de/common.json @@ -773,7 +773,10 @@ "free": "frei", "conntrack": "Conntrack", "uptime": "Uptime" - } + }, + "licenseOk": "Lizenz OK", + "licenseTrial": "Trial", + "licenseTrialDays": "Trial · {{days}}d" }, "ntp": { "title": "Zeitserver (Chrony)", diff --git a/management-ui/src/i18n/locales/en/common.json b/management-ui/src/i18n/locales/en/common.json index fe4ff81..903c43d 100644 --- a/management-ui/src/i18n/locales/en/common.json +++ b/management-ui/src/i18n/locales/en/common.json @@ -773,7 +773,10 @@ "free": "free", "conntrack": "Conntrack", "uptime": "Uptime" - } + }, + "licenseOk": "License OK", + "licenseTrial": "Trial", + "licenseTrialDays": "Trial · {{days}}d" }, "ntp": { "title": "Time server (Chrony)", diff --git a/management-ui/src/pages/Backends/index.tsx b/management-ui/src/pages/Backends/index.tsx index 3e190e8..5ee9adf 100644 --- a/management-ui/src/pages/Backends/index.tsx +++ b/management-ui/src/pages/Backends/index.tsx @@ -216,11 +216,13 @@ export default function BackendsPage() { void qc.invalidateQueries({ queryKey: ['backends'] }) void qc.invalidateQueries({ queryKey: ['domains'] }) }, + onError: (e: Error) => message.error(e.message), }) const del = useMutation({ mutationFn: async (id: number) => { await apiClient.delete(`/backends/${id}`) }, onSuccess: () => { void qc.invalidateQueries({ queryKey: ['backends'] }) }, + onError: (e: Error) => message.error(e.message), }) const quickToggle = useMutation({ mutationFn: async ({ id, row, checked }: { id: number; row: Backend; checked: boolean }) => { @@ -453,7 +455,7 @@ function ServerPanel({ backendID }: { backendID: number }) { }, { title: t('backends.server.weight'), dataIndex: 'weight', width: 80 }, { title: t('backends.server.backup'), dataIndex: 'backup', - render: (v: boolean) => v ? Backup : '—', width: 100 }, + render: (v: boolean) => v ? {t('backends.server.backup')} : '—', width: 100 }, { title: t('backends.active'), dataIndex: 'active', width: 80, render: (v: boolean, row: BackendServer) => ( diff --git a/management-ui/src/pages/Dashboard/index.tsx b/management-ui/src/pages/Dashboard/index.tsx index c528446..dcee3eb 100644 --- a/management-ui/src/pages/Dashboard/index.tsx +++ b/management-ui/src/pages/Dashboard/index.tsx @@ -713,6 +713,7 @@ function LicenseChip({ data }: { data: { expires_at?: string license_key?: string }}) { + const { t } = useTranslation() const exp = data.valid_until ?? data.expires_at const days = exp ? Math.ceil((new Date(exp).getTime() - Date.now()) / 86_400_000) : null const isTrial = data.type === 'trial' || (!data.license_key && data.status === 'active') @@ -720,12 +721,15 @@ function LicenseChip({ data }: { data: { return {data.status} } if (isTrial) { - if (days != null && days <= 7) return Trial · {days}d - if (days != null && days <= 14) return Trial · {days}d - return {days != null ? `Trial · ${days}d` : 'Trial'} + const trialLabel = days != null + ? t('dashboard.licenseTrialDays', { days }) + : t('dashboard.licenseTrial') + if (days != null && days <= 7) return {trialLabel} + if (days != null && days <= 14) return {trialLabel} + return {trialLabel} } if (data.status === 'active') { - return License OK + return {t('dashboard.licenseOk')} } return null } diff --git a/management-ui/src/pages/Domains/index.tsx b/management-ui/src/pages/Domains/index.tsx index c0ca2b8..d352ea4 100644 --- a/management-ui/src/pages/Domains/index.tsx +++ b/management-ui/src/pages/Domains/index.tsx @@ -167,6 +167,7 @@ export default function DomainsPage() { form.resetFields() void qc.invalidateQueries({ queryKey: ['domains'] }) }, + onError: (e: Error) => message.error(e.message), }) const del = useMutation({ @@ -176,6 +177,7 @@ export default function DomainsPage() { onSuccess: () => { void qc.invalidateQueries({ queryKey: ['domains'] }) }, + onError: (e: Error) => message.error(e.message), }) const quickToggle = useMutation({ mutationFn: async ({ id, row, checked }: { id: number; row: Domain; checked: boolean }) => {