105 lines
5.3 KiB
HTML
105 lines
5.3 KiB
HTML
{% extends "admin/layout.html" %}
|
|
{% block admin_title %}{{ job.name_str() }}{% endblock admin_title %}
|
|
|
|
{% block content %}
|
|
<h1>{{ job.name_str() }}</h1>
|
|
|
|
<table>
|
|
<tr><th>{{ t.jobs_description }}</th><td>{{ job.description_str() }}</td></tr>
|
|
<tr><th>{{ t.jobs_cron }}</th><td><code>{{ job.cron_expression_str() }}</code></td></tr>
|
|
<tr><th>{{ t.jobs_enabled }}</th><td>{% if job.enabled() %}✅{% else %}❌{% endif %}</td></tr>
|
|
<tr><th>{{ t.jobs_last_run }}</th><td>{{ job.last_run_at_str() }}</td></tr>
|
|
<tr><th>{{ t.jobs_next_run }}</th><td>{{ job.next_run_at_str() }}</td></tr>
|
|
</table>
|
|
|
|
<div style="margin: 1rem 0; display: flex; gap: .5rem; align-items: flex-end;">
|
|
{% if job.name_str() != "metadata_backfill" %}
|
|
<form method="post" action="/admin/jobs/{{ job.name_str() }}/run" style="margin:0;">
|
|
<button type="submit" style="padding:.4rem 1rem; background:#007bff; color:#fff; border:none; border-radius:4px; cursor:pointer;">{{ t.jobs_run_now }}</button>
|
|
</form>
|
|
{% endif %}
|
|
{% if job.name_str() != "metadata_backfill" %}
|
|
<form method="post" action="/admin/jobs/{{ job.name_str() }}/toggle" style="margin:0;">
|
|
{% if job.enabled() %}
|
|
<button type="submit" style="padding:.4rem 1rem; background:#dc3545; color:#fff; border:none; border-radius:4px; cursor:pointer;">{{ t.jobs_disable }}</button>
|
|
{% else %}
|
|
<button type="submit" style="padding:.4rem 1rem; background:#28a745; color:#fff; border:none; border-radius:4px; cursor:pointer;">{{ t.jobs_enable }}</button>
|
|
{% endif %}
|
|
</form>
|
|
{% endif %}
|
|
</div>
|
|
|
|
{% if job.name_str() == "metadata_backfill" %}
|
|
<h2>{{ t.jobs_metadata_backfill_options }}</h2>
|
|
<form method="post" action="/admin/jobs/metadata_backfill/run-options" style="margin:0 0 1.5rem; padding:1rem; background:#fff; border:1px solid #e0e0e0; border-radius:6px;">
|
|
<fieldset style="border:0; margin:0 0 .75rem; padding:0;">
|
|
<legend style="font-weight:600; margin-bottom:.5rem;">{{ t.jobs_metadata_backfill_fields }}</legend>
|
|
<label style="display:inline-flex; gap:.35rem; align-items:center; margin-right:1rem; margin-bottom:.4rem;">
|
|
<input type="checkbox" name="audio_bitrate" checked> audio_bitrate
|
|
</label>
|
|
<label style="display:inline-flex; gap:.35rem; align-items:center; margin-right:1rem; margin-bottom:.4rem;">
|
|
<input type="checkbox" name="audio_sample_rate" checked> audio_sample_rate
|
|
</label>
|
|
<label style="display:inline-flex; gap:.35rem; align-items:center; margin-right:1rem; margin-bottom:.4rem;">
|
|
<input type="checkbox" name="audio_bit_depth" checked> audio_bit_depth
|
|
</label>
|
|
<label style="display:inline-flex; gap:.35rem; align-items:center; margin-right:1rem; margin-bottom:.4rem;">
|
|
<input type="checkbox" name="duration_seconds" checked> duration_seconds
|
|
</label>
|
|
</fieldset>
|
|
<div style="display:flex; gap:1rem; align-items:center; margin-bottom:.9rem;">
|
|
<label style="display:inline-flex; gap:.35rem; align-items:center;">
|
|
<input type="radio" name="mode" value="fill_missing" checked> {{ t.jobs_metadata_backfill_fill_missing }}
|
|
</label>
|
|
<label style="display:inline-flex; gap:.35rem; align-items:center;">
|
|
<input type="radio" name="mode" value="overwrite"> {{ t.jobs_metadata_backfill_overwrite }}
|
|
</label>
|
|
</div>
|
|
<button type="submit" style="padding:.45rem 1rem; background:#007bff; color:#fff; border:none; border-radius:4px; cursor:pointer;">{{ t.jobs_metadata_backfill_run }}</button>
|
|
</form>
|
|
{% endif %}
|
|
|
|
{% if job.name_str() != "metadata_backfill" %}
|
|
<h2>{{ t.jobs_cron }}</h2>
|
|
<p style="font-size:.85rem;color:#666;margin-bottom:.5rem;">{{ t.jobs_cron_help }}</p>
|
|
<form method="post" action="/admin/jobs/{{ job.name_str() }}/cron" style="display:flex;gap:.5rem;align-items:center;margin-bottom:1.5rem;">
|
|
<input name="cron_expression" value="{{ job.cron_expression_str() }}" style="width:20em;font-family:monospace;">
|
|
<button type="submit" style="padding:.4rem 1rem; background:#6c757d; color:#fff; border:none; border-radius:4px; cursor:pointer;">{{ t.jobs_cron_update }}</button>
|
|
</form>
|
|
{% endif %}
|
|
|
|
<h2>{{ t.jobs_run_history }}</h2>
|
|
{% if runs.is_empty() %}
|
|
<p>No runs yet.</p>
|
|
{% else %}
|
|
<table>
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>{{ t.jobs_run_status }}</th>
|
|
<th>{{ t.jobs_run_started }}</th>
|
|
<th>{{ t.jobs_run_duration }}</th>
|
|
<th>{{ t.jobs_run_trigger }}</th>
|
|
<th>{{ t.jobs_actions }}</th>
|
|
</tr>
|
|
{% for run in runs %}
|
|
<tr>
|
|
<td>{{ run.id_val() }}</td>
|
|
<td><span class="badge {{ run.status_badge_class() }}">{{ run.status_str() }}</span></td>
|
|
<td>{{ run.started_at_str() }}</td>
|
|
<td>{{ run.duration_display() }}</td>
|
|
<td>{{ run.trigger_str() }}</td>
|
|
<td><a href="/admin/jobs/{{ job.name_str() }}/runs/{{ run.id_val() }}">{{ t.reviews_view }}</a></td>
|
|
</tr>
|
|
{% endfor %}
|
|
</table>
|
|
{% endif %}
|
|
|
|
<p style="margin-top:1rem;"><a href="/admin/jobs">← {{ t.jobs_back_to_list }}</a></p>
|
|
|
|
<style>
|
|
.badge-completed { background: #d4edda; color: #155724; }
|
|
.badge-failed { background: #f8d7da; color: #721c24; }
|
|
.badge-processing { background: #d1ecf1; color: #0c5460; }
|
|
</style>
|
|
{% endblock content %}
|