/** * JobsTab — operational content for the backups service page. * * Instance-scoped: hooks filter by instance.id so multi-instance setups * show only the selected backups service's jobs, runs, and alerts. */ import { useState } from "react"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useAcknowledgeAlert, useBackupAlerts, useBackupJobs, useBackupRuns, } from "../../hooks/useBackups"; import BackupAlertsTable from "../../components/BackupAlertsTable"; import BackupJobsTable from "../../components/BackupJobsTable"; import BackupRunsTable from "../../components/BackupRunsTable"; import type { ServiceInstance } from "../../types"; export function JobsTab({ instance }: { instance: ServiceInstance }) { const [tab, setTab] = useState("jobs"); const { data: jobsData, isLoading: jobsLoading } = useBackupJobs(instance.id); const { data: runsData, isLoading: runsLoading } = useBackupRuns( undefined, undefined, instance.id, ); const { data: alertsData, isLoading: alertsLoading } = useBackupAlerts( undefined, false, undefined, instance.id, ); const acknowledgeMutation = useAcknowledgeAlert(); // Build a map of latest runs per job const latestRuns = new Map(); if (runsData) { for (const run of runsData) { const existing = latestRuns.get(run.job_id); if (!existing || run.started_at > existing.started_at) { latestRuns.set(run.job_id, run); } } } const alertsLabel = alertsData ? `Alerts (${alertsData.length})` : "Alerts"; return (
Loading jobs…
) : (Loading runs…
) : (Loading alerts…
) : (