Files
toolvana/app/Views/admin/jobs_index.php
T
deepseek beaf0e1f37 Toolvana: production-ready media tools platform (CodeIgniter 4)
- 134-tool registry with programmatic SEO (unique titles/H1/descriptions,
  JSON-LD graphs, sitemap index, canonical 301 enforcement via required filter)
- DB-backed job queue (SKIP LOCKED) with drivers: Ffmpeg, Images (GD),
  Pdf (qpdf/gs/poppler), Youtube (thumbnails), Qr (server-side PNG)
- Security: SSRF guard, MIME validation, rate limits, API-key auth,
  bcrypt admin login, security headers
- Admin panel: dashboard, tools/categories/guides CRUD, SEO audit,
  analytics, job inspector with retry, system health, feature flags
- Docker deployment (nginx + web/api FPM pools + scalable workers),
  PHPUnit suite (19 tests / 1139 assertions), PWA manifest + service worker
2026-08-23 07:10:30 +00:00

23 lines
2.0 KiB
PHP

<?= view('partials/admin_nav') ?>
<h1 style="font-size:1.7rem;margin-bottom:1rem">Processing jobs</h1>
<div class="chips" style="margin-bottom:1rem">
<a class="chip" href="/admin/jobs">all (<?= $counts['completed'] + $counts['failed'] + $counts['queued'] + $counts['processing'] ?>)</a>
<a class="chip" href="/admin/jobs?status=queued">queued (<?= $counts['queued'] ?>)</a>
<a class="chip" href="/admin/jobs?status=processing">processing (<?= $counts['processing'] ?>)</a>
<a class="chip" href="/admin/jobs?status=completed">completed (<?= $counts['completed'] ?>)</a>
<a class="chip" href="/admin/jobs?status=failed">failed (<?= $counts['failed'] ?>)</a>
</div>
<table style="width:100%;font-size:.84rem;border-collapse:collapse;background:#fff;border-radius:var(--radius-sm);box-shadow:var(--shadow-sm)">
<tr style="text-align:left;color:var(--ink-500)"><th style="padding:.65rem">Job</th><th>Op</th><th>In</th><th>Status / stage</th><th>Error</th><th></th></tr>
<?php foreach ($jobs as $j): ?>
<tr style="border-top:1px solid #f2f2f5">
<td style="padding:.5rem .65rem"><code><?= esc(substr($j['id'],0,8)) ?></code><br><span class="hint"><?= esc($j['created_at']) ?></span></td>
<td><?= esc($j['operation']) ?></td>
<td><?= esc($j['input_name'] ?? '—') ?></td>
<td><span class="badge" style="<?= $j['status']==='completed'?'background:#ecfdf5;color:#047857':($j['status']==='failed'?'background:#fef2f2;color:#b91c1c':'') ?>"><?= esc($j['status']) ?></span> <?= esc($j['stage']) ?> · <?= (int)$j['progress'] ?>%</td>
<td style="max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" class="hint"><?= esc(mb_substr($j['error'] ?? '', 0, 60)) ?></td>
<td><?php if (in_array($j['status'], ['failed', 'expired'], true)): ?><form method="post" action="/admin/jobs/<?= esc($j['id']) ?>/retry"><?= csrf_field() ?><button class="chip" type="submit" style="cursor:pointer;border:1px solid var(--brand-300,#c4b5fd)">Retry</button></form><?php endif ?></td>
</tr>
<?php endforeach ?>
</table>