brackt/app/routes/admin.templates.tsx

112 lines
3.6 KiB
TypeScript
Raw Normal View History

import { Link } from "react-router";
import type { Route } from "./+types/admin.templates";
import { findAllSeasonTemplates } from "~/models/season-template";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "~/components/ui/card";
import { Button } from "~/components/ui/button";
import { Plus, FolderKanban } from "lucide-react";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "~/components/ui/table";
import { Badge } from "~/components/ui/badge";
export function meta(): Route.MetaDescriptors {
return [{ title: "Templates - Brackt Admin" }];
}
export async function loader() {
const templates = await findAllSeasonTemplates();
return { templates };
}
export default function AdminTemplates({ loaderData }: Route.ComponentProps) {
const { templates } = loaderData;
return (
<div className="p-8">
<div className="flex items-center justify-between mb-6">
<div>
<h1 className="text-3xl font-bold">Season Templates</h1>
<p className="text-muted-foreground mt-1">
Manage season templates for league commissioners
</p>
</div>
<Button asChild>
<Link to="/admin/templates/new">
<Plus className="mr-2 h-4 w-4" />
Create Template
</Link>
</Button>
</div>
<Card>
<CardHeader>
<CardTitle>All Templates</CardTitle>
<CardDescription>
{templates.length} {templates.length === 1 ? "template" : "templates"} total
</CardDescription>
</CardHeader>
<CardContent>
{templates.length === 0 ? (
<div className="text-center py-12">
<FolderKanban className="mx-auto h-12 w-12 text-muted-foreground" />
<h3 className="mt-4 text-lg font-semibold">No templates yet</h3>
<p className="text-muted-foreground mt-2">
Create your first season template to bundle sports seasons
</p>
<Button className="mt-4" asChild>
<Link to="/admin/templates/new">
<Plus className="mr-2 h-4 w-4" />
Create Template
</Link>
</Button>
</div>
) : (
<Table>
<TableHeader>
<TableRow>
<TableHead>Name</TableHead>
<TableHead>Status</TableHead>
<TableHead>Description</TableHead>
<TableHead className="text-right">Actions</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{templates.map((template) => (
<TableRow key={template.id}>
<TableCell className="font-medium">{template.name}</TableCell>
<TableCell>
<Badge variant={template.isActive ? "default" : "secondary"}>
{template.isActive ? "Active" : "Inactive"}
</Badge>
</TableCell>
<TableCell className="text-muted-foreground max-w-md truncate">
{template.description || "-"}
</TableCell>
<TableCell className="text-right">
<Button variant="ghost" size="sm" asChild>
<Link to={`/admin/templates/${template.id}`}>Edit</Link>
</Button>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
)}
</CardContent>
</Card>
</div>
);
}