Componenti
SpreadsheetLockIndicator
Badge inline che mostra lo stato del lock del foglio. Visualizza owner, scadenza e azione di rilascio per il lock owner.
Scopo
Indicatore inline (badge) dello stato del lock pessimistico del foglio:
- 🔒 Foglio bloccato da altro utente — utente corrente in read-only
- 🔓 Lock posseduto da me — utente corrente in scrittura, può rilasciare
Mostrato al centro di SpreadsheetToolbar quando isLocked || isLockOwner.
Props
| Prop | Tipo | Required | Descrizione |
|---|---|---|---|
islocked | boolean | ✓ | True se il foglio ha un lock attivo (di chiunque) |
idutenteLock | number | undefined | — | ID utente owner del lock |
lockOwnerName | string | undefined | — | Nome leggibile owner (per tooltip) |
scadenzalock | string | undefined | — | Scadenza ISO 8601 (es. "2026-05-11T15:30:00Z") |
isCurrentUserLockOwner | boolean | ✓ | True se l'utente corrente possiede il lock |
Eventi
| Evento | Payload | Quando |
|---|---|---|
rilascia | — | Click su "Rilascia lock" (solo se isCurrentUserLockOwner === true) |
Visualizzazione
| Stato | UI |
|---|---|
Lock di altro utente (islocked && !isCurrentUserLockOwner) | 🔒 "Bloccato da {lockOwnerName}" — Tag rosso non cliccabile |
Lock mio (isCurrentUserLockOwner) | 🔓 "Stai modificando · scade alle {hh:mm}" — Tag verde con button "Rilascia" |
| Nessun lock | Indicatore nascosto |
Calcolo scadenza
const scadenzaDate = new Date(scadenzalock)
const minutesLeft = Math.floor((scadenzaDate.getTime() - Date.now()) / 60000)
const display = minutesLeft > 0 ? `${minutesLeft} min` : 'scaduto'
Aggiornamento ogni minuto via setInterval(updateLabel, 60000).
Lifecycle del lock
1. Apertura foglio (SpreadsheetEditor mount + permesso write)
└─ LockService.acquisisciLock
├─ successo → isCurrentUserLockOwner = true
│ └─ Heartbeat ogni 5 min → rinnovaLock (estende a +30 min)
└─ LOCK_OCCUPIED → islocked = true
└─ Editor forzato in mode='view'
2. Utente clicca "Rilascia"
└─ LockService.rilasciaLock
└─ DB DELETE riga lock
3. Chiusura editor (onUnmounted)
└─ Auto-rilascio se isCurrentUserLockOwner
Quando vedrai il lock di un altro utente
Se apri un foglio già aperto da Marco:
islocked = true,idutenteLock = idMarco- L'editor si apre in
mode='view'forzato - Toolbar mostra
🔒 Bloccato da marco · scade alle 15:30 - Tutte le operazioni di modifica sono disabilitate
Workaround: lock scaduto
Se il lock di Marco è scaduto (es. Marco ha chiuso il browser senza unmount pulito):
- DB scadenza <
now()→ la prossimaacquisisciLockdi qualsiasi utente prende il lock - Il vecchio lock "fantasma" viene sovrascritto silenziosamente
La durata del lock (default 30 minuti) è gestita server-side. Lato client il heartbeat la estende ogni 5 minuti. Se un utente lascia il tab aperto ma idle per oltre 5 min senza heartbeat (es. browser sleep), il lock può scadere prima dell'unmount.
Tipi correlati
LockInfo—{ idfolio, idutenteLock, datalock, scadenzalock, islocked }LockService— RPC acquisisci/rilascia/rinnovauseSpreadsheet— gestisce il lifecycle del lock