indicator-ui 1.0.32 → 1.0.34
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/dist/index.cjs +14 -14
- package/dist/index.js +5172 -5117
- package/dist/types/src/hooks/forms/lib/createFormServices.d.ts +25 -0
- package/dist/types/src/hooks/forms/lib/index.d.ts +1 -0
- package/dist/types/src/hooks/forms/types/index.d.ts +1 -0
- package/dist/types/src/hooks/forms/types/services.d.ts +51 -0
- package/dist/types/src/hooks/forms/useForm.d.ts +165 -145
- package/package.json +1 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ExtendFormPath, FormErrorsType, FormErrorType, FormPath, FormValue, UseFormServices } from '../types';
|
|
2
|
+
import { Form } from '../classes';
|
|
3
|
+
export declare function createFormServices<T>(deps: {
|
|
4
|
+
/** Form */
|
|
5
|
+
getForm: () => Form<T>;
|
|
6
|
+
setFormData: (data: T) => void;
|
|
7
|
+
/** Fields */
|
|
8
|
+
getField: <P extends FormPath<T>>(path: P) => FormValue<T, P> | null | undefined;
|
|
9
|
+
getFieldSync: <P extends FormPath<T>>(path: P) => FormValue<T, P> | undefined;
|
|
10
|
+
setField: <P extends FormPath<T>>(path: P, value: FormValue<T, P> | undefined) => void;
|
|
11
|
+
clearField: (path: FormPath<T> | FormPath<T>[]) => void;
|
|
12
|
+
/** Errors */
|
|
13
|
+
getError: <P extends FormPath<T>>(path: P) => FormErrorType | undefined;
|
|
14
|
+
setError: <P extends FormPath<T>>(path: P, error: FormErrorType) => void;
|
|
15
|
+
setErrors: (errors: FormErrorsType<T>) => void;
|
|
16
|
+
clearErrors: () => void;
|
|
17
|
+
/** Validation */
|
|
18
|
+
isFieldValid: <P extends ExtendFormPath<T>>(path: P) => Promise<boolean>;
|
|
19
|
+
areFieldsValid: (paths: ExtendFormPath<T>[]) => Promise<boolean>;
|
|
20
|
+
isFormValid: () => Promise<boolean>;
|
|
21
|
+
/** Highlight (side-effect validation) */
|
|
22
|
+
highlightField: <P extends ExtendFormPath<T>>(path: P) => Promise<boolean>;
|
|
23
|
+
highlightFields: (paths: ExtendFormPath<T>[]) => Promise<boolean>;
|
|
24
|
+
highlightFormErrors: () => Promise<boolean>;
|
|
25
|
+
}): UseFormServices<T>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ExtendFormPath, FormErrorsType, FormErrorType, FormPath, FormValue } from './formTypes';
|
|
2
|
+
import { Form } from '../classes';
|
|
3
|
+
export type UseFormServices<T> = {
|
|
4
|
+
/** Работа с данными формы */
|
|
5
|
+
form: {
|
|
6
|
+
/** Получить актуальные данные формы */
|
|
7
|
+
getData: () => Form<T>;
|
|
8
|
+
/** Полностью заменить данные формы */
|
|
9
|
+
setData: (data: T) => void;
|
|
10
|
+
};
|
|
11
|
+
/** Работа с полями */
|
|
12
|
+
fields: {
|
|
13
|
+
/** Получить значение поля (реактивное) */
|
|
14
|
+
get: <P extends FormPath<T>>(path: P) => FormValue<T, P> | null | undefined;
|
|
15
|
+
/** Получить значение поля (гарантированно актуальное) */
|
|
16
|
+
getSync: <P extends FormPath<T>>(path: P) => FormValue<T, P> | undefined;
|
|
17
|
+
/** Установить значение поля */
|
|
18
|
+
set: <P extends FormPath<T>>(path: P, value: FormValue<T, P> | undefined) => void;
|
|
19
|
+
/** Очистить одно или несколько полей */
|
|
20
|
+
clear: (path: FormPath<T> | FormPath<T>[]) => void;
|
|
21
|
+
};
|
|
22
|
+
/** Работа с ошибками */
|
|
23
|
+
errors: {
|
|
24
|
+
/** Получить ошибку поля */
|
|
25
|
+
get: <P extends FormPath<T>>(path: P) => FormErrorType | undefined;
|
|
26
|
+
/** Установить ошибку поля */
|
|
27
|
+
set: <P extends FormPath<T>>(path: P, error: FormErrorType) => void;
|
|
28
|
+
/** Массово установить ошибки (например, серверные) */
|
|
29
|
+
setAll: (errors: FormErrorsType<T>) => void;
|
|
30
|
+
/** Очистить все ошибки */
|
|
31
|
+
clear: () => void;
|
|
32
|
+
};
|
|
33
|
+
/** Валидация (без мутаций ошибок) */
|
|
34
|
+
validation: {
|
|
35
|
+
/** Проверить валидность поля */
|
|
36
|
+
isFieldValid: <P extends ExtendFormPath<T>>(path: P) => Promise<boolean>;
|
|
37
|
+
/** Проверить несколько полей */
|
|
38
|
+
areFieldsValid: (paths: ExtendFormPath<T>[]) => Promise<boolean>;
|
|
39
|
+
/** Проверить валидность всей формы */
|
|
40
|
+
isFormValid: () => Promise<boolean>;
|
|
41
|
+
};
|
|
42
|
+
/** Подсветка ошибок (side-effect валидации) */
|
|
43
|
+
highlight: {
|
|
44
|
+
/** Подсветить ошибку конкретного поля */
|
|
45
|
+
field: <P extends ExtendFormPath<T>>(path: P) => Promise<boolean>;
|
|
46
|
+
/** Подсветить ошибки нескольких полей */
|
|
47
|
+
fields: (paths: ExtendFormPath<T>[]) => Promise<boolean>;
|
|
48
|
+
/** Подсветить все ошибки формы */
|
|
49
|
+
form: () => Promise<boolean>;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
@@ -1,194 +1,212 @@
|
|
|
1
1
|
import { default as React, FormEvent } from 'react';
|
|
2
2
|
import { ExtendFormPath, FieldPropsType, FormErrorsType, FormErrorType } from '..';
|
|
3
|
-
import { Nullable, Undefinable } from '../../types';
|
|
4
|
-
import { FormPath, FormSchemeType, FormValue } from './types';
|
|
3
|
+
import { InstanceRefAttributes, Nullable, Undefinable } from '../../types';
|
|
4
|
+
import { FormPath, FormSchemeType, FormValue, UseFormServices } from './types';
|
|
5
5
|
type PropsType<T, Form> = [
|
|
6
6
|
props?: {
|
|
7
7
|
initFormData?: T;
|
|
8
8
|
scheme?: FormSchemeType<T>;
|
|
9
|
-
onSubmit?: (data: Form, event: FormEvent<HTMLFormElement>) => void | Promise<void>;
|
|
9
|
+
onSubmit?: (data: Form, event: FormEvent<HTMLFormElement>, services: UseFormServices<T>) => void | Promise<void>;
|
|
10
10
|
/** Callback при ошибки валидации полей */
|
|
11
11
|
onSubmitError?: (event: {
|
|
12
12
|
errors: FormErrorsType<T>;
|
|
13
|
-
}) => void;
|
|
13
|
+
}, services: UseFormServices<T>) => void;
|
|
14
|
+
onSubmitAttempt?: (data: T | undefined | null, event: FormEvent<HTMLFormElement>, services: UseFormServices<T>) => void;
|
|
14
15
|
}
|
|
15
16
|
];
|
|
16
17
|
/**
|
|
17
|
-
*
|
|
18
|
+
* `useForm` — типобезопасный хук для управления состоянием и валидации форм.
|
|
18
19
|
*
|
|
19
|
-
*
|
|
20
|
-
* -
|
|
21
|
-
* -
|
|
22
|
-
* -
|
|
23
|
-
* -
|
|
20
|
+
* Предоставляет:
|
|
21
|
+
* - централизованное управление данными формы;
|
|
22
|
+
* - декларативную регистрацию полей;
|
|
23
|
+
* - схемную и кастомную валидацию;
|
|
24
|
+
* - контролируемый submit lifecycle;
|
|
25
|
+
* - безопасный императивный API (`services`) для бизнес-логики.
|
|
24
26
|
*
|
|
25
27
|
* ---
|
|
26
|
-
*
|
|
27
|
-
* Все поля формы управляются внутри хука.
|
|
28
|
-
* Для внешнего контроля состояния формы и ошибок можно использовать `setFormData` и `setError`.
|
|
28
|
+
* ## 🧠 Основная идея
|
|
29
29
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* -
|
|
30
|
+
* Хук полностью управляет состоянием формы и ошибками,
|
|
31
|
+
* а наружу отдаёт:
|
|
32
|
+
* - **декларативный API** (`register`, `registerForm`);
|
|
33
|
+
* - **императивные команды** (clear, validate, highlight);
|
|
34
|
+
* - **изолированные сервисы** для submit-логики.
|
|
33
35
|
*
|
|
34
36
|
* ---
|
|
35
|
-
*
|
|
37
|
+
* ## 🔁 Submit lifecycle
|
|
36
38
|
*
|
|
37
|
-
*
|
|
38
|
-
* ```tsx
|
|
39
|
-
* <FormField
|
|
40
|
-
* {...register('baseInput', { required: { setting: true, message: 'Обязательное поле' } })}
|
|
41
|
-
* label="Base input"
|
|
42
|
-
* hint="Обычная строка"
|
|
43
|
-
* />
|
|
44
|
-
* ```
|
|
39
|
+
* Порядок вызова callbacks при submit:
|
|
45
40
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
41
|
+
* 1. `onSubmitAttempt` — всегда
|
|
42
|
+
* 2. Валидация формы
|
|
43
|
+
* 3. `onSubmit` — если форма валидна
|
|
44
|
+
* 4. `onSubmitError` — если есть ошибки
|
|
45
|
+
*
|
|
46
|
+
* ---
|
|
47
|
+
* ## 🔌 Callbacks
|
|
48
|
+
*
|
|
49
|
+
* Все callbacks получают объект `services` —
|
|
50
|
+
* стабильный набор команд для работы с формой
|
|
51
|
+
* (без реактивных значений и возможности вызвать submit повторно).
|
|
52
|
+
*
|
|
53
|
+
* ---
|
|
54
|
+
* ## 📥 Входные параметры
|
|
55
|
+
*
|
|
56
|
+
* | Параметр | Тип | Описание |
|
|
57
|
+
* |---------|-----|----------|
|
|
58
|
+
* | `initFormData` | `T` | Начальные данные формы |
|
|
59
|
+
* | `scheme` | `FormSchemeType<T>` | Схема валидации |
|
|
60
|
+
* | `onSubmitAttempt` | `(data, event, services) => void` | Вызывается при любой попытке submit |
|
|
61
|
+
* | `onSubmit` | `(data, event, services) => void \| Promise<void>` | Вызывается при успешной валидации |
|
|
62
|
+
* | `onSubmitError` | `({ errors }, services) => void` | Вызывается при ошибках валидации |
|
|
63
|
+
*
|
|
64
|
+
* ---
|
|
65
|
+
* ## 📤 Возвращаемое API
|
|
66
|
+
*
|
|
67
|
+
* | Поле | Тип | Назначение |
|
|
68
|
+
* |------|-----|------------|
|
|
69
|
+
* | `formData` | `T` | Реактивные данные формы |
|
|
70
|
+
* | `errors` | `FormErrorsType<T>` | Реактивные ошибки |
|
|
71
|
+
* | `register` | `(path, config?) => FieldProps` | Регистрация поля |
|
|
72
|
+
* | `registerForm` | `() => form props` | Подключение `<form>` |
|
|
73
|
+
* | `setFormData` | `(data) => void` | Полная замена данных формы |
|
|
74
|
+
* | `getFormData` | `() => T` | Получить актуальные данные |
|
|
75
|
+
* | `getField` | `(path) => value` | Получить значение поля |
|
|
76
|
+
* | `getFieldSync` | `(path) => value` | Получить актуальное значение поля |
|
|
77
|
+
* | `setField` | `(path, value) => void` | Установить значение поля |
|
|
78
|
+
* | `getError` | `(path) => error` | Получить ошибку поля |
|
|
79
|
+
* | `setError` | `(path, error) => void` | Установить ошибку поля |
|
|
80
|
+
* | `clearField` | `(path \| paths) => void` | Очистить поле(я) |
|
|
81
|
+
* | `clearForm` | `() => void` | Очистить форму |
|
|
82
|
+
* | `clearErrors` | `() => void` | Очистить все ошибки |
|
|
83
|
+
* | `highlightField` | `(path) => Promise<boolean>` | Валидировать поле с ошибками |
|
|
84
|
+
* | `highlightFields` | `(paths) => Promise<boolean>` | Валидировать несколько полей |
|
|
85
|
+
* | `highlightFormErrors` | `() => Promise<boolean>` | Валидировать всю форму |
|
|
86
|
+
* | `isFieldValid` | `(path) => Promise<boolean>` | Проверка поля без ошибок |
|
|
87
|
+
* | `areFieldsValid` | `(paths) => Promise<boolean>` | Проверка полей без ошибок |
|
|
88
|
+
* | `isFormValid` | `() => Promise<boolean>` | Проверка формы без ошибок |
|
|
89
|
+
* | `getValidForm` | `() => Promise<T \| null>` | Получить форму, если валидна |
|
|
90
|
+
* | `submitForm` | `() => void` | Программный submit |
|
|
91
|
+
* | `resetForm` | `() => void` | Программный reset |
|
|
92
|
+
*
|
|
93
|
+
* ---
|
|
94
|
+
* ## 🛠 `services`
|
|
63
95
|
*
|
|
64
|
-
*
|
|
96
|
+
* `services` доступны **только внутри submit-callbacks**
|
|
97
|
+
* и предоставляют императивный API:
|
|
98
|
+
*
|
|
99
|
+
* - `form` — чтение и замена данных формы;
|
|
100
|
+
* - `fields` — работа с полями;
|
|
101
|
+
* - `errors` — управление ошибками;
|
|
102
|
+
* - `validation` — проверки без side-effects;
|
|
103
|
+
* - `highlight` — валидация с обновлением ошибок.
|
|
65
104
|
*
|
|
66
105
|
* ---
|
|
67
|
-
|
|
106
|
+
;
|
|
107
|
+
* @example
|
|
108
|
+
*
|
|
68
109
|
* ```tsx
|
|
69
|
-
* type
|
|
70
|
-
*
|
|
71
|
-
*
|
|
110
|
+
* type FormType = {
|
|
111
|
+
* phone: string;
|
|
112
|
+
* message: string;
|
|
72
113
|
* selects: {
|
|
73
|
-
*
|
|
74
|
-
*
|
|
114
|
+
* category: 'a' | 'b' | 'c';
|
|
115
|
+
* tags: ('a' | 'b' | 'c')[];
|
|
75
116
|
* };
|
|
76
|
-
*
|
|
77
|
-
* {
|
|
78
|
-
* {
|
|
117
|
+
* settings: [
|
|
118
|
+
* { enabled: boolean },
|
|
119
|
+
* { mode: { value: string } },
|
|
79
120
|
* ];
|
|
80
121
|
* };
|
|
81
122
|
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
123
|
+
* const scheme: FormSchemeType<FormType> = {
|
|
124
|
+
* phone: {
|
|
125
|
+
* required: { setting: true, message: 'Обязательное поле' },
|
|
126
|
+
* custom: value =>
|
|
127
|
+
* value && value.length > 5 ? false : 'Некорректный номер',
|
|
128
|
+
* },
|
|
129
|
+
*
|
|
130
|
+
* message: {
|
|
131
|
+
* noSpace: true,
|
|
132
|
+
* custom: (value, options) => {
|
|
133
|
+
* const enabled = options.getField('settings[0].enabled');
|
|
134
|
+
* return enabled && !value
|
|
135
|
+
* ? 'Сообщение обязательно'
|
|
136
|
+
* : false;
|
|
137
|
+
* },
|
|
138
|
+
* },
|
|
139
|
+
*
|
|
140
|
+
* 'selects.category': {
|
|
141
|
+
* required: true,
|
|
142
|
+
* },
|
|
143
|
+
* };
|
|
144
|
+
*
|
|
145
|
+
* export function ExampleForm() {
|
|
146
|
+
* const {
|
|
147
|
+
* formData,
|
|
148
|
+
* register,
|
|
149
|
+
* registerForm,
|
|
150
|
+
* highlightField,
|
|
151
|
+
* isFormValid,
|
|
152
|
+
* } = useForm<FormType>({
|
|
84
153
|
* scheme,
|
|
85
|
-
*
|
|
154
|
+
*
|
|
155
|
+
* onSubmitAttempt: (data, event, services) => {
|
|
156
|
+
* console.log('Submit attempt:', data);
|
|
157
|
+
* },
|
|
158
|
+
*
|
|
159
|
+
* onSubmit: async (data, event, services) => {
|
|
160
|
+
* // бизнес-валидация без UI-эффектов
|
|
161
|
+
* const isValid = await services.validation.isFormValid();
|
|
162
|
+
* if (!isValid) return;
|
|
163
|
+
*
|
|
164
|
+
* console.log('Submit success:', data);
|
|
165
|
+
* },
|
|
166
|
+
*
|
|
167
|
+
* onSubmitError: ({ errors }, services) => {
|
|
168
|
+
* // UI-валидация с подсветкой
|
|
169
|
+
* services.highlight.form();
|
|
170
|
+
* console.log('Submit errors:', errors);
|
|
171
|
+
* },
|
|
86
172
|
* });
|
|
87
173
|
*
|
|
88
174
|
* return (
|
|
89
175
|
* <form {...registerForm()}>
|
|
90
|
-
* <FormField
|
|
91
|
-
* {...register('baseInput', { required: { setting: true, message: 'Обязательное поле' } })}
|
|
92
|
-
* label="base input"
|
|
93
|
-
* hint="Обычная строка"
|
|
94
|
-
* />
|
|
95
176
|
*
|
|
96
|
-
* <
|
|
177
|
+
* <input {...register('phone')} />
|
|
97
178
|
*
|
|
98
|
-
* <
|
|
179
|
+
* <textarea {...register('message')} />
|
|
99
180
|
*
|
|
100
|
-
* <
|
|
101
|
-
*
|
|
181
|
+
* <select {...register('selects.category')}>
|
|
182
|
+
* <option value="a">A</option>
|
|
183
|
+
* <option value="b">B</option>
|
|
184
|
+
* <option value="c">C</option>
|
|
185
|
+
* </select>
|
|
102
186
|
*
|
|
103
|
-
* <
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* label="selects.select"
|
|
107
|
-
* required
|
|
108
|
-
* hint="Select с выбором только одного элемента"
|
|
187
|
+
* <input
|
|
188
|
+
* type="checkbox"
|
|
189
|
+
* {...register('settings[0].enabled')}
|
|
109
190
|
* />
|
|
110
191
|
*
|
|
111
|
-
* <
|
|
112
|
-
* {...register('selects.selectMulti')}
|
|
113
|
-
* multiple
|
|
114
|
-
* required
|
|
115
|
-
* options={selectOptions}
|
|
116
|
-
* label="selects.selectMulti"
|
|
117
|
-
* hint="Select с выбором нескольких элементов"
|
|
118
|
-
* />
|
|
119
|
-
*
|
|
120
|
-
* <button type="submit">Отправить</button>
|
|
121
|
-
* <button type="reset">Сбросить</button>
|
|
122
|
-
* </form>
|
|
123
|
-
* );
|
|
124
|
-
* }
|
|
125
|
-
* ```
|
|
192
|
+
* <input {...register('settings[1].mode.value')} />
|
|
126
193
|
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
* | Переменная / метод | Тип | Назначение |
|
|
131
|
-
* |---------------------|------|-------------|
|
|
132
|
-
* | `formData` | `T` | Текущее состояние формы (реактивное) |
|
|
133
|
-
* | `setFormData(data)` | `(data: T) => void` | Полностью заменяет состояние формы |
|
|
134
|
-
* | `getFormData()` | `() => T` | Возвращает актуальные данные формы |
|
|
135
|
-
* | `errors` | `FormErrorsType<T>` | Объект всех ошибок формы |
|
|
136
|
-
* | `setErrors(errors)` | `(errors: FormErrorsType<T>) => void` | Полностью заменяет состояние ошибок |
|
|
137
|
-
* | `getField(path)` | `(path) => value` | Возвращает текущее значение поля (возвращает стейт) |
|
|
138
|
-
* | `setField(path, value)` | `(path, value) => void` | Устанавливает значение поля |
|
|
139
|
-
* | `getFieldSync(path)` | `(path) => value` | Возвращает текущее значение поля (гарантировано последнее значение) |
|
|
140
|
-
* | `getError(path)` | `(path) => FormErrorType` | Возвращает ошибку конкретного поля |
|
|
141
|
-
* | `setError(path, error)` | `(path, error) => void` | Устанавливает ошибку вручную |
|
|
142
|
-
* | `highlightField(path)` | `(path) => Promise<boolean>` | Проверяет конкретное поле и обновляет `errors`. Возвращает результат проверки. |
|
|
143
|
-
* | `highlightFields(paths)` | `(paths) => Promise<boolean>` | Проверяет несколько полей и обновляет `errors`. Возвращает результат проверки. |
|
|
144
|
-
* | `highlightFormErrors()` | `() => Promise<boolean>` | Проверяет всю форму и обновляет `errors`. Возвращает результат проверки. |
|
|
145
|
-
* | `isFieldValid(path)` | `(path) => Promise<boolean>` | Проверяет валидность поля (без добавления `errors`) |
|
|
146
|
-
* | `areFieldsValid(paths)` | `(paths) => Promise<boolean>` | Проверяет валидность полей (без добавления `errors`) |
|
|
147
|
-
* | `isFormValid()` | `() => Promise<boolean>` | Проверяет, валидна ли вся форма (без добавления `errors`) |
|
|
148
|
-
* | `clearForm()` | `() => void` | Сбрасывает все значения формы |
|
|
149
|
-
* | `clearErrors()` | `() => void` | Очищает все ошибки |
|
|
150
|
-
* | `clearField(path | paths)` | `(path | paths) => void` | Очищает поле или поля |
|
|
151
|
-
* | `register(path, config?)` | `(path, config?) => FieldPropsType` | Регистрирует поле и возвращает пропсы для компонента |
|
|
152
|
-
* | `registerForm()` | `() => Pick<React.ComponentProps<'form'>, 'onSubmit' | 'onReset' | 'noValidate'>` | Возвращает обработчики и настройки для `<form>` |
|
|
153
|
-
* | `getValidForm()` | `() => Promise<T | null>` | Возвращает валидную форму, в случае если форма не валидна - null |
|
|
194
|
+
* <button type="button" onClick={() => highlightField('phone')}>
|
|
195
|
+
* Validate phone
|
|
196
|
+
* </button>
|
|
154
197
|
*
|
|
155
|
-
*
|
|
156
|
-
* ### 🧠 `registerForm`
|
|
198
|
+
* <button type="submit">Submit</button>
|
|
157
199
|
*
|
|
158
|
-
*
|
|
159
|
-
* не теряя контроль над поведением `onSubmit` и `onReset`.
|
|
200
|
+
* <pre>{JSON.stringify(formData, null, 2)}</pre>
|
|
160
201
|
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
* onSubmit: (data) => console.log('Отправлено:', data),
|
|
165
|
-
* });
|
|
166
|
-
*
|
|
167
|
-
* return (
|
|
168
|
-
* <form {...registerForm()}>
|
|
169
|
-
* <FormField {...register('username')} label="Имя" />
|
|
170
|
-
* <FormField {...register('email')} label="Email" />
|
|
171
|
-
* <button type="submit">Отправить</button>
|
|
172
|
-
* <button type="reset">Сбросить</button>
|
|
173
|
-
* </form>
|
|
174
|
-
* );
|
|
202
|
+
* </form>
|
|
203
|
+
* );
|
|
204
|
+
* }
|
|
175
205
|
* ```
|
|
176
206
|
*
|
|
177
|
-
* #### Поведение:
|
|
178
|
-
* - `onSubmit`: выполняет валидацию всей формы (`isFormValid()`), при успехе вызывает переданный `onSubmit`;
|
|
179
|
-
* - `onReset`: предотвращает нативный сброс, очищает значения (`clearForm()`) и ошибки (`clearErrors()`);
|
|
180
|
-
* - `noValidate: true`: отключает нативную HTML5-валидацию, чтобы не мешала кастомной логике.
|
|
181
|
-
*
|
|
182
207
|
* ---
|
|
183
|
-
* @template Form
|
|
184
|
-
* @template T
|
|
185
|
-
*
|
|
186
|
-
* @param {Object} [params]
|
|
187
|
-
* @param {T} [params.initFormData] — начальные данные формы.
|
|
188
|
-
* @param {FormSchemeType<T>} [params.scheme] — схема валидации формы.
|
|
189
|
-
* @param {(data: Form) => void | Promise<void>} [params.onSubmit] — колбэк, вызываемый при успешной отправке формы.
|
|
190
|
-
*
|
|
191
|
-
* @returns {object} Объект с методами и состоянием формы (см. таблицу выше).
|
|
208
|
+
* @template Form Полный тип формы
|
|
209
|
+
* @template T Тип начальных данных
|
|
192
210
|
*/
|
|
193
211
|
export declare function useForm<Form, T extends Nullable<Undefinable<Form>> = Nullable<Undefinable<Form>>>(...args: PropsType<T, Form>): {
|
|
194
212
|
formData: T | undefined;
|
|
@@ -214,7 +232,9 @@ export declare function useForm<Form, T extends Nullable<Undefinable<Form>> = Nu
|
|
|
214
232
|
(): FieldPropsType<FormValue<T, "">>;
|
|
215
233
|
<P extends FormPath<T>>(path: P, config?: FormSchemeType<T>[P]): FieldPropsType<FormValue<T, P>>;
|
|
216
234
|
};
|
|
217
|
-
registerForm: () => Pick<React.ComponentProps<"form">, "onSubmit" | "onReset" | "noValidate">;
|
|
235
|
+
registerForm: () => Pick<React.ComponentProps<"form">, "onSubmit" | "onReset" | "noValidate" | "ref"> & Pick<InstanceRefAttributes<React.ComponentRef<"form">>, "instanceRef">;
|
|
218
236
|
getValidForm: () => Promise<Form | null>;
|
|
237
|
+
submitForm: () => void;
|
|
238
|
+
resetForm: () => void;
|
|
219
239
|
};
|
|
220
240
|
export {};
|