import { Chip, FormControl, InputLabel, MenuItem, Paper, Select, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, } from "@mui/material"; import { useState } from "react"; import { BackupRun } from "../types/backups"; interface Props { runs: BackupRun[]; } function formatBytes(bytes: number | null): string { if (bytes === null || bytes === undefined) return "—"; if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number | null): string { if (ms === null || ms === undefined) return "—"; if (ms < 1000) return `${ms}ms`; if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`; if (ms < 3600_000) return `${(ms / 60_000).toFixed(1)}m`; return `${(ms / 3600_000).toFixed(1)}h`; } function formatTimestamp(ts: number): string { return new Date(ts * 1000).toLocaleString(); } export default function BackupRunsTable({ runs }: Props) { const [statusFilter, setStatusFilter] = useState("all"); const filteredRuns = statusFilter === "all" ? runs : runs.filter((r) => r.status === statusFilter); return ( <> Status Job Status Duration Size Started {filteredRuns.map((run) => ( {run.job_id} {formatDuration(run.duration_ms)} {formatBytes(run.bytes_transferred)} {formatTimestamp(run.started_at)} ))}
); }