Schema
O que é um schema?
Um schema descreve declarativamente a estrutura visual e funcional de um DyonaForm. Importe o componente e seu tipo, defina um objeto e passe-o para schema:
import {
DyonaForm,
type DyonaFormSchema,
} from '@typhonsoftware/dyona-form';
const schema: DyonaFormSchema = {
// ...
};
<DyonaForm schema={schema} />
DyonaForm recebe um objeto JavaScript ou TypeScript com uma estrutura compatível com JSON; ele não recebe diretamente uma string JSON.
Estrutura raiz
type DyonaFormSchema = {
title: string;
actions?: DyonaFormActionsConfig;
tabs: DyonaFormTab[];
hideSingleTab?: boolean;
};
titleé obrigatório, deve ser uma string não vazia e é o título geral do formulário.tabsé obrigatório, é um array deDyonaFormTab, deve conter pelo menos uma tab e contém a estrutura principal do formulário.hideSingleTabé opcional e booleano. Quando existe exatamente uma tab e seu valor étrue, somente a barra visual de tabs é ocultada; seu conteúdo continua sendo renderizado. Com duas ou mais tabs, elas sempre são exibidas.actionsé opcional e configura os próprios botões do formulário. Não é o Action Engine genérico do DYONA.
Hierarquia visual
DyonaFormSchema
↓
tabs[]
↓
rows[]
↓
columns[]
↓
DyonaFormField
Um schema contém tabs; cada tab contém rows; cada row contém columns; e cada item de columns é um field.
Tabs
type DyonaFormTab = {
id: string;
title: string;
helpUrl?: string;
rows: DyonaFormRow[];
};
idé obrigatório, deve ser uma string não vazia e deve ser único dentro do schema.titleé obrigatório, deve ser uma string não vazia e é o texto visível da tab.helpUrlé opcional, é uma string e permite definir acesso à ajuda dessa seção.rowsé o array de linhas da tab.
Rows e columns
type DyonaFormRow = {
columns: DyonaFormField[];
};
Uma row representa uma linha lógica do formulário. columns é obrigatório, é um array e uma row existente deve conter pelo menos um field. Cada item é um DyonaFormField.
O nome público da propriedade é columns, não fields.
rows: [
{
columns: [
{name: 'firstName', label: 'Nome', type: 'text'},
{name: 'lastName', label: 'Sobrenome', type: 'text'},
],
},
]
Fields: estrutura básica
As propriedades específicas de fields são documentadas em Fields. Em Schema, a estrutura mínima é:
{name: 'name', label: 'Nome', type: 'text'}
nameidentifica o dado, deve ser uma string não vazia e deve ser único em todo o formulário.labelé o texto visível do field.typedefine qual controle o DYONA Form renderiza.
Os field types atuais são text, number, date, datetime, select, autocomplete, checkbox, textarea, email, password, link e label. Suas propriedades específicas são documentadas em Fields.
Layout e grid
Um field pode definir sua largura responsiva com grid:
grid: {xs: 12, md: 6}
xs, sm, md, lg e xl usam valores de 1 a 12.
Actions do formulário
type DyonaFormActionsConfig = {
submit?: DyonaFormActionButtonConfig;
back?: DyonaFormActionButtonConfig;
custom?: DyonaFormCustomActionConfig[];
disableOtherActionsWhileRunning?: boolean;
layout?: 'horizontal' | 'vertical';
wrap?: boolean;
};
type DyonaFormActionButtonConfig = {
label?: string;
icon?: string;
shortcut?: string;
tooltip?: string;
variant?: 'text' | 'outlined' | 'contained';
loadingLabel?: string;
showSpinner?: boolean;
cancelable?: boolean;
};
type DyonaFormCustomActionConfig = DyonaFormActionButtonConfig & {
id: string;
label: string;
validate?: boolean;
};
actions: {
submit: {label: 'Salvar', icon: 'Save', shortcut: 'Alt+S', tooltip: 'Salvar alterações'},
back: {label: 'Voltar', icon: 'ArrowBack'},
custom: [{id: 'preview', label: 'Visualizar', validate: false}],
}
Estas actions configuram os botões próprios submit e back e os botões custom de DyonaForm. Elas não são instâncias de DyonaAction nem pertencem ao Action Engine genérico. Consulte Actions do formulário para handlers, validação, execução assíncrona, cancelamento, defaults e layout.
O que não pertence ao schema?
Estas são props de DyonaForm, não propriedades do schema: locale, initialValues, onSubmit, onBack, onAction, styles e dataSourceExecutor.
<DyonaForm
locale="..."
schema={schema}
initialValues={{...}}
onSubmit={...}
onAction={...}
/>
Isso separa a configuração declarativa do schema da integração React do componente.
Exemplo mínimo completo
const schema: DyonaFormSchema = {
title: 'Cliente',
hideSingleTab: true,
tabs: [{
id: 'general',
title: 'Geral',
rows: [{
columns: [{name: 'name', label: 'Nome', type: 'text', required: true}],
}],
}],
};
<DyonaForm locale="pt" schema={schema} />
Exemplo estrutural
const schema: DyonaFormSchema = {
title: 'Editor de cliente',
tabs: [
{
id: 'general', title: 'Geral',
rows: [
{columns: [
{name: 'firstName', label: 'Nome', type: 'text', grid: {xs: 12, md: 6}},
{name: 'lastName', label: 'Sobrenome', type: 'text', grid: {xs: 12, md: 6}},
]},
{columns: [{name: 'email', label: 'Email', type: 'email'}]},
],
},
{
id: 'preferences', title: 'Preferências',
rows: [{columns: [{name: 'newsletter', label: 'Receber novidades', type: 'checkbox'}]}],
},
],
actions: {
submit: {label: 'Salvar', icon: 'Save'},
back: {label: 'Voltar', icon: 'ArrowBack'},
},
};
Schema como JSON
A mesma estrutura básica pode ser representada com sintaxe JSON real:
{
"title": "Cliente",
"tabs": [{
"id": "general",
"title": "Geral",
"rows": [{
"columns": [{"name": "name", "label": "Nome", "type": "text"}]
}]
}]
}
A estrutura é compatível com JSON; a aplicação finalmente fornece o objeto resultante para schema.
Validação estrutural
O DYONA Form valida um schema antes da renderização normal. Regras estruturais úteis incluem title obrigatório, pelo menos uma tab, ids de tabs únicos, names de fields únicos em todo o formulário, field types suportados, columns válidas em rows e rejeição de propriedades incompatíveis. Códigos internos de validação não fazem parte deste guia.
Próximos passos
- Fields — tipos e propriedades de fields.
- Validation — validação declarativa e integrada.
- Conditions — visibilidade e obrigatoriedade condicional.
- Label — fields informativos visuais/no-data.