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