"use client"; import { Card } from "@/components/ui/card"; import { formatCurrency, relativeTime } from "@/lib/crm"; import type { Report } from "@/lib/crm"; import { cn } from "@/lib/utils"; import { ChevronRight } from "lucide-react"; /** Date range label like "May 25 – 31" (compact, same-month aware). */ function periodLabel(startIso: string, endIso: string): string { const start = new Date(startIso); const end = new Date(endIso); const sameMonth = start.getUTCMonth() === end.getUTCMonth() && start.getUTCFullYear() === end.getUTCFullYear(); const startStr = start.toLocaleDateString("en-US", { month: "short", day: "numeric", timeZone: "UTC", }); const endStr = end.toLocaleDateString( "en-US", sameMonth ? { day: "numeric", timeZone: "UTC" } : { month: "short", day: "numeric", timeZone: "UTC" }, ); return `${startStr} – ${endStr}`; } /** * A single weekly report summary row for the reports list. Shows the title, * its period + generated-at relative time, and two headline metrics * (bookings, weighted forecast). Highlights when selected; subtle hover. */ export function ReportCard({ report, selected, onSelect, }: { report: Report; selected?: boolean; onSelect?: () => void; }) { const { metrics } = report; return ( { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); onSelect?.(); } }} className={cn( "cursor-pointer gap-3 py-4 transition hover:border-primary/40 hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", selected && "border-primary ring-2 ring-primary/30", )} >
{report.title}
{periodLabel(report.periodStart, report.periodEnd)} · generated{" "} {relativeTime(report.generatedAt)}
Bookings
{formatCurrency(metrics.bookings)}
Weighted forecast
{formatCurrency(metrics.weightedForecast)}
); }