fix(settings): Bestätigungsdialog vor Service-Restart + status-dot CSS (v1.1.138)

- Popconfirm vor jedem Restart-Button — kein versehentlicher Neustart mehr
- status-dot inline styles → .status-dot.online/.offline CSS-Klassen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Debian
2026-05-28 17:14:44 +02:00
parent 2a9310e947
commit dc2c1b7471
7 changed files with 27 additions and 19 deletions

View File

@@ -567,6 +567,9 @@
"backupNowFailed": "Backup-Trigger fehlgeschlagen",
"serviceRestartCardTitle": "Dienste neu starten",
"serviceRestartBtn": "Restart",
"serviceRestartConfirmTitle": "{{service}} neu starten?",
"serviceRestartConfirmDesc": "Der Dienst ist während des Neustarts kurz nicht erreichbar.",
"serviceRestartConfirmOk": "Ja, neu starten",
"serviceRestartOk": "{{service}} wurde neu gestartet.",
"serviceRestartFailed": "Neustart von {{service}} fehlgeschlagen",
"serviceRestartHint": "Startet den Dienst via systemctl restart. edgeguard-api und PostgreSQL sind bewusst ausgeschlossen.",

View File

@@ -565,6 +565,9 @@
"backupNowBtn": "Backup now",
"serviceRestartCardTitle": "Restart services",
"serviceRestartBtn": "Restart",
"serviceRestartConfirmTitle": "Restart {{service}}?",
"serviceRestartConfirmDesc": "The service will be briefly unavailable while restarting.",
"serviceRestartConfirmOk": "Yes, restart",
"serviceRestartOk": "{{service}} restarted successfully.",
"serviceRestartFailed": "Restart of {{service}} failed",
"serviceRestartHint": "Restarts the service via systemctl restart. edgeguard-api and PostgreSQL are intentionally excluded.",

View File

@@ -1,4 +1,4 @@
import { Alert, Button, Card, Descriptions, Form, Input, InputNumber, Select, Space, Spin, Switch, Tooltip, Typography, message } from 'antd'
import { Alert, Button, Card, Descriptions, Form, Input, InputNumber, Popconfirm, Select, Space, Spin, Switch, Tooltip, Typography, message } from 'antd'
import { CloudDownloadOutlined, CloudSyncOutlined, CodeOutlined, CopyOutlined, DatabaseOutlined, DownloadOutlined, ExclamationCircleOutlined, FileSearchOutlined, GlobalOutlined, LockOutlined, MailOutlined, ReloadOutlined, SettingOutlined, StopOutlined, ToolOutlined } from '@ant-design/icons'
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import { useEffect, useState } from 'react'
@@ -407,13 +407,7 @@ export default function SettingsPage() {
return (
<Space key={svc} style={{ width: '100%', justifyContent: 'space-between' }}>
<Space size={6}>
<span
style={{
display: 'inline-block', width: 8, height: 8, borderRadius: '50%',
background: status?.active ? '#22c55e' : '#ef4444',
flexShrink: 0,
}}
/>
<span className={`status-dot ${status?.active ? 'online' : 'offline'}`} />
<Typography.Text style={{ fontFamily: 'monospace', fontSize: 13 }}>{svc}</Typography.Text>
{status && (
<Typography.Text type="secondary" style={{ fontSize: 11 }}>
@@ -422,15 +416,23 @@ export default function SettingsPage() {
)}
</Space>
<Tooltip title={isViewer ? t('auth.viewerBadge') : undefined}>
<Button
size="small"
icon={<ReloadOutlined />}
loading={restartingService === svc}
<Popconfirm
title={t('settings.serviceRestartConfirmTitle', { service: svc })}
description={t('settings.serviceRestartConfirmDesc')}
okText={t('settings.serviceRestartConfirmOk')}
cancelText={t('common.cancel')}
disabled={isViewer}
onClick={() => serviceRestart.mutate(svc)}
onConfirm={() => serviceRestart.mutate(svc)}
>
{t('settings.serviceRestartBtn')}
</Button>
<Button
size="small"
icon={<ReloadOutlined />}
loading={restartingService === svc}
disabled={isViewer}
>
{t('settings.serviceRestartBtn')}
</Button>
</Popconfirm>
</Tooltip>
</Space>
)