feat(5.8): reguli mapare pe text (substring/cont) + UX tabel trimiteri (detaliu inline, fara scroll, cod RAR)

Reguli text per cont (operation_text_rules), resolve_prestatii cu param aditiv
text_rules + precedenta stricta, threadat pe toate cele 6 callsite-uri + valid_codes
+ seam classify_prezentare. UI Mapari: sectiune reguli + preview pre-salvare + overlap
+ telemetrie text_rule_hit. UX tabel: cod_rar sub operatie, pill eticheta scurta, fara
scroll orizontal (scopat .tabel-trimiteri + carduri <768px), detaliu inline expandabil
(a11y + pauza poll). code-review: reparat regula auto_send=0 care trimitea automat la RAR
in loc sa tina randul pentru review. 814 passed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-06-24 12:47:37 +00:00
parent c80c79462c
commit 51dc504f1d
28 changed files with 3023 additions and 61 deletions

View File

@@ -1,11 +1,13 @@
{% from "_eroare.html" import card_erori %}
{% import '_macros.html' as ui %}
<div class="card" id="detaliu-card-{{ id }}" style="border-color:var(--accent);">
{# US-008: conectorul detaliului = fundal subtil + border-top pe randul-sibling
(.detaliu-rand, base.html), NU border-left accent (evita AI-slop). #}
<div class="card" id="detaliu-card-{{ id }}" style="border-color:var(--line);">
<div style="display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin:0 0 12px;">
<h2 style="font-size:15px; margin:0;">Detaliu trimitere #{{ id }}</h2>
<span class="pill {{ stare_css }}">{{ stare_text }}</span>
<button type="button" style="margin-left:auto; background:var(--card); color:var(--muted); border-color:var(--line);"
onclick="document.getElementById('trimitere-detaliu').innerHTML='';">
onclick="window.inchideDetaliu && window.inchideDetaliu('{{ id }}');">
Inchide
</button>
</div>
@@ -51,12 +53,12 @@
{% if gestionabil %}
<div style="margin-top:14px; padding-top:12px; border-top:1px solid var(--line); display:flex; gap:10px; flex-wrap:wrap;">
<form hx-post="/trimitere/{{ id }}/repune"
hx-target="#trimitere-detaliu" hx-swap="innerHTML" style="margin:0;">
hx-target="#detaliu-{{ id }}" hx-swap="innerHTML" style="margin:0;">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<button type="submit">Re-pune in coada</button>
</form>
<form hx-post="/trimitere/{{ id }}/sterge"
hx-target="#trimitere-detaliu" hx-swap="innerHTML"
hx-target="#detaliu-{{ id }}" hx-swap="innerHTML"
hx-confirm="Stergi definitiv aceasta trimitere din coada?" style="margin:0;">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<button type="submit" style="background:var(--card); color:var(--err); border-color:var(--err);">
@@ -77,7 +79,7 @@
{% for op in nemapate_inline %}
{% set top = op.suggestions[0] if op.suggestions else None %}
{% set preselect = top.cod_prestatie if (top and top.score >= 60) else '' %}
<form hx-post="/trimitere/{{ id }}/mapeaza" hx-target="#trimitere-detaliu" hx-swap="innerHTML"
<form hx-post="/trimitere/{{ id }}/mapeaza" hx-target="#detaliu-{{ id }}" hx-swap="innerHTML"
style="margin:0 0 12px; padding:10px; border:1px solid var(--line); border-radius:8px;">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<input type="hidden" name="cod_op_service" value="{{ op.cod_op_service }}">
@@ -126,7 +128,7 @@
{% endif %}
<form hx-post="/trimitere/{{ id }}/corecteaza"
hx-target="#trimitere-detaliu" hx-swap="innerHTML">
hx-target="#detaliu-{{ id }}" hx-swap="innerHTML">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<div style="display:grid; grid-template-columns:repeat(auto-fit, minmax(200px, 1fr)); gap:10px 16px;">
@@ -158,13 +160,17 @@
<script>
(function() {
/* Vizibilitate (design review): scroll la panou + evidentiaza randul selectat. */
var panou = document.getElementById('trimitere-detaliu');
if (panou) panou.scrollIntoView({behavior: 'smooth', block: 'nearest'});
document.querySelectorAll('tr[id^="trimitere-row-"]').forEach(function(tr) {
tr.style.outline = '';
});
/* US-008: detaliul traieste acum in randul-sibling #detaliu-{id}. Asiguram ca randul
de detaliu e vizibil (la re-swap dupa corectie/mapare HTMX poate readuce continut
intr-un container ascuns) si ca randul declansator e marcat ca deschis. Single-open
+ pauza poll sunt gestionate global in base.html. */
var cont = document.getElementById('detaliu-{{ id }}');
if (cont) {
var detRow = cont.closest('tr.detaliu-rand');
if (detRow) detRow.hidden = false;
cont.scrollIntoView({behavior: 'smooth', block: 'nearest'});
}
var rand = document.getElementById('trimitere-row-{{ id }}');
if (rand) rand.style.outline = '2px solid var(--accent)';
if (rand && window.marcheazaDetaliuDeschis) window.marcheazaDetaliuDeschis(rand);
})();
</script>