Интеграция @vtaits/react-final-form-schema
с @n3/kit
import { Button, buttonColors } from '@n3/kit';
import {
Form,
createFormFields,
BottomBlock,
ButtonsBlock,
} from '@n3/react-form-kit';
const fieldTypes = createFormFields(options);
const getFieldType = ({ type }) => fieldTypes[type];
...
<Form
{...otherFormProps}
names={[
'fieldName1',
'fieldName2',
'fieldName3',
]}
fields={fields}
getFieldType={getFieldType}
renderBottom={({
renderError,
submitting,
}) => (
<BottomBlock>
{renderError()}
<ButtonsBlock>
<Button
color={buttonColors.PRIMARY}
componentProps={{
type: 'submit',
}}
disabled={submitting}
>
Сохранить
</Button>
<Button
color={buttonColors.DEFAULT}
componentProps={{
type: 'button',
}}
disabled={submitting}
>
Отмена
</Button>
</ButtonsBlock>
</BottomBlock>
)}
/>
Необязательное, объект, может содержать параметры:
-
get
- асинхронная функция get-запроса на сервер, принимает аргументы:-
url
- строка; -
queryParams
- объект параметров;
-
-
getFetchHeaders
- функция получения заголовков для вызоваfetch
; -
processUploadedAttachment
- функция процессинга файлов в полеattachment
, принимает аргументы:-
response
- ответ сервера в результате загрузки; -
file
- загруженный файл;
-
-
uploadAttachment
- асихнхронная функция загрузкий файлов в полеattachment
, принимает аргументы:-
file
- загруженный файл; -
schema
- схема поля; -
getFetchHeaders
- функция из параметров; -
processUploadedAttachment
- функция из параметров.
-
Принимает props @vtaits/react-final-form-schema
, а также добавляются:
-
fields
- необязательное, объект, ключами которого являются имена полей, а значениями - их схемы, работает только в случае, еслиgetFieldSchema
не задано; -
renderFields
- необязательное, функция рендера блока полей формы с помощьюrenderFieldsBlock
(смотри Form renderProps). Если не задано, поля будут отрендерены подряд одно за другим. ПринимаетrenderProps
формы. -
renderBottom
- необязательное, функция рендера контента ниже полей ввода (кнопки, сообщения об ошибках, не относящихся к полям, ...) с помощьюrenderBottomBlock
(смотри Form renderProps). ПринимаетrenderProps
формы. -
children
- необязательное, функция рендера формы. Если не задана, будут рендериться подряд результаты вызововrenderFieldsBlock
иrenderBottomBlock
; -
errorTitle
- необязательное, строка, заголовок сообщения о наличии ошибок формы; -
errorMessages
- необязательное, массив строк, тексты сообщений о наличии ошибок формы; -
excludeNames
- необязательное, массив имён полей, исключённых из рендера; -
errorsPath
- необязательное, строка, путь до объекта ошибок в случае неудачной отправки, по умолчанию"response.data"
; -
onSubmitSuccess
- необязательное, функция, обработчик успешной отправки формы, первым аргументом принимает результат вызоваonSubmit
; -
onSubmitError
- необязательное, функция, обработчик отправки формы с ошибкой; -
redirectTo
- необязательное, адрес редиректа после успешной отправки формы; -
getRedirectTo
- необязательное, функция получения адреса редиректа после успешной отправки формы, первым аргументом принимает результат вызоваonSubmit
; -
notification
- необязательное, объект, параметры вспывающего сообщенияsuccessLog
после успешной отправки формы; -
getNotification
- необязательное, функция получения параметров вспывающего сообщенияsuccessLog
после успешной отправки формы, первым аргументом принимает результат вызоваonSubmit
.
Передаются все renderProps из @vtaits/react-final-form-schema
, а также добавляются следующие:
-
renderFieldsBlock
- функиця рендера полей формы; -
renderBottomBlock
- функция рендера контента ниже полей ввода; -
renderError
- функция рендера ошибки отправки формы; -
names
- спиок полей для рендера формы.
В отличие от final-form
, если функция onSubmit
не бросила исключение, отправка счиатется успешной. Есть способы вывести ошибки:
-
Бросить исключение
SubmissionError
:import { Form, SubmissionError } from '@n3/react-form-kit'; ... <Form onSubmit={async () => { throw new SubmissionError({ field1: ['Ошибка'], field2: ['Ошибка'], }); }} />
-
Бросить любое другое исключение, параметр
errorsPath
должен содержать путь до объекта ошибок, например, при использованииaxios
:import { Form } from '@n3/react-form-kit'; ... <Form onSubmit={async (values) => { await axios.post('/url/', values); }} errorsPath="response.data" />
import {
Form,
createShowFields,
} from '@n3/react-form-kit';
const showFieldTypes = createShowFields();
const getShowFieldType = ({ type }) => showFieldTypes[type];
...
<Form
{...otherFormProps}
names={[
'fieldName1',
'fieldName2',
'fieldName3',
]}
fields={fields}
getFieldType={getShowFieldType}
/>
Создаёт поле с выводом заголовка, ошибок, ворнингов, звёздочки в случае обязательности
import { FieldWrapper } from '@n3/react-form-kit';
const FieldComponent = (props) => {
...
return (
<FieldWrapper
{...props}
>
{({
input,
meta,
disabled,
hasError,
hasWarning,
name,
}) => {
...
}}
</FieldWrapper>
);
};
Создаёт поле с выводом заголовка
import { ShowFieldWrapper } from '@n3/react-form-kit';
const FieldComponent = (props) => {
...
return (
<ShowFieldWrapper
{...props}
>
{({
input,
meta,
disabled,
hasError,
hasWarning,
name,
}) => {
...
}}
</ShowFieldWrapper>
);
};
Создаёт группу полей с выводом заголовка, ошибок, ворнингов, звёздочки в случае обязательности
import { FieldArrayWrapper } from '@n3/react-form-kit';
const FieldArrayComponent = (props) => {
...
return (
<FieldArrayWrapper
{...props}
>
{({
fields,
meta,
disabled,
hasError,
hasWarning,
name,
}) => {
...
}}
</FieldArrayWrapper>
);
};
Создаёт группу полей с выводом заголовка
import { ShowFieldArrayWrapper } from '@n3/react-form-kit';
const FieldArrayComponent = (props) => {
...
return (
<ShowFieldArrayWrapper
{...props}
>
{({
fields,
meta,
disabled,
hasError,
hasWarning,
name,
}) => {
...
}}
</ShowFieldArrayWrapper>
);
};
Аналогично FieldArrayWrapper
, но добавляются функции handleAdd
и handleRemove
.
import { RepeatWrapper } from '@n3/react-form-kit';
const RepeatComponent = (props) => {
...
return (
<RepeatWrapper
{...props}
fieldSchema={{
required,
initialValues,
}}
>
{({
fields,
meta,
disabled,
hasError,
hasWarning,
handleAdd,
handleRemove,
name,
}) => {
...
}}
</RepeatWrapper>
);
};
-
handleAdd
- функция, при вызове добавляет новую группу полей со значениямиinitialValues
; -
handleRemove
- функция, удаляет группу полей по выбранному индексу. Если группа была единственная, а такжеrequired
= true, то добавляет новую группу полей сinitialValues
.
Хук для создания повторяющихся групп полей на основе useFieldArray
из react-final-form-arrays
.
import { useRepeat } from '@n3/react-form-kit';
const RepeatField = ({
name,
initialValues,
required,
}) => {
const {
fields,
meta,
handleAdd,
handleRemove,
} = useRepeat(name, {
required,
initialValues,
});
const removeByIndex = (index) => {
handleRemove(index);
};
}
Аналогично useFieldArray
, но добавляются функции добавления и удаления групп полей.
-
handleAdd
- функция, при вызове добавляет новую группу полей со значениямиinitialValues
; -
handleRemove
- функция, удаляет группу полей по выбранному индексу. Если группа была единственная, а такжеrequired
= true, то добавляет новую группу полей сinitialValues
.
Каждое поле, созданное при помощи createField
или createShowField
имеет следующие необязательные параметры:
-
label
- строка, заголовок поля; -
onlyField
- булево, если true, заголовок поля не отображается; -
required
- булево, если true, на форме создания/редактирования рядом с заголовком отображается*
; -
help_text
- строка, подсказка, выводящаяся под полем; -
help_tooltip
- строка, подсказка, выводящаяся в тултипе рядом с заголовком; -
unit
- React.Node, единицы измерения; -
initial
- значение поля по умолчанию; -
labelCols
- число, количество колонок, которое занимает заголовок поля, по умолчанию 3; -
fieldCols
- число, количество колонок, которое занимает поле, по умолчанию 5; -
unitCols
- число, количество колонок, которое занимает блок единиц измерения, по умолчанию 1.
Поле ввода текста. Параметры:
-
inputComponent
- react-компонент, компонент поля, по умолчаниюinput
; -
inputType
- строка, тип инпута, по умолчаниюtext
; -
inputProps
- обеъект, дополнительные props элементаinput
; -
debounceTimeout
- задержка debounce-инпута, по умолчанию300
; -
max_length
- число, максимальное количество введённых символов; -
mask
- маска формата react-input-mask, если задано, параметрыdebounceTimeout
иmax_length
не работают; -
disabled
- булево; -
read_only
- булево; -
placeholder
- строка.
Полностью аналогично string
.
Полностью аналогично string
.
Аналогично string
, отличия:
- отсутствие свойства
mask
; - сериализация пустого значения в
null
.
Список опций для выбора. Параметры:
-
choices
- массив объектов опций селекта, по умолчанию имеют формат{ value, display_name }
, гдеvalue
- значение, отправляемое на сервер,label
- текст для отображения опции; -
valueKey
- ключ значения опции для отправки на сервер, по умолчаниюvalue
; -
labelKey
- ключ значения опции для отображения, по умолчаниюdisplay_name
; -
disabled
- булево; -
read_only
- булево; -
renderWith
-'select'
или'radio'
, по умолчанию'select'
.
Мультиселект. Аналогичен choice
, но принимает и отправляет массивы значений. Параметры:
-
renderWith
-'select'
или'checkbox'
, по умолчанию'select'
.
Селект с подгрузкой опций с сервера. Использует компонент SelectAjax
. Параметры:
-
choices_url
- строка, url для запроса данных. Опции могут приходить массивом или в форматеdrf
({ results, next }
); -
mapResponse
- необязательное, функция маппинга ответа сервера в форматreact-select-async-paginate
; -
queryParams
- объект параметров запроса, не зависящих от других полей; -
debounceTimeout
- задержка перед запросом в мс, по умолчанию300
; -
choices_cascade_params
- объект, ключами которого являются имена других полей, а значениями - названия параметров, под которыми они будут переданы на сервер; -
disabledWithoutCascadeValues
- булево, выключать ли поле в случае незаполненности хотя бы одного из полейchoices_cascade_params
; -
searchParamName
- строка, параметрSelectAjax
; -
pageParamName
- строка, параметрSelectAjax
; -
offsetParamName
- строка, параметрSelectAjax
; -
parseValue
- необязательное, функция загрузки опции по id. По умолчанию делается запрос на<choices_url><id>/
с параметрамиqueryParams
. Принимает аргументы;-
get
- из параметровcreateFormFields
; -
value
- id опции; -
choicesUrl
-
queryParams
-
mapResponseSimple
- смотри ниже;
-
-
mapResponseSimple
- необязательное, функция маппинга загруженного значения при парсинге в опцию.
Мультиселект с подгрузкой опций с сервера. Аналогичен ajax_choice
, но принимает и отправляет массивы значений.
Дейтпикер. Принимает значения в формате js-объекта Date
, строки формата 2018-12-26
или строки формата 2018-10-14T22:33:20
. Параметры:
-
disabled
- булево; -
read_only
- булево.
Дейттаймпикер. Принимает значения в формате js-объекта Date
или строки формата 2018-10-14T22:33:20
. Параметры:
-
disabled
- булево; -
read_only
- булево.
Чекбокс. Принимает булевы значения. Параметры:
-
disabled
- булево; -
checkboxLabel
- строка, текст чекбокса; -
falsyLabel
- строка, используется для вывода ложного значения на форме просмотра; -
truthyLabel
- строка, используется для вывода истинного значения на форме просмотра.
Поле ввода телефона с маской.
Поле ввода времени с маской.
Загрузчик файлов по схемам drf
. Параметры:
-
upload_url
- обязательное, url для загрузки файла; -
upload_field
- необязательное, ключ, по которому загруженный файл будет передан на сервер, по умолчанию'tmpfile'
; -
allowed_extensions
- необязательное, список доступных расширений ([".docx", ".pdf", ".xlsx"]
); -
max_length
- необязательное, максимальное количество файлов; -
max_size
- необязательное, максимальный размер файла в байтах; -
isDragAndDrop
- необязательное, из компонентаFileUploader
.
Загрузчик одного файла. Параметры:
-
uploadFile
- обязательное, асинхронная функция загрузки файла@n3/react-fileuploader
; -
extensions
- необязательное, массив возможных расширений файлов; -
placeholder
- необязательное, react node, текст загрузчика; -
isDragAndDrop
- необязательное, из компонентаFileUploader
.
Загрузчик нескольких файлов. Параметры:
-
uploadFile
- обязательное, асинхронная функция загрузки файла@n3/react-fileuploader
; -
extensions
- необязательное, массив возможных расширений файлов; -
placeholder
- необязательное, react node, текст загрузчика; -
maxLength
- необязательное, число, максимальное количество файлов; -
isDragAndDrop
- необязательное, из компонентаFileUploader
.
Группа полей. Параметры:
-
child
- обязательное, объект, поля:-
fields
- обязательное, объект, схемы полея группы; -
ordering
- обязательное, массив, список имён полей группы;
-
-
excludeNames
- необязательное, массив полей, которые нужно исключить изordering
; -
render
- необязательное, функция рендера содержимого блока. Пример:render: ({ renderField, ordering, }) => ( <> {renderField('nestedField1')} {renderField('nestedField2')} </> )
-
renderField
- функция рендера вложенного поля по имени; -
ordering
- массив имён вложенных полей, из которого исключеныexcludeNames
.
-
Повторяющееся поле. Параметры:
-
child
- обязательное, объект, схема повторяющегося поля; -
addButtonTitle
- необязательное, текст кнопки добавления, по умолчанию'Добавить ещё'
; -
getBlockTitle
- необязательное, функция генерации заголовка блока, принимает аргументы:-
index
- число, индекс блока в списке;
-
-
blockTitle
- необязательное, заголовок каждого блока, работает в случае, если не определеноgetBlockTitle
; -
style
- необязательное,'default' | 'mini'
, стиль блоков; -
min_length
- необязательное, минимальное количество элементов; -
max_length
- необязательное, максимальное количество элементов;
Повторяющаяся группа полей. Параметры:
-
child
- обязательное, объект, поля:-
fields
- обязательное, объект, схемы полей группы; -
ordering
- обязательное, массив, список имён полей группы;
-
-
excludeNames
- необязательное, массив полей, которые нужно исключить изordering
; -
addButtonTitle
- необязательное, текст кнопки добавления, по умолчанию'Добавить ещё'
; -
getBlockTitle
- необязательное, функция генерации заголовка группы полей, принимает аргументы:-
index
- число, индекс группы полей в списке;
-
-
blockTitle
- необязательное, заголовок каждой группы полей, работает в случае, если не определеноgetBlockTitle
; -
renderBlock
- необязательное, функция рендера содержимого блока. Пример:renderBlock: ({ renderField, ordering, }) => ( <> {renderField('nestedField1')} {renderField('nestedField2')} </> )
-
renderField
- функция рендера вложенного поля по имени; -
ordering
- массив имён вложенных полей, из которого исключеныexcludeNames
.
-
-
style
- необязательное,'default' | 'mini'
, стиль блоков; -
min_length
- необязательное, минимальное количество элементов; -
max_length
- необязательное, максимальное количество элементов;
Поле со схемой, зависящей от других полей. Пример:
const schema = {
type: 'dynamic',
getSchema: ({
otherField,
}, phase) => ({
type: 'string',
label: 'Поле',
required: Boolean(otherField),
}),
};
Параметры:
-
getSchema
- обязательное, функция, первым аргументом принимает объект значений формы. Должна вернуть схему поля для рендера илиnull
. В случае возвратаnull
поле не отображается и не участвует в сериализации и парсинге значений формы, а также сборе ошибок. Аргументы;-
values
- объект значений формы на этапе рендера/сериализации или объект необработанных значений на этапе парсинга; -
phase
- текущая фаза @vtaits/form-schema. Принимает значения:'parse'
,'serialize'
,'render'
;
-
-
getSchemaAsync
- необязательное, функция. Может быть использована для асинхронного парсинга. АналогичнаgetSchema
, но должна вернутьPromise
с итоговой схемой; -
onShow
- необязательное, функиця. которая вызывается после показа поля. Аргументы:-
form
- экземплярfinal-form
; -
name
- имя поля; -
schema
- схема дочернего поля; -
getFieldSchema
- текущееgetFieldSchema
; -
getFieldType
- глобальноеgetFieldType
; -
parents
- массив родительских полей;
-
-
onHide
- not required, callback that called when field has hidden. Arguments:-
form
- экземплярfinal-form
; -
name
- имя поля; -
getFieldSchema
- текущееgetFieldSchema
; -
getFieldType
- глобальноеgetFieldType
; -
parents
- массив родительских полей.
-
Контейнер для вывода блоков ошибок и кнопок.
Название | Обязательность | Тип | Значение по умолчанию | Описание |
---|---|---|---|---|
hasSections | bool | false |
Поля формы сгруппированы в секции с заголовками слева | |
children | node | null |
Контейнер для кнопок действий.
Кнопка для создания форм с несколькими способами отправки.
Название | Обязательность | Тип | Значение по умолчанию | Описание |
---|---|---|---|---|
handleSubmit | + | () => void |
Функция отправки формы react-final-form
|
|
submitTypeRef | + | MutableRefObject<any> |
ref для установки способа отправки |
|
submitType | + | any |
Способ отправки формы |
import { getErrorsAndWarnings } from '@n3/react-form-kit';
...
const {
errors,
warnings,
} = getErrorsAndWarnings(submitError);
Функция для получения списков ошибок и предупреждений по стандартной ошибке поля.
import { FormConfigContext } from '@n3/react-form-kit';
<FormConfigContext.Provider
value={{
labelCols: 4,
fieldCols: 8,
onFieldChange: (value, prevValue, name, form) => {
// ...
},
}}
>
{/** ... */}
</FormConfigContext.Provider>
-
isCellsPercentage
- необязательное,boolean
, пропорциональная ширина поля и контейнера для единиц измерения; -
labelCols
- обязательное, число, количество колонок заголовков по умолчанию; -
fieldCols
- обязательное, число, количество колонок полей по умолчанию; -
colon
- необязательное,boolean
, показывать ли двоеточие после заголовка поля; -
direction
- необязательное,'horizontal' | 'vertical'
, направление рендера полей; -
onFieldChange
- необязательное, функция, глобальный обработчик изменений значений полей.