Data

WeekScheduler

Griglia settimanale risorsa x giorno (es. autisti x giorni della settimana) con slot personalizzabili per intestazioni, celle ed eventi. Pensato per planner, scheduler, gestione turni e assegnazioni.

Import

import { WeekScheduler } from '@pzeta/vue-components'

Esempio Base

Props

PropTipoDefaultDescrizione
resourcesSchedulerResource[](required)Elenco delle risorse mostrate sulle righe (es. autisti, mezzi, sale)
eventsSchedulerEvent[](required)Elenco degli eventi/giri/turni da posizionare nella griglia
startDateDate | stringinizio settimana correnteData di riferimento; viene normalizzata all'inizio della settimana secondo weekStartsOn
weekStartsOn0 | 1 | 2 | 3 | 4 | 5 | 61Giorno di inizio settimana (0 = domenica, 1 = lunedi)
resourceKeystring | (r) => string | number'id'Nome del campo (o accessor) usato come chiave della risorsa
eventResourceKeystring | (e) => string | number | null'resourceId'Nome del campo (o accessor) che lega l'evento alla risorsa; null/undefined => riga non assegnati
eventDateKeystring | (e) => string'date'Nome del campo (o accessor) che fornisce la data ISO YYYY-MM-DD dell'evento
showUnassignedRowbooleanfalseMostra una riga aggiuntiva in alto per gli eventi senza resourceId
unassignedLabelstring'Non assegnati'Etichetta della riga non assegnati
todayHighlightbooleantrueEvidenzia con sfondo blu la colonna del giorno corrente
localestring'it-IT'Locale Intl.DateTimeFormat per i label dei giorni
minCellHeightstring'40px'Altezza minima della cella (CSS)
resourceColumnWidthstring'9rem'Larghezza della colonna risorse (CSS)
dayLabelFormat'short' | 'long' | 'numeric''short'Formato del nome del giorno nell'header colonna

SchedulerResource

Proprieta'TipoDescrizione
idstring | numberIdentificatore univoco (override possibile via resourceKey)
[key]unknownQualsiasi altro campo: viene esposto nello slot #resource per il rendering custom

SchedulerEvent

Proprieta'TipoDescrizione
idstring | numberIdentificatore univoco dell'evento
resourceIdstring | number | nullChiave della risorsa di appartenenza; null per gli eventi non assegnati
datestringData ISO YYYY-MM-DD
[key]unknownQualsiasi altro campo: viene esposto nello slot #event

SchedulerDay

Proprieta'TipoDescrizione
dateDateOggetto data del giorno
dateStrstringData ISO YYYY-MM-DD
labelstringEtichetta formattata secondo locale e dayLabelFormat
isTodaybooleantrue se corrisponde al giorno corrente
dayIndexnumberIndice del giorno nella settimana (0-6)

Slots

SlotPropsDescrizione
resourceHeader-Contenuto dell'intestazione della colonna risorse (in alto a sinistra)
dayHeader{ day: SchedulerDay }Override del label di una colonna giorno
resource{ resource: SchedulerResource }Rendering della cella risorsa (colonna fissa di sinistra)
event{ event: SchedulerEvent, resource: SchedulerResource | null, day: SchedulerDay, isUnassigned: boolean }Rendering di un singolo evento dentro una cella
cell{ resource: SchedulerResource | null, day: SchedulerDay, events: SchedulerEvent[], isUnassigned: boolean }Override completo della cella (sostituisce il rendering di default degli eventi)
unassignedLabel-Override del label della riga non assegnati
Lo slot #cell ha precedenza sullo slot #event: se viene fornito, il rendering degli eventi all'interno della cella e' interamente delegato al consumer.

Emits

EventoPayloadDescrizione
update:startDateDateEmesso quando la data di partenza cambia (per v-model:start-date)
cellClick{ resource: SchedulerResource | null, date: string, events: SchedulerEvent[], originalEvent: MouseEvent }Emesso al click su una cella vuota o sul background di una cella
eventClick{ event: SchedulerEvent, resource: SchedulerResource | null, date: string, originalEvent: MouseEvent }Emesso al click su un singolo evento; originalEvent.stopPropagation() viene chiamato automaticamente

Esempi

Slot custom con stato colorato

Pattern tipico per planner di giri/turni: ogni evento ha uno stato (PIANIFICATO, IN_CORSO, ...) mappato a una variante di colore.

Riga "Non assegnati" + handler click

Abilita una riga in alto per gli eventi con resourceId: null e gestisce sia il click sulla cella sia il click sul singolo evento.

v-model:start-date permette di pilotare la settimana visualizzata da un controllo esterno (toolbar, date picker, scorciatoie).

Accessor function per chiavi non standard

Se il modello dati usa chiavi diverse (es. idautista, idgiro), passa una funzione invece di una stringa.

<WeekScheduler
  :resources="autisti"
  :events="giri"
  :resource-key="(r) => r.idautista"
  :event-resource-key="(e) => e.idautista"
  :event-date-key="(e) => e.data"
>
  <template #resource="{ resource }">
    {{ resource.cognome }} {{ resource.nome }}
  </template>
  <template #event="{ event }">
    Giro #{{ event.idgiro }}
  </template>
</WeekScheduler>

Note Comportamento

  • La data di partenza viene normalizzata all'inizio della settimana corrente in base a weekStartsOn: passare 2026-05-14 con weekStartsOn: 1 produce comunque una griglia che parte da lunedi
  • Gli eventi vengono indicizzati per (resourceId, date) in un Map ricalcolato in modo reattivo su events/resources: le mutazioni alle reference sono efficienti
  • Il click su un evento ferma la propagazione (stopPropagation) per non far scattare anche cellClick
  • La colonna delle risorse e' sticky (position: sticky; left: 0) e la griglia ha min-width: 900px per evitare collasso eccessivo su viewport stretti
  • Eventi con resourceId non presente in resources vengono ignorati nel rendering (non si crea una riga fantasma)

Accessibilita'

  • Le celle e gli eventi sono <div> con handler click; per planner accessibili da tastiera valutare l'override via slot #cell con elementi <button> nativi
  • Il giorno corrente riceve una variazione di colore (bg-blue-50 text-blue-700) quando todayHighlight e' attivo

TypeScript

import type {
  WeekSchedulerProps,
  WeekSchedulerEmits,
  SchedulerResource,
  SchedulerEvent,
  SchedulerCellClickPayload,
  SchedulerEventClickPayload,
} from '@pzeta/vue-components'

interface Autista extends SchedulerResource {
  idautista: number
  cognome: string
  nome: string
}

interface Giro extends SchedulerEvent {
  idgiro: number
  descrizione: string
  codstato: 'PIANIFICATO' | 'ASSEGNATO' | 'IN_CORSO' | 'COMPLETATO' | 'ANNULLATO'
}

const onEventClick = (payload: SchedulerEventClickPayload) => {
  const giro = payload.event as Giro
  console.log('giro', giro.idgiro, giro.codstato)
}

Quando usarlo

  • Planner giornaliero/settimanale per risorse (autisti, mezzi, dipendenti, sale)
  • Gestione turni e assegnazioni
  • Visualizzazione a griglia di prenotazioni o appuntamenti

Per casi diversi:

  • Vista mese con sidebar eventi del giorno → EventCalendar
  • Cronologia eventi singola (non gridata per risorsa) → Timeline
  • Selezione di una singola data → DatePicker (categoria forms)