feat: organizer Android app and token-gated upload API
CI / lint-and-test (push) Failing after 1m18s

Replace Syncthing as the product upload path with a share-target app
and POST /api/jobs. Web UI live-polls job progress.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Frank Schwenk
2026-08-27 21:38:50 +02:00
parent 5dcc3717c7
commit c03f17488c
58 changed files with 3134 additions and 186 deletions
+12 -6
View File
@@ -2,28 +2,34 @@
{% block title %}{{ site_title }}{% endblock %}
{% block content %}
{% if not jobs %}
<p class="empty-state">Noch keine Jobs. Bild in den Sync-Ordner legen, dann kurz warten.</p>
<p class="empty-state">Noch keine Jobs. Foto in der App teilen, dann kurz warten.</p>
{% else %}
<ul class="job-grid">
{% for job in jobs %}
<li class="job-card">
<li class="job-card{% if job.status in ACTIVE_STATUSES %} is-live{% endif %}">
<a href="/jobs/{{ job.job_id }}">
{% if job.thumbnail %}
{% set img = img_attrs(job.job_id, job.thumbnail) %}
<img class="thumb lightboxable"
<img class="thumb"
src="{{ img.src }}"
srcset="{{ img.srcset }}"
sizes="{{ img.sizes }}"
data-full-src="{{ img.full_src }}"
alt="Variante von Job {{ job.job_id }}"
loading="lazy"
decoding="async">
{% else %}
<span class="thumb thumb-placeholder status-{{ job.status }}">{{ job.status }}</span>
<span class="thumb thumb-placeholder status-{{ job.status }}">{{ job.status_label }}</span>
{% endif %}
<span class="job-meta">
<span class="job-id">{{ job.job_id }}</span>
<span class="job-status status-{{ job.status }}">{{ job.status }} &middot; {{ job.variant_count }} Varianten</span>
<span class="job-status status-{{ job.status }}">
{{ job.status_label }}
{% if job.stage_label and job.status in ACTIVE_STATUSES %}
&middot; {{ job.stage_label }}
{% else %}
&middot; {{ job.variant_count }} Varianten
{% endif %}
</span>
</span>
</a>
</li>