WeekScheduler
Import
import { WeekScheduler } from '@pzeta/vue-components'
Esempio Base
Props
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
resources | SchedulerResource[] | (required) | Elenco delle risorse mostrate sulle righe (es. autisti, mezzi, sale) |
events | SchedulerEvent[] | (required) | Elenco degli eventi/giri/turni da posizionare nella griglia |
startDate | Date | string | inizio settimana corrente | Data di riferimento; viene normalizzata all'inizio della settimana secondo weekStartsOn |
weekStartsOn | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 1 | Giorno di inizio settimana (0 = domenica, 1 = lunedi) |
resourceKey | string | (r) => string | number | 'id' | Nome del campo (o accessor) usato come chiave della risorsa |
eventResourceKey | string | (e) => string | number | null | 'resourceId' | Nome del campo (o accessor) che lega l'evento alla risorsa; null/undefined => riga non assegnati |
eventDateKey | string | (e) => string | 'date' | Nome del campo (o accessor) che fornisce la data ISO YYYY-MM-DD dell'evento |
showUnassignedRow | boolean | false | Mostra una riga aggiuntiva in alto per gli eventi senza resourceId |
unassignedLabel | string | 'Non assegnati' | Etichetta della riga non assegnati |
todayHighlight | boolean | true | Evidenzia con sfondo blu la colonna del giorno corrente |
locale | string | 'it-IT' | Locale Intl.DateTimeFormat per i label dei giorni |
minCellHeight | string | '40px' | Altezza minima della cella (CSS) |
resourceColumnWidth | string | '9rem' | Larghezza della colonna risorse (CSS) |
dayLabelFormat | 'short' | 'long' | 'numeric' | 'short' | Formato del nome del giorno nell'header colonna |
SchedulerResource
| Proprieta' | Tipo | Descrizione |
|---|---|---|
id | string | number | Identificatore univoco (override possibile via resourceKey) |
[key] | unknown | Qualsiasi altro campo: viene esposto nello slot #resource per il rendering custom |
SchedulerEvent
| Proprieta' | Tipo | Descrizione |
|---|---|---|
id | string | number | Identificatore univoco dell'evento |
resourceId | string | number | null | Chiave della risorsa di appartenenza; null per gli eventi non assegnati |
date | string | Data ISO YYYY-MM-DD |
[key] | unknown | Qualsiasi altro campo: viene esposto nello slot #event |
SchedulerDay
| Proprieta' | Tipo | Descrizione |
|---|---|---|
date | Date | Oggetto data del giorno |
dateStr | string | Data ISO YYYY-MM-DD |
label | string | Etichetta formattata secondo locale e dayLabelFormat |
isToday | boolean | true se corrisponde al giorno corrente |
dayIndex | number | Indice del giorno nella settimana (0-6) |
Slots
| Slot | Props | Descrizione |
|---|---|---|
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 |
#cell ha precedenza sullo slot #event: se viene fornito, il rendering degli eventi all'interno della cella e' interamente delegato al consumer.Emits
| Evento | Payload | Descrizione |
|---|---|---|
update:startDate | Date | Emesso 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.
Navigazione settimana (v-model:start-date)
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: passare2026-05-14conweekStartsOn: 1produce comunque una griglia che parte da lunedi - Gli eventi vengono indicizzati per
(resourceId, date)in unMapricalcolato in modo reattivo suevents/resources: le mutazioni alle reference sono efficienti - Il click su un evento ferma la propagazione (
stopPropagation) per non far scattare anchecellClick - La colonna delle risorse e' sticky (
position: sticky; left: 0) e la griglia hamin-width: 900pxper evitare collasso eccessivo su viewport stretti - Eventi con
resourceIdnon presente inresourcesvengono 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#cellcon elementi<button>nativi - Il giorno corrente riceve una variazione di colore (
bg-blue-50 text-blue-700) quandotodayHighlighte' 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)
TreeTable
Tabella con struttura dati gerarchica espandibile, supporto per ordinamento, paginazione e selezione nodi tramite il sub-componente Column.
YearCalendar
Overview annuale a 12 mini-mesi in griglia responsive con eventi puntuali per giorno (pallino colorato per tipo, tooltip e drill-down via day-click).