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 a tipo.azione)

Il form supporta:

  • Pre-compilazione automatica dal tipo (riepilogopredefinito, notapredefinita, idutentepredefinito) tramite hook field.onChange con patch()
  • Bridge datetime: campi virtuali _datetimeinizio/_datetimefine con transform.read/write per riunioni con orario specifico
  • Visibilità condizionale dei campi tramite visible: (data) => ...
  • Action extra "Segna come fatto" in modalità nuova (extra-actions di DynamicFormDialog)
  • validateOnMount per validazione immediata in modifica
  • submitting propagato per loading state esterno

Anteprima live (con IHttpClient mockato)

Props

PropTipoDefaultDescrizione
entitasorgentestringRichiesto. Tipo entità (es. 'anagrafica', 'contratto')
identitasorgentenumberRichiesto. ID istanza entità
visiblebooleanRichiesto. Visibilità dialog (v-model:visible)
attivitaAttivitaViewundefinedAttività da modificare. undefined → nuova
initialStatePartial<AttivitaFormState>undefinedPre-compilazione (es. da suggerimento concatenamento) — merged sui default
utenteOptionsUtenteOption[][]Opzioni per il multiselect assegnatari

Emits

EventoPayloadDescrizione
update:visiblebooleanRichiesta cambio visibilità
savedidattivita: numberAttività salvata con successo (creata o modificata, oppure "Segna come fatto")
cancelEmesso quando il dialog si chiude senza salvare (update:visible(false))

Modalità nuova vs modifica

AspettoNuova (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)falsetrue

Validazione

Tutta la validazione è schema-driven via vue-form (regole pipe-separated 'required\|max:125', 'required\|mindate:0d'):

CampoRegolaNote
idtipoattivitarequiredObbligatorio
riepilogorequired|max:125Help text reattivo: contatore N/125
assegnatarirequiredAlmeno un assegnatario
datascadenzarequired|mindate:0dVisibile solo per non-riunioni o riunione tuttoilgiorno
_datetimeiniziorequiredCampo virtuale con exclude: true — visibile solo per riunioni con orario
_datetimefinerequiredIdem _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.4 AttivitaForm non usa più il composable useAttivitaForm. Lo schema vue-form gestisce stato e validazione, e il submit chiama direttamente repository.pianificaAttivita / repository.updateAttivita + repository.replaceAssegnatari. useAttivitaForm resta esportato per chi vuole costruire form custom.
  • Auto-refresh viste data-aware (v1.0.0): dopo un POST/PATCH (sia handleSave sia handleSegnaComeFatto), AttivitaForm incrementa refreshSignal del context. Tutte le viste data-aware (AttivitaListaEntita, AttivitaBadge, AttivitaTimeline, AttivitaCalendario, AttivitaConsolidata, AttivitaKanbanTipo) si auto-aggiornano senza che il parent debba ricaricare. Vedi useAttivitaContext.refreshSignal.
  • Toast integrati: il componente usa useToast() di @pzeta/vue-components per feedback su successo/errore — non serve gestirli dal parent.
  • Width fissa 600px sul DynamicFormDialog.