import { Form, Link } from "react-router"; import type { Route } from "./+types/admin.sports-seasons.$id.participants"; import { findSportsSeasonById } from "~/models/sports-season"; import { findParticipantsBySportsSeasonId, createParticipant, deleteParticipant } from "~/models/participant"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; import { Label } from "~/components/ui/label"; import { Textarea } from "~/components/ui/textarea"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "~/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "~/components/ui/table"; import { Plus, Trash2, ArrowLeft } from "lucide-react"; export function meta({ data }: Route.MetaArgs): Route.MetaDescriptors { return [{ title: `Participants — ${data?.sportsSeason?.name ?? "Sports Season"} - Brackt Admin` }]; } export async function loader({ params }: Route.LoaderArgs) { const sportsSeason = await findSportsSeasonById(params.id); if (!sportsSeason) { throw new Response("Sports season not found", { status: 404 }); } const participants = await findParticipantsBySportsSeasonId(params.id); // Type assertion since we know the sport relation is included return { sportsSeason: sportsSeason as typeof sportsSeason & { sport: { id: string; name: string; type: string; slug: string } }, participants }; } export async function action({ request, params }: Route.ActionArgs) { const formData = await request.formData(); const intent = formData.get("intent"); if (intent === "delete") { const participantId = formData.get("participantId"); if (typeof participantId === "string") { await deleteParticipant(participantId); } return { success: true }; } // Bulk add participants if (intent === "bulk") { const bulkNames = formData.get("bulkNames"); if (typeof bulkNames !== "string" || !bulkNames.trim()) { return { error: "Please enter at least one participant name" }; } const names = bulkNames .split("\n") .map(name => name.trim()) .filter(name => name.length > 0); if (names.length === 0) { return { error: "Please enter at least one participant name" }; } try { for (const name of names) { await createParticipant({ sportsSeasonId: params.id, name, shortName: null, externalId: null, expectedValue: "0", }); } return { success: true, count: names.length }; } catch (error) { console.error("Error creating participants:", error); return { error: "Failed to add participants. Please try again." }; } } // Add single participant const name = formData.get("name"); if (typeof name !== "string" || !name.trim()) { return { error: "Participant name is required" }; } try { await createParticipant({ sportsSeasonId: params.id, name: name.trim(), shortName: null, externalId: null, expectedValue: "0", }); return { success: true }; } catch (error) { console.error("Error creating participant:", error); return { error: "Failed to add participant. Please try again." }; } } export default function ManageParticipants({ loaderData, actionData }: Route.ComponentProps) { const { sportsSeason, participants } = loaderData; // Use success state to reset forms by changing the key const formKey = actionData?.success ? Date.now() : 'static'; return (
{sportsSeason.sport.name} - {sportsSeason.name}
No participants yet. Add your first {sportsSeason.sport.type === "team" ? "team" : "player"}.
) : (