import { Form, Link, redirect } from "react-router"; import { useState } from "react"; import type { Route } from "./+types/admin.templates.$id"; import { logger } from "~/lib/logger"; import { findSeasonTemplateWithSportsSeasons, updateSeasonTemplate, deleteSeasonTemplate, setSeasonTemplateActive } from "~/models/season-template"; import { addSportToTemplate, removeSportFromTemplate } from "~/models/season-template-sport"; import { findAllSportsSeasons } from "~/models/sports-season"; 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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "~/components/ui/select"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "~/components/ui/alert-dialog"; import { Trash2, Plus, X } from "lucide-react"; import { Badge } from "~/components/ui/badge"; export function meta({ data }: Route.MetaArgs): Route.MetaDescriptors { return [{ title: `${data?.template?.name ?? "Template"} - Brackt Admin` }]; } export async function loader({ params }: Route.LoaderArgs) { const template = await findSeasonTemplateWithSportsSeasons(params.id); if (!template) { throw new Response("Template not found", { status: 404 }); } const allSportsSeasons = await findAllSportsSeasons(); // Type assertion since we know the sport relation is included return { template, allSportsSeasons: allSportsSeasons as Array }; } export async function action({ request, params }: Route.ActionArgs) { const formData = await request.formData(); const intent = formData.get("intent"); if (intent === "delete") { await deleteSeasonTemplate(params.id); return redirect("/admin/templates"); } if (intent === "toggle-active") { const isActive = formData.get("isActive") === "true"; await setSeasonTemplateActive(params.id, isActive); return { success: true }; } if (intent === "add-sport") { const sportsSeasonId = formData.get("sportsSeasonId"); if (typeof sportsSeasonId === "string") { await addSportToTemplate(params.id, sportsSeasonId); } return { success: true }; } if (intent === "remove-sport") { const sportsSeasonId = formData.get("sportsSeasonId"); if (typeof sportsSeasonId === "string") { await removeSportFromTemplate(params.id, sportsSeasonId); } return { success: true }; } // Update template const name = formData.get("name"); const year = formData.get("year"); const description = formData.get("description"); if (typeof name !== "string" || !name.trim()) { return { error: "Template name is required" }; } if (typeof year !== "string") { return { error: "Year is required" }; } const yearNum = parseInt(year, 10); if (isNaN(yearNum) || yearNum < 2000 || yearNum > 2100) { return { error: "Year must be between 2000 and 2100" }; } try { await updateSeasonTemplate(params.id, { name: name.trim(), year: yearNum, description: typeof description === "string" && description.trim() ? description.trim() : null, }); return { success: true }; } catch (error) { logger.error("Error updating template:", error); return { error: "Failed to update template. Please try again." }; } } export default function EditTemplate({ loaderData, actionData }: Route.ComponentProps) { const { template, allSportsSeasons } = loaderData; const [selectedSportId, setSelectedSportId] = useState(""); const includedSeasonIds = new Set( template.seasonTemplateSports.map((s) => s.sportsSeasonId) ); const availableSportsSeasons = allSportsSeasons.filter( (s) => !includedSeasonIds.has(s.id) ); return (

Edit Template

{template.name}

Template Details Update the template information