109 lines
3.6 KiB
TypeScript
109 lines
3.6 KiB
TypeScript
|
|
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 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>Year</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>{template.year}</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>
|
||
|
|
);
|
||
|
|
}
|