Vue Form

Sistema form dinamico Vue 3 schema-driven con 30+ tipi di input, 80+ validatori integrati, validation on-blur, layout normal/tabs/wizard/accordion, cross-field validation e integrazione i18n.

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

  • DynamicFormLayouts schema-driven con 30+ tipi di input, validation on-blur, layout normal/tabs/wizard/accordion, tracking dirty/valid/dirty-values
  • Schema come oggetto literal: forma canonica { sections: [...] } — diff-friendly, serializzabile, mappa 1:1 sui tipi FormSchema / SectionDefinition / RowDefinition / FieldDefinition
  • Wrapper UI: DynamicFormDialog, DynamicFormDrawer, DynamicFormDrawerWithTable, DynamicFormListDialog per scenari modali e CRUD completi
  • Helper opzionali field/row/section/form per 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: I18nFormPlugin con merge automatico di traduzioni, italiano precaricato + inglese lazy
  • Componenti remote: SelectRemote, ListboxRemote, TreeRemote, AutoCompleteRemote (ricerca sul server mentre si digita), ecc. con fetchFn o endpoint + 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) e tags (etichette a testo libero)
  • Campi generati con l'AI: opzione di campo ai e componente AiFieldTrigger

Novità dalla 2.14

VersioneNovità
2.14.0DynamicFormDialog: submitLabel, size, breakpoints, initialFocus, closeOnSave; Esc sulla conferma di scarto. Tipo di campo datetime
2.15.0autocomplete con ricerca remota tramite un proprio listener complete
2.15.2Alias di regola in; avviso in console per le regole sconosciute
2.16.0AutoCompleteRemote (initialOptions dalla 2.16.1)
2.17.0TiptapEditor: link conservati, extensions, readonly, stile del contenuto nella shell, «/Trascrizione vocale». AiFieldTrigger, ListInput, CronInput. DynamicFormDialog: extraDirty e focus sul primo campo asincrono
2.18.0DynamicFormDrawer: slot body-before/body-after ed extraDirty. Errori e testi di aiuto di nuovo visibili in 8 componenti
2.18.1Dipendenze aggiornate
2.18.2Build Vite dei consumer senza @tiptap/suggestion di nuovo integra (vedi Installazione)
2.18.3Peer @pzeta/mfe-contracts accetta anche la 3.x
2.18.4VueFormPlugin registra anche AutoCompleteRemote
2.20.0Regole 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

ModuloDescrizione
Getting StartedInstallazione, peer dependencies, plugin i18n setup
ComponentsDynamicFormLayouts, Dialog/Drawer/ListDialog, tutti i tipi di input
Validators80+ validatori organizzati per categoria + custom
ComposablesuseValidation, useFieldValidation, useRemoteFetch, useRemoteSetup, useOptionLabel, useAudioRecorder
ServicesValidationService — API centrale di validazione

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>
Per ridurre boilerplate in schemi grandi con molte select inline o factorizzazione di campi base puoi usare gli helper opzionali field/row/section/form. Vedi Schema builders — i builder sono un'alternativa, non il default.

Quando usare cosa

ScenarioSoluzione
Form standalone su paginaDynamicFormLayouts
Form modale di creazione/modificaDynamicFormDialog
Form drawer con auto-fetch del recordDynamicFormDrawer
CRUD completo (table + drawer + form)DynamicFormDrawerWithTable
Lista embedded con form di aggiunta inlineDynamicFormListDialog
Scelta fra migliaia di record, cercando sul servercampo autocompleteremote
Elenco di righe tipizzate dentro il formcampo list
Pianificazione (espressione cron)campo cron
Etichette libere (tag) con un numero massimocampo tags + regola maxItems:N
Valore di un campo generato con l'AIopzione di campo ai
Note di una riunione registrate e trascritteTiptapEditor con voiceTranscription
Validazione manuale di un valore singoloValidationService.validate(...) o useValidation
Schema standard / serializzato da backend / piccoli-medioggetto literal { sections: [...] } (default raccomandato)
Schema con campi base riusabili o molte select inline ripetutehelper opzionali field/row/section/form (vedi criteri di scelta)