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. #}
+{# 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 %}
-
-
+{# 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. #}
+