import { Link } from "react-router"; import type { Route } from "./+types/admin.draft-schedule"; import { findAllSports } from "~/models/sport"; import { findDraftScheduleForHorizon } from "~/models/sports-season"; import { DraftScheduleGantt, type GanttSport, } from "~/components/admin/DraftScheduleGantt"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "~/components/ui/card"; import { Button } from "~/components/ui/button"; import { AlertTriangle, ArrowRight } from "lucide-react"; const ALLOWED_MONTHS = [6, 12] as const; export function meta(): Route.MetaDescriptors { return [{ title: "Draft Schedule - Brackt" }]; } export async function loader({ request }: Route.LoaderArgs) { const url = new URL(request.url); const monthsParam = Number(url.searchParams.get("months")); const months = ALLOWED_MONTHS.includes(monthsParam as (typeof ALLOWED_MONTHS)[number]) ? monthsParam : 6; const [allSports, windows] = await Promise.all([ findAllSports(), findDraftScheduleForHorizon(months), ]); const windowsBySport = new Map(); for (const w of windows) { const list = windowsBySport.get(w.sport.id) ?? []; list.push(w); windowsBySport.set(w.sport.id, list); } const sports: GanttSport[] = allSports.map((s) => ({ id: s.id, name: s.name, slug: s.slug, iconUrl: s.iconUrl, windows: windowsBySport.get(s.id) ?? [], })); const sportsWithoutCoverage = sports.filter((s) => s.windows.length === 0); const today = new Date().toISOString().split("T")[0]; return { sports, sportsWithoutCoverage, today, months }; } export default function AdminDraftSchedule({ loaderData }: Route.ComponentProps) { const { sports, sportsWithoutCoverage, today, months } = loaderData; return (

Draft Schedule

See when each sport is scheduled to be drafted and spot gaps in coverage.

{ALLOWED_MONTHS.map((m) => ( ))}
{sportsWithoutCoverage.length > 0 && ( Sports without a draft window {sportsWithoutCoverage.length} sport {sportsWithoutCoverage.length !== 1 ? "s" : ""}{" "} {sportsWithoutCoverage.length !== 1 ? "have" : "has"} no draft window open or upcoming in the next {months} months.
    {sportsWithoutCoverage.map((s) => (
  • {s.name}
  • ))}
)}
); }