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

PropTipoRequiredDescrizione
islockedboolean✓True se il foglio ha un lock attivo (di chiunque)
idutenteLocknumber | undefined—ID utente owner del lock
lockOwnerNamestring | undefined—Nome leggibile owner (per tooltip)
scadenzalockstring | undefined—Scadenza ISO 8601 (es. "2026-05-11T15:30:00Z")
isCurrentUserLockOwnerboolean✓True se l'utente corrente possiede il lock

Eventi

EventoPayloadQuando
rilascia—Click su "Rilascia lock" (solo se isCurrentUserLockOwner === true)

Visualizzazione

StatoUI
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 lockIndicatore 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 prossima acquisisciLock di 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/rinnova
  • useSpreadsheet — gestisce il lifecycle del lock