"use client"; import Link from "next/link"; import { FormEvent, useEffect, useState } from "react"; import { createGlobalDevice, createProject, deleteGlobalDevice, listGlobalDevices, listProjects, updateGlobalDevice, } from "../../frontend/utils/api"; import type { CreateGlobalDeviceInput, GlobalDeviceDto, ProjectDto, } from "../../frontend/types"; const emptyGlobalDevice: CreateGlobalDeviceInput = { name: "", displayName: "", category: "", quantity: 1, installedPowerPerUnitKw: 0.1, demandFactor: 1, voltageV: 230, phaseCount: 1, powerFactor: 1, note: "", }; function toOptionalNumber(value: string) { const trimmed = value.trim(); if (!trimmed) { return undefined; } return Number(trimmed); } export default function ProjectsPage() { const [projects, setProjects] = useState([]); const [globalDevices, setGlobalDevices] = useState([]); const [projectName, setProjectName] = useState(""); const [globalDeviceForm, setGlobalDeviceForm] = useState>({ name: "", displayName: "", category: "", quantity: "1", installedPowerPerUnitKw: "0.1", demandFactor: "1", voltageV: "230", phaseCount: "1", powerFactor: "1", note: "", }); const [isSaving, setIsSaving] = useState(false); const [error, setError] = useState(null); async function loadData() { setError(null); const [loadedProjects, loadedGlobalDevices] = await Promise.all([listProjects(), listGlobalDevices()]); setProjects(loadedProjects); setGlobalDevices(loadedGlobalDevices); } useEffect(() => { loadData().catch((err: unknown) => setError(err instanceof Error ? err.message : "Daten konnten nicht geladen werden.") ); }, []); async function handleCreateProject(event: FormEvent) { event.preventDefault(); if (!projectName.trim()) { return; } setIsSaving(true); setError(null); try { const created = await createProject(projectName.trim()); setProjects((current) => [...current, created]); setProjectName(""); } catch (err) { setError(err instanceof Error ? err.message : "Projekt konnte nicht erstellt werden."); } finally { setIsSaving(false); } } async function handleCreateGlobalDevice(event: FormEvent) { event.preventDefault(); if (!globalDeviceForm.name.trim()) { return; } const payload: CreateGlobalDeviceInput = { name: globalDeviceForm.name.trim(), displayName: globalDeviceForm.displayName.trim() || globalDeviceForm.name.trim(), category: globalDeviceForm.category.trim() || undefined, quantity: Number(globalDeviceForm.quantity), installedPowerPerUnitKw: Number(globalDeviceForm.installedPowerPerUnitKw), demandFactor: Number(globalDeviceForm.demandFactor), voltageV: toOptionalNumber(globalDeviceForm.voltageV), phaseCount: globalDeviceForm.phaseCount === "3" ? 3 : 1, powerFactor: toOptionalNumber(globalDeviceForm.powerFactor), note: globalDeviceForm.note.trim() || undefined, }; setIsSaving(true); setError(null); try { const created = await createGlobalDevice(payload); setGlobalDevices((current) => [...current, created]); setGlobalDeviceForm({ name: emptyGlobalDevice.name, displayName: emptyGlobalDevice.displayName, category: emptyGlobalDevice.category ?? "", quantity: String(emptyGlobalDevice.quantity), installedPowerPerUnitKw: String(emptyGlobalDevice.installedPowerPerUnitKw), demandFactor: String(emptyGlobalDevice.demandFactor), voltageV: String(emptyGlobalDevice.voltageV ?? ""), phaseCount: String(emptyGlobalDevice.phaseCount ?? 1), powerFactor: String(emptyGlobalDevice.powerFactor ?? ""), note: emptyGlobalDevice.note ?? "", }); } catch (err) { setError(err instanceof Error ? err.message : "Globales Gerät konnte nicht erstellt werden."); } finally { setIsSaving(false); } } async function handleDeleteGlobalDevice(globalDeviceId: string) { setIsSaving(true); setError(null); try { await deleteGlobalDevice(globalDeviceId); setGlobalDevices((current) => current.filter((item) => item.id !== globalDeviceId)); } catch (err) { setError(err instanceof Error ? err.message : "Globales Gerät konnte nicht gelöscht werden."); } finally { setIsSaving(false); } } async function handleQuickUpdateGlobalDevice( device: GlobalDeviceDto, key: "name" | "displayName" | "category", value: string ) { const payload: CreateGlobalDeviceInput = { name: key === "name" ? value : device.name, displayName: key === "displayName" ? value : device.displayName, category: key === "category" ? value : device.category ?? undefined, quantity: device.quantity, installedPowerPerUnitKw: device.installedPowerPerUnitKw, demandFactor: device.demandFactor, voltageV: device.voltageV ?? undefined, phaseCount: device.phaseCount ?? undefined, powerFactor: device.powerFactor ?? undefined, note: device.note ?? undefined, }; try { const updated = await updateGlobalDevice(device.id, payload); setGlobalDevices((current) => current.map((item) => (item.id === device.id ? updated : item))); } catch (err) { setError(err instanceof Error ? err.message : "Globales Gerät konnte nicht aktualisiert werden."); } } return (

Projekte

Projektübersicht und globale Geräteverwaltung

{error ?
{error}
: null}
Neues Projekt
setProjectName(event.target.value)} placeholder="z. B. Neubau Schule" />
Alle Projekte
{projects.map((project) => ( ))} {!projects.length ? ( ) : null}
Projekt Aktionen
{project.name} Projekt öffnen
Noch keine Projekte vorhanden.
Globale Geräte / Verbraucher
setGlobalDeviceForm((current) => ({ ...current, name: event.target.value }))} />
setGlobalDeviceForm((current) => ({ ...current, displayName: event.target.value }))} />
setGlobalDeviceForm((current) => ({ ...current, category: event.target.value })) } />
setGlobalDeviceForm((current) => ({ ...current, quantity: event.target.value })) } />
setGlobalDeviceForm((current) => ({ ...current, installedPowerPerUnitKw: event.target.value, })) } />
setGlobalDeviceForm((current) => ({ ...current, demandFactor: event.target.value })) } />
{globalDevices.map((device) => ( ))} {!globalDevices.length ? ( ) : null}
Interner Name Anzeigename Kategorie Anzahl Leistung je Stück [kW] GZF Aktion
event.target.value !== device.name ? handleQuickUpdateGlobalDevice(device, "name", event.target.value) : undefined } /> event.target.value !== device.displayName ? handleQuickUpdateGlobalDevice(device, "displayName", event.target.value) : undefined } /> event.target.value !== (device.category ?? "") ? handleQuickUpdateGlobalDevice(device, "category", event.target.value) : undefined } /> {device.quantity} {device.installedPowerPerUnitKw} {device.demandFactor}
Noch keine globalen Geräte vorhanden.
); }