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