- _trimitere_detaliu.html rescris pe ordinea verticala R10: header+motiv, eroare blocanta, mapare inline, formular editabil/context read-only, actiuni, <details> Detalii tehnice colapsat - zero dublare: campurile editabile apar O SINGURA DATA (nr rand propriu, VIN dedesubt, restul in grila); blocul read-only de grila contopit cu formularul - R9: operatie+cod read-only deasupra campurilor cu prez.cod_rar (fallback nemapat), fara eticheta separata Cod RAR - R2 (fix F7): buton primar conditionat de stare - error->Re-pune(/repune), needs_data/needs_mapping->Salveaza si retrimite(/corecteaza); duplicatul gol eliminat - R11: un singur Sterge outline var(--err) pe rand separat, hx-confirm specific, full-width pe mobil (.detaliu-actiuni-jos in @media 767px, base.html) - R5: hx-disabled-elt pe toate formele; inchidere pe succes prin inchideModal - R4: script modal-appropriate pastrat (curatat de US-003) - 6 teste noi in test_web_corectie.py; rutele + _detaliu_ctx NESCHIMBATE - suita 835 passed (-m 'not live'); prd.json/progress.txt US-004 passes Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
145 lines
9.4 KiB
Plaintext
145 lines
9.4 KiB
Plaintext
# Ralph Progress Log
|
|
Started: 2026-06-24
|
|
Project: autopass-5.9-ux-corectie-modal-mobil
|
|
Branch: ralph/5.9-ux-corectie-modal-mobil
|
|
Source PRD: docs/prd/prd-5.9-ux-corectie-modal-mobil.md
|
|
Note: PRD APROBAT 2026-06-24 cu revizii obligatorii R1-R12 (raport AUTOPLAN). R1-R12 au prioritate unde difera de AC original — sunt deja incorporate in acceptance criteria.
|
|
---
|
|
|
|
## Iteratie: 2026-06-24
|
|
### Story implementat: US-001 - Eticheta umana scurta pe randul de afisare + cod brut disponibil pentru modal (R1) (tags: backend)
|
|
### Status: Complete
|
|
|
|
### Gates rulate:
|
|
- Typecheck: SKIP (techStack.commands.typecheck gol)
|
|
- Lint: SKIP (techStack.commands.lint gol)
|
|
- Tests: PASS (tests/test_web_submissions.py 22; suita completa 819 passed, 1 deselected)
|
|
- /review (backend): PASS — no issues (DRY respectat, defensiv, aditiv non-regresie)
|
|
|
|
### Ce s-a schimbat:
|
|
- app/web/routes.py: helper `_eticheta_problema(status, motiv)` + constanta `_STARI_CU_PROBLEMA`;
|
|
`_submission_row_view` hoisteaza `motiv` intr-o variabila si adauga campul `eticheta_problema`
|
|
(text uman scurt: motiv || eticheta_scurta; gol pe queued/sending/sent).
|
|
- app/web/labels.py: `parse_erori` expune cheia `cod` (cod brut de catalog) pe ramurile imbogatite
|
|
(lista + dict), pentru ca modalul (US-004) sa-l deriveze via parse_erori(...)[0]['cod'] — fara decoder nou (R1 DRY).
|
|
- tests/test_web_submissions.py: 5 teste US-001 (sub_pill R1 rename, error/needs_mapping prezent, gol pe ok, defensiv JSON invalid).
|
|
|
|
### Learnings:
|
|
- `parse_erori` traieste in app/web/labels.py (nu app/errors.py cum sugera AC#4) — `app/errors.py` defineste CATALOG-ul de coduri si `eroare()`.
|
|
- `_GESTIONABILE_WEB` == aceleasi 3 stari cu problema; am definit `_STARI_CU_PROBLEMA` separat pentru claritate semantica (gestionabil != are-problema conceptual).
|
|
- Eticheta de pe rand e adaugata DOAR in view-model; randarea sub pill apartine US-002 (de aceea testele sunt unitare pe _submission_row_view).
|
|
|
|
### Next:
|
|
- US-003 (modal, ui, requiresDesignReview) — independent, priority 15.
|
|
- US-002 depinde de US-001 (acum done) + US-003.
|
|
---
|
|
## Rate limit la iter 10 — sleep 1800
|
|
|
|
## Iteratie: 2026-06-25
|
|
### Story implementat: US-002 - Tabel trimiteri: eticheta umana sub stare, fara chevron, cod RAR simplu, rand declanseaza modalul (tags: ui)
|
|
### Status: Complete
|
|
|
|
### Gates rulate:
|
|
- Typecheck: SKIP (techStack.commands.typecheck gol)
|
|
- Lint: SKIP (techStack.commands.lint gol)
|
|
- Tests: PASS (tests/test_web_submissions.py 20; suita completa 826 passed, 1 deselected)
|
|
- Browser (gstack/E2E requiresBrowserCheck) si /review: DEFERATE la VERIFY (loop fara browser) — vezi AC E2E.
|
|
|
|
### Ce s-a schimbat:
|
|
- app/web/templates/_submissions.html: sub pill (col-stare) randeaza `r.eticheta_problema`
|
|
(text mic `eticheta-problema s-error`, DOAR cand e ne-gol); col-operatie linia 2 arata
|
|
codul RAR ca chip `cod-rar-cod` FARA prefixul "cod RAR:" (nemapat -> "nemapat" muted).
|
|
- app/web/templates/base.html: CSS nou `.eticheta-problema`, `.cod-rar-cod`, si regula R8
|
|
44px touch-target pe `tr.trimitere-row` (min-height + padding 11px) + afordanta hover/focus.
|
|
- tests/test_web_submissions.py: 7 teste noi US-002 (eticheta sub pill + absenta pe ok, fara
|
|
chevron, cod RAR fara prefix, nemapat, rand deschide modal, a11y+keyboard markup); actualizat
|
|
`test_operatie_contine_cod_rar` (fara prefix) si `test_tabel_nu_are_coloana_motiv` (eticheta sub pill).
|
|
|
|
### Learnings:
|
|
- Mare parte din scope-ul US-002 era deja livrat de US-001 (campul `eticheta_problema`) si US-003
|
|
(randul declanseaza modalul: role=button/tabindex/aria-haspopup, fara aria-expanded; htmx:beforeRequest
|
|
fara toggle). Chevron-ul NU exista in cod (grep zero) -> R8 a insemnat doar adaugarea regulii 44px, nu eliminare.
|
|
- `motiv_uman` echo-ul mesajului RAR => eticheta_problema poate contine textul brut al erorii. Asta a
|
|
intrat in conflict cu vechiul `test_tabel_nu_are_coloana_motiv` (5.8) care interzicea continutul Motiv
|
|
in tabel; US-002 R1 il surfaceaza intentionat sub pill, deci testul a fost actualizat (pastreaza doar
|
|
invarianta "fara coloana/celula Motiv").
|
|
|
|
### Next:
|
|
- US-004 (detaliu editabil in-place + butoane in modal), US-005 (poll nu inchide modalul), US-006/007/008 (responsive).
|
|
- VERIFY: ruleaza gstack E2E pe `/` pentru AC requiresBrowserCheck (eticheta sub pill, fara chevron, cod fara prefix, click deschide modal).
|
|
---
|
|
|
|
## US-006: Fundatie responsive — viewport, header/nav, modal full-screen mobil, breakpoint-uri
|
|
|
|
### Ce s-a livrat:
|
|
- app/web/templates/base.html: CONVENTIE breakpoint unic 768px documentata (CSS custom props nu
|
|
merg in @media -> folosim consecvent `@media (max-width:767px)` pentru mobil; >=1024px = desktop
|
|
neschimbat). Blocul `@media (max-width:767px)` extins cu:
|
|
- Modal full-screen pe mobil: overlay fara padding + align/justify:stretch (fara backdrop lateral);
|
|
dialog 100vw/100vh, fara border-radius/umbra, padding-top:56px, scroll intern; modal-close 44x44px.
|
|
- Header colapsat: flex-wrap + gap + padding redus; h1 mai mic; main padding 16px.
|
|
- Tinte touch >=44px: .icon-btn (toggle tema/cont hamburger), .tab-link, itemii .cont-menu.
|
|
- Comentariul CSS desktop al modalului actualizat (full-screen mobil livrat, nu „vine in US-006").
|
|
- tests/test_web_responsive.py NOU: test_viewport_meta_prezent, test_modal_fullscreen_clasa_mobil,
|
|
test_nav_colapsabil_sub_breakpoint (markup/CSS in HTML randat prin TestClient).
|
|
|
|
### Learnings:
|
|
- meta viewport era DEJA prezent (base.html:5) -> AC „confirmat/adaugat" = confirmat, neatins.
|
|
- Nav colapsabil (hamburger cont #cont-menu-toggle ☰ + dropdown hidden; tab-bar cu overflow-x:auto)
|
|
era deja livrat de PRD-uri anterioare (5.5 US-006, 5.3 tab-bar). US-006 5.9 a adaugat DOAR
|
|
tratamentul touch 44px sub breakpoint + modalul full-screen (modalul e nou din US-003 5.9).
|
|
- Desktop nefatat: regula de baza `.modal-dialog { max-width:680px }` ramane; doar media mobil o
|
|
suprascrie. Test asigura ambele (max-width:680px prezent + media 767px cu 100vw/100vh/44px).
|
|
|
|
### Next:
|
|
- US-007 (responsive pagini continut), US-008 (responsive Acasa + login/signup) — depind de US-006 (gata).
|
|
- VERIFY: gstack browser la 375px pe `/` — fara scroll orizontal de pagina; ☰ deschide meniul cont;
|
|
modal deschis ocupa tot ecranul si se inchide din `x` (requiresBrowserCheck + requiresDesignReview).
|
|
---
|
|
|
|
## US-004: Detaliu editabil in-place + butoane consolidate (in modal), ordine verticala R10
|
|
|
|
### Ce s-a livrat:
|
|
- app/web/templates/_trimitere_detaliu.html REscris pe ordinea verticala R10:
|
|
(1) header #id + pill + motiv uman; (2) bloc eroare blocanta (card_erori) cand exista;
|
|
(3) mapare inline (5.7) cand nemapate_inline, tintind #detaliu-modal-body; (4) formular
|
|
editabil SAU context read-only; (5) actiuni jos; (6) <details> „Detalii tehnice" colapsat.
|
|
- Zero dublare: blocul read-only de grila (vechiul :19-32) si formularul de corectie s-au
|
|
contopit. Campurile editabile (nr_inmatriculare, vin, data_prestatie, odometru_final,
|
|
odometru_initial) apar O SINGURA DATA, ca inputuri pre-completate. Nr. pe rand propriu,
|
|
VIN dedesubt (ambele latime plina), restul in grila.
|
|
- R9: operatie + cod RAR rezolvat read-only deasupra campurilor, folosind prez.cod_rar
|
|
(fallback „nemapat"), fara eticheta separata „Cod RAR" (vechiul :23 eliminat).
|
|
- R2 (fix F7): buton primar CONDITIONAT DE STARE, unul singur per stare:
|
|
* error -> „Re-pune in coada" pe /repune (error NU e editabil, /corecteaza ar da 403);
|
|
* needs_data/needs_mapping -> „Salveaza si retrimite" pe /corecteaza (submit-ul formularului).
|
|
Butonul gol „Re-pune in coada" duplicat (vechiul :55-59) eliminat.
|
|
- R11: UN SINGUR „Sterge" (outline distructiv var(--err)) pe RAND SEPARAT (clasa
|
|
.detaliu-actiuni-jos, NU margin-left:auto), hx-confirm specific
|
|
„Stergi definitiv trimiterea #{id}? Nu se poate anula."; full-width stivuit pe mobil
|
|
prin regula noua `.detaliu-actiuni-jos button { width:100% }` in @media 767px (base.html).
|
|
- R5: hx-disabled-elt="find button" pe toate cele 3 forme (corectie/repune/sterge + mapare);
|
|
inchiderea modalului pe succes vine din HX-Trigger inchideModal emis de rute (neschimbat).
|
|
- R4: scriptul inline modal-appropriate (curatat deja de US-003) pastrat; comentariu actualizat.
|
|
- Detalii tehnice colapsate: Nr. prezentare RAR, Cod HTTP, Reincercari, timestamps, mesaj RAR
|
|
brut + cod brut (erori_3n[0].cod, doar cand exista).
|
|
- tests/test_web_corectie.py: 6 teste noi US-004 (test_camp_apare_o_singura_data,
|
|
test_nr_si_vin_pe_randuri_separate, test_un_singur_buton_primar_per_stare,
|
|
test_error_foloseste_repune, test_sterge_prezent_si_distinct, test_corectie_pastreaza_comportament).
|
|
|
|
### Learnings:
|
|
- F7 (CRITICAL): consolidarea naiva pe /corecteaza ar fi scos retry-ul randurilor `error`
|
|
(_CORECTABILE=needs_data/needs_mapping; post_corectie da 403 pe error). Rezolvat prin buton
|
|
primar conditionat de stare: error pastreaza fluxul existent /repune (re-pune in coada),
|
|
needs_data/needs_mapping merg pe /corecteaza. Logica backend a rutelor NESCHIMBATA.
|
|
- _detaliu_ctx neatins (avea deja toate flag-urile necesare: editabil, gestionabil, status,
|
|
prez.cod_rar, erori_3n). Zero logica noua in routes.py.
|
|
- test_web_lifecycle.py::test_buton_sterge_doar_pe_blocate ramane verde (error arata
|
|
„Re-pune in coada", sent nu) — fluxul error->repune e pastrat.
|
|
|
|
### Next:
|
|
- VERIFY (requiresBrowserCheck + requiresDesignReview): gstack browser — needs_data arata
|
|
fiecare camp o data (nr. rand propriu, VIN dedesubt), corectez data, „Salveaza si retrimite"
|
|
-> queued; error arata „Re-pune in coada"; „Sterge" clar separat, rosu, full-width pe mobil.
|
|
---
|