feat(jobs): add Retry button for failed jobs with an associated asset

This commit is contained in:
Zac Gaetano 2026-05-19 00:54:47 -04:00
parent de4cb1b6a0
commit 43a17ecd14

View file

@ -670,6 +670,10 @@ function renderRow(job) {
const dur = formatDuration(job.started_at, job.completed_at || job.failed_at);
const retryBtn = (job.status === 'failed' && job.asset_id)
? `<button class="btn btn-ghost" style="font-size:var(--text-xs);padding:4px 10px;color:var(--status-green)" onclick="retryJob('${escHtml(job.asset_id)}', event)" title="Re-queue asset processing">Retry</button>`
: '';
tr.innerHTML = `
<td><span class="type-chip ${escHtml(job.type || 'conform')}">${escHtml((job.type || 'conform').toUpperCase())}</span></td>
<td>
@ -690,6 +694,7 @@ function renderRow(job) {
<td class="time-cell">${dur}</td>
<td>
<button class="btn btn-ghost" style="font-size:var(--text-xs);padding:4px 10px" onclick="openDetail('${escHtml(job.id)}')">Details</button>
${retryBtn}
<button class="btn btn-ghost" style="font-size:var(--text-xs);padding:4px 10px;color:var(--signal-bad)" onclick="killJob('${escHtml(job.id)}', event)" title="Remove this job from the queue">Kill</button>
</td>`;
@ -708,6 +713,17 @@ async function killJob(jobId, ev) {
}
}
async function retryJob(assetId, ev) {
ev.stopPropagation();
try {
await api('/assets/' + encodeURIComponent(assetId) + '/retry', { method: 'POST' });
toast('Job re-queued — processing will restart shortly.');
loadJobs();
} catch (e) {
showError('Retry failed: ' + e.message);
}
}
function statusBadge(status) {
const map = {
active: '<span class="badge badge-recording">Active</span>',
@ -792,6 +808,13 @@ function openDetail(jobId) {
</div>
</div>
${job.status === 'failed' && job.asset_id ? `
<div class="panel-section">
<button class="btn btn-secondary btn-sm" onclick="retryJob('${escHtml(job.asset_id)}', event); closeDetail();">
Retry — re-queue processing
</button>
</div>` : ''}
${job.error ? `
<div class="panel-section">
<div class="detail-label">Error</div>