Monaljain's picture
renamed satellite-interpolation-app to frontend
86f4c12
Raw
History Blame Contribute Delete
1.84 kB
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { ExportJob } from "../types";
import { Progress } from "@/components/ui/progress";
interface ExportQueueProps {
activeJobs: ExportJob[];
onCancel: (id: string) => void;
}
export function ExportQueue({ activeJobs, onCancel }: ExportQueueProps) {
if (activeJobs.length === 0) return null;
return (
<Card>
<CardHeader className="py-3 border-b">
<CardTitle className="text-sm font-medium">Export Queue</CardTitle>
</CardHeader>
<CardContent className="pt-4 space-y-4">
{activeJobs.map((job) => (
<div key={job.id} className="p-4 border rounded-lg bg-background">
<div className="flex items-center justify-between mb-3">
<div>
<div className="font-medium text-sm flex items-center gap-2">
<span>{job.format} Export</span>
<span className="text-xs px-2 py-0.5 rounded-full bg-primary/10 text-primary capitalize">
{job.status}
</span>
</div>
<div className="text-xs text-muted-foreground mt-1">
Started: {new Date(job.createdAt).toLocaleTimeString()}
</div>
</div>
<button
onClick={() => onCancel(job.id)}
className="text-xs text-destructive hover:underline"
>
Cancel
</button>
</div>
<div className="flex items-center gap-3">
<Progress value={job.progress} className="h-1.5 flex-1" />
<span className="text-xs font-mono w-8 text-right">{job.progress.toFixed(0)}%</span>
</div>
</div>
))}
</CardContent>
</Card>
);
}