@n3/react-form-kit v0.16.12
@n3/react-form-kit
Интеграция @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>
)}
/>createFormFields options
Необязательное, объект, может содержать параметры:
get- асинхронная функция get-запроса на сервер, принимает аргументы:url- строка;queryParams- объект параметров;
getFetchHeaders- функция получения заголовков для вызоваfetch;processUploadedAttachment- функция процессинга файлов в полеattachment, принимает аргументы:response- ответ сервера в результате загрузки;file- загруженный файл;
uploadAttachment- асихнхронная функция загрузкий файлов в полеattachment, принимает аргументы:file- загруженный файл;schema- схема поля;getFetchHeaders- функция из параметров;processUploadedAttachment- функция из параметров.
Form props
Принимает 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.
Form renderProps
Передаются все 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>
);
};Повторяющиеся группы полей с кнопками добавления и удаления
RepeatWrapper
Аналогично 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.
useRepeat
Хук для создания повторяющихся групп полей на основе 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.
Реализованные поля
string
Поле ввода текста. Параметры:
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.
url
Полностью аналогично string.
integer
Аналогично string, отличия:
- отсутствие свойства
mask; - сериализация пустого значения в
null.
choice
Список опций для выбора. Параметры:
choices- массив объектов опций селекта, по умолчанию имеют формат{ value, display_name }, гдеvalue- значение, отправляемое на сервер,label- текст для отображения опции;valueKey- ключ значения опции для отправки на сервер, по умолчаниюvalue;labelKey- ключ значения опции для отображения, по умолчаниюdisplay_name;disabled- булево;read_only- булево;renderWith-'select'или'radio', по умолчанию'select'.
multiple_choice
Мультиселект. Аналогичен choice, но принимает и отправляет массивы значений. Параметры:
renderWith-'select'или'checkbox', по умолчанию'select'.
ajax_choice
Селект с подгрузкой опций с сервера. Использует компонент 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 опции;choicesUrlqueryParamsmapResponseSimple- смотри ниже;
mapResponseSimple- необязательное, функция маппинга загруженного значения при парсинге в опцию.
ajax_multiple_choice
Мультиселект с подгрузкой опций с сервера. Аналогичен ajax_choice, но принимает и отправляет массивы значений.
date
Дейтпикер. Принимает значения в формате js-объекта Date, строки формата 2018-12-26 или строки формата 2018-10-14T22:33:20. Параметры:
disabled- булево;read_only- булево.
datetime
Дейттаймпикер. Принимает значения в формате js-объекта Date или строки формата 2018-10-14T22:33:20. Параметры:
disabled- булево;read_only- булево.
boolean
Чекбокс. Принимает булевы значения. Параметры:
disabled- булево;checkboxLabel- строка, текст чекбокса;falsyLabel- строка, используется для вывода ложного значения на форме просмотра;truthyLabel- строка, используется для вывода истинного значения на форме просмотра.
phone
Поле ввода телефона с маской.
time
Поле ввода времени с маской.
attachment
Загрузчик файлов по схемам drf. Параметры:
upload_url- обязательное, url для загрузки файла;upload_field- необязательное, ключ, по которому загруженный файл будет передан на сервер, по умолчанию'tmpfile';allowed_extensions- необязательное, список доступных расширений ([".docx", ".pdf", ".xlsx"]);max_length- необязательное, максимальное количество файлов;max_size- необязательное, максимальный размер файла в байтах;isDragAndDrop- необязательное, из компонентаFileUploader.
file
Загрузчик одного файла. Параметры:
uploadFile- обязательное, асинхронная функция загрузки файла@n3/react-fileuploader;extensions- необязательное, массив возможных расширений файлов;placeholder- необязательное, react node, текст загрузчика;isDragAndDrop- необязательное, из компонентаFileUploader.
multiple_file
Загрузчик нескольких файлов. Параметры:
uploadFile- обязательное, асинхронная функция загрузки файла@n3/react-fileuploader;extensions- необязательное, массив возможных расширений файлов;placeholder- необязательное, react node, текст загрузчика;maxLength- необязательное, число, максимальное количество файлов;isDragAndDrop- необязательное, из компонентаFileUploader.
nested_object
Группа полей. Параметры:
child- обязательное, объект, поля:fields- обязательное, объект, схемы полея группы;ordering- обязательное, массив, список имён полей группы;
excludeNames- необязательное, массив полей, которые нужно исключить изordering;render- необязательное, функция рендера содержимого блока. Пример:render: ({ renderField, ordering, }) => ( <> {renderField('nestedField1')} {renderField('nestedField2')} </> )renderField- функция рендера вложенного поля по имени;ordering- массив имён вложенных полей, из которого исключеныexcludeNames.
list
Повторяющееся поле. Параметры:
child- обязательное, объект, схема повторяющегося поля;addButtonTitle- необязательное, текст кнопки добавления, по умолчанию'Добавить ещё';getBlockTitle- необязательное, функция генерации заголовка блока, принимает аргументы:index- число, индекс блока в списке;
blockTitle- необязательное, заголовок каждого блока, работает в случае, если не определеноgetBlockTitle;style- необязательное,'default' | 'mini', стиль блоков;min_length- необязательное, минимальное количество элементов;max_length- необязательное, максимальное количество элементов;
nested_objects_list
Повторяющаяся группа полей. Параметры:
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- необязательное, максимальное количество элементов;
dynamic
Поле со схемой, зависящей от других полей. Пример:
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- массив родительских полей.
Вспомогательные компоненты
BottomBlock
Контейнер для вывода блоков ошибок и кнопок.
props
| Название | Обязательность | Тип | Значение по умолчанию | Описание |
|---|---|---|---|---|
| hasSections | bool | false | Поля формы сгруппированы в секции с заголовками слева | |
| children | node | null |
ButtonsBlock
Контейнер для кнопок действий.
SubmitButtonByType
Кнопка для создания форм с несколькими способами отправки.
props
| Название | Обязательность | Тип | Значение по умолчанию | Описание |
|---|---|---|---|---|
| handleSubmit | + | () => void | Функция отправки формы react-final-form | |
| submitTypeRef | + | MutableRefObject<any> | ref для установки способа отправки | |
| submitType | + | any | Способ отправки формы |
Утилиты
getErrorsAndWarnings
import { getErrorsAndWarnings } from '@n3/react-form-kit';
...
const {
errors,
warnings,
} = getErrorsAndWarnings(submitError);Функция для получения списков ошибок и предупреждений по стандартной ошибке поля.
Конфигурация через FormConfigContext
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- необязательное, функция, глобальный обработчик изменений значений полей.
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago