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 }) => {