fix(260923-ku6): ruhiger "noch nicht abgefragt"-Zustand und Adresse ohne Grossschreibung
Zwei weitere Nachbesserungen aus dem Rundgang zu 260923-dhh, beide in
ServerCard.tsx und deshalb in einem Commit:
Befund 2: ein frisch angelegter, noch nie abgefragter Server zeigte
faelschlich "Ein unerwarteter Fehler ist aufgetreten" — die leere
Zwischenlagerzeile aus createServer hat `reachable: false` und
`errorKind: null`, was bisher blind in die Fehler-Uebersetzung `unbekannt`
lief. Neuer ruhiger Zustand fuer `status.lastPolledAt === null`, der auf
"Jetzt aktualisieren" verweist; die bestehenden Fehlermeldungen (inkl.
`unbekannt` fuer echte unbekannte Fehler) bleiben fuer `lastPolledAt !== null`
unveraendert.
Befund 3: die Klasse `uppercase` sass auf der ganzen Statuszeile und faerbte
dadurch auch die Adresse gross ("PVE — HTTPS://..."). Jetzt nur noch auf dem
Produktkuerzel.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,8 @@ vi.mock('next-intl', () => ({
|
|||||||
const translations: Record<string, string> = {
|
const translations: Record<string, string> = {
|
||||||
'card.unknownValue': 'unbekannt',
|
'card.unknownValue': 'unbekannt',
|
||||||
'card.lastPolledLabel': 'Letzte Abfrage',
|
'card.lastPolledLabel': 'Letzte Abfrage',
|
||||||
|
'card.notPolledYet': 'Noch keine Abfrage gelaufen. Klicken Sie oben auf „{refreshLabel}“.',
|
||||||
|
'card.refresh': 'Jetzt aktualisieren',
|
||||||
'card.lastOkLabel': 'Letzte erfolgreiche Messung',
|
'card.lastOkLabel': 'Letzte erfolgreiche Messung',
|
||||||
'card.pve.nodeCount': 'Knoten',
|
'card.pve.nodeCount': 'Knoten',
|
||||||
'card.pve.guests': '{running} laufend / {stopped} gestoppt',
|
'card.pve.guests': '{running} laufend / {stopped} gestoppt',
|
||||||
@@ -252,4 +254,45 @@ describe('ServerCard', () => {
|
|||||||
|
|
||||||
expect(screen.getByText(/Letzte Abfrage/)).toBeInTheDocument();
|
expect(screen.getByText(/Letzte Abfrage/)).toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('Nachbesserung Befund 2: ein frisch angelegter, noch nie abgefragter Server zeigt den ruhigen Hinweis statt "Ein unerwarteter Fehler ist aufgetreten"', async () => {
|
||||||
|
const { ServerCard } = await import('./ServerCard');
|
||||||
|
// Zustand direkt nach `createServer`: leere Zwischenlagerzeile, noch nie abgefragt.
|
||||||
|
const server = makeServer({
|
||||||
|
status: {
|
||||||
|
id: 's1',
|
||||||
|
serverId: 'srv-1',
|
||||||
|
lastPolledAt: null,
|
||||||
|
lastOkAt: null,
|
||||||
|
reachable: false,
|
||||||
|
errorKind: null,
|
||||||
|
errorDetail: null,
|
||||||
|
rawSample: null,
|
||||||
|
updatedAt: '2026-09-23T10:00:00.000Z',
|
||||||
|
metrics: null,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
render(<ServerCard server={server} />);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
screen.getByText('Noch keine Abfrage gelaufen. Klicken Sie oben auf „Jetzt aktualisieren“.'),
|
||||||
|
).toBeInTheDocument();
|
||||||
|
// Ohne die Korrektur erschiene hier faelschlich die Sammelmeldung — roter Test.
|
||||||
|
expect(screen.queryByText('Unerwarteter Fehler.')).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Nachbesserung Befund 3: die Adresse bleibt unveraendert dargestellt, nur das Produktkuerzel ist grossgeschrieben', async () => {
|
||||||
|
const { ServerCard } = await import('./ServerCard');
|
||||||
|
const server = makeServer({ baseUrl: 'https://172.21.0.1:8006' });
|
||||||
|
|
||||||
|
render(<ServerCard server={server} />);
|
||||||
|
|
||||||
|
const line = screen.getByText(/172\.21\.0\.1:8006/);
|
||||||
|
expect(line).toHaveTextContent('pve — https://172.21.0.1:8006');
|
||||||
|
const productSpan = line.querySelector('span');
|
||||||
|
expect(productSpan).not.toBeNull();
|
||||||
|
expect(productSpan).toHaveClass('uppercase');
|
||||||
|
expect(line).not.toHaveClass('uppercase');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -162,8 +162,9 @@ export function ServerCard({ server }: ServerCardProps) {
|
|||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<div className="font-medium">{server.name}</div>
|
<div className="font-medium">{server.name}</div>
|
||||||
<div className="text-xs uppercase text-muted-foreground">
|
{/* Nachbesserung Befund 3: `uppercase` gilt nur dem Produktkuerzel, nicht der Adresse. */}
|
||||||
{server.productType} — {server.baseUrl}
|
<div className="text-xs text-muted-foreground">
|
||||||
|
<span className="uppercase">{server.productType}</span> — {server.baseUrl}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -172,7 +173,20 @@ export function ServerCard({ server }: ServerCardProps) {
|
|||||||
{t('card.lastPolledLabel')}: {formatTimestamp(status?.lastPolledAt ?? null, unknown)}
|
{t('card.lastPolledLabel')}: {formatTimestamp(status?.lastPolledAt ?? null, unknown)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{status && !status.reachable && (
|
{/*
|
||||||
|
Nachbesserung Befund 2: ein Server, der noch nie abgefragt wurde
|
||||||
|
(`lastPolledAt === null`), zeigt einen ruhigen Hinweis statt der
|
||||||
|
Fehlermeldung — die leere Zwischenlagerzeile aus `createServer` hat
|
||||||
|
`reachable: false` und `errorKind: null`, was sonst faelschlich als
|
||||||
|
"unbekannter Fehler" erschien.
|
||||||
|
*/}
|
||||||
|
{status && !status.lastPolledAt && (
|
||||||
|
<p className="mt-2 text-xs text-muted-foreground">
|
||||||
|
{t('card.notPolledYet', { refreshLabel: t('card.refresh') })}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{status?.lastPolledAt && !status.reachable && (
|
||||||
<div className="mt-2 space-y-1 text-sm">
|
<div className="mt-2 space-y-1 text-sm">
|
||||||
<p className="text-destructive">
|
<p className="text-destructive">
|
||||||
{errorMessage(t, status.errorKind)}
|
{errorMessage(t, status.errorKind)}
|
||||||
|
|||||||
@@ -712,6 +712,7 @@
|
|||||||
"card": {
|
"card": {
|
||||||
"unknownValue": "unbekannt",
|
"unknownValue": "unbekannt",
|
||||||
"lastPolledLabel": "Letzte Abfrage",
|
"lastPolledLabel": "Letzte Abfrage",
|
||||||
|
"notPolledYet": "Noch keine Abfrage gelaufen. Klicken Sie oben auf „{refreshLabel}“.",
|
||||||
"lastOkLabel": "Letzte erfolgreiche Messung",
|
"lastOkLabel": "Letzte erfolgreiche Messung",
|
||||||
"refresh": "Jetzt aktualisieren",
|
"refresh": "Jetzt aktualisieren",
|
||||||
"refreshing": "Wird aktualisiert...",
|
"refreshing": "Wird aktualisiert...",
|
||||||
|
|||||||
@@ -712,6 +712,7 @@
|
|||||||
"card": {
|
"card": {
|
||||||
"unknownValue": "unknown",
|
"unknownValue": "unknown",
|
||||||
"lastPolledLabel": "Last poll",
|
"lastPolledLabel": "Last poll",
|
||||||
|
"notPolledYet": "No poll has run yet. Click \"{refreshLabel}\" above.",
|
||||||
"lastOkLabel": "Last successful measurement",
|
"lastOkLabel": "Last successful measurement",
|
||||||
"refresh": "Refresh now",
|
"refresh": "Refresh now",
|
||||||
"refreshing": "Refreshing...",
|
"refreshing": "Refreshing...",
|
||||||
|
|||||||
Reference in New Issue
Block a user