Skip to content

Utiliser FormBuilder

FormBuilder est le composant public d’édition visuelle.

Il encapsule :

  • la toolbar ;
  • le panneau des composants ;
  • le panneau de propriétés ;
  • le canevas ;
  • le mode aperçu ;
  • le store Pinia isolé par instance ;
  • l’autosave ;
  • les événements métier.

Exemple minimal

vue
<script setup lang="ts">
import type { FormKitSchemaDefinition } from '@formkit/core'

type FormBuilderSchema = FormKitSchemaDefinition[]
type FormBuilderValues = Record<string, unknown>

const schema = ref<FormBuilderSchema>([])
const values = ref<FormBuilderValues>({})
</script>

<template>
  <FormBuilder
    builder-id="simple-builder"
    v-model:schema="schema"
    v-model:values="values"
  />
</template>

Exemple avec sauvegarde

vue
<script setup lang="ts">
import type { FormKitSchemaDefinition } from '@formkit/core'

type FormBuilderSchema = FormKitSchemaDefinition[]
type FormBuilderValues = Record<string, unknown>

type FormBuilderSavePayload = {
  builderId: string
  schema: FormBuilderSchema
  values: FormBuilderValues
  settings: Record<string, unknown>
}

const schema = ref<FormBuilderSchema>([])
const values = ref<FormBuilderValues>({})
const previewMode = ref<'editing' | 'previewing'>('editing')

function saveForm(payload: FormBuilderSavePayload) {
  console.log('Builder', payload.builderId)
  console.log('Schema', payload.schema)
  console.log('Values', payload.values)
  console.log('Settings', payload.settings)
}
</script>

<template>
  <FormBuilder
    builder-id="contact-form-builder"
    v-model:schema="schema"
    v-model:values="values"
    v-model:preview-mode="previewMode"
    title="Formulaire de contact"
    subtitle="Construisez le formulaire affiché aux utilisateurs"
    autosave
    storage-key="forms:contact:builder-state"
    @save="saveForm"
  />
</template>

Utiliser l’API publique avec ref

FormBuilder expose plusieurs méthodes utiles pour une page admin.

vue
<script setup lang="ts">
import type { FormKitSchemaDefinition } from '@formkit/core'

type FormBuilderSchema = FormKitSchemaDefinition[]
type FormBuilderValues = Record<string, unknown>

type FormBuilderPublicApi = {
  getBuilderId: () => string
  save: () => {
    builderId: string
    schema: FormBuilderSchema
    values: FormBuilderValues
    settings: Record<string, unknown>
  }
  reset: () => void
  setSchema: (schema: FormBuilderSchema) => void
  getSchema: () => FormBuilderSchema
  setValues: (values: FormBuilderValues) => void
  getValues: () => FormBuilderValues
  setSettings: (settings: Record<string, unknown>) => void
  getSettings: () => Record<string, unknown>
  importSchema: (schema: FormBuilderSchema) => void
  exportSchema: () => FormBuilderSchema
}

const builderRef = ref<FormBuilderPublicApi | null>(null)

function exportCurrentSchema() {
  const schema = builderRef.value?.exportSchema() || []
  console.log('Schéma exporté', schema)
}

function clearBuilder() {
  builderRef.value?.reset()
}
</script>

<template>
  <div class="column q-gutter-md">
    <div class="row q-gutter-sm">
      <QBtn label="Exporter" color="primary" @click="exportCurrentSchema" />
      <QBtn label="Réinitialiser" color="negative" flat @click="clearBuilder" />
    </div>

    <FormBuilder
      ref="builderRef"
      builder-id="builder-with-public-api"
      height="calc(100vh - 96px)"
    />
  </div>
</template>

Personnaliser les labels

vue
<template>
  <FormBuilder
    builder-id="custom-labels"
    :labels="{
      save: 'Sauvegarder le formulaire',
      reset: 'Réinitialiser',
      preview: 'Prévisualiser',
      edit: 'Éditer'
    }"
  />
</template>

Slots de toolbar

FormBuilder expose deux slots de toolbar :

  • toolbar-before ;
  • toolbar-after.

Ils reçoivent schema, values, settings, builderId, et pour toolbar-after, les méthodes save et reset.

vue
<template>
  <FormBuilder builder-id="toolbar-demo">
    <template #toolbar-after="{ builderId, save }">
      <QBtn
        dense
        flat
        icon="cloud_upload"
        label="Publier"
        @click="save()"
      />
      <QBadge outline color="primary">
        {{ builderId }}
      </QBadge>
    </template>
  </FormBuilder>
</template>

Bonne pratique

Garde builder-id stable. Ne le calcule pas à partir d’une donnée qui change pendant le cycle de vie du composant.

À éviter :

vue
<FormBuilder :builder-id="`form-${Date.now()}`" />

À privilégier :

vue
<FormBuilder :builder-id="`form-${formId}`" />

QForm Builder — couche Nuxt 4 / Quasar / FormKit réutilisable.