From 2f8dd14bfb3d9ca65ff7e2c8a4cf37805587770a Mon Sep 17 00:00:00 2001 From: Schalli Date: Wed, 23 Sep 2026 15:31:58 +0200 Subject: [PATCH] fix(260923-le6): Proxmox-Karte verweist Nicht-Admins nicht auf den Aktualisieren-Knopf Co-Authored-By: Claude Sonnet 5 --- .../proxmox/components/ServerCard.test.tsx | 64 ++++++++++++++++++- .../modules/proxmox/components/ServerCard.tsx | 9 ++- apps/web/src/messages/de.json | 1 + apps/web/src/messages/en.json | 1 + 4 files changed, 69 insertions(+), 6 deletions(-) diff --git a/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.test.tsx b/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.test.tsx index d0953aa..1517371 100644 --- a/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.test.tsx +++ b/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.test.tsx @@ -8,6 +8,8 @@ vi.mock('next-intl', () => ({ 'card.unknownValue': 'unbekannt', 'card.lastPolledLabel': 'Letzte Abfrage', 'card.notPolledYet': 'Noch keine Abfrage gelaufen. Klicken Sie oben auf „{refreshLabel}“.', + 'card.notPolledYetAutomatic': + 'Noch keine Abfrage gelaufen. Die Werte erscheinen nach der nächsten automatischen Abfrage.', 'card.refresh': 'Jetzt aktualisieren', 'card.lastOkLabel': 'Letzte erfolgreiche Messung', 'card.pve.nodeCount': 'Knoten', @@ -255,7 +257,7 @@ describe('ServerCard', () => { 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 () => { + it('Nachbesserung Befund 2: ein frisch angelegter, noch nie abgefragter Server zeigt Admins den ruhigen Hinweis mit Knopfverweis statt "Ein unerwarteter Fehler ist aufgetreten"', async () => { const { ServerCard } = await import('./ServerCard'); // Zustand direkt nach `createServer`: leere Zwischenlagerzeile, noch nie abgefragt. const server = makeServer({ @@ -273,12 +275,68 @@ describe('ServerCard', () => { }, }); + render(); + + 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('260923-le6: isAdmin={false}, noch nie abgefragt -> automatischer Hinweis ohne Knopfverweis', async () => { + const { ServerCard } = await import('./ServerCard'); + 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(); + + expect( + screen.getByText( + 'Noch keine Abfrage gelaufen. Die Werte erscheinen nach der nächsten automatischen Abfrage.', + ), + ).toBeInTheDocument(); + expect(screen.queryByText(/Jetzt aktualisieren/)).not.toBeInTheDocument(); + expect(screen.queryByText('Unerwarteter Fehler.')).not.toBeInTheDocument(); + }); + + it('260923-le6: isAdmin weggelassen, noch nie abgefragt -> verhaelt sich wie isAdmin={false} (sichere Vorgabe)', async () => { + const { ServerCard } = await import('./ServerCard'); + 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(); expect( - screen.getByText('Noch keine Abfrage gelaufen. Klicken Sie oben auf „Jetzt aktualisieren“.'), + screen.getByText( + 'Noch keine Abfrage gelaufen. Die Werte erscheinen nach der nächsten automatischen Abfrage.', + ), ).toBeInTheDocument(); - // Ohne die Korrektur erschiene hier faelschlich die Sammelmeldung — roter Test. + expect(screen.queryByText(/Jetzt aktualisieren/)).not.toBeInTheDocument(); expect(screen.queryByText('Unerwarteter Fehler.')).not.toBeInTheDocument(); }); diff --git a/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.tsx b/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.tsx index 5084238..97a849b 100644 --- a/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.tsx +++ b/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.tsx @@ -146,13 +146,14 @@ function errorMessage(t: ReturnType, kind: ProxmoxErrorK interface ServerCardProps { server: ProxmoxServer; + isAdmin?: boolean; } /** * Anzeige EINES Servers (Aufgabe 6) — verzweigt ueber `productType` auf der * unterscheidbaren Union aus Aufgabe 3. */ -export function ServerCard({ server }: ServerCardProps) { +export function ServerCard({ server, isAdmin = false }: ServerCardProps) { const t = useTranslations('proxmox'); const unknown = t('card.unknownValue'); const status = server.status; @@ -178,11 +179,13 @@ export function ServerCard({ server }: ServerCardProps) { (`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. + "unbekannter Fehler" erschien. Nicht-Admins sehen den Knopf nicht + (der Poll-Endpunkt verlangt ADMIN/SUPER_ADMIN) und bekommen deshalb + den Text ohne Knopfverweis (260923-le6). */} {status && !status.lastPolledAt && (

- {t('card.notPolledYet', { refreshLabel: t('card.refresh') })} + {isAdmin ? t('card.notPolledYet', { refreshLabel: t('card.refresh') }) : t('card.notPolledYetAutomatic')}

)} diff --git a/apps/web/src/messages/de.json b/apps/web/src/messages/de.json index 6dd0303..d7b3bcd 100644 --- a/apps/web/src/messages/de.json +++ b/apps/web/src/messages/de.json @@ -713,6 +713,7 @@ "unknownValue": "unbekannt", "lastPolledLabel": "Letzte Abfrage", "notPolledYet": "Noch keine Abfrage gelaufen. Klicken Sie oben auf „{refreshLabel}“.", + "notPolledYetAutomatic": "Noch keine Abfrage gelaufen. Die Werte erscheinen nach der nächsten automatischen Abfrage.", "lastOkLabel": "Letzte erfolgreiche Messung", "refresh": "Jetzt aktualisieren", "refreshing": "Wird aktualisiert...", diff --git a/apps/web/src/messages/en.json b/apps/web/src/messages/en.json index 1f67f97..898f609 100644 --- a/apps/web/src/messages/en.json +++ b/apps/web/src/messages/en.json @@ -713,6 +713,7 @@ "unknownValue": "unknown", "lastPolledLabel": "Last poll", "notPolledYet": "No poll has run yet. Click \"{refreshLabel}\" above.", + "notPolledYetAutomatic": "No poll has run yet. The values will appear after the next automatic poll.", "lastOkLabel": "Last successful measurement", "refresh": "Refresh now", "refreshing": "Refreshing...",