Files
rar-autopass/app/web/templates/_stepper.html
Claude Agent 4a1d28749a feat(web): dashboard ergonomic cu tab-uri, stepper import si microcopy uman (3.4)
Reorganizeaza interfata web pe trei principii, fara a atinge backend-ul de
trimitere (worker, mapping, idempotency, masina de stari neatinse):

- US-001 app/web/labels.py: modul pur stari tehnice -> text uman + clasa CSS
- US-002 bara status /_fragments/status: microcopy uman, defalcare blocate, scoped cont
- US-003 shell 6 tab-uri (Acasa/Import/Coada/Mapari/Cont/Nomenclator): deep-link
  ?tab=, panou activ randat server-side, fragmente inactive lazy, ARIA real
- US-004 stepper import 4 pasi (pur vizual; hx-target + csrf pastrate)
- US-005 Acasa onboarding checklist auto-bifat + colaps + empty states prietenoase

Reparat in cursul VERIFY/CLOSE: izolare teste (reset ratelimit._hits in fixturi),
regresie avertisment "cont in asteptare de activare" (re-introdus in bara status),
culori hardcodate -> variabile paleta. 434 teste pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 22:26:10 +00:00

97 lines
3.1 KiB
HTML

{#
_stepper.html — Antet wizard import (PUR vizual, fara logica de rutare).
Parametru: `pas` (integer 1-4) — pasul curent.
Utilizare in template-uri care mostenesc contextul Jinja2:
{% set pas = 1 %}{% include '_stepper.html' %}
sau cu `with`:
{% with pas=2 %}{% include '_stepper.html' %}{% endwith %}
Cei 4 pasi ficsi:
1. Incarca fisier
2. Potriveste coloanele
3. Verifica
4. Confirma trimiterea
Stari vizuale:
- index < pas "facut" (bulina plina, text bifat)
- index == pas "activ" (evidentiat, aria-current="step")
- index > pas → "viitor" (estompat)
#}
{%- set _pasi_import = [
(1, "Incarca fisier", "Trage un fisier xlsx/csv aici sau foloseste butonul de alegere."),
(2, "Potriveste coloanele", "Spune-ne ce coloana din fisier corespunde cu ce camp RAR."),
(3, "Verifica", "Verifica randurile inainte sa le trimiti la RAR."),
(4, "Confirma trimiterea", "Confirma numarul de prezentari — actiunea e ireversibila."),
] -%}
<nav class="stepper-import" aria-label="Pasii importului" style="
display:flex;
gap:0;
align-items:stretch;
margin-bottom:20px;
border:1px solid var(--line);
border-radius:8px;
overflow:hidden;
background:var(--card);
">
{% for nr, titlu, ajutor in _pasi_import %}
{%- if nr < pas %}
{%- set cls = "facut" -%}
{%- set aria = "" -%}
{%- elif nr == pas %}
{%- set cls = "activ" -%}
{%- set aria = ' aria-current="step"' -%}
{%- else %}
{%- set cls = "viitor" -%}
{%- set aria = "" -%}
{%- endif %}
<div class="stepper-pas stepper-pas--{{ cls }}"{{ aria | safe }}
style="
flex:1;
padding:10px 14px;
border-right:{% if not loop.last %}1px solid var(--line){% else %}none{% endif %};
{% if cls == 'activ' %}
background:rgba(91,141,239,.10);
{% elif cls == 'facut' %}
opacity:1;
{% else %}
opacity:.4;
{% endif %}
">
<div style="display:flex; align-items:center; gap:6px; margin-bottom:2px;">
<span class="stepper-nr" style="
display:inline-flex;
align-items:center;
justify-content:center;
width:20px;
height:20px;
border-radius:50%;
font-size:11px;
font-weight:700;
flex-shrink:0;
{% if cls == 'activ' %}
background:var(--accent);
color:#fff;
{% elif cls == 'facut' %}
background:var(--ok);
color:#fff;
{% else %}
background:var(--line);
color:var(--muted);
{% endif %}
">
{% if cls == 'facut' %}&#10003;{% else %}{{ nr }}{% endif %}
</span>
<span style="
font-size:13px;
font-weight:{% if cls == 'activ' %}600{% else %}400{% endif %};
color:{% if cls == 'activ' %}var(--ink){% elif cls == 'facut' %}var(--ink){% else %}var(--muted){% endif %};
">{{ titlu }}</span>
</div>
{% if cls == 'activ' %}
<p class="muted" style="margin:0; font-size:12px; padding-left:26px;">{{ ajutor }}</p>
{% endif %}
</div>
{% endfor %}
</nav>