fix(web): kebab anti-clipping partajat + panou admin redenumit + tabel mapari compact
- "Panou admin" -> "Conturi clienti" (titlu, antet, link meniu hamburger)
- Kebab actiuni mutat in component partajat (base.html) cu position:fixed
pozitionat din JS: .tablewrap{overflow-x:auto} inducea overflow-y:auto care
taia dropdown-ul pe ultimul rand (meniul admin nu se vedea). Sters CSS local.
- Mapari salvate: Salveaza/Sterge mutate in kebab (legate prin form=); coloana
"In coada" doar checkbox (macro autosend_toggle compact, semantica de prezenta
pastrata); select cod RAR limitat la 240px -> tabelul incape fara scroll.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -132,6 +132,24 @@
|
||||
.cont-menu a:hover, .cont-menu button:hover { background:var(--line); }
|
||||
.cont-menu hr { border:none; border-top:1px solid var(--line); margin:4px 0; }
|
||||
.cont-menu form { margin:0; }
|
||||
/* Kebab partajat (actiuni per-rand in tabele). Meniul e position:fixed si pozitionat de JS:
|
||||
altfel `.tablewrap { overflow-x:auto }` induce overflow-y:auto si TAIE dropdown-ul pe ultimul
|
||||
rand (bug 5.5 — meniul nu se vedea). fixed scoate meniul din contextul de clipping al tabelului. */
|
||||
.kebab { position:relative; display:inline-block; }
|
||||
.kebab > summary { list-style:none; cursor:pointer; display:inline-flex; align-items:center;
|
||||
justify-content:center; min-height:32px; min-width:32px; padding:4px 10px;
|
||||
border-radius:6px; color:var(--ink); }
|
||||
.kebab > summary::-webkit-details-marker { display:none; }
|
||||
.kebab > summary:hover, .kebab[open] > summary { background:var(--line); }
|
||||
.kebab-menu { position:fixed; z-index:1000; min-width:160px; background:var(--card);
|
||||
border:1px solid var(--line); border-radius:8px; padding:6px;
|
||||
box-shadow:0 8px 24px rgba(0,0,0,.18); display:flex; flex-direction:column; gap:2px; }
|
||||
.kebab-menu form { margin:0; }
|
||||
.kebab-menu button, .kebab-menu a { display:block; width:100%; text-align:left; background:transparent;
|
||||
border:none; color:var(--ink); text-decoration:none; font:inherit; padding:7px 10px;
|
||||
border-radius:6px; cursor:pointer; min-height:36px; white-space:nowrap; }
|
||||
.kebab-menu button:hover, .kebab-menu a:hover { background:var(--line); }
|
||||
.kebab-menu button.danger { color:var(--err); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -154,7 +172,7 @@
|
||||
<a role="menuitem" href="/?tab=cont">Cont</a>
|
||||
<a role="menuitem" href="/?tab=integrare">Integrare</a>
|
||||
<a role="menuitem" href="/?tab=nomenclator">Nomenclator</a>
|
||||
{% if is_admin|default(false) %}<a role="menuitem" href="/admin">Panou admin</a>{% endif %}
|
||||
{% if is_admin|default(false) %}<a role="menuitem" href="/admin">Conturi clienti</a>{% endif %}
|
||||
<hr>
|
||||
<form method="post" action="/logout">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token|default('') }}">
|
||||
@@ -232,5 +250,50 @@
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
// Kebab partajat (actiuni per-rand). `<details class="kebab">` + `.kebab-menu` position:fixed.
|
||||
// Pozitionarea se face in JS la deschidere (eveniment `toggle`, captat pe document fiindca nu
|
||||
// bubble-uie), ancorat sub buton si aliniat la dreapta; flip in sus daca nu incape jos. Delegare
|
||||
// pe document → supravietuieste swap-urilor HTMX (#mapari-section se re-randeaza la fiecare salvare).
|
||||
(function() {
|
||||
function position(d) {
|
||||
var btn = d.querySelector('summary');
|
||||
var menu = d.querySelector('.kebab-menu');
|
||||
if (!btn || !menu) return;
|
||||
var r = btn.getBoundingClientRect();
|
||||
menu.style.visibility = 'hidden';
|
||||
var mw = menu.offsetWidth, mh = menu.offsetHeight;
|
||||
var left = Math.max(8, r.right - mw);
|
||||
var top = (r.bottom + mh > window.innerHeight - 8 && r.top - mh - 4 > 8)
|
||||
? r.top - mh - 4 : r.bottom + 4;
|
||||
menu.style.left = left + 'px';
|
||||
menu.style.top = top + 'px';
|
||||
menu.style.visibility = '';
|
||||
}
|
||||
function closeAll(except) {
|
||||
document.querySelectorAll('details.kebab[open]').forEach(function(d) {
|
||||
if (d !== except) d.removeAttribute('open');
|
||||
});
|
||||
}
|
||||
// `toggle` nu bubble-uie -> ascultam in faza de capturare pe document.
|
||||
document.addEventListener('toggle', function(e) {
|
||||
var d = e.target;
|
||||
if (!d.classList || !d.classList.contains('kebab')) return;
|
||||
if (d.open) { closeAll(d); position(d); }
|
||||
}, true);
|
||||
document.addEventListener('click', function(e) {
|
||||
if (!e.target.closest('details.kebab')) closeAll(null);
|
||||
});
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape') closeAll(null);
|
||||
});
|
||||
// La scroll/resize repozitionam meniul deschis (position:fixed nu urmareste ancora singur).
|
||||
window.addEventListener('scroll', function() {
|
||||
var open = document.querySelector('details.kebab[open]');
|
||||
if (open) position(open);
|
||||
}, true);
|
||||
window.addEventListener('resize', function() { closeAll(null); });
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user