Aller au contenu

Référence

Composants

Deux composants portent toute la surface publique de l’UI : le builder qui produit un spec, et le renderer qui transforme un spec en formulaire fonctionnel. Tout le reste du package n’est qu’une brick interne qu’ils composent.

Le même composant est exposé de trois façons. Les props sont identiques ; seule la syntaxe des événements change :

<FkFormRender spec={spec} onFormSubmit={(e) => save(e.detail.data)} />

Les props sont en camelCase, les événements sont des handlers onXxx.

Rend un spec sous forme de formulaire fonctionnel.

Prop Type Défaut Rôle
spec BrickSpec Obligatoire. Le formulaire à afficher.
data Record<string, unknown> {} Valeurs initiales, indexées par la key des bricks.
context Record<string, unknown> Valeurs d’exécution pour les règles et l’interpolation d’URL. Jamais une valeur de champ, jamais émis.
readOnly boolean false Rend tous les contrôles désactivés et masque l’action intégrée.
disabled boolean false Rend tous les contrôles indisponibles — attribut disabled partout.
showSubmit boolean false Affiche un bouton de soumission intégré.
submitLabel string Remplace le libellé de ce bouton.
editable boolean false Rendu en mode builder (contours de sélection, zones de dépôt). Utilisé par le builder lui-même.
selectedPath string Quelle brick apparaît sélectionnée en mode editable, par chemin.
locale string Locale utilisée pour résoudre les libellés et messages de validation localisés.

Un formulaire a souvent besoin de valeurs que l’hôte connaît et que l’utilisateur ne doit pas fournir : une adresse d’API, un plan client, un jeton d’authentification. Passez-les via context, un sac tenu séparé des données du formulaire :

<FkFormRender spec={spec} data={values} context={{ apiBase, tenant }} />

Les règles et l’interpolation de optionsUrl / optionsHeaders lisent context et data comme une seule map, context l’emportant en cas de collision de nom. Rien de ce que contient context n’est validé, écrit par un effet de valeur, ou présent dans formDataChange / formSubmit. La même prop existe sur fk-form-builder, où elle alimente l’aperçu.

Événement Detail Se déclenche quand
formDataChange { data, isValid, errors } Un champ change, et après validate()
formSubmit { data, isValid, errors } Le formulaire est soumis et valide. Un formulaire invalide ne l’émet jamais : isValid vaut donc toujours true et errors est toujours vide.
validityChange { valid, errors } Au premier rendu et à chaque changement de verdict
interface DataChangeDetail {
data: Record<string, unknown>
isValid: boolean
errors: Record<string, string> // indexé par key de brick, ex. "contacts[0].email"
}
await element.validate(): Promise<ValidationResult>
await element.submit(): Promise<ValidationResult>

submit() valide, n’émet formSubmit que si le formulaire est valide, et renvoie le verdict dans les deux cas.

fk-form-render est un custom element associé aux formulaires et remonte sa validité en continu : un écran complet n’a donc besoin ni de ref ni d’appel à validate() :

<form id="checkout">
<fk-form-render id="form"></fk-form-render>
</form>
<button type="submit" form="checkout">Envoyer</button>

Le bouton externe pilote l’élément via la plateforme, et checkValidity() sur le formulaire reflète les règles du spec. Lier le disabled d’un bouton à validityChange fonctionne pareil, sans formulaire du tout. Là où ElementInternals n’est pas disponible, l’élément se comporte comme avant.

validate() marque chaque brick porteuse d’une key comme touchée (pour que les erreurs deviennent visibles), valide les données à plat, attend la validation ligne par ligne de chaque data grid, fusionne les résultats et émet formDataChange. Il retourne { valid, errors }.

import { useRef } from 'react'
import { FkFormRender } from '@streamline-pulse/formkrafter-react'
const ref = useRef<HTMLFkFormRenderElement>(null)
const verdict = await ref.current?.validate()

L’éditeur en glisser-déposer. Il rend sa propre palette, son canvas et son panneau de propriétés.

Prop Type Défaut Rôle
spec BrickSpec Spec à charger dans le canvas. Omettez-le pour partir d’un formulaire vide.
data Record<string, unknown> {} Valeurs d’aperçu utilisées pendant l’édition.
context Record<string, unknown> Valeurs d’exécution pour l’aperçu, même contrat que sur le renderer.
locales string[] [] Active le sélecteur de langue d’édition ; les champs du panneau lisent et écrivent alors par locale.
locale string La langue du chrome du builder : associée à setFkTranslations, la toolbar, la palette et le panneau se re-rendent à la volée — sans remontage. Distincte de la langue d’édition.
Événement Detail Se déclenche quand
specChange { spec, patches, inverse } Toute édition : dépôt, réordonnancement, changement de config, undo, redo, import
interface SpecChangeDetail {
spec?: BrickSpec
patches: Operation[] // RFC 6902, avant
inverse: Operation[] // RFC 6902, arrière
}

Sur un undo, un redo et un remplacement complet du spec, patches et inverse sont émis sous forme de tableaux vides — le spec lui-même fait autorité dans ces cas-là.

import { useState } from 'react'
import { FkFormBuilder, FkFormRender } from '@streamline-pulse/formkrafter-react'
import '@streamline-pulse/formkrafter-wc/styles.css'
import type { BrickSpec } from '@streamline-pulse/formkrafter-core'
export function Studio() {
const [spec, setSpec] = useState<BrickSpec>()
return (
<>
<FkFormBuilder onSpecChange={(e) => setSpec(e.detail.spec)} />
{spec && (
<FkFormRender spec={spec} onFormSubmit={(e) => console.log(e.detail.data)} />
)}
</>
)
}

Un projet de Streamline Pulse