feat(web): dashboard ergonomic cu tab-uri, stepper import si microcopy uman (3.4)
Reorganizeaza interfata web pe trei principii, fara a atinge backend-ul de trimitere (worker, mapping, idempotency, masina de stari neatinse): - US-001 app/web/labels.py: modul pur stari tehnice -> text uman + clasa CSS - US-002 bara status /_fragments/status: microcopy uman, defalcare blocate, scoped cont - US-003 shell 6 tab-uri (Acasa/Import/Coada/Mapari/Cont/Nomenclator): deep-link ?tab=, panou activ randat server-side, fragmente inactive lazy, ARIA real - US-004 stepper import 4 pasi (pur vizual; hx-target + csrf pastrate) - US-005 Acasa onboarding checklist auto-bifat + colaps + empty states prietenoase Reparat in cursul VERIFY/CLOSE: izolare teste (reset ratelimit._hits in fixturi), regresie avertisment "cont in asteptare de activare" (re-introdus in bara status), culori hardcodate -> variabile paleta. 434 teste pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
126
app/web/labels.py
Normal file
126
app/web/labels.py
Normal file
@@ -0,0 +1,126 @@
|
||||
"""
|
||||
labels.py — traducere stari tehnice in text uman + clasa CSS (US-001, PRD 3.4).
|
||||
|
||||
Functii pure: fara DB, fara request. Usor de testat unitar si de importat in template-uri.
|
||||
|
||||
Sursa de adevar pentru texte: tabelul din PRD 3.4 §3 US-001.
|
||||
"""
|
||||
|
||||
from typing import Tuple
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Tipul returnat: (text_principal, subtext_tooltip, css_class)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
Eticheta = Tuple[str, str, str]
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Etichete stari submissions
|
||||
# Clasele CSS corespund celor definite in base.html:
|
||||
# s-queued (accent/albastru), s-sending (warn/galben), s-sent (ok/verde),
|
||||
# s-error, s-needs_data, s-needs_mapping (err/rosu).
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
STARI_SUBMISSION: dict[str, Eticheta] = {
|
||||
"queued": (
|
||||
"In asteptare sa fie trimise",
|
||||
"",
|
||||
"s-queued",
|
||||
),
|
||||
"sending": (
|
||||
"Se trimite acum",
|
||||
"",
|
||||
"s-sending",
|
||||
),
|
||||
"sent": (
|
||||
"Declarate la RAR (finalizate)",
|
||||
"Confirmate cu numar de prezentare; nu se mai pot modifica.",
|
||||
"s-sent",
|
||||
),
|
||||
"needs_mapping": (
|
||||
"Lipseste codul prestatiei",
|
||||
"Alege codul RAR in tab-ul Mapari.",
|
||||
"s-needs_mapping",
|
||||
),
|
||||
"needs_data": (
|
||||
"Date incomplete (respinse de RAR)",
|
||||
"Corecteaza randul si reimporta.",
|
||||
"s-needs_data",
|
||||
),
|
||||
"error": (
|
||||
"Eroare la trimitere",
|
||||
"Vezi detaliul randului; se reincearca automat sau necesita corectie.",
|
||||
"s-error",
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
def eticheta_stare(status: str) -> Eticheta:
|
||||
"""
|
||||
Returneaza (text, subtext, css_class) pentru o stare de submission.
|
||||
|
||||
Arunca KeyError daca starea nu este mapata — intentionat, ca sa prinda
|
||||
stari noi adaugate in schema fara mapare corespunzatoare.
|
||||
"""
|
||||
try:
|
||||
return STARI_SUBMISSION[status]
|
||||
except KeyError:
|
||||
raise KeyError(
|
||||
f"Starea de submission {status!r} nu are eticheta umana in labels.py. "
|
||||
"Adauga-o in STARI_SUBMISSION."
|
||||
)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Etichete worker (viu / mort)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def eticheta_worker(viu: bool) -> Eticheta:
|
||||
"""
|
||||
Returneaza (text, subtext, css_class) pentru starea worker-ului.
|
||||
|
||||
viu=True => "Trimitere automata: activa" (clasa s-sent / verde)
|
||||
viu=False => "Trimitere automata: oprita" (clasa s-error / rosu)
|
||||
"""
|
||||
if viu:
|
||||
return (
|
||||
"Trimitere automata: activa",
|
||||
"Sistemul verifica coada si trimite la RAR la fiecare cateva secunde.",
|
||||
"s-sent",
|
||||
)
|
||||
return (
|
||||
"Trimitere automata: oprita",
|
||||
"Nimic nu pleaca spre RAR pana reporneste. Anunta administratorul.",
|
||||
"s-error",
|
||||
)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Etichete conexiune RAR (ok / indisponibil)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def eticheta_rar(stare: str) -> Eticheta:
|
||||
"""
|
||||
Returneaza (text, subtext, css_class) pentru starea conexiunii cu RAR.
|
||||
|
||||
stare="ok" => "Legatura cu RAR: functionala" (s-sent / verde)
|
||||
stare="indisponibil" => "Legatura cu RAR: indisponibila" (s-error / rosu)
|
||||
"""
|
||||
if stare == "ok":
|
||||
return (
|
||||
"Legatura cu RAR: functionala",
|
||||
"Portalul AUTOPASS raspunde.",
|
||||
"s-sent",
|
||||
)
|
||||
return (
|
||||
"Legatura cu RAR: indisponibila",
|
||||
"Portalul RAR nu raspunde acum; coada se reia automat cand revine.",
|
||||
"s-error",
|
||||
)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Constante auxiliare (microcopy fix, fara logica)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
ETICHETA_ULTIMA_AUTENTIFICARE_RAR = "Ultima autentificare la RAR"
|
||||
Reference in New Issue
Block a user