Added job review toggle

This commit is contained in:
Aaron Roberts
2026-06-23 10:43:44 +01:00
parent 91c134faa7
commit 48f958de6c
2 changed files with 105 additions and 0 deletions

View File

@@ -50,6 +50,7 @@ function JobDetail({ jobId, onClose, onReviewed, onDeleted, suggestions = {} })
const [saveResult, setSaveResult] = useState(null)
const [confirmDelete, setConfirmDelete] = useState(false)
const [deleting, setDeleting] = useState(false)
const [togglingStatus, setTogglingStatus] = useState(false)
useEffect(() => {
let cancelled = false
@@ -112,6 +113,29 @@ function JobDetail({ jobId, onClose, onReviewed, onDeleted, suggestions = {} })
}
}
const handleToggleStatus = async () => {
const next = isReviewed ? 'unreviewed' : 'reviewed'
if (next === 'reviewed' && !reviewerName.trim()) {
setSaveResult({ success: false, error: 'Reviewer name is required to mark reviewed.' })
return
}
setTogglingStatus(true)
setSaveResult(null)
try {
const res = await axios.put(`${API_BASE}/jobs/${jobId}/status`, {
status: next,
reviewer_name: reviewerName.trim() || null,
})
setJob(res.data)
setReviewerName(res.data.reviewer_name || '')
onReviewed(res.data)
} catch (err) {
setSaveResult({ success: false, error: err.response?.data?.detail || err.message })
} finally {
setTogglingStatus(false)
}
}
const handleDelete = async () => {
setDeleting(true)
try {
@@ -148,6 +172,27 @@ function JobDetail({ jobId, onClose, onReviewed, onDeleted, suggestions = {} })
{job && (
<>
<StatusBadge status={job.status} />
<motion.button
onClick={handleToggleStatus}
disabled={togglingStatus}
title={isReviewed ? 'Revert to unreviewed' : 'Mark as reviewed'}
className={`flex items-center gap-1 px-3 py-1.5 rounded-lg text-xs font-medium transition-colors disabled:opacity-50 ${
isReviewed
? 'glass glass-hover text-amber-400 hover:bg-amber-500/10'
: 'glass glass-hover text-green-400 hover:bg-green-500/10'
}`}
whileHover={!togglingStatus ? { scale: 1.02 } : {}}
whileTap={!togglingStatus ? { scale: 0.98 } : {}}
>
{togglingStatus ? (
<Loader2 className="w-3.5 h-3.5 animate-spin" />
) : isReviewed ? (
<Clock className="w-3.5 h-3.5" />
) : (
<CheckCircle2 className="w-3.5 h-3.5" />
)}
{isReviewed ? 'Mark Unreviewed' : 'Mark Reviewed'}
</motion.button>
<span className="text-xs text-gray-500 font-mono hidden sm:block">{job.id}</span>
</>
)}