From b0e933e895990ae4eb16afc48e2537848ecf1fef Mon Sep 17 00:00:00 2001 From: olaf Date: Wed, 23 Jul 2025 15:04:16 +0000 Subject: [PATCH] UI polishing --- dashboard/src/clients.tsx | 16 +++++++++- dashboard/src/dashboard.tsx | 58 +++++++++++++++++++++++-------------- 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/dashboard/src/clients.tsx b/dashboard/src/clients.tsx index fa31249..10014fc 100644 --- a/dashboard/src/clients.tsx +++ b/dashboard/src/clients.tsx @@ -75,7 +75,21 @@ function DetailsModal({ open, client, groupIdToName, onClose }: DetailsModalProp ? 'IP-Adresse' : key === 'registration_time' ? 'Registriert am' - : key.charAt(0).toUpperCase() + key.slice(1)} + : key === 'description' + ? 'Beschreibung' + : key === 'last_alive' + ? 'Letzter Kontakt' + : key === 'model' + ? 'Modell' + : key === 'uuid' + ? 'Client-Code' + : key === "os_version" + ? 'Betriebssystem' + : key === 'software_version' + ? 'Clientsoftware' + : key === 'macs' + ? 'MAC-Adressen' + : key.charAt(0).toUpperCase() + key.slice(1)} : diff --git a/dashboard/src/dashboard.tsx b/dashboard/src/dashboard.tsx index dc9ef57..0e820a6 100644 --- a/dashboard/src/dashboard.tsx +++ b/dashboard/src/dashboard.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState, useRef } from 'react'; import { fetchGroupsWithClients, restartClient } from './apiClients'; -import type { Group } from './apiClients'; +import type { Group, Client } from './apiClients'; import { GridComponent, ColumnsDirective, @@ -13,25 +13,35 @@ import { const REFRESH_INTERVAL = 15000; // 15 Sekunden +// Typ für Collapse-Event +// type DetailRowCollapseArgs = { +// data?: { id?: string | number }; +// }; + +// Typ für DataBound-Event +type DetailRowDataBoundArgs = { + data?: { id?: string | number }; +}; + const Dashboard: React.FC = () => { const [groups, setGroups] = useState([]); const [expandedGroupIds, setExpandedGroupIds] = useState([]); - const gridRef = useRef(null); + const gridRef = useRef(null); // Funktion für das Schließen einer Gruppe (Collapse) - const onDetailCollapse = (args: any) => { - if (args && args.data && args.data.id) { - const groupId = String(args.data.id); - setExpandedGroupIds(prev => prev.filter(id => String(id) !== groupId)); - } - }; + // const onDetailCollapse = (args: DetailRowCollapseArgs) => { + // if (args && args.data && args.data.id) { + // const groupId = String(args.data.id); + // setExpandedGroupIds(prev => prev.filter(id => String(id) !== groupId)); + // } + // }; - // Registriere das Event nach dem Mount am Grid - useEffect(() => { - if (gridRef.current) { - gridRef.current.detailCollapse = onDetailCollapse; - } - }, []); + // // Registriere das Event nach dem Mount am Grid + // useEffect(() => { + // if (gridRef.current) { + // gridRef.current.detailCollapse = onDetailCollapse; + // } + // }, []); // Optimiertes Update: Nur bei echten Datenänderungen wird das Grid aktualisiert useEffect(() => { @@ -77,7 +87,7 @@ const Dashboard: React.FC = () => { // Health-Badge const getHealthBadge = (group: Group) => { const total = group.clients.length; - const alive = group.clients.filter((c: any) => c.is_alive).length; + const alive = group.clients.filter((c: Client) => c.is_alive).length; const ratio = total === 0 ? 0 : alive / total; let color = 'danger'; let text = `${alive} / ${total} offline`; @@ -98,7 +108,7 @@ const Dashboard: React.FC = () => { - { const date = new Date(dateStr); return isNaN(date.getTime()) ? props.last_alive : date.toLocaleString(); }} - /> + /> */} { try { const result = await restartClient(uuid); alert(`Neustart erfolgreich: ${result.message}`); - } catch (error: any) { - alert(`Fehler beim Neustart: ${error.message}`); + } catch (error: unknown) { + if (error && typeof error === 'object' && 'message' in error) { + alert(`Fehler beim Neustart: ${(error as { message: string }).message}`); + } else { + alert('Unbekannter Fehler beim Neustart'); + } } }; // SyncFusion Grid liefert im Event die Zeile/Gruppe - const onDetailDataBound = (args: any) => { + const onDetailDataBound = (args: DetailRowDataBoundArgs) => { if (args && args.data && args.data.id) { - const groupId = args.data.id; + const groupId = String(args.data.id); setExpandedGroupIds(prev => (prev.includes(groupId) ? prev : [...prev, groupId])); } }; @@ -176,7 +190,7 @@ const Dashboard: React.FC = () => { getHealthBadge(props)} + template={(props: Group) => getHealthBadge(props)} />