Pular para o conteúdo principal

BuilderProvider

O provider de contexto que alimenta o editor visual de schemas com drag-and-drop.

Import

import {
BuilderProvider,
Canvas,
ConfigPanel,
Palette,
} from "@schema-forms-data/builder";

Configuração mínima

<BuilderProvider onSchemaChange={(schema) => console.log(schema)}>
<div style={{ display: "flex", height: "100vh" }}>
<Palette />
<Canvas />
<ConfigPanel />
</div>
</BuilderProvider>

Props

PropTipoPadrãoDescrição
initialConfigsRecord<string, ItemConfig>{}Pré-carrega o builder a partir de um FormSchema salvo. Use formSchemaToBuilder(schema).configs.
initialContainersContainersTree{ root: { children: [] } }Estrutura de árvore de um schema salvo. Use formSchemaToBuilder(schema).dndState.containers.
initialTemplateIdstring"moderno"Pré-seleciona um template visual no preview do builder.
schemaIdstringundefinedID do schema sendo editado. Necessário para uploadTermsPdf funcionar.
uploadTermsPdf(file: File) => Promise<string>Faz upload de um PDF para um campo Terms. Retorne o uploadId.
onSchemaChange(schema: FormSchema) => voidDisparado a cada mudança com o schema atual.

Carregar schema existente

import {
BuilderProvider,
formSchemaToBuilder,
} from "@schema-forms-data/builder";

const schemaExistente: FormSchema = await buscarSchema("meu-schema-id");
const { dndState, configs, templateId } = formSchemaToBuilder(schemaExistente);

<BuilderProvider
initialConfigs={configs}
initialContainers={dndState.containers}
initialTemplateId={templateId ?? "moderno"}
schemaId="meu-schema-id"
uploadTermsPdf={async (file) => minhaApi.uploadPdf(file)}
onSchemaChange={(schema) => minhaApi.salvarSchema(schema)}
>
{/* ... */}
</BuilderProvider>;

Exportar schema programaticamente

import { useBuilder, builderToFormSchema } from "@schema-forms-data/builder";

function BotaoSalvar() {
const { dndState, configs, previewTemplateId } = useBuilder();

const handleSalvar = () => {
const schema = builderToFormSchema(dndState, configs, {
id: "meu-schema",
nome: "Meu Formulário",
status: "ativo",
template: previewTemplateId,
});
minhaApi.salvar(schema);
};

return <button onClick={handleSalvar}>Salvar</button>;
}

Sub-componentes

ComponenteDescrição
<Palette />Sidebar esquerda com tipos de campo e blocos pré-prontos para arrastar
<Canvas />Área principal drag-and-drop — exibe steps, containers e campos
<ConfigPanel />Sidebar direita — exibe opções de configuração do item selecionado
<TemplateSelector />Menu para trocar o template do preview

Hook useBuilder

Acessa o estado completo do builder em qualquer componente dentro do BuilderProvider:

const {
selectedId, // ID do campo/container/step selecionado
configs, // Record<string, ItemConfig> — todas as configs
dndState, // DndState — estrutura de árvore
schemaId, // string | undefined
addItem, // adiciona novo campo/container/step
removeItem, // remove item e todos os descendentes
updateConfig, // atualiza config de um item
undo, // desfaz última alteração
redo, // refaz
canUndo, // boolean
canRedo, // boolean
} = useBuilder();