AttivitaForm
title: AttivitaForm description: Dialog schema-driven per pianificazione e modifica attività. Costruito su DynamicFormDialog di @pzeta/vue-form con tab Base/Avanzato e panel contestuali in slot.
Panoramica
AttivitaForm è il dialog principale per creare e modificare attività. Internamente usa DynamicFormDialog di @pzeta/vue-form con uno schema reattivo a due sezioni (Base e Avanzato) renderizzate come tab:
- Base: tipo attività, riepilogo, data scadenza (oppure datetime inizio/fine per riunioni con orario), priorità, switch tutto il giorno (riunioni), assegnatari
- Avanzato: nota + panel data-aware iniettati via slot
section-after-1(ricorrenza, partecipanti, documento, firma — visibili in base atipo.azione)
Il form supporta:
- Pre-compilazione automatica dal tipo (
riepilogopredefinito,notapredefinita,idutentepredefinito) tramite hookfield.onChangeconpatch() - Bridge datetime: campi virtuali
_datetimeinizio/_datetimefinecontransform.read/writeper riunioni con orario specifico - Visibilità condizionale dei campi tramite
visible: (data) => ... - Action extra "Segna come fatto" in modalità nuova (
extra-actionsdiDynamicFormDialog) validateOnMountper validazione immediata in modificasubmittingpropagato per loading state esterno
Anteprima live (con IHttpClient mockato)
Props
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
entitasorgente | string | — | Richiesto. Tipo entità (es. 'anagrafica', 'contratto') |
identitasorgente | number | — | Richiesto. ID istanza entità |
visible | boolean | — | Richiesto. Visibilità dialog (v-model:visible) |
attivita | AttivitaView | undefined | Attività da modificare. undefined → nuova |
initialState | Partial<AttivitaFormState> | undefined | Pre-compilazione (es. da suggerimento concatenamento) — merged sui default |
utenteOptions | UtenteOption[] | [] | Opzioni per il multiselect assegnatari |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
update:visible | boolean | Richiesta cambio visibilità |
saved | idattivita: number | Attività salvata con successo (creata o modificata, oppure "Segna come fatto") |
cancel | — | Emesso quando il dialog si chiude senza salvare (update:visible(false)) |
Modalità nuova vs modifica
| Aspetto | Nuova (attivita undefined) | Modifica (attivita valorizzata) |
|---|---|---|
| Header | "Nuova Attività" | "Modifica Attività" |
| Pulsante "Segna come fatto" | Visibile (extra-actions) | Nascosto |
| Pre-compila da tipo (riepilogo/nota/assegnatari) | Sì, via field.onChange + patch() | No (preserva valori esistenti) |
| Panel ricorrenza/partecipanti/documento/firma | "Salva prima l'attività per…" (placeholder) | Renderizzati con idattivita reale |
isEdit (slot scope) | false | true |
Validazione
Tutta la validazione è schema-driven via vue-form (regole pipe-separated 'required\|max:125', 'required\|mindate:0d'):
| Campo | Regola | Note |
|---|---|---|
idtipoattivita | required | Obbligatorio |
riepilogo | required|max:125 | Help text reattivo: contatore N/125 |
assegnatari | required | Almeno un assegnatario |
datascadenza | required|mindate:0d | Visibile solo per non-riunioni o riunione tuttoilgiorno |
_datetimeinizio | required | Campo virtuale con exclude: true — visibile solo per riunioni con orario |
_datetimefine | required | Idem _datetimeinizio |
I campi virtuali _datetimeinizio/_datetimefine usano transform.read/write per fondere datascadenza + orarioinizio in un unico picker datetime e splittare al submit.
Slot
AttivitaForm espone tutti gli slot di DynamicFormDialog per personalizzazione. Internamente usa già:
field-idtipoattivita-option— render custom delle opzioni del select tipo (icona PrimeIcons inline + nome)section-after-1— panel contestuali nel tab Avanzato (ricorrenza, partecipanti se riunione, documento se upload_documento, firma se richiesta_firma)
Se sovrascrivi questi slot dal parent, gli slot interni vengono rimpiazzati.
Note implementative
- Niente
useAttivitaForm: dalla v0.1.4AttivitaFormnon usa più il composableuseAttivitaForm. Lo schema vue-form gestisce stato e validazione, e il submit chiama direttamenterepository.pianificaAttivita/repository.updateAttivita+repository.replaceAssegnatari.useAttivitaFormresta esportato per chi vuole costruire form custom. - Auto-refresh viste data-aware (v1.0.0): dopo un POST/PATCH (sia
handleSavesiahandleSegnaComeFatto),AttivitaFormincrementarefreshSignaldel context. Tutte le viste data-aware (AttivitaListaEntita,AttivitaBadge,AttivitaTimeline,AttivitaCalendario,AttivitaConsolidata,AttivitaKanbanTipo) si auto-aggiornano senza che il parent debba ricaricare. VediuseAttivitaContext.refreshSignal. - Toast integrati: il componente usa
useToast()di@pzeta/vue-componentsper feedback su successo/errore — non serve gestirli dal parent. - Width fissa 600px sul
DynamicFormDialog.