feat: version 2.14.0 -- compartir grupo completo y destruir con cascada

Contraseñas: "Compartir grupo" aplica el mismo share de solo lectura a todas
las credenciales de un grupo de una vez (el grupo sigue sin ser una unidad
de permiso -- es una accion de conveniencia). El grupo y cada credencial se
marcan con el icono de compartido. "Destruir grupo" ahora tiene dos
opciones: solo desagrupar (como antes) o destruir tambien las N credenciales,
con advertencia explicita del conteo.

Fix de paso en ComboBox (afecta a toda la app): el panel se cerraba solo al
abrirse si el trigger estaba cerca del borde de un contenedor con scroll,
por un micro-scroll automatico del navegador al enfocar el boton.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Milton Gonzalez
2026-10-14 17:42:39 -05:00
parent dad73b841d
commit 7139f1604e
12 changed files with 151 additions and 24 deletions
+8 -2
View File
@@ -54,9 +54,15 @@ export function ComboBox({ options, value, onChange, placeholder = '', searchThr
// capture:true para detectar scroll en CUALQUIER ancestro (los eventos de scroll no burbujean).
function onScroll() { setOpen(false); }
document.addEventListener('mousedown', onDocMouseDown);
window.addEventListener('scroll', onScroll, true);
window.addEventListener('resize', onScroll);
// El listener de scroll se activa un frame despues de abrir -- si el trigger esta cerca del
// borde de un contenedor con scroll (ej. el body de un DetailPopup), el navegador hace un
// micro-scroll automatico al enfocarlo, lo que cerraba el panel apenas se abria.
const raf = requestAnimationFrame(() => {
window.addEventListener('scroll', onScroll, true);
window.addEventListener('resize', onScroll);
});
return () => {
cancelAnimationFrame(raf);
document.removeEventListener('mousedown', onDocMouseDown);
window.removeEventListener('scroll', onScroll, true);
window.removeEventListener('resize', onScroll);