feat: version 2.16.0 -- contador de cierre en Contraseñas, cierre por inactividad y ajustes de Equipos

Contraseñas: el cierre automatico ahora es por inactividad (no saca al usuario a medio escribir),
token de desbloqueo renovable y contador visible junto al titulo. Equipos: GUID como componente.
Sube la version para que el panel de Actualizaciones ofrezca los cambios 2.15.0 -> 2.16.0
(migraciones 025 y 026, instalador del agente y pestaña Compartir).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Milton Gonzalez
2026-10-20 08:52:46 -05:00
parent d60b4b1d77
commit 4a305df73e
10 changed files with 88 additions and 23 deletions
@@ -22,11 +22,12 @@ import { DetailPopup } from '../../components/DetailPopup.jsx';
import { Flyout, FlyoutItem } from '../../components/Flyout.jsx';
import { SearchInput } from '../../components/SearchInput.jsx';
import { ComboBox } from '../../components/ComboBox.jsx';
import { AutoLockCountdown } from '../../components/AutoLockCountdown.jsx';
import { BRAND_ICONS } from '../../data/brandIcons.js';
const EMPTY_FORM = { title: '', url: '', username: '', password: '', notes: '', iconKey: '', groupId: '' };
const EMPTY_GROUP_FORM = { name: '', iconKey: '' };
const AUTO_LOCK_MS = 3 * 60 * 1000; // 3 minutos: salir solo del menu si queda abierto sin atencion
const AUTO_LOCK_MS = 3 * 60 * 1000; // 3 minutos SIN actividad (teclado/mouse/toque): sale solo del menu
// Catalogo fijo de iconos genericos (debe coincidir con backend/src/modules/vault/service.js#ICON_KEYS) --
// a proposito NO se usa ningun servicio externo de favicon (ej. google/s2/favicons): revelaria a
@@ -150,15 +151,13 @@ export default function ContrasenasPage() {
// PIN de nuevo, sin importar cuanto haya durado la sesion del sistema.
useEffect(() => () => setVaultToken(null), []);
// Si queda abierto sin atencion, sale solo al Panel a los 3 minutos de haberse desbloqueado.
useEffect(() => {
if (locked) return;
const timer = setTimeout(() => {
pushToast({ tone: 'warning', message: t('vault_auto_lock_notice') });
navigate('/');
}, AUTO_LOCK_MS);
return () => clearTimeout(timer);
}, [locked]);
// Cierre por inactividad (3 min sin teclado/clic/toque/rueda): lo cuenta <AutoLockCountdown>, que
// muestra el tiempo restante junto al titulo y reinicia con cada accion del usuario, asi que
// nunca lo saca en medio de escribir/editar una credencial.
function autoLockExit() {
pushToast({ tone: 'warning', message: t('vault_auto_lock_notice') });
navigate('/');
}
async function submitPin() {
setPinError('');
@@ -433,6 +432,7 @@ export default function ContrasenasPage() {
<div>
<div className="toolbar">
<h2 className="page-title mt-0" style={{ marginBottom: 0 }}>{t('nav_passwords')}</h2>
<AutoLockCountdown ms={AUTO_LOCK_MS} onExpire={autoLockExit} title={t('vault_countdown_hint')} />
<SearchInput value={search} onChange={setSearch} />
<div style={{ flex: 1 }} />
<Button variant="standard" icon={RefreshCw} onClick={() => setChangingPin(true)}>{t('vault_change_pin')}</Button>