Files
rar-autopass/app/web/templates/_form_editare.html
Claude Agent 8f39dfbc1e feat(5.16): aliniere lista/preview la mockup + fix lock seed la boot
Implementeaza planul aprobat din docs/raport-comparatie-mockup-5.16.md (T-1..T-9):

- T-1/T-8: rand lista 4->2 linii (placuta primar + cod RAR · operatie · data + pill),
  fallback placuta, eticheta-problema 10px->--fs-xs (_submissions.html, base.html)
- T-2: pill slim restilat fill-tint + dot 7px + text colorat per stare (base.html)
- T-3: bug 4a coliziune pill/vehicul in preview — col-stare 104->140px (base.html)
- T-4: preview 8->5 coloane (scos #, KM, Note; motivul -> title pe pill)
- T-5: titlu sectiune "Trimiterile tale" -> sr-only (a11y) + badge/export discret
- T-6: linia plan N/60 in corp doar pe avertizare; consum normal in badge+burger
- T-7: guard chenar gol chips extra (_chips_prestatii.html)
- T-9: "Anuleaza"->"Renunta"; nume operatie emfatic bold

Fix boot: init_db reincarca seedul de ~17k operatii (5.18) pe FIECARE pornire, pe
API + worker concurent -> "database is locked" la al doilea proces. Guard "_if_empty"
pe mapping_suggestions (ca seed_nomenclator_if_empty) -> boot rapid, fara cursa.

Teste actualizate (slim 2-linii, fallback placuta, plan in burger). TODOS.md:
defer trackuit (eroare HTMX lista, retokenizare px, diacritice).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 14:44:10 +00:00

114 lines
6.0 KiB
HTML

{# _form_editare.html — partial partajat slim: campurile vehicul/data/odo + obs + chips prestatii.
US-007 (PRD 5.15): redesign slim cu VIN unic, Observatii textarea, chips prestatii (E4),
si reveal dinamic odometru initial cand chips contin R-ODO/I-ODO (D10c, E6 server-driven).
Inclus cu {% include "_form_editare.html" %} INSIDE un <form> element al
template-ului parinte. Acel parinte pune form-ul, CSRF-ul si orice campuri
suplimentare.
Variabile necesare din context (setate de parinte inainte de include):
form_nr — valoare curenta nr_inmatriculare
form_vin — valoare curenta vin
form_data — valoare curenta data_prestatie (YYYY-MM-DD sau brut)
form_odo_final — valoare curenta odometru_final
form_odo_initial — valoare curenta odometru_initial
obs_val — valoare curenta obs (Observatii), text liber (default '')
prestatii_chips — list of {cod_prestatie, cod_op_service, denumire} (default [])
nomenclator_rar — list of {cod_prestatie, nume_prestatie} pentru picker (default [])
has_r_odo — True daca chips contin R-ODO/I-ODO (server-computed, default False)
form_chips_url — URL pentru HTMX chip endpoint (default '/form-chips')
err_map — dict {field_name: mesaj_eroare} (poate fi {})
fix_map — dict {field_name: hint_fix} (poate fi {})
vin_context — string VIN pentru aria-label (poate fi '')
btn_label — eticheta butonului primar (ex. 'Salveaza si retrimite')
#}
{% from "_macros.html" import camp, icon %}
{# === 1. VIN — camp unic (fara "Confirma VIN"; contractul RAR cere un singur VIN) === #}
{{ camp('vin', 'VIN (serie sasiu)', form_vin, slim=True, mono=True,
err_map=err_map, fix_map=fix_map, vin_context=vin_context) }}
{# === 2. Data prestatie + Nr. inmatriculare — grila 2 coloane === #}
<div style="display:grid; grid-template-columns:1fr 1fr; gap:0 12px;">
{{ camp('data_prestatie', 'Data prestatiei', form_data, tip='date', slim=True,
err_map=err_map, fix_map=fix_map, vin_context=vin_context) }}
{{ camp('nr_inmatriculare', 'Numar inmatriculare', form_nr, slim=True, mono=True,
err_map=err_map, fix_map=fix_map, vin_context=vin_context) }}
</div>
{# === 3. Observatii (obs) — textarea liber, US-005 === #}
<div class="camp-slim">
<label for="c-obs">Observatii (operatiile efectuate)</label>
<textarea id="c-obs" name="obs" rows="2"
aria-label="Observatii (operatiile efectuate){% if vin_context %} (VIN: {{ vin_context }}){% endif %}"
placeholder="ex: Revizie; schimbare placute frana">{{ obs_val or '' }}</textarea>
</div>
{# === 4. Prestatii chips (E4 server-driven, US-007) === #}
{% set form_chips_url = form_chips_url or '/form-chips' %}
{% set chips_section_id = 'chips-section' %}
{% include "_chips_prestatii.html" %}
{# === 5. Odometru final — intotdeauna vizibil === #}
{{ camp('odometru_final', 'Odometru final (km)', form_odo_final, slim=True, mono=True,
err_map=err_map, fix_map=fix_map, vin_context=vin_context) }}
{# === 6. Odometru initial — reveal dinamic server cand chips contin R-ODO/I-ODO (D10c) ===
has_r_odo=True (server-computed din lista de chips): sectiune vizibila cu marcaj warn.
has_r_odo=False: hint discret, campul optional si vizual neutru. #}
{% if has_r_odo %}
<div class="odo-initial-warn"
style="border-left:2px solid var(--warn);padding-left:10px;margin-left:-2px;">
<div class="camp-slim">
<label for="c-odometru_initial" style="color:var(--warn);">
Odometru initial (km) · necesar pentru R-ODO
</label>
<input id="c-odometru_initial" type="text" name="odometru_initial"
value="{{ form_odo_initial or '' }}"
class="camp-mono"
required
aria-required="true"
style="border-color:color-mix(in srgb,var(--warn) 50%,var(--line));{% if err_map.get('odometru_initial') %}border-color:var(--err);{% endif %}"
aria-label="Odometru initial (VIN: {{ vin_context or '' }}) — necesar pentru R-ODO"
{% if err_map.get('odometru_initial') %}aria-invalid="true"{% endif %}>
{% if err_map.get('odometru_initial') %}
<div class="s-error" style="font-size:12px;margin-top:2px;">{{ err_map.get('odometru_initial') }}</div>
{% endif %}
</div>
</div>
{% else %}
{# Hint discret cand nu e necesar #}
<div class="camp-slim">
<label for="c-odometru_initial" style="color:var(--muted);">Odometru initial (km)</label>
<input id="c-odometru_initial" type="text" name="odometru_initial"
value="{{ form_odo_initial or '' }}"
class="camp-mono"
style="{% if err_map.get('odometru_initial') %}border-color:var(--err);{% endif %}"
aria-label="Odometru initial (optional){% if vin_context %} (VIN: {{ vin_context }}){% endif %}"
{% if err_map.get('odometru_initial') %}aria-invalid="true"{% endif %}>
{% if err_map.get('odometru_initial') %}
<div class="s-error" style="font-size:12px;margin-top:2px;">{{ err_map.get('odometru_initial') }}</div>
{% endif %}
<span style="font-size:10px;color:var(--muted);font-style:italic;">
Odometru initial se cere doar pentru coduri R-ODO / I-ODO.
</span>
</div>
{% endif %}
{# === 7. Buton primar parametrizat ===
with_cancel=True (modal editare preview): Salveaza + Anuleaza pe ACELASI rand,
sistemul .act (desktop = text alaturat; mobil = doua iconite Lucide 44px alaturate).
Implicit (ex. _trimitere_detaliu): un singur buton text, neschimbat. #}
{% if with_cancel %}
<div class="act-group" style="margin-top:14px;">
<button type="submit" class="act act-primary" aria-label="{{ btn_label or 'Salveaza' }}">
<span class="act-tx">{{ btn_label or 'Salveaza' }}</span>{{ icon('save') }}</button>
<button type="button" class="act" aria-label="{{ cancel_label or 'Renunta' }}" data-modal-close>
<span class="act-tx">{{ cancel_label or 'Renunta' }}</span>{{ icon('x') }}</button>
</div>
{% else %}
<div style="margin-top:14px;">
<button type="submit">{{ btn_label or 'Salveaza' }}</button>
</div>
{% endif %}