feat(5.9): US-007 - responsive pagini de continut (card Mapari, scroll contained Jurnal/Nomenclator/Admin, formulare stivate)

- base.html @media(max-width:767px): clasa .tabel-card (card per rand) scopata
  SEPARAT de .tabel-trimiteri 5.8; reguli formular full-width + butoane >=44px
  scopate pe #card-cont / #form-test-cheie / #filtre-jurnal (marker US-007)
- _mapari.html: tabel-card + data-eticheta pe toate 4 tabelele; override select
  in card local (evita batalia de specificitate cu stilul inline)
- _integrare.html: id=form-test-cheie (ancora de scope pe formularul de test)
- R12 per-tabel: Mapari=card; Jurnal/Nomenclator/Admin=.tablewrap scroll contained;
  Cont/Integrare=fara tabele (doar formulare)
- tests: +3 (tabele clasa responsive, formulare full-width, regresie carduri 5.8)
- suita: 838 passed, 1 deselected
- prd.json US-007 passes=true + notes; progress.txt

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-06-25 09:17:47 +00:00
parent 141949dc95
commit d3433015ad
6 changed files with 220 additions and 25 deletions

View File

@@ -110,3 +110,107 @@ def test_nav_colapsabil_sub_breakpoint(client):
# Sub breakpoint, tintele touch din header/nav cresc la >=44px.
mobil = html[html.find("@media (max-width:767px)"):]
assert "44px" in mobil
# ============================================================
# PRD 5.9 US-007: responsive paginile de continut
# (Mapari, Cont, Nomenclator, Integrare, Jurnal, Admin)
# ============================================================
def _seed_nomenclator(items):
from app.mapping import upsert_nomenclator
from app.db import get_connection
conn = get_connection()
try:
upsert_nomenclator(conn, items)
conn.commit()
finally:
conn.close()
def _seed_event(account_id, tip="test", mesaj="eveniment de test"):
from app.observ import log_event
from app.db import get_connection
conn = get_connection()
try:
log_event(tip, account_id=account_id, mesaj=mesaj, conn=conn)
conn.commit()
finally:
conn.close()
def test_tabele_continut_au_clasa_responsive(client):
"""R12 politica per-tabel:
- Mapari (actionabil) = CARD per rand: clasa proprie `.tabel-card` + `data-eticheta` pe `<td>`-uri.
- Jurnal / Nomenclator (dense read-only) = `.tablewrap` (scroll orizontal CONTAINED),
FARA `.tabel-card`.
Definitia regulii de card traieste in base.html, scopata SEPARAT de `.tabel-trimiteri`.
"""
acct = _create_account_user("t7@test.com")
_login(client, "t7@test.com")
# --- Mapari = card. Tabelul „Reguli automate (text)" e mereu randat (rand de adaugare),
# deci nu depinde de date seedate. ---
mapari = client.get("/?tab=mapari").text
assert "tabel-card" in mapari
assert 'data-eticheta="Cod RAR"' in mapari
assert 'data-eticheta="Daca operatia contine"' in mapari
# Regula de card e definita o data in base.html, scopata pe `.tabel-card`.
assert ".tabel-card thead" in mapari
assert "US-007" in mapari
# --- Jurnal = scroll contained. Cu un eveniment seedat, tabelul apare in `.tablewrap`,
# NU ca `.tabel-card`. ---
_seed_event(acct)
jurnal = client.get("/?tab=jurnal").text
assert "tablewrap" in jurnal
# Sectiunea de jurnal NU foloseste cardul actionabil.
body = jurnal[jurnal.find('id="jurnal-section"'):]
assert "tabel-card" not in body
# --- Nomenclator = scroll contained (dens read-only). ---
_seed_nomenclator([{"codPrestatie": "OE-2", "numePrestatie": "Revizie"}])
nomen = client.get("/?tab=nomenclator").text
assert "tablewrap" in nomen
def test_formulare_full_width_mobil(client):
"""Formularele de continut (Cont, Integrare test, filtre Jurnal) stiveaza pe o coloana
sub 767px: inputuri full-width + butoane >=44px. Verificam ancorele de scope (id-uri)
plus regulile CSS mobil din base.html (toate scopate sub `@media (max-width:767px)`)."""
_create_account_user("f7@test.com")
_login(client, "f7@test.com")
cont = client.get("/?tab=cont").text
assert 'id="card-cont"' in cont
# Regulile mobil de formular exista si sunt scopate pe sectiunile de continut.
mobil = cont[cont.find("@media (max-width:767px)"):]
assert "#card-cont button" in mobil
assert "min-height:44px" in mobil
assert "width:100% !important" in mobil # suprascrie latimile inline doar pe mobil
integrare = client.get("/?tab=integrare").text
assert 'id="form-test-cheie"' in integrare
# Filtrele de jurnal (form mereu prezent, indiferent de date) primesc scope-ul mobil.
jurnal = client.get("/?tab=jurnal").text
assert 'id="filtre-jurnal"' in jurnal
assert "#jurnal-section #filtre-jurnal button" in jurnal
def test_carduri_trimiteri_5_8_supravietuiesc(client):
"""Regresie R12: scoparea `.tabel-card` (US-007) NU trebuie sa atinga blocul
`.tabel-trimiteri @media(max-width:767px)` din 5.8 — cardurile de trimiteri raman."""
_create_account_user("r58@test.com")
_login(client, "r58@test.com")
html = client.get("/?tab=acasa").text
mobil = html[html.find("@media (max-width:767px)"):]
# Cardurile de trimiteri 5.8 (clasa proprie, separata de `.tabel-card`).
assert ".tabel-trimiteri thead { display:none; }" in mobil
assert ".tabel-trimiteri td::before" in mobil
# Cele doua mecanisme coexista, scopate distinct.
assert ".tabel-card thead" in mobil