'use client' import { Invoice, Deadline } from '@/types' import { cn } from '@/lib/utils' import { getWeekDays, formatWeekDayHeader, formatDateISO, isSameDay, isInvoiceOverdue, isDeadlineOverdue, getTimeSlots, } from '@/lib/calendar/utils' interface CalendarWeekViewProps { currentDate: Date invoices: Invoice[] deadlines: Deadline[] onDayClick: (date: Date) => void } export function CalendarWeekView({ currentDate, invoices, deadlines, onDayClick, }: CalendarWeekViewProps) { const weekDays = getWeekDays(currentDate) const timeSlots = getTimeSlots(8, 20) const today = new Date() // Group invoices and deadlines by date for quick lookup const getItemsForDate = (date: Date) => { const dateStr = formatDateISO(date) const dayInvoices = invoices.filter(inv => inv.due_date === dateStr) const dayDeadlines = deadlines.filter(d => d.due_date === dateStr) return { invoices: dayInvoices, deadlines: dayDeadlines } } return (
{/* Header row with day names and dates */}
{/* Empty corner cell */} {weekDays.map((date, index) => { const isToday = isSameDay(date, today) return ( ) })}
{/* All-day events section */}
Heldag
{weekDays.map((date, index) => { const items = getItemsForDate(date) const isToday = isSameDay(date, today) // Filter to only show non-timed items (all invoices and deadlines without times are "all-day") const allDayInvoices = items.invoices.filter(inv => inv.status !== 'paid' && inv.status !== 'cancelled' && inv.status !== 'credited' ) const allDayDeadlines = items.deadlines.filter(d => !d.is_completed) return (
{/* Invoice indicators */} {allDayInvoices.map((invoice) => (
F#{invoice.invoice_number}
))} {/* Deadline indicators */} {allDayDeadlines.map((deadline) => (
{deadline.title}
))}
) })}
{/* Time grid */}
{timeSlots.map((time, timeIndex) => (
{time}
{weekDays.map((date, dayIndex) => { const isToday = isSameDay(date, today) return (
))}
) }