Files
POPS/app/templates/dashboard.html
Martin Hohenberg ee0b1b39e9 Add Jinja2 web UI with Bootstrap 5 dark theme
- app/templates/: base layout with sidebar nav + 6 pages
  (dashboard, printers, jobs, filaments, todos, pricing)
- app/routers/ui.py: HTML routes querying the DB live
- API routes moved to /api/* prefix
- requirements: jinja2, python-multipart

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 21:26:23 +02:00

107 lines
3.7 KiB
HTML

{% extends "base.html" %}
{% block title %}Dashboard — POPS{% endblock %}
{% block content %}
<h5 class="text-white mb-4">Dashboard</h5>
{# ── Stats row ── #}
<div class="row g-3 mb-4">
<div class="col-6 col-md-3">
<div class="card p-3">
<div class="text-secondary small mb-1">Printers</div>
<div class="fs-2 fw-bold text-white">{{ total_printers }}</div>
</div>
</div>
<div class="col-6 col-md-3">
<div class="card p-3">
<div class="text-secondary small mb-1">Printing Now</div>
<div class="fs-2 fw-bold text-primary">{{ printing_count }}</div>
</div>
</div>
<div class="col-6 col-md-3">
<div class="card p-3">
<div class="text-secondary small mb-1">Active Jobs</div>
<div class="fs-2 fw-bold text-warning">{{ active_jobs }}</div>
</div>
</div>
<div class="col-6 col-md-3">
<div class="card p-3">
<div class="text-secondary small mb-1">Filament Spools</div>
<div class="fs-2 fw-bold text-white">{{ total_filaments }}</div>
</div>
</div>
</div>
<div class="row g-3">
{# ── Printer overview ── #}
<div class="col-lg-5">
<div class="card h-100">
<div class="card-header text-secondary small text-uppercase fw-normal" style="border-color:#21262d">Printers</div>
{% if printers %}
<table class="table table-dark table-hover mb-0 align-middle">
<tbody>
{% for p in printers %}
<tr>
<td>{{ p.name }}</td>
<td class="text-secondary small">{{ p.model or '—' }}</td>
<td class="text-end">
{% set s = p.status.value %}
{% if s == 'printing' %}<span class="badge bg-primary">printing</span>
{% elif s == 'idle' %}<span class="badge bg-success">idle</span>
{% elif s == 'error' %}<span class="badge bg-danger">error</span>
{% else %}<span class="badge bg-secondary">offline</span>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<div class="card-body text-secondary">No printers configured yet.</div>
{% endif %}
</div>
</div>
{# ── Recent jobs ── #}
<div class="col-lg-7">
<div class="card h-100">
<div class="card-header text-secondary small text-uppercase fw-normal" style="border-color:#21262d">Recent Jobs</div>
{% if recent_jobs %}
<table class="table table-dark table-hover mb-0 align-middle">
<thead>
<tr class="text-secondary small">
<th class="fw-normal">Name</th>
<th class="fw-normal">Printer</th>
<th class="fw-normal">Status</th>
<th class="fw-normal text-end">Date</th>
</tr>
</thead>
<tbody>
{% for j in recent_jobs %}
<tr>
<td>{{ j.name }}</td>
<td class="text-secondary small">{{ j.printer.name if j.printer else '—' }}</td>
<td>
{% set s = j.status.value %}
{% if s == 'printing' %}<span class="badge bg-primary">printing</span>
{% elif s == 'done' %}<span class="badge bg-success">done</span>
{% elif s == 'failed' %}<span class="badge bg-danger">failed</span>
{% elif s == 'cancelled' %}<span class="badge bg-warning text-dark">cancelled</span>
{% else %}<span class="badge bg-secondary">queued</span>
{% endif %}
</td>
<td class="text-secondary small text-end">{{ j.created_at.strftime('%d.%m %H:%M') }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<div class="card-body text-secondary">No jobs yet.</div>
{% endif %}
</div>
</div>
</div>
{% endblock %}