diff --git a/app/web/routes.py b/app/web/routes.py index d3130b8..df4678a 100644 --- a/app/web/routes.py +++ b/app/web/routes.py @@ -1112,10 +1112,14 @@ async def post_corectie_trimitere(request: Request, submission_id: int) -> HTMLR message="Exista deja o trimitere identica. Corectia a fost oprita."), ) row2 = _fetch_submission_scoped(conn, account_id, submission_id) - return templates.TemplateResponse( + resp = templates.TemplateResponse( "_trimitere_detaliu.html", _detaliu_ctx(request, row2, message="Corectat — randul a fost re-pus in coada."), ) + # PRD 5.9 US-003 (R5): pe succes, lista se reincarca (trimiteriChanged) si modalul + # se inchide (inchideModal). After-settle ca inchiderea sa urmeze swap-ul fragmentului. + resp.headers["HX-Trigger-After-Settle"] = "trimiteriChanged, inchideModal" + return resp finally: conn.close() @@ -1172,7 +1176,8 @@ async def post_sterge_trimitere(request: Request, submission_id: int) -> HTMLRes resp = HTMLResponse( '
Trimitere stearsa.
' ) - resp.headers["HX-Trigger"] = "trimiteriChanged" + # PRD 5.9 US-003 (R5): pe succes, lista se reincarca + modalul se inchide. + resp.headers["HX-Trigger-After-Settle"] = "trimiteriChanged, inchideModal" return resp finally: conn.close() diff --git a/app/web/templates/_coada.html b/app/web/templates/_coada.html index d09df7e..c2440e3 100644 --- a/app/web/templates/_coada.html +++ b/app/web/templates/_coada.html @@ -1,8 +1,8 @@ {# _coada.html — repurposat in 3.6 (US-003). Nu mai e un tab/panou separat: e sectiunea "Trimiterile tale" inclusa pe Acasa, - sub zona de upload. Pastreaza filtrele (US-009), tabelul (_submissions.html) si - panoul de detaliu (#trimitere-detaliu). Poll aliniat la 15s (anti dublu-poll, M5). + sub zona de upload. Pastreaza filtrele (US-009) si tabelul (_submissions.html); detaliul + se deschide acum in modalul global (#modal-detaliu). Poll aliniat la 15s (anti dublu-poll, M5). #}
@@ -67,9 +67,8 @@ - - + {# PRD 5.9 US-003: detaliul s-a mutat intr-un MODAL global (#modal-detaliu in base.html), + in afara #submissions-wrap -> poll-ul de 15s nu-l mai atinge. Randul declanseaza + deschiderea (hx-target=#detaliu-modal-body). Vechiul panou inert #trimitere-detaliu + a fost eliminat (rol preluat de modal). #}
diff --git a/app/web/templates/_submissions.html b/app/web/templates/_submissions.html index dd085d9..7454e65 100644 --- a/app/web/templates/_submissions.html +++ b/app/web/templates/_submissions.html @@ -29,18 +29,17 @@ {% for r in rows %} - {# US-008: detaliul apare ca rand-sibling expandabil SUB acest rand (#detaliu-{id}), - nu in panoul global de la baza. Randul e clickabil/focusabil (toggle prin JS in - base.html: single-open + pauza poll). #} + {# PRD 5.9 US-003: randul declanseaza deschiderea MODALULUI global (#detaliu-modal-body), + nu un rand-sibling. Clickabil/focusabil (role=button); Enter/Space deschid modalul + (JS in base.html). Vechiul rand-sibling de detaliu a fost eliminat. #} @@ -49,8 +48,7 @@ aria-label="Selecteaza trimiterea #{{ r.id }} pentru stergere"> {% endif %} - - {{ r.id }} + {{ r.id }} {{ r.stare_scurt }} @@ -72,15 +70,6 @@ {{ r.id_prezentare or '—' }} {{ r.updated_at }} - {# US-008: rand-sibling de detaliu, ascuns pana la deschidere. Placeholder „Se - incarca…" prin hx-indicator cat raspunde HTMX. #} - - - Se incarca… -
- - {% endfor %} diff --git a/app/web/templates/_trimitere_detaliu.html b/app/web/templates/_trimitere_detaliu.html index 75a1a61..5afd3f8 100644 --- a/app/web/templates/_trimitere_detaliu.html +++ b/app/web/templates/_trimitere_detaliu.html @@ -1,15 +1,11 @@ {% from "_eroare.html" import card_erori %} {% import '_macros.html' as ui %} -{# US-008: conectorul detaliului = fundal subtil + border-top pe randul-sibling - (.detaliu-rand, base.html), NU border-left accent (evita AI-slop). #} -
+{# PRD 5.9 US-003: fragmentul se swap-uieste in corpul modalului global + (#detaliu-modal-body). Heading-ul poarta id-ul folosit de aria-labelledby al dialogului. #} +
-

Detaliu trimitere #{{ id }}

+

Detaliu trimitere #{{ id }}

{{ stare_text }} -
{% if stare_subtext %} @@ -53,12 +49,12 @@ {% if gestionabil %}
+ hx-target="#detaliu-modal-body" hx-swap="innerHTML" style="margin:0;">
- - +{# PRD 5.9 US-003 (R4): focus-ul dupa swap (incl. re-render corectie/mapare) e mutat in + corpul modalului din base.html (htmx:afterSettle pe #detaliu-modal-body). Vechiul script + inline (marcheazaDetaliuDeschis / scrollIntoView pe randul-sibling) a fost eliminat. #} diff --git a/app/web/templates/base.html b/app/web/templates/base.html index 5881a69..56dec79 100644 --- a/app/web/templates/base.html +++ b/app/web/templates/base.html @@ -176,27 +176,29 @@ .tabel-trimiteri .col-operatie > div { line-height:1.35; } /* secundarul muted („cod RAR" / „nemapat") — >=12px, contrast pe var(--muted) >=4.5:1 */ .tabel-trimiteri .cod-rar-sub { font-size:12px; margin-top:2px; } - /* === Detaliu inline (PRD 5.8 US-008): rand-sibling expandabil sub randul selectat. === */ - /* Chevron de stare (▸ inchis / ▾ deschis), rotit prin schimbarea glifei in JS. */ - .tabel-trimiteri .chevron { display:inline-block; color:var(--muted); font-size:11px; - width:1.1em; text-align:center; margin-right:2px; } - /* Randul deschis: fundal evidentiat (nu doar culoare de text -> a11y). */ - .tabel-trimiteri tr.rand-deschis > td { background:#1d212b; } - [data-theme="light"] .tabel-trimiteri tr.rand-deschis > td { background:#eef1f6; } - /* Conectorul detaliului = fundal subtil + border-top (NU border-left accent / slop). */ - .tabel-trimiteri tr.detaliu-rand > td { padding:0; border-top:2px solid var(--accent); - background:color-mix(in srgb, var(--accent) 6%, var(--card)); } - .tabel-trimiteri tr.detaliu-rand .card { margin:10px; } - /* `hidden` trebuie sa invinga `display:block` din banda <768 (specificitate). */ - .tabel-trimiteri tr.detaliu-rand[hidden] { display:none; } /* 768-1024px: ascunde Actualizat (e in detaliu) -> 7 coloane, fara scroll */ @media (max-width:1024px) { .tabel-trimiteri .col-actualizat { display:none; } } - /* Tinta de atins >=44px pe touch (chevron-ul e ancora de toggle). */ - @media (pointer:coarse) { - .tabel-trimiteri .chevron { min-width:44px; min-height:44px; line-height:44px; } - } + /* === Modal detaliu (PRD 5.9 US-003): fereastra modala globala, in afara zonei de + poll (#submissions-wrap). Backdrop + dialog centrat pe desktop; focus-trap + + scroll-lock + inert pe
sunt in JS. Varianta full-screen mobil vine in US-006. === */ + .modal-overlay { position:fixed; inset:0; z-index:1100; display:flex; + align-items:flex-start; justify-content:center; padding:40px 16px; overflow-y:auto; } + .modal-overlay[hidden] { display:none; } + .modal-backdrop { position:fixed; inset:0; background:rgba(0,0,0,.55); } + .modal-dialog { position:relative; z-index:1; width:100%; max-width:680px; + background:var(--card); border:1px solid var(--line); border-radius:12px; + box-shadow:0 16px 48px rgba(0,0,0,.35); padding:18px 20px; + max-height:calc(100vh - 80px); overflow-y:auto; } + .modal-close { position:absolute; top:10px; right:10px; background:transparent; + border:1px solid var(--line); color:var(--muted); width:36px; height:36px; + border-radius:8px; font-size:20px; line-height:1; cursor:pointer; + display:inline-flex; align-items:center; justify-content:center; } + .modal-close:hover { background:var(--line); color:var(--ink); } + body.modal-open { overflow:hidden; } + .modal-eroare { padding:16px 4px; } + .modal-eroare .actiuni { margin-top:12px; display:flex; gap:10px; flex-wrap:wrap; } /* <768px: card per rand (eticheta:valoare stivuit), nu tabel -> fara scroll orizontal */ @media (max-width:767px) { .tabel-trimiteri table { table-layout:auto; } @@ -243,6 +245,18 @@
{% block content %}{% endblock %}
+ {# Modal detaliu trimitere (PRD 5.9 US-003): container global, SIBLING al
+ (nu descendent), ca `inert`+`aria-hidden` pe
sa nu-l prinda si pe el (R7). + Corpul #detaliu-modal-body e tinta de swap pentru fragment + rutele corectie/ + mapare/lifecycle. Traieste in afara #submissions-wrap -> poll-ul de 15s nu-l atinge. #} +