'use client'; import { useEffect, useState, useCallback } from 'react'; import { Tablette } from '@/types/tablette'; const EMPTY: Omit = { tab: '', pday: 1, cnt: 0, at: '', rem: '', order: '', }; type FormData = Omit; export default function TablettenTable() { const [rows, setRows] = useState([]); const [sortField, setSortField] = useState('until'); const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc'); const [modal, setModal] = useState(null); const [selected, setSelected] = useState(null); const [form, setForm] = useState({ ...EMPTY }); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const fetchData = useCallback(async () => { setLoading(true); try { const res = await fetch(`/api/data?sidx=${sortField}&sord=${sortDir}`); const json = await res.json(); if (!res.ok) { setError(`Fehler beim Laden: ${json.error ?? res.status}`); return; } setRows(json.values || []); } catch { setError('Fehler beim Laden der Daten.'); } finally { setLoading(false); } }, [sortField, sortDir]); useEffect(() => { fetchData(); }, [fetchData]); function handleSort(field: string) { if (field === sortField) { setSortDir((d) => (d === 'asc' ? 'desc' : 'asc')); } else { setSortField(field); setSortDir('asc'); } } function openAdd() { setForm({ ...EMPTY }); setModal('add'); } function openEdit(row: Tablette) { setSelected(row); setForm({ tab: row.tab, pday: row.pday, cnt: row.cnt, at: row.at, rem: row.rem, order: row.order }); setModal('edit'); } function openDel(row: Tablette) { setSelected(row); setModal('del'); } async function handleSave() { const payload = { ...form, oper: modal === 'add' ? 'add' : 'edit' }; await fetch('/api/data', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }); setModal(null); fetchData(); } async function handleDelete() { if (!selected) return; await fetch('/api/data', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ oper: 'del', tab: selected.tab }), }); setModal(null); fetchData(); } const SortIndicator = ({ field }: { field: string }) => sortField === field ? (sortDir === 'asc' ? ' ▲' : ' ▼') : ''; const colHeader = (label: string, field: string) => ( handleSort(field)} className="sortable-header" > {label} ); return (
{error &&

{error}

}
{colHeader('Tabletten', 'tab')} {colHeader('pro Tag', 'pday')} {colHeader('aktuell', 'akt')} {colHeader('reicht bis', 'until')} {colHeader('Anzahl…', 'cnt')} {colHeader('…am', 'at')} {colHeader('Bemerkungen', 'rem')} {colHeader('bestellt am', 'order')} {loading && ( )} {!loading && rows.map((row) => ( ))}
Aktion
Lade…
{row.tab} {row.pday} {row.akt} {row.until} {row.cnt} {row.at} {row.rem} {row.order}
{/* Add/Edit Modal */} {(modal === 'add' || modal === 'edit') && (
setModal(null)}>
e.stopPropagation()}>

{modal === 'add' ? 'Neuer Eintrag' : 'Bearbeiten'}

)} {/* Delete Modal */} {modal === 'del' && selected && (
setModal(null)}>
e.stopPropagation()}>

Eintrag löschen

Möchtest du {selected.tab} wirklich löschen?

)}
); }