Vue Form
Panoramica
@pzeta/vue-form è la libreria PZeta per costruire form complessi schema-driven in Vue 3. Il componente principale DynamicFormLayouts accetta uno schema dichiarativo e renderizza automaticamente i campi corretti con validazione on-blur, errori inline, condizioni dinamiche e propagazione disabled/readonly ai discendenti.
Versione corrente: 2.18.4 — peer deps vue@^3.5.43, @pzeta/vue-components@^1.23.0, @pzeta/vue-i18n@^1.2.0 (più optional @tiptap/*, @googlemaps/js-api-loader, @pzeta/postgrest e @pzeta/mfe-contracts).
Funzionalità principali
DynamicFormLayoutsschema-driven con 30+ tipi di input, validation on-blur, layoutnormal/tabs/wizard/accordion, trackingdirty/valid/dirty-values- Schema come oggetto literal: forma canonica
{ sections: [...] }— diff-friendly, serializzabile, mappa 1:1 sui tipiFormSchema/SectionDefinition/RowDefinition/FieldDefinition - Wrapper UI:
DynamicFormDialog,DynamicFormDrawer,DynamicFormDrawerWithTable,DynamicFormListDialogper scenari modali e CRUD completi - Helper opzionali
field/row/section/formper casi di forte riuso/factorizzazione — vedi Schema builders per i criteri di scelta - 80+ validatori organizzati in 11 categorie (core, string, numeric, date, format, italian, financial, network, security, documents, file, other)
- Validatori custom registrabili runtime via
ValidationService.registerValidator - Cross-field validation: regole
validationRules(match, different, requiredIf, ecc.) valutate in tempo reale - i18n integrato:
I18nFormPlugincon merge automatico di traduzioni, italiano precaricato + inglese lazy - Componenti remote:
SelectRemote,ListboxRemote,TreeRemote,AutoCompleteRemote(ricerca sul server mentre si digita), ecc. confetchFnoendpoint+ filtri dinamici - Componenti speciali:
AddressAutocompleteInput(Google Places),BarcodeScanner(BarcodeDetector API),CameraCapture,TiptapEditor(con immagini, tabelle e il blocco «/Trascrizione vocale») - Campi strutturati:
list(righe tipizzate con colonne nello schema),cron(espressione con anteprima leggibile) etags(etichette a testo libero) - Campi generati con l'AI: opzione di campo
aie componenteAiFieldTrigger
Novità dalla 2.14
| Versione | Novità |
|---|---|
| 2.14.0 | DynamicFormDialog: submitLabel, size, breakpoints, initialFocus, closeOnSave; Esc sulla conferma di scarto. Tipo di campo datetime |
| 2.15.0 | autocomplete con ricerca remota tramite un proprio listener complete |
| 2.15.2 | Alias di regola in; avviso in console per le regole sconosciute |
| 2.16.0 | AutoCompleteRemote (initialOptions dalla 2.16.1) |
| 2.17.0 | TiptapEditor: link conservati, extensions, readonly, stile del contenuto nella shell, «/Trascrizione vocale». AiFieldTrigger, ListInput, CronInput. DynamicFormDialog: extraDirty e focus sul primo campo asincrono |
| 2.18.0 | DynamicFormDrawer: slot body-before/body-after ed extraDirty. Errori e testi di aiuto di nuovo visibili in 8 componenti |
| 2.18.1 | Dipendenze aggiornate |
| 2.18.2 | Build Vite dei consumer senza @tiptap/suggestion di nuovo integra (vedi Installazione) |
| 2.18.3 | Peer @pzeta/mfe-contracts accetta anche la 3.x |
| 2.18.4 | VueFormPlugin registra anche AutoCompleteRemote |
| 2.20.0 | Regole minItems/maxItems per i valori a elenco, avviso in console per min/max su un array. Tipo di campo tags; commitDrafts() di DynamicFormLayouts. Peer @pzeta/vue-components ^1.32.0 |
Sotto-pagine
| Modulo | Descrizione |
|---|---|
| Getting Started | Installazione, peer dependencies, plugin i18n setup |
| Components | DynamicFormLayouts, Dialog/Drawer/ListDialog, tutti i tipi di input |
| Validators | 80+ validatori organizzati per categoria + custom |
| Composables | useValidation, useFieldValidation, useRemoteFetch, useRemoteSetup, useOptionLabel, useAudioRecorder |
| Services | ValidationService — API centrale di validazione |
Components
Tutti i tipi di input disponibili nel sistema form — basic, selection, toggle, advanced, editor, remote e special.
Composables
Composables di @pzeta/vue-form per validazione reattiva, fetch dati remoti e gestione opzioni — useValidation, useFieldValidation, useRemoteFetch, useRemoteSetup, useOptionLabel.
Services
API di servizio di @pzeta/vue-form.
Validators
60+ validatori organizzati per categoria. La sintassi è "required|email|min:5|max:100".
Quick start
// main.ts
import { createApp } from 'vue'
import { VueFormPlugin, I18nFormPlugin } from '@pzeta/vue-form'
import '@pzeta/vue-form/style.css'
const app = createApp(App)
// 1. Configura i18n PRIMA di tutto
app.use(I18nFormPlugin)
// 2. Registra componenti
app.use(VueFormPlugin)
app.mount('#app')
<script setup lang="ts">
import { ref } from 'vue'
import { DynamicFormLayouts } from '@pzeta/vue-form'
import type { FormSchema } from '@pzeta/vue-form'
const formData = ref({})
// Forma raccomandata: schema come oggetto literal
const schema: FormSchema = {
sections: [
{
title: 'Anagrafica',
icon: 'pi pi-user',
rows: [
{
fields: [
{ name: 'nome', type: 'text', label: 'Nome', span: 6, required: true, validation: 'required' },
{ name: 'email', type: 'email', label: 'Email', span: 6, required: true, validation: 'required|email' },
],
},
{
fields: [
{
name: 'paese',
type: 'select',
label: 'Paese',
props: {
options: [
{ label: 'Italia', value: 'IT' },
{ label: 'Francia', value: 'FR' },
],
optionLabel: 'label',
optionValue: 'value',
},
},
],
},
],
},
],
}
</script>
<template>
<DynamicFormLayouts v-model="formData" :schema="schema" />
</template>
field/row/section/form. Vedi Schema builders — i builder sono un'alternativa, non il default.Quando usare cosa
| Scenario | Soluzione |
|---|---|
| Form standalone su pagina | DynamicFormLayouts |
| Form modale di creazione/modifica | DynamicFormDialog |
| Form drawer con auto-fetch del record | DynamicFormDrawer |
| CRUD completo (table + drawer + form) | DynamicFormDrawerWithTable |
| Lista embedded con form di aggiunta inline | DynamicFormListDialog |
| Scelta fra migliaia di record, cercando sul server | campo autocompleteremote |
| Elenco di righe tipizzate dentro il form | campo list |
| Pianificazione (espressione cron) | campo cron |
| Etichette libere (tag) con un numero massimo | campo tags + regola maxItems:N |
| Valore di un campo generato con l'AI | opzione di campo ai |
| Note di una riunione registrate e trascritte | TiptapEditor con voiceTranscription |
| Validazione manuale di un valore singolo | ValidationService.validate(...) o useValidation |
| Schema standard / serializzato da backend / piccoli-medi | oggetto literal { sections: [...] } (default raccomandato) |
| Schema con campi base riusabili o molte select inline ripetute | helper opzionali field/row/section/form (vedi criteri di scelta) |