feat(web): UI compact Trimiteri + bara bulk contextuala + fix buton "+" editor (PRD 5.22)

Trimiteri desktop = tabel grid cu header, un rand per trimitere: status =
bulina cu tooltip, mediu = litera T/P, multi-cod = primul cod + badge +N,
sub-linie de eroare cu textul brut RAR doar pe error/needs_data. Mobil:
2 linii prin grid-areas, fara header. Actiunile bulk apar doar la selectie
(bara contextuala cu contor + texte explicite). Mapari: exemplu concret in
loc de descriere la Reguli automate.

Fix buton "+" chips (nu facea nimic, fara eroare): hx-disabled-elt="find
button" mostenit de la form-ul parinte crapa htmx inainte de request ->
hx-disabled-elt="this" explicit pe butoanele chips; separat, no-op-urile
silentioase din post_form_chips au acum mesaje (cod invalid/duplicat) si
confirmare cu chip evidentiat la succes.

Suita: 1622 passed. Verify E2E in browser (desktop 1280 + mobil 390).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-07-07 12:27:42 +00:00
parent 6674d0e3e1
commit 5a2c976d46
17 changed files with 912 additions and 169 deletions

View File

@@ -46,3 +46,39 @@ def test_eticheta_lunga_ramane_pentru_subtext():
assert isinstance(css_class, str) and css_class, (
f"eticheta_stare({status!r}) trebuie sa aiba css_class non-vida la pozitia 3"
)
def test_eroare_bruta_prefera_cauza_tehnica():
import json
from app.web.labels import eroare_bruta
rar_error = json.dumps({
"cod": "RAR_EROARE_SERVER",
"problema": "RAR a esuat la inregistrarea prezentarii",
"cauza": "ORA-12899: value too large for column PRESTATII.COD",
"fix": "",
"field": None,
"message": "ORA-12899: value too large for column PRESTATII.COD",
})
assert eroare_bruta("error", rar_error) == (
"ORA-12899: value too large for column PRESTATII.COD"
)
def test_eroare_bruta_goala_pe_needs_mapping_si_stari_ok():
from app.web.labels import eroare_bruta
assert eroare_bruta("needs_mapping", '{"unmapped": [{"cod_op_service": "X"}]}') == ""
assert eroare_bruta("sent", "orice") == ""
assert eroare_bruta("queued", None) == ""
def test_eroare_bruta_validare_needs_data():
import json
from app.web.labels import eroare_bruta
rar_error = json.dumps([{"field": "vin", "message": "VIN invalid (17 caractere)"}])
assert eroare_bruta("needs_data", rar_error) == "VIN invalid (17 caractere)"
def test_eroare_bruta_nu_arunca_pe_json_corupt():
from app.web.labels import eroare_bruta
assert eroare_bruta("error", "{corupt") == "{corupt"
assert eroare_bruta("error", None) == ""