@schema-forms-data/renderer 0.3.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +103 -0
- package/dist/index.cjs +3 -0
- package/dist/index.d.ts +773 -0
- package/dist/index.js +4244 -0
- package/package.json +63 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,773 @@
|
|
|
1
|
+
import { Context } from 'react';
|
|
2
|
+
import { Control } from 'react-hook-form';
|
|
3
|
+
import { default as default_2 } from 'react';
|
|
4
|
+
import { FieldConditionalExpr } from '@schema-forms-data/core';
|
|
5
|
+
import { FieldOption } from '@schema-forms-data/core';
|
|
6
|
+
import { FieldValidation } from '@schema-forms-data/core';
|
|
7
|
+
import { FieldValidatorConfig } from '@schema-forms-data/core';
|
|
8
|
+
import { FormContainer } from '@schema-forms-data/core';
|
|
9
|
+
import { FormField } from '@schema-forms-data/core';
|
|
10
|
+
import { FormSchema } from '@schema-forms-data/core';
|
|
11
|
+
import { FormStep } from '@schema-forms-data/core';
|
|
12
|
+
import { JSX as JSX_2 } from 'react/jsx-runtime';
|
|
13
|
+
import { Resolver } from 'react-hook-form';
|
|
14
|
+
|
|
15
|
+
declare interface CepFillMap {
|
|
16
|
+
logradouro?: string;
|
|
17
|
+
bairro?: string;
|
|
18
|
+
cidade?: string;
|
|
19
|
+
estado?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export declare interface CepLookupResult {
|
|
23
|
+
logradouro?: string;
|
|
24
|
+
bairro?: string;
|
|
25
|
+
cidade?: string;
|
|
26
|
+
estado?: string;
|
|
27
|
+
erro?: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Mapa de componentes customizados indexados pelo `tipo` do campo.
|
|
32
|
+
*
|
|
33
|
+
* Registre componentes para **substituir** ou **complementar** os defaults do renderer.
|
|
34
|
+
* Funciona para todos os `FieldType` existentes e também para tipos customizados.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```tsx
|
|
38
|
+
* import { FieldType } from '@schema-forms-data/core';
|
|
39
|
+
*
|
|
40
|
+
* const componentMapper: ComponentMapper = {
|
|
41
|
+
* // Substitui o DFTextField padrão pelo Input do shadcn/ui
|
|
42
|
+
* [FieldType.TEXTO]: MeuTextField,
|
|
43
|
+
* // Adiciona um novo tipo de campo 'rating-stars'
|
|
44
|
+
* 'rating-stars': MeuRatingStars,
|
|
45
|
+
* };
|
|
46
|
+
*
|
|
47
|
+
* <FormRenderer schema={schema} componentMapper={componentMapper} />
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare type ComponentMapper = Record<string, React.ComponentType<FieldComponentProps>>;
|
|
51
|
+
|
|
52
|
+
export declare const ContainerRenderer: (props: ContainerRendererProps) => JSX_2.Element;
|
|
53
|
+
|
|
54
|
+
declare interface ContainerRendererProps {
|
|
55
|
+
container: FormContainer;
|
|
56
|
+
control: Control<Record<string, unknown>>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export declare const DFCepField: ({ name, control, placeholder, disabled, readOnly, cepFillMap, }: DFCepFieldProps) => JSX_2.Element;
|
|
60
|
+
|
|
61
|
+
declare interface DFCepFieldProps {
|
|
62
|
+
name: string;
|
|
63
|
+
control: Control<Record<string, unknown>>;
|
|
64
|
+
placeholder?: string;
|
|
65
|
+
disabled?: boolean;
|
|
66
|
+
readOnly?: boolean;
|
|
67
|
+
/** Mapa de nomes de campos a preencher após lookup. Quando ausente usa `_address_*`. */
|
|
68
|
+
cepFillMap?: CepFillMap;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export declare const DFCheckbox: ({ name, control, label, disabled, readOnly, }: DFCheckboxProps) => JSX_2.Element;
|
|
72
|
+
|
|
73
|
+
export declare const DFCheckboxGroup: ({ name, control, options, disabled, }: DFCheckboxGroupProps) => JSX_2.Element;
|
|
74
|
+
|
|
75
|
+
declare interface DFCheckboxGroupProps {
|
|
76
|
+
name: string;
|
|
77
|
+
control: Control<Record<string, unknown>>;
|
|
78
|
+
options: FieldOption[];
|
|
79
|
+
disabled?: boolean;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
declare interface DFCheckboxProps {
|
|
83
|
+
name: string;
|
|
84
|
+
control: Control<Record<string, unknown>>;
|
|
85
|
+
label?: string;
|
|
86
|
+
disabled?: boolean;
|
|
87
|
+
readOnly?: boolean;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export declare const DFDateField: ({ name, control, isDatetime, disabled, readOnly, validacao, }: DFDateFieldProps) => JSX_2.Element;
|
|
91
|
+
|
|
92
|
+
declare interface DFDateFieldProps {
|
|
93
|
+
name: string;
|
|
94
|
+
control: Control<Record<string, unknown>>;
|
|
95
|
+
placeholder?: string;
|
|
96
|
+
isDatetime?: boolean;
|
|
97
|
+
disabled?: boolean;
|
|
98
|
+
readOnly?: boolean;
|
|
99
|
+
validacao?: FieldValidation;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export declare const DFFieldArray: ({ name, control, subFields, minItems, maxItems, itemLabel, addLabel, }: DFFieldArrayProps) => JSX_2.Element;
|
|
103
|
+
|
|
104
|
+
declare interface DFFieldArrayProps {
|
|
105
|
+
name: string;
|
|
106
|
+
control: Control<Record<string, unknown>>;
|
|
107
|
+
subFields?: FormField[];
|
|
108
|
+
minItems?: number;
|
|
109
|
+
maxItems?: number;
|
|
110
|
+
itemLabel?: string;
|
|
111
|
+
addLabel?: string;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export declare const DFFileUpload: ({ name, control, disabled, campo, fileTypes, maxFileSize, }: DFFileUploadProps) => JSX_2.Element;
|
|
115
|
+
|
|
116
|
+
declare interface DFFileUploadProps {
|
|
117
|
+
name: string;
|
|
118
|
+
control: Control<Record<string, unknown>>;
|
|
119
|
+
disabled?: boolean;
|
|
120
|
+
campo?: string;
|
|
121
|
+
fileTypes?: string[];
|
|
122
|
+
maxFileSize?: number;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export declare const DFHidden: ({ name, control }: DFHiddenProps) => JSX_2.Element;
|
|
126
|
+
|
|
127
|
+
declare interface DFHiddenProps {
|
|
128
|
+
name: string;
|
|
129
|
+
control: Control<Record<string, unknown>>;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export declare const DFMaskedInput: ({ name, control, placeholder, maskType, disabled, readOnly, }: DFMaskedInputProps) => JSX_2.Element;
|
|
133
|
+
|
|
134
|
+
declare interface DFMaskedInputProps {
|
|
135
|
+
name: string;
|
|
136
|
+
control: Control<Record<string, unknown>>;
|
|
137
|
+
placeholder?: string;
|
|
138
|
+
maskType?: string;
|
|
139
|
+
disabled?: boolean;
|
|
140
|
+
readOnly?: boolean;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export declare const DFParticipationType: ({ name, control }: DFParticipationTypeProps) => JSX_2.Element;
|
|
144
|
+
|
|
145
|
+
export declare interface DFParticipationTypeProps {
|
|
146
|
+
name: string;
|
|
147
|
+
control: Control<Record<string, unknown>>;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export declare const DFPaymentMethod: ({ name, control, relatedFieldName, }: DFPaymentMethodProps) => JSX_2.Element;
|
|
151
|
+
|
|
152
|
+
export declare interface DFPaymentMethodProps {
|
|
153
|
+
name: string;
|
|
154
|
+
control: Control<Record<string, unknown>>;
|
|
155
|
+
/** Nome do campo de tipo de participação a ser observado. Padrão: `"tipo_participacao"`. */
|
|
156
|
+
relatedFieldName?: string;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export declare const DFRadioGroup: ({ name, control, options, visualStyle, disabled, }: DFRadioGroupProps) => JSX_2.Element;
|
|
160
|
+
|
|
161
|
+
declare interface DFRadioGroupProps {
|
|
162
|
+
name: string;
|
|
163
|
+
control: Control<Record<string, unknown>>;
|
|
164
|
+
options: FieldOption[];
|
|
165
|
+
visualStyle?: "default" | "card";
|
|
166
|
+
disabled?: boolean;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export declare const DFSelect: ({ name, control, placeholder, options, disabled, readOnly, }: DFSelectProps) => JSX_2.Element;
|
|
170
|
+
|
|
171
|
+
declare interface DFSelectProps {
|
|
172
|
+
name: string;
|
|
173
|
+
control: Control<Record<string, unknown>>;
|
|
174
|
+
placeholder?: string;
|
|
175
|
+
options: FieldOption[];
|
|
176
|
+
disabled?: boolean;
|
|
177
|
+
readOnly?: boolean;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export declare const DFTerms: ({ name, control, label, termoTexto, termoPdfUrl, termoPdfUploadId, }: DFTermsProps) => JSX_2.Element;
|
|
181
|
+
|
|
182
|
+
declare interface DFTermsProps {
|
|
183
|
+
name: string;
|
|
184
|
+
control: Control<Record<string, unknown>>;
|
|
185
|
+
label?: string;
|
|
186
|
+
termoTexto?: string;
|
|
187
|
+
termoPdfUrl?: string;
|
|
188
|
+
/** ID do upload armazenado. Quando presente, busca URL via `resolveTermsUploadUrl` do context. */
|
|
189
|
+
termoPdfUploadId?: string;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export declare const DFTextarea: ({ name, control, placeholder, disabled, readOnly, }: DFTextareaProps) => JSX_2.Element;
|
|
193
|
+
|
|
194
|
+
declare interface DFTextareaProps {
|
|
195
|
+
name: string;
|
|
196
|
+
control: Control<Record<string, unknown>>;
|
|
197
|
+
placeholder?: string;
|
|
198
|
+
disabled?: boolean;
|
|
199
|
+
readOnly?: boolean;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export declare const DFTextField: ({ name, control, placeholder, type, disabled, readOnly, }: DFTextFieldProps) => JSX_2.Element;
|
|
203
|
+
|
|
204
|
+
declare interface DFTextFieldProps {
|
|
205
|
+
name: string;
|
|
206
|
+
control: Control<Record<string, unknown>>;
|
|
207
|
+
placeholder?: string;
|
|
208
|
+
type?: string;
|
|
209
|
+
disabled?: boolean;
|
|
210
|
+
readOnly?: boolean;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Avalia uma FieldConditionalExpr recursivamente.
|
|
215
|
+
*/
|
|
216
|
+
export declare const evaluateFieldCondition: (cond: FieldConditionalExpr | undefined, values: Record<string, unknown>, externalData?: Record<string, unknown>) => boolean;
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* API de campo com props de input e metadados.
|
|
220
|
+
* Retornada por `useFieldApi(name)` — use para criar componentes de campo customizados.
|
|
221
|
+
*/
|
|
222
|
+
export declare interface FieldApiReturn {
|
|
223
|
+
/** Props prontas para passar num element de input (`<input {...input} />`) */
|
|
224
|
+
input: {
|
|
225
|
+
name: string;
|
|
226
|
+
value: unknown;
|
|
227
|
+
onChange: (...args: unknown[]) => void;
|
|
228
|
+
onBlur: () => void;
|
|
229
|
+
ref: React.Ref<unknown>;
|
|
230
|
+
};
|
|
231
|
+
/** Metadados de estado do campo */
|
|
232
|
+
meta: {
|
|
233
|
+
error?: string;
|
|
234
|
+
warning?: string;
|
|
235
|
+
touched: boolean;
|
|
236
|
+
dirty: boolean;
|
|
237
|
+
valid: boolean;
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Props recebidas por qualquer componente registrado no `componentMapper`.
|
|
243
|
+
*
|
|
244
|
+
* O campo `field` já vem **resolvido** (após `resolveProps` e `opcoesFromVar`),
|
|
245
|
+
* então o componente customizado pode ler `field.opcoes`, `field.isDisabled`, etc.
|
|
246
|
+
*
|
|
247
|
+
* @example
|
|
248
|
+
* ```tsx
|
|
249
|
+
* const MeuTextField: React.FC<FieldComponentProps> = ({ name, control, field }) => (
|
|
250
|
+
* <Controller
|
|
251
|
+
* name={name}
|
|
252
|
+
* control={control}
|
|
253
|
+
* render={({ field: f, fieldState }) => (
|
|
254
|
+
* <MyInput
|
|
255
|
+
* {...f}
|
|
256
|
+
* label={field.label}
|
|
257
|
+
* error={fieldState.error?.message}
|
|
258
|
+
* disabled={field.isDisabled}
|
|
259
|
+
* />
|
|
260
|
+
* )}
|
|
261
|
+
* />
|
|
262
|
+
* );
|
|
263
|
+
* ```
|
|
264
|
+
*/
|
|
265
|
+
export declare interface FieldComponentProps {
|
|
266
|
+
/** Nome do campo no formulário (path do react-hook-form) */
|
|
267
|
+
name: string;
|
|
268
|
+
/** Control do react-hook-form da etapa atual */
|
|
269
|
+
control: Control<Record<string, unknown>>;
|
|
270
|
+
/** Field config resolvido — contém label, opcoes, isDisabled, placeholder, etc. */
|
|
271
|
+
field: FormField;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Tipo de um resolver de props de campo.
|
|
276
|
+
* Recebe o field original, os valores atuais do form e os dados externos,
|
|
277
|
+
* e retorna um objeto parcial que é mesclado sobre o field antes da renderização.
|
|
278
|
+
*
|
|
279
|
+
* @example
|
|
280
|
+
* ```ts
|
|
281
|
+
* const resolvers: FieldResolvers = {
|
|
282
|
+
* // Carrega opções de camiseta dinamicamente baseado no evento
|
|
283
|
+
* opcoes_camiseta: (field, _values, external) => ({
|
|
284
|
+
* opcoes: (external['evento.tamanhosCamiseta'] as string[])
|
|
285
|
+
* ?.map(t => ({ valor: t, label: t })) ?? field.opcoes,
|
|
286
|
+
* }),
|
|
287
|
+
* // Desabilita campo se participante já pagou
|
|
288
|
+
* forma_pagamento: (_field, values) => ({
|
|
289
|
+
* isDisabled: values['pagamento_confirmado'] === true,
|
|
290
|
+
* }),
|
|
291
|
+
* };
|
|
292
|
+
* ```
|
|
293
|
+
*/
|
|
294
|
+
export declare type FieldResolver = (field: FormField, formValues: Record<string, unknown>, externalData: Record<string, unknown>) => Partial<FormField>;
|
|
295
|
+
|
|
296
|
+
export declare type FieldResolvers = Record<string, FieldResolver>;
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Estado de um campo individual.
|
|
300
|
+
* Retornado por `useField(name)`.
|
|
301
|
+
*/
|
|
302
|
+
export declare interface FieldState {
|
|
303
|
+
/** Valor atual do campo */
|
|
304
|
+
value: unknown;
|
|
305
|
+
/** Mensagem de erro de validação, se houver */
|
|
306
|
+
error?: string;
|
|
307
|
+
/** Mensagem de aviso (warn), se houver */
|
|
308
|
+
warning?: string;
|
|
309
|
+
/** `true` se o campo foi alterado em relação ao defaultValue */
|
|
310
|
+
dirty: boolean;
|
|
311
|
+
/** `true` se o campo já recebeu foco e perdeu */
|
|
312
|
+
touched: boolean;
|
|
313
|
+
/** `true` se o campo não tem erros */
|
|
314
|
+
valid: boolean;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Função validadora customizada registrada no `validatorMapper`.
|
|
319
|
+
*
|
|
320
|
+
* Recebe:
|
|
321
|
+
* - `value` — valor atual do campo
|
|
322
|
+
* - `allValues` — todos os valores do step (cross-field)
|
|
323
|
+
* - `config` — configuração do validador (`type`, `message` e params extras)
|
|
324
|
+
* - `externalData` — dados externos do formulário
|
|
325
|
+
*
|
|
326
|
+
* Retorna `undefined` se válido, ou a mensagem de erro (sync ou async).
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* ```ts
|
|
330
|
+
* const validatorMapper: ValidatorMapper = {
|
|
331
|
+
* cpfUnico: async (value, _allValues, _config, external) => {
|
|
332
|
+
* const exists = await api.checkCpf(String(value), external['evento.id']);
|
|
333
|
+
* return exists ? 'CPF já cadastrado' : undefined;
|
|
334
|
+
* },
|
|
335
|
+
* senhasIguais: (value, allValues, config) => {
|
|
336
|
+
* const other = allValues[config['field'] as string];
|
|
337
|
+
* return value === other ? undefined : 'As senhas não conferem';
|
|
338
|
+
* },
|
|
339
|
+
* };
|
|
340
|
+
* ```
|
|
341
|
+
*/
|
|
342
|
+
export declare type FieldValidatorFn = (value: unknown, allValues: Record<string, unknown>, config: FieldValidatorConfig, externalData: Record<string, unknown>) => string | undefined | Promise<string | undefined>;
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* API programática do formulário, acessível de qualquer componente filho.
|
|
346
|
+
* Retornada por `useFormApi()`.
|
|
347
|
+
*/
|
|
348
|
+
export declare interface FormApi {
|
|
349
|
+
/**
|
|
350
|
+
* Altera o valor de um campo e dispara a revalidação.
|
|
351
|
+
* Equivalente a `setValue(name, value, { shouldValidate: true })`.
|
|
352
|
+
*/
|
|
353
|
+
change: (name: string, value: unknown) => void;
|
|
354
|
+
/**
|
|
355
|
+
* Dispara o submit do formulário (equivale ao clique no botão "Próximo/Finalizar").
|
|
356
|
+
*/
|
|
357
|
+
submit: () => void;
|
|
358
|
+
/**
|
|
359
|
+
* Reseta o formulário para os valores fornecidos (ou os `defaultValues`).
|
|
360
|
+
*/
|
|
361
|
+
reset: (values?: Record<string, unknown>) => void;
|
|
362
|
+
/**
|
|
363
|
+
* Retorna um snapshot síncrono do estado atual do formulário.
|
|
364
|
+
*/
|
|
365
|
+
getState: () => FormStateSnapshot;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
export declare const FormRenderer: ({ schema, initialValues, initialStep, onSubmitStep, onComplete, template, formTitle, externalData, fieldErrors, uploadFile, cepLookup, resolveTermsUploadUrl, fieldResolvers, validatorMapper, componentMapper, paymentMethodOptions, onValuesChange, className, StepIndicator, }: FormRendererProps) => JSX_2.Element;
|
|
369
|
+
|
|
370
|
+
export declare interface FormRendererProps {
|
|
371
|
+
schema: FormSchema;
|
|
372
|
+
initialValues?: Record<string, unknown>;
|
|
373
|
+
/** Step inicial (0-based), restaurado do backend */
|
|
374
|
+
initialStep?: number;
|
|
375
|
+
onSubmitStep?: (stepIndex: number, data: Record<string, unknown>) => Promise<void>;
|
|
376
|
+
onComplete?: (data: Record<string, unknown>) => Promise<void>;
|
|
377
|
+
/** Template visual — define cores e estilo dos containers */
|
|
378
|
+
template?: string | null;
|
|
379
|
+
/** Título exibido no topo (era eventoNome) */
|
|
380
|
+
formTitle?: string;
|
|
381
|
+
/** Dados externos/contextuais para interpolação e campos especiais (era eventoData) */
|
|
382
|
+
externalData?: Record<string, unknown>;
|
|
383
|
+
/** Erros de campo vindos do servidor (ex: validação 422) */
|
|
384
|
+
fieldErrors?: Record<string, string>;
|
|
385
|
+
uploadFile?: RendererContextValue["uploadFile"];
|
|
386
|
+
cepLookup?: RendererContextValue["cepLookup"];
|
|
387
|
+
resolveTermsUploadUrl?: RendererContextValue["resolveTermsUploadUrl"];
|
|
388
|
+
/**
|
|
389
|
+
* Mapa de resolvers de props de campo para `resolvePropsKey`.
|
|
390
|
+
* @see FieldResolvers
|
|
391
|
+
*/
|
|
392
|
+
fieldResolvers?: FieldResolvers;
|
|
393
|
+
/**
|
|
394
|
+
* Mapa de validadores customizados para `validate` e `warn` dos campos.
|
|
395
|
+
* @see ValidatorMapper
|
|
396
|
+
*/
|
|
397
|
+
validatorMapper?: ValidatorMapper;
|
|
398
|
+
/**
|
|
399
|
+
* Mapa de componentes customizados por tipo de campo.
|
|
400
|
+
* Substitui (ou estende) os componentes internos do renderer.
|
|
401
|
+
*
|
|
402
|
+
* @example
|
|
403
|
+
* ```tsx
|
|
404
|
+
* import { FieldType } from '@schema-forms-data/core';
|
|
405
|
+
*
|
|
406
|
+
* <FormRenderer
|
|
407
|
+
* schema={schema}
|
|
408
|
+
* componentMapper={{
|
|
409
|
+
* [FieldType.TEXTO]: MeuTextField,
|
|
410
|
+
* [FieldType.SELECT]: MeuSelect,
|
|
411
|
+
* }}
|
|
412
|
+
* />
|
|
413
|
+
* ```
|
|
414
|
+
*/
|
|
415
|
+
componentMapper?: ComponentMapper;
|
|
416
|
+
/**
|
|
417
|
+
* Opções customizadas de pagamento para o `DFPaymentMethod`.
|
|
418
|
+
* Substitui os defaults do modelo IPB para `porDia` e/ou `todosOsDias`.
|
|
419
|
+
* @see PaymentOption
|
|
420
|
+
*/
|
|
421
|
+
paymentMethodOptions?: RendererContextValue["paymentMethodOptions"];
|
|
422
|
+
/**
|
|
423
|
+
* Chamada sempre que qualquer campo do step atual for alterado.
|
|
424
|
+
* Recebe os valores atuais do step — útil para autosave, analytics, etc.
|
|
425
|
+
*
|
|
426
|
+
* @example
|
|
427
|
+
* ```tsx
|
|
428
|
+
* <FormRenderer
|
|
429
|
+
* schema={schema}
|
|
430
|
+
* onValuesChange={(values) => sessionStorage.setItem('draft', JSON.stringify(values))}
|
|
431
|
+
* />
|
|
432
|
+
* ```
|
|
433
|
+
*/
|
|
434
|
+
onValuesChange?: (values: Record<string, unknown>) => void;
|
|
435
|
+
className?: string;
|
|
436
|
+
/** Componente indicador de progress steps customizado */
|
|
437
|
+
StepIndicator?: React.ComponentType<StepIndicatorProps>;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Componente observador do estado do formulário.
|
|
442
|
+
* Deve ser montado dentro do `<FormRenderer>`.
|
|
443
|
+
*/
|
|
444
|
+
export declare const FormSpy: default_2.FC<FormSpyProps>;
|
|
445
|
+
|
|
446
|
+
export declare interface FormSpyProps {
|
|
447
|
+
/**
|
|
448
|
+
* Função-filho que recebe o estado atual e retorna JSX.
|
|
449
|
+
* Também aceita children estáticos (JSX comum).
|
|
450
|
+
*/
|
|
451
|
+
children?: ((state: FormStateValue) => default_2.ReactNode) | default_2.ReactNode;
|
|
452
|
+
/**
|
|
453
|
+
* Alternativa ao children como função.
|
|
454
|
+
* Chamada com o estado atual a cada mudança.
|
|
455
|
+
*/
|
|
456
|
+
render?: (state: FormStateValue) => default_2.ReactNode;
|
|
457
|
+
/**
|
|
458
|
+
* Chamada a cada mudança do estado do formulário.
|
|
459
|
+
* Não produz nenhuma saída visual — use para autosave, logging, analytics, etc.
|
|
460
|
+
*
|
|
461
|
+
* ⚠️ Também é chamada no mount inicial com os valores padrão.
|
|
462
|
+
*/
|
|
463
|
+
onChange?: (state: FormStateValue) => void;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* Snapshot do estado do formulário retornado por `useFormApi().getState()`.
|
|
468
|
+
*/
|
|
469
|
+
export declare interface FormStateSnapshot {
|
|
470
|
+
values: Record<string, unknown>;
|
|
471
|
+
errors: Record<string, string | undefined>;
|
|
472
|
+
warnings: Record<string, string>;
|
|
473
|
+
dirty: boolean;
|
|
474
|
+
valid: boolean;
|
|
475
|
+
submitting: boolean;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Estado observável do formulário, atualizado a cada mudança de campo.
|
|
480
|
+
* Retornado por `useFormState()`.
|
|
481
|
+
*/
|
|
482
|
+
export declare interface FormStateValue {
|
|
483
|
+
/** Todos os valores atuais do formulário (reativo via `useWatch`) */
|
|
484
|
+
values: Record<string, unknown>;
|
|
485
|
+
/** Erros de validação indexados por nome de campo */
|
|
486
|
+
errors: Record<string, string | undefined>;
|
|
487
|
+
/** Avisos (warn) indexados por nome de campo */
|
|
488
|
+
warnings: Record<string, string>;
|
|
489
|
+
/** `true` se qualquer campo foi alterado em relação aos defaultValues */
|
|
490
|
+
dirty: boolean;
|
|
491
|
+
/** `true` se não há erros de validação */
|
|
492
|
+
valid: boolean;
|
|
493
|
+
/** `true` durante o submit/onSubmit assíncrono */
|
|
494
|
+
submitting: boolean;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
export declare const interpolate: (text: string | undefined | null, vars: Record<string, string>) => string;
|
|
498
|
+
|
|
499
|
+
export declare const interpolateContainer: (container: FormContainer, vars: Record<string, string>) => FormContainer;
|
|
500
|
+
|
|
501
|
+
export declare const interpolateField: (field: FormField, vars: Record<string, string>) => FormField;
|
|
502
|
+
|
|
503
|
+
export declare const interpolateStep: (step: FormStep, vars: Record<string, string>) => FormStep;
|
|
504
|
+
|
|
505
|
+
export declare const makeStepResolver: (step: FormStep, externalData?: Record<string, unknown>, validatorMapper?: ValidatorMapper) => Resolver<Record<string, unknown>>;
|
|
506
|
+
|
|
507
|
+
/**
|
|
508
|
+
* Retorna uma função que computa os avisos (`warn`) de todos os campos do step.
|
|
509
|
+
* Os avisos não bloqueiam o submit — são apenas informativos.
|
|
510
|
+
* Chame o resultado com os valores do form para obter `Record<fieldName, warnMessage>`.
|
|
511
|
+
*/
|
|
512
|
+
export declare const makeStepWarnComputer: (step: FormStep, externalData?: Record<string, unknown>, validatorMapper?: ValidatorMapper) => (values: Record<string, unknown>) => Promise<Record<string, string>>;
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Opções de pagamento padrão para participação por dia (IPB).
|
|
516
|
+
* Use como base ao customizar via `paymentMethodOptions.porDia`.
|
|
517
|
+
*/
|
|
518
|
+
export declare const OPCOES_POR_DIA: PaymentOption[];
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* Opções de pagamento padrão para participação em todos os dias (IPB).
|
|
522
|
+
* Use como base ao customizar via `paymentMethodOptions.todosOsDias`.
|
|
523
|
+
*/
|
|
524
|
+
export declare const OPCOES_TODOS_OS_DIAS: PaymentOption[];
|
|
525
|
+
|
|
526
|
+
export declare interface ParticipationValue {
|
|
527
|
+
tipo: "todos_os_dias" | "por_dia" | null;
|
|
528
|
+
data: string | null;
|
|
529
|
+
genero?: "masculino" | "feminino" | null;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
export declare interface PaymentMethodValue {
|
|
533
|
+
metodo: string;
|
|
534
|
+
parcelas?: number;
|
|
535
|
+
valorTotal: number;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Opção de pagamento exibida pelo `DFPaymentMethod`.
|
|
540
|
+
*
|
|
541
|
+
* Exporte suas próprias listas a partir dos defaults `OPCOES_POR_DIA` e
|
|
542
|
+
* `OPCOES_TODOS_OS_DIAS` (renderer/src/components/DFPaymentMethod) para usar
|
|
543
|
+
* como ponto de partida ao customizar.
|
|
544
|
+
*
|
|
545
|
+
* @example
|
|
546
|
+
* ```ts
|
|
547
|
+
* import { OPCOES_POR_DIA, PaymentOption } from '@schema-forms-data/renderer';
|
|
548
|
+
*
|
|
549
|
+
* const opcoes: PaymentOption[] = [
|
|
550
|
+
* ...OPCOES_POR_DIA,
|
|
551
|
+
* { id: 'boleto', label: 'Boleto', description: '3 dias úteis', Icon: File, taxa: 0 },
|
|
552
|
+
* ];
|
|
553
|
+
* ```
|
|
554
|
+
*/
|
|
555
|
+
export declare interface PaymentOption {
|
|
556
|
+
/** Identificador único gravado no campo (ex: `"pix"`, `"cartao"`) */
|
|
557
|
+
id: string;
|
|
558
|
+
/** Rótulo curto exibido no card */
|
|
559
|
+
label: string;
|
|
560
|
+
/** Descrição exibida abaixo do label */
|
|
561
|
+
description: string;
|
|
562
|
+
/** Ícone Lucide ou qualquer `React.FC` */
|
|
563
|
+
Icon: React.FC<{
|
|
564
|
+
className?: string;
|
|
565
|
+
}>;
|
|
566
|
+
/** Taxa percentual decimal. Ex: 0.0315 = 3,15%. Use 0 para sem taxa. */
|
|
567
|
+
taxa: number;
|
|
568
|
+
/** Número de parcelas. Omitir (ou 1) para à vista. */
|
|
569
|
+
parcelas?: number;
|
|
570
|
+
/** Texto de taxa exibido abaixo da descrição. Ex: `"Taxa: 3,15%"` */
|
|
571
|
+
taxaLabel?: string;
|
|
572
|
+
/** Se `true`, o card é renderizado desabilitado */
|
|
573
|
+
disabled?: boolean;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
export declare const RendererContext: Context<RendererContextValue>;
|
|
577
|
+
|
|
578
|
+
export declare interface RendererContextValue {
|
|
579
|
+
/**
|
|
580
|
+
* Função para upload de arquivos.
|
|
581
|
+
* Recebe o File, o nome do campo e um callback opcional de progresso (0-100).
|
|
582
|
+
* Deve retornar o uploadId (string) para armazenar no form.
|
|
583
|
+
*
|
|
584
|
+
* O callback `onProgress` é chamado durante o upload com valores de 0 a 100.
|
|
585
|
+
* Suporta uploads simples e multipart — a implementação decide como reportar.
|
|
586
|
+
*
|
|
587
|
+
* Quando não fornecida, o campo FILE exibe aviso de preview.
|
|
588
|
+
*
|
|
589
|
+
* @example
|
|
590
|
+
* ```ts
|
|
591
|
+
* uploadFile={async (file, fieldName, onProgress) => {
|
|
592
|
+
* const { uploadUrl } = await api.initiateUpload({ file, campo: fieldName });
|
|
593
|
+
* await uploadWithProgress(uploadUrl, file, onProgress);
|
|
594
|
+
* return uploadId;
|
|
595
|
+
* }}
|
|
596
|
+
* ```
|
|
597
|
+
*/
|
|
598
|
+
uploadFile?: (file: File, fieldName: string, onProgress?: (percent: number) => void) => Promise<string>;
|
|
599
|
+
/**
|
|
600
|
+
* Função de lookup de CEP.
|
|
601
|
+
* Recebe o CEP sem máscara (8 dígitos) e retorna os dados de endereço.
|
|
602
|
+
*
|
|
603
|
+
* Quando não fornecida, usa a API pública https://viacep.com.br (padrão).
|
|
604
|
+
*/
|
|
605
|
+
cepLookup?: (cep: string) => Promise<CepLookupResult>;
|
|
606
|
+
/**
|
|
607
|
+
* Função para resolver a URL de preview de um PDF de termos armazenado.
|
|
608
|
+
* Recebe o uploadId e deve retornar a URL temporária de preview.
|
|
609
|
+
*
|
|
610
|
+
* Quando não fornecida, o campo TERMS ignora termoPdfUploadId e usa
|
|
611
|
+
* apenas termoPdfUrl (URL direta) ou termoTexto como fallback.
|
|
612
|
+
*/
|
|
613
|
+
resolveTermsUploadUrl?: (uploadId: string) => Promise<string>;
|
|
614
|
+
/**
|
|
615
|
+
* Dados externos injetados no formulário.
|
|
616
|
+
* Usados para condicionais com source='evento' e campos como
|
|
617
|
+
* PARTICIPATION_TYPE e PAYMENT_METHOD.
|
|
618
|
+
*
|
|
619
|
+
* Exemplo: { 'evento.dataInicioEvento': '2026-01-01', 'evento.valor': 5000 }
|
|
620
|
+
*/
|
|
621
|
+
externalData?: Record<string, unknown>;
|
|
622
|
+
/**
|
|
623
|
+
* Mapa de resolvers de props de campo indexados por `resolvePropsKey`.
|
|
624
|
+
* Cada resolver recebe o field, os valores atuais do form e os dados externos,
|
|
625
|
+
* e retorna um `Partial<FormField>` mesclado dinamicamente antes da renderização.
|
|
626
|
+
*
|
|
627
|
+
* @see FieldResolver
|
|
628
|
+
*/
|
|
629
|
+
fieldResolvers?: FieldResolvers;
|
|
630
|
+
/**
|
|
631
|
+
* Mapa de validadores customizados indexados pela chave `type`.
|
|
632
|
+
* Usado pelos arrays `validate` e `warn` de cada campo.
|
|
633
|
+
* Suporta funções síncronas e assíncronas.
|
|
634
|
+
*
|
|
635
|
+
* @example
|
|
636
|
+
* ```ts
|
|
637
|
+
* validatorMapper={{
|
|
638
|
+
* emailUnico: async (value) => {
|
|
639
|
+
* const exists = await api.checkEmail(String(value));
|
|
640
|
+
* return exists ? 'E-mail já cadastrado' : undefined;
|
|
641
|
+
* },
|
|
642
|
+
* senhasIguais: (value, allValues, config) => {
|
|
643
|
+
* return value === allValues[config['field'] as string]
|
|
644
|
+
* ? undefined
|
|
645
|
+
* : 'As senhas não conferem';
|
|
646
|
+
* },
|
|
647
|
+
* }}
|
|
648
|
+
* ```
|
|
649
|
+
*/
|
|
650
|
+
validatorMapper?: ValidatorMapper;
|
|
651
|
+
/**
|
|
652
|
+
* Avisos de campo computados a partir dos validadores `warn`.
|
|
653
|
+
* Não bloqueiam o submit — são apenas informativos.
|
|
654
|
+
* Injetado automaticamente pelo FormRenderer.
|
|
655
|
+
*/
|
|
656
|
+
fieldWarnings?: Record<string, string>;
|
|
657
|
+
/**
|
|
658
|
+
* Mapa de componentes customizados por tipo de campo.
|
|
659
|
+
* Quando fornecido, substitui o componente padrão do renderer para os tipos registrados.
|
|
660
|
+
*
|
|
661
|
+
* @see ComponentMapper
|
|
662
|
+
*/
|
|
663
|
+
componentMapper?: ComponentMapper;
|
|
664
|
+
/**
|
|
665
|
+
* Opções customizadas de pagamento para o `DFPaymentMethod`.
|
|
666
|
+
*
|
|
667
|
+
* Quando definidas, substituem os defaults internos (baseados no modelo IPB).
|
|
668
|
+
* Use `OPCOES_POR_DIA` e `OPCOES_TODOS_OS_DIAS` como ponto de partida.
|
|
669
|
+
*
|
|
670
|
+
* Para substituir o componente inteiramente use `componentMapper[FieldType.PAYMENT_METHOD]`.
|
|
671
|
+
*
|
|
672
|
+
* @example
|
|
673
|
+
* ```tsx
|
|
674
|
+
* import { OPCOES_POR_DIA, OPCOES_TODOS_OS_DIAS, PaymentOption } from '@schema-forms-data/renderer';
|
|
675
|
+
*
|
|
676
|
+
* const paymentMethodOptions = {
|
|
677
|
+
* porDia: [
|
|
678
|
+
* ...OPCOES_POR_DIA,
|
|
679
|
+
* { id: 'boleto', label: 'Boleto', description: '3 dias úteis', Icon: File, taxa: 0 },
|
|
680
|
+
* ],
|
|
681
|
+
* todosOsDias: OPCOES_TODOS_OS_DIAS,
|
|
682
|
+
* };
|
|
683
|
+
*
|
|
684
|
+
* <FormRenderer schema={schema} paymentMethodOptions={paymentMethodOptions} />
|
|
685
|
+
* ```
|
|
686
|
+
*/
|
|
687
|
+
paymentMethodOptions?: {
|
|
688
|
+
/** Opções exibidas quando o campo `relatedField` indica `"por_dia"` */
|
|
689
|
+
porDia?: PaymentOption[];
|
|
690
|
+
/** Opções exibidas quando `relatedField` indica `"todos_os_dias"` ou é nulo */
|
|
691
|
+
todosOsDias?: PaymentOption[];
|
|
692
|
+
};
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
export declare interface StepIndicatorProps {
|
|
696
|
+
steps: Array<{
|
|
697
|
+
id: string;
|
|
698
|
+
label?: string;
|
|
699
|
+
icone?: string;
|
|
700
|
+
}>;
|
|
701
|
+
currentStep: number;
|
|
702
|
+
onStepClick?: (index: number) => void;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
export declare const StepRenderer: ({ step, control, externalData, }: StepRendererProps) => JSX_2.Element;
|
|
706
|
+
|
|
707
|
+
declare interface StepRendererProps {
|
|
708
|
+
step: FormStep;
|
|
709
|
+
control: Control<Record<string, unknown>>;
|
|
710
|
+
externalData?: Record<string, unknown>;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/**
|
|
714
|
+
* Retorna o estado de um campo individual, reativo a mudanças.
|
|
715
|
+
* Funciona a partir de **qualquer componente** dentro do `<FormRenderer>`.
|
|
716
|
+
*
|
|
717
|
+
* @example
|
|
718
|
+
* ```tsx
|
|
719
|
+
* const { value, error, warning, dirty, touched } = useField('email');
|
|
720
|
+
* ```
|
|
721
|
+
*/
|
|
722
|
+
export declare const useField: (name: string) => FieldState;
|
|
723
|
+
|
|
724
|
+
/**
|
|
725
|
+
* Retorna `input` props + `meta` para construir componentes de campo customizados.
|
|
726
|
+
* Funciona a partir de **qualquer componente** dentro do `<FormRenderer>`.
|
|
727
|
+
*
|
|
728
|
+
* @example
|
|
729
|
+
* ```tsx
|
|
730
|
+
* const { input, meta } = useFieldApi('email');
|
|
731
|
+
* return (
|
|
732
|
+
* <div>
|
|
733
|
+
* <input type="email" {...input} />
|
|
734
|
+
* {meta.error && <span>{meta.error}</span>}
|
|
735
|
+
* </div>
|
|
736
|
+
* );
|
|
737
|
+
* ```
|
|
738
|
+
*/
|
|
739
|
+
export declare const useFieldApi: (name: string) => FieldApiReturn;
|
|
740
|
+
|
|
741
|
+
/**
|
|
742
|
+
* Retorna a API programática do formulário.
|
|
743
|
+
* Funciona a partir de **qualquer componente** dentro do `<FormRenderer>`.
|
|
744
|
+
*
|
|
745
|
+
* @example
|
|
746
|
+
* ```tsx
|
|
747
|
+
* const api = useFormApi();
|
|
748
|
+
* api.change('plano', 'premium');
|
|
749
|
+
* const state = api.getState();
|
|
750
|
+
* ```
|
|
751
|
+
*/
|
|
752
|
+
export declare const useFormApi: () => FormApi;
|
|
753
|
+
|
|
754
|
+
/**
|
|
755
|
+
* Retorna o estado observável do formulário, reativo a cada mudança de campo.
|
|
756
|
+
* Funciona a partir de **qualquer componente** dentro do `<FormRenderer>`.
|
|
757
|
+
*
|
|
758
|
+
* @example
|
|
759
|
+
* ```tsx
|
|
760
|
+
* const { values, errors, dirty, valid, submitting, warnings } = useFormState();
|
|
761
|
+
* ```
|
|
762
|
+
*/
|
|
763
|
+
export declare const useFormState: () => FormStateValue;
|
|
764
|
+
|
|
765
|
+
export declare const useRendererContext: () => RendererContextValue;
|
|
766
|
+
|
|
767
|
+
/**
|
|
768
|
+
* Mapa de validadores customizados indexados pela chave `type`
|
|
769
|
+
* usada em `FormField.validate` e `FormField.warn`.
|
|
770
|
+
*/
|
|
771
|
+
export declare type ValidatorMapper = Record<string, FieldValidatorFn>;
|
|
772
|
+
|
|
773
|
+
export { }
|