"use client"; import { useMemo, useState } from "react"; import type { OilLogRow } from "@/components/OilsBoard"; import { inBounds, presetBounds, saDay, type LogPreset } from "@/lib/oil-log"; const PRESETS: { id: LogPreset; label: string }[] = [ { id: "today", label: "Today" }, { id: "week", label: "This week" }, { id: "month", label: "This month" }, { id: "all", label: "Everything" }, { id: "range", label: "Date range" }, ]; const fmt = (n: number) => n.toLocaleString("en-ZA", { maximumFractionDigits: 2 }); const when = (stamp: string) => !stamp ? "—" : !stamp.includes("T") && stamp.length <= 10 ? new Date(stamp + "T12:00:00").toLocaleDateString("en-ZA", { day: "numeric", month: "short", year: "numeric" }) : new Date(stamp.replace(" ", "T")).toLocaleString("en-ZA", { timeZone: "Africa/Johannesburg", day: "numeric", month: "short", year: "numeric", hour: "2-digit", minute: "2-digit", hourCycle: "h23", }); /** Everything booked out of stock, filterable by period. A price per litre column slots in here later. */ export function BookedOutTable({ log }: { log: OilLogRow[] }) { const [preset, setPreset] = useState("month"); const [from, setFrom] = useState(""); const [to, setTo] = useState(""); const [product, setProduct] = useState(""); const products = useMemo(() => [...new Set(log.map((r) => r.item))].sort(), [log]); const rows = useMemo(() => { const bounds = presetBounds(preset, saDay(new Date().toISOString()), from, to); return log.filter((r) => inBounds(saDay(r.at), bounds) && (!product || r.item === product)); }, [log, preset, from, to, product]); const totals = useMemo(() => { const m = new Map(); for (const r of rows) m.set(r.item, (m.get(r.item) || 0) + r.litres); return [...m.entries()].sort((a, b) => a[0].localeCompare(b[0])); }, [rows]); const field = "min-h-[44px] rounded-lg border border-gray-200 dark:border-border bg-white dark:bg-surface px-3 text-sm"; return (

Booked out

{/* Pills from lg, a dropdown below it. */}
{PRESETS.map((p) => ( ))}
{preset === "range" && (
setFrom(e.target.value)} aria-label="From" /> to setTo(e.target.value)} aria-label="To" />
)}
{totals.length > 0 && (
{totals.map(([name, l]) => ( {name}: {fmt(l)} L ))}
)} {rows.length === 0 ? (

{log.length === 0 ? "Nothing booked out yet. Staff book litres out in the Plant Clock app." : "Nothing booked out in this period."}

) : (
{rows.map((r) => ( ))}
When Product Litres Vehicle Odometer Booked by Meter
{when(r.at)} {r.item} {fmt(r.litres)} {r.asset || "—"} {r.odometer != null ? fmt(r.odometer) : "—"} {r.by || "—"} {r.photo ? View photo : "—"}
Total · {rows.length} booking{rows.length !== 1 && "s"} {fmt(rows.reduce((s, r) => s + r.litres, 0))}
)}
); }