diff --git a/dashboards/tracker-web/src/app/dashboard/fleet/jobs/page.tsx b/dashboards/tracker-web/src/app/dashboard/fleet/jobs/page.tsx index fc8825ba..d6192338 100644 --- a/dashboards/tracker-web/src/app/dashboard/fleet/jobs/page.tsx +++ b/dashboards/tracker-web/src/app/dashboard/fleet/jobs/page.tsx @@ -3,8 +3,9 @@ import { useEffect, useState, useCallback } from 'react'; import Link from 'next/link'; import { PageHeader } from '@bytelyst/dashboard-components'; +import { Button } from '@/components/ui/Primitives'; import { useAuth } from '@/lib/auth-context'; -import { listJobs, type FleetJob } from '@/lib/fleet-client'; +import { listJobs, submitJob, type FleetJob } from '@/lib/fleet-client'; const STAGES = [ '', @@ -26,6 +27,14 @@ export default function FleetJobsPage() { const [stage, setStage] = useState(''); const [loading, setLoading] = useState(true); + // New-job form state + const [showForm, setShowForm] = useState(false); + const [body, setBody] = useState(''); + const [priority, setPriority] = useState<'low' | 'normal' | 'high'>('high'); + const [caps, setCaps] = useState('build'); + const [submitting, setSubmitting] = useState(false); + const [submitMsg, setSubmitMsg] = useState<{ ok: boolean; text: string } | null>(null); + const refresh = useCallback(async () => { try { const params: Record = { limit: '50' }; @@ -46,10 +55,108 @@ export default function FleetJobsPage() { return () => clearInterval(id); }, [token, refresh]); + const handleSubmit = useCallback(async () => { + if (!body.trim()) { + setSubmitMsg({ ok: false, text: 'Job body is required.' }); + return; + } + setSubmitting(true); + setSubmitMsg(null); + try { + const capabilities = caps + .split(',') + .map(c => c.trim()) + .filter(Boolean); + const { job } = await submitJob({ + idempotencyKey: `ui-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`, + bodyMd: body.trim(), + priority, + capabilities, + }); + setSubmitMsg({ ok: true, text: `Submitted ${job.id} (stage: ${job.stage}).` }); + setBody(''); + await refresh(); + } catch (err: unknown) { + const msg = err instanceof Error ? err.message : 'Submit failed.'; + setSubmitMsg({ ok: false, text: msg }); + } finally { + setSubmitting(false); + } + }, [body, caps, priority, refresh]); + return (
+ {/* New job */} +
+ + {showForm && ( +
+
+ +