gflow 0.4.18

A lightweight, single-node job scheduler written in Rust.
import type { Reservation } from "@/api"
import { formatDuration, formatGpuSpec, formatTime } from "@/lib/format"
import {
  Card,
  CardContent,
  CardDescription,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from "@/components/ui/table"
import { EmptyRow } from "@/components/dashboard/StatePanels"
import { StatusBadge } from "@/components/dashboard/StatusBadge"

export function ReservationsView({ reservations }: { reservations: Reservation[] }) {
  return (
    <Card className="rounded-lg">
      <CardHeader>
        <CardTitle>Reservations</CardTitle>
        <CardDescription>{reservations.length} reservations</CardDescription>
      </CardHeader>
      <CardContent>
        <div className="overflow-hidden rounded-lg border">
          <Table>
            <TableHeader>
              <TableRow>
                <TableHead>ID</TableHead>
                <TableHead>Status</TableHead>
                <TableHead>User</TableHead>
                <TableHead>GPU Spec</TableHead>
                <TableHead>Start</TableHead>
                <TableHead>Duration</TableHead>
              </TableRow>
            </TableHeader>
            <TableBody>
              {reservations.length ? (
                reservations.map((reservation) => (
                  <TableRow key={reservation.id}>
                    <TableCell className="font-mono text-xs">
                      {reservation.id}
                    </TableCell>
                    <TableCell>
                      <StatusBadge value={reservation.status} />
                    </TableCell>
                    <TableCell>{reservation.user}</TableCell>
                    <TableCell>{formatGpuSpec(reservation.gpu_spec)}</TableCell>
                    <TableCell>{formatTime(reservation.start_time)}</TableCell>
                    <TableCell>{formatDuration(reservation.duration)}</TableCell>
                  </TableRow>
                ))
              ) : (
                <EmptyRow columns={6} label="No reservations" />
              )}
            </TableBody>
          </Table>
        </div>
      </CardContent>
    </Card>
  )
}