'use client'; import { useState } from 'react'; import { KUPPELN } from '@/types/logbuch'; import type { Kuppel, LogbuchEintrag, SofueStatus } from '@/types/logbuch'; import LogbuchForm from '@/components/LogbuchForm'; import LogbuchList from '@/components/LogbuchList'; import Statistik from '@/components/Statistik'; import Fahrkosten from '@/components/Fahrkosten'; import Fuehrungen from '@/components/Fuehrungen'; import packageJson from '@/package.json'; function datumDe(iso?: string): string { if (!iso) return ''; const [j, m, t] = iso.slice(0, 10).split('-'); return t && m && j ? `${t}.${m}.${j}` : iso; } /** Rückmeldung zur Rückschreibung einer Sonderführung ins Register SoFue2. */ function sofueMeldung(s: SofueStatus): string { switch (s.status) { case 'ok': return `Sonderführung vom ${datumDe(s.wtermin ?? s.datum)} im Register als stattgefunden eingetragen.`; case 'kein_termin': return `Keine Sonderführung am ${datumDe(s.datum)} gefunden — das Sonderführungs-Register wurde nicht aktualisiert.`; default: return 'Das Sonderführungs-Register konnte nicht aktualisiert werden. Bitte den Eintrag dort von Hand nachtragen.'; } } interface Props { kuerzel: string; beoId: number; beoName: string; role: string | null; } export default function MainClient({ kuerzel, beoId, beoName, role }: Props) { const [activeKuppel, setActiveKuppel] = useState('West'); const [activeTab, setActiveTab] = useState<'eingabe' | 'liste' | 'fuehrungen' | 'statistik' | 'fahrkosten'>('eingabe'); const [refreshKey, setRefreshKey] = useState(0); const [editEntry, setEditEntry] = useState(null); const [backupState, setBackupState] = useState<'idle' | 'running' | 'ok' | 'error'>('idle'); const [sofueHinweis, setSofueHinweis] = useState(null); const grafikSrc = '/api/statistik/grafik'; const version = packageJson.version; const buildDate = process.env.NEXT_PUBLIC_BUILD_DATE || new Date().toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric' }); const currentUserBeo = { ID: beoId, Kuerzel: kuerzel, Name: beoName }; function handleSaved(sofue?: SofueStatus | null) { setRefreshKey((k) => k + 1); setEditEntry(null); setSofueHinweis(sofue ?? null); } function handleEdit(entry: LogbuchEintrag) { setEditEntry(entry); setActiveTab('eingabe'); window.scrollTo({ top: 0, behavior: 'smooth' }); } async function handleLogout() { await fetch('/api/logout', { method: 'POST' }); window.location.href = '/login'; } async function handleBackup() { setBackupState('running'); try { const r = await fetch('/api/backup', { method: 'POST' }); setBackupState(r.ok ? 'ok' : 'error'); } catch { setBackupState('error'); } setTimeout(() => setBackupState('idle'), 4000); } return (
{/* Header */}

Sternwarte-Welzheim   Führungsbuch für {activeKuppel}-Kuppel

{role?.includes('admin') && ( <> Admin )}
{/* Kuppel-Tabs */}
{KUPPELN.map((k) => ( ))}
{/* Eingabe/Liste/Statistik-Tabs */}
{(['eingabe', 'liste', 'statistik', 'fahrkosten', 'fuehrungen'] as const) .filter((tab) => tab !== 'fahrkosten' || role?.includes('admin') || role?.includes('master')) .map((tab) => ( ))}
{/* Eingabe-Tab: Formular + kompakte Vorschau-Liste (nur Desktop) */} {activeTab === 'eingabe' && ( <> {editEntry && (
Eintrag bearbeiten (ID {editEntry.ID})
)} {sofueHinweis && sofueHinweis.status !== 'uebersprungen' && (
{sofueMeldung(sofueHinweis)}
)} {/* Kompakte Liste — nur auf Desktop sichtbar */}

Letzte Einträge

)} {/* Liste-Tab: vollständige Liste */} {activeTab === 'liste' && (
Sternwarte Welzheim — Führungsbuch {activeKuppel}-Kuppel
Ausdruck vom {new Date().toLocaleDateString('de-DE')}
)} {/* Statistik-Tab */} {activeTab === 'statistik' && (
Statistik (alle Kuppeln)
)} {/* Führungen-Tab: kommende Sonderführungen absagen oder verschieben */} {activeTab === 'fuehrungen' && (
Kommende Sonderführungen
)} {/* Fahrkosten-Tab */} {activeTab === 'fahrkosten' && (role?.includes('admin') || role?.includes('master')) && (
Fahrkostenabrechnung
)}
); }