"use client"; import { useCallback, useEffect, useMemo, useState } from "react"; import Link from "next/link"; import { createClient } from "@/lib/supabase/client"; import { addDays, formatDateLong, formatPrice, WEEKDAYS } from "@/lib/menu"; import type { Dish, MenuEntry, Section } from "@/lib/types"; export default function WeekEditor({ monday }: { monday: string }) { const supabase = useMemo(() => createClient(), []); const friday = addDays(monday, 4); const days = WEEKDAYS.map((weekday, i) => ({ weekday, iso: addDays(monday, i), })); const [sections, setSections] = useState([]); const [dishes, setDishes] = useState([]); const [entries, setEntries] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Zelle, in der gerade ein Gericht hinzugefügt wird const [adding, setAdding] = useState<{ iso: string; section: string } | null>( null ); const [selectedDish, setSelectedDish] = useState(""); const load = useCallback(async () => { setError(null); const [se, di, en] = await Promise.all([ supabase.from("sections").select("*").order("sort"), supabase.from("dishes").select("*").order("name"), supabase .from("menu_entries") .select("id, menu_date, section_key, position, dish:dishes(id, name, price)") .gte("menu_date", monday) .lte("menu_date", friday) .order("position") .order("created_at"), ]); const problem = se.error ?? di.error ?? en.error; if (problem) { setError(`Laden fehlgeschlagen: ${problem.message}`); } else { setSections(se.data as Section[]); setDishes(di.data as Dish[]); setEntries(en.data as unknown as MenuEntry[]); } setLoading(false); }, [supabase, monday, friday]); useEffect(() => { setLoading(true); load(); }, [load]); async function addEntry() { if (!adding || !selectedDish) return; const { error } = await supabase.from("menu_entries").insert({ menu_date: adding.iso, section_key: adding.section, dish_id: selectedDish, }); if (error) { setError( /duplicate key/i.test(error.message) ? "Dieses Gericht ist an diesem Tag bereits zugewiesen." : `Speichern fehlgeschlagen: ${error.message}` ); } setAdding(null); setSelectedDish(""); await load(); } async function removeEntry(id: string) { const { error } = await supabase.from("menu_entries").delete().eq("id", id); if (error) setError(`Löschen fehlgeschlagen: ${error.message}`); await load(); } const cell = (iso: string, sectionKey: string) => entries.filter((e) => e.menu_date === iso && e.section_key === sectionKey); return (

Wochenplan

← Vorherige Woche Nächste Woche →
{error && (

{error}

)} {loading ? (

Lade Wochenplan…

) : ( ))} {sections.map((s) => ( {days.map((d) => { const isAdding = adding?.iso === d.iso && adding?.section === s.key; return ( ); })} ))}
{days.map((d) => ( {d.weekday}
{formatDateLong(d.iso)}
{s.label}
{s.time_range}
{cell(d.iso, s.key).map((e) => (
{e.dish.name} {" – "} {formatPrice(e.dish.price)}
))} {isAdding ? (
) : ( )}
)}

Neue Gerichte legst du unter{" "} Gerichte {" "} an.

); }