indicator-ui 0.1.46 → 0.1.48
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.css +617 -0
- package/dist/index.css.map +1 -1
- package/dist/index.js +17548 -14323
- package/dist/index.js.map +1 -1
- package/dist/scss/ui/formFields/FormFieldWrapper/styles/mixins/index.scss +1 -0
- package/dist/scss/ui/formFields/FormFieldWrapper/styles/mixins/inputFieldWrapper.scss +50 -0
- package/dist/types/src/hooks/forms/__tests__/lib/getDataByPath.test.d.ts +1 -0
- package/dist/types/src/hooks/forms/__tests__/lib/getFormDataPaths.test.d.ts +1 -0
- package/dist/types/src/hooks/forms/__tests__/lib/setDataByPath.test.d.ts +1 -0
- package/dist/types/src/hooks/forms/__tests__/lib/utils.test.d.ts +1 -0
- package/dist/types/src/hooks/forms/classes/index.d.ts +44 -0
- package/dist/types/src/hooks/forms/index.d.ts +2 -0
- package/dist/types/src/hooks/forms/lib/fieldsProps.d.ts +11 -0
- package/dist/types/src/hooks/forms/lib/getDataByPath.d.ts +4 -0
- package/dist/types/src/hooks/forms/lib/getFormDataPaths.d.ts +5 -0
- package/dist/types/src/hooks/forms/lib/index.d.ts +5 -0
- package/dist/types/src/hooks/forms/lib/scheme.d.ts +13 -0
- package/dist/types/src/hooks/forms/lib/setDataByPath.d.ts +5 -0
- package/dist/types/src/hooks/forms/lib/utils.d.ts +9 -0
- package/dist/types/src/hooks/forms/types/formTypes.d.ts +51 -0
- package/dist/types/src/hooks/forms/types/index.d.ts +2 -3
- package/dist/types/src/hooks/forms/types/scheme.d.ts +151 -0
- package/dist/types/src/hooks/forms/useForm.d.ts +212 -0
- package/dist/types/src/hooks/forms/validateFunctions/config.d.ts +2 -0
- package/dist/types/src/hooks/forms/validateFunctions/index.d.ts +8 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateArray.d.ts +1 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateDateTime.d.ts +7 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateEqualsTo.d.ts +1 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateFile.d.ts +3 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateNum.d.ts +6 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateRequired.d.ts +1 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateStr.d.ts +8 -0
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/lib/tsCheck/index.d.ts +1 -0
- package/dist/types/src/test/App.d.ts +1 -1
- package/dist/types/src/test/layout/PageLayout.d.ts +1 -1
- package/dist/types/src/test/pages/ButtonsPage.d.ts +1 -1
- package/dist/types/src/test/pages/CascadeSelectorPage.d.ts +1 -1
- package/dist/types/src/test/pages/CheckboxMarkPage.d.ts +1 -1
- package/dist/types/src/test/pages/CheckboxPage.d.ts +1 -1
- package/dist/types/src/test/pages/DateTimeFieldMaskPage.d.ts +1 -1
- package/dist/types/src/test/pages/DateTimeFieldsPage.d.ts +1 -1
- package/dist/types/src/test/pages/DateTimePickerPage.d.ts +1 -1
- package/dist/types/src/test/pages/DropdownItemPage.d.ts +1 -1
- package/dist/types/src/test/pages/FieldsPage.d.ts +1 -1
- package/dist/types/src/test/pages/FormBuilderPage.d.ts +1 -1
- package/dist/types/src/test/pages/FormPage.d.ts +1 -0
- package/dist/types/src/test/pages/HomePage.d.ts +1 -1
- package/dist/types/src/test/pages/LoadingIndicatorPage.d.ts +1 -1
- package/dist/types/src/test/pages/MediaPlayerPage.d.ts +1 -1
- package/dist/types/src/test/pages/MicroButtonsPage.d.ts +1 -1
- package/dist/types/src/test/pages/ModalsPage.d.ts +1 -1
- package/dist/types/src/test/pages/PaginationPage.d.ts +1 -1
- package/dist/types/src/test/pages/SlideTransitionPage.d.ts +1 -1
- package/dist/types/src/test/pages/TabFramePage.d.ts +1 -1
- package/dist/types/src/test/pages/TagPage.d.ts +1 -1
- package/dist/types/src/test/pages/TestPage.d.ts +1 -1
- package/dist/types/src/test/pages/ToggleBasePage.d.ts +1 -1
- package/dist/types/src/test/pages/TogglePage.d.ts +1 -1
- package/dist/types/src/test/pages/TooltipTage.d.ts +1 -1
- package/dist/types/src/test/pages/UiAnimationsPage.d.ts +1 -1
- package/dist/types/src/test/pages/UseSmartPositionPage.d.ts +1 -1
- package/dist/types/src/test/pages/UseSmartScrollPage.d.ts +1 -1
- package/dist/types/src/test/pages/UserPickPage.d.ts +1 -1
- package/dist/types/src/test/pages/index.d.ts +1 -0
- package/dist/types/src/types/mixins.d.ts +10 -0
- package/dist/types/src/ui/Carousel/ui/Carousel.d.ts +1 -1
- package/dist/types/src/ui/CascadeSelector/ui/CascadeSelector.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/components/CalendarButton.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/components/CalendarDay.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/components/CalendarMonth.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/components/CalendarYear.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/components/TimePickerFeed.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/components/TimePickerTag.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/parts/Footer.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/parts/Header.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/parts/Main.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/pickers/DatePicker.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/pickers/MonthPicker.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/pickers/TimePicker.d.ts +1 -1
- package/dist/types/src/ui/DateTimePicker/ui/pickers/YearPicker.d.ts +1 -1
- package/dist/types/src/ui/Dropdown/types/DropdownTypes.d.ts +5 -0
- package/dist/types/src/ui/DropdownItem/types/DropdownItemTypes.d.ts +5 -0
- package/dist/types/src/ui/FormBuilder/lib/formBuilder.d.ts +1 -1
- package/dist/types/src/ui/InputFields/DateTimeField/ui/DateField.d.ts +1 -1
- package/dist/types/src/ui/InputFields/DateTimeField/ui/DateFieldBase.d.ts +1 -1
- package/dist/types/src/ui/InputFields/DateTimeField/ui/DateTimeField.d.ts +1 -1
- package/dist/types/src/ui/InputFields/DateTimeField/ui/TimeField.d.ts +1 -1
- package/dist/types/src/ui/InputFields/DateTimeField/ui/TimeFieldBase.d.ts +1 -1
- package/dist/types/src/ui/InputFields/DateTimeFieldMask/ui/DateTimeFieldMask.d.ts +1 -1
- package/dist/types/src/ui/InputFields/DateTimeRangeField/ui/DateRangeField.d.ts +1 -1
- package/dist/types/src/ui/InputFields/DateTimeRangeField/ui/DateTimeRangeField.d.ts +1 -1
- package/dist/types/src/ui/InputFields/DateTimeRangeField/ui/TimeRangeField.d.ts +1 -1
- package/dist/types/src/ui/InputFields/SelectField/types/SelectFieldTypes.d.ts +4 -0
- package/dist/types/src/ui/InputFields/TextareaField/ui/TextareaField.d.ts +1 -1
- package/dist/types/src/ui/Loaders/ui/LoadingIndicator.d.ts +1 -1
- package/dist/types/src/ui/MediaViewer/ui/components/ControlBar.d.ts +1 -1
- package/dist/types/src/ui/MediaViewer/ui/components/VideoProgressBar.d.ts +1 -1
- package/dist/types/src/ui/PaginationBar/ui/PageSwitcher.d.ts +1 -1
- package/dist/types/src/ui/PaginationBar/ui/PaginationBar.d.ts +1 -1
- package/dist/types/src/ui/PlayButton/ui/PlayButton.d.ts +1 -1
- package/dist/types/src/ui/SlideTransition/ui/SlideTransition.d.ts +1 -1
- package/dist/types/src/ui/TabButtons/ui/TabButtons.d.ts +1 -1
- package/dist/types/src/ui/TabFrame/ui/TabFrame.d.ts +1 -1
- package/dist/types/src/ui/Tag/ui/Tag.d.ts +1 -1
- package/dist/types/src/ui/Tag/ui/TagCheckbox.d.ts +1 -1
- package/dist/types/src/ui/Tag/ui/TagCount.d.ts +1 -1
- package/dist/types/src/ui/Toggle/ui/Toggle.d.ts +1 -1
- package/dist/types/src/ui/Tooltip/ui/Tooltip.d.ts +1 -1
- package/dist/types/src/ui/UserPick/ui/UserPick.d.ts +1 -1
- package/dist/types/src/ui/formFields/FormField/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormField/styles/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormField/ui/FormField.d.ts +6 -0
- package/dist/types/src/ui/formFields/FormField/ui/FormFieldBase.d.ts +19 -0
- package/dist/types/src/ui/formFields/FormField/ui/index.d.ts +2 -0
- package/dist/types/src/ui/formFields/FormFieldWrapper/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormFieldWrapper/styles/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormFieldWrapper/ui/FormFieldWrapper.d.ts +24 -0
- package/dist/types/src/ui/formFields/FormFieldWrapper/ui/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormRadioField/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormRadioField/ui/FieldItem.d.ts +11 -0
- package/dist/types/src/ui/formFields/FormRadioField/ui/FormRadioField.d.ts +18 -0
- package/dist/types/src/ui/formFields/FormRadioField/ui/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormSelectField/config/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormSelectField/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormSelectField/styles/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormSelectField/ui/FormSelectField.d.ts +8 -0
- package/dist/types/src/ui/formFields/FormSelectField/ui/FormSelectFieldBase.d.ts +21 -0
- package/dist/types/src/ui/formFields/FormSelectField/ui/index.d.ts +2 -0
- package/dist/types/src/ui/formFields/FormSwitcherField/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormSwitcherField/ui/FormSwitcherField.d.ts +5 -0
- package/dist/types/src/ui/formFields/FormSwitcherField/ui/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormTextareaField/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormTextareaField/styles/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormTextareaField/ui/FormTextareaField.d.ts +14 -0
- package/dist/types/src/ui/formFields/FormTextareaField/ui/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/extends/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/extends/style/index.d.ts +2 -0
- package/dist/types/src/ui/formFields/extends/ui/DropdownArrow.d.ts +6 -0
- package/dist/types/src/ui/formFields/extends/ui/InputInnerButton.d.ts +7 -0
- package/dist/types/src/ui/formFields/extends/ui/index.d.ts +2 -0
- package/dist/types/src/ui/formFields/index.d.ts +6 -0
- package/dist/types/src/ui/index.d.ts +1 -0
- package/docs/Notes.md +134 -0
- package/package.json +2 -2
- package/dist/scss/ui/InputFields/index.scss +0 -7
- package/dist/types/src/hooks/forms/useForms.d.ts +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@forward "inputFieldWrapper";
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
@use '../../../../../styles' as *;
|
|
2
|
+
|
|
3
|
+
@mixin insertInputFieldWrapper() {
|
|
4
|
+
.inputFieldWrapper {
|
|
5
|
+
width: 100%;
|
|
6
|
+
min-width: 0;
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: column;
|
|
9
|
+
gap: 4px;
|
|
10
|
+
|
|
11
|
+
.labelText {
|
|
12
|
+
display: flex;
|
|
13
|
+
padding: 0 12px;
|
|
14
|
+
gap: 2px;
|
|
15
|
+
|
|
16
|
+
@include fnt($size: 14, $line-height: 20, $weight: 500, $color: var(--gray-700));
|
|
17
|
+
|
|
18
|
+
.required {
|
|
19
|
+
@include fnt($size: 14, $line-height: 20, $weight: 500, $color: var(--error-500));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.hintText {
|
|
24
|
+
display: flex;
|
|
25
|
+
padding: 0 12px;
|
|
26
|
+
gap: 2px;
|
|
27
|
+
|
|
28
|
+
@include fnt($size: 14, $line-height: 20, $weight: 400, $color: var(--gray-600));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.hintError {
|
|
32
|
+
display: flex;
|
|
33
|
+
padding: 0 12px;
|
|
34
|
+
gap: 2px;
|
|
35
|
+
|
|
36
|
+
@include fnt($size: 14, $line-height: 20, $weight: 400, $color: var(--error-500));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.helperLink {
|
|
40
|
+
display: flex;
|
|
41
|
+
padding: 0 12px;
|
|
42
|
+
gap: 2px;
|
|
43
|
+
cursor: pointer;
|
|
44
|
+
@include changeSvg($width: 20, $height: 20, $stroke: var(--primary-500), $flex: none);
|
|
45
|
+
@include fnt($size: 14, $line-height: 20, $weight: 400, $color: var(--primary-500));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@content;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { FormErrorsType, FormErrorType, FormPath, FormValidateFunItemType, FormValidateFunListType, FormValidateFunType, FormValue, GetFormValidateFunPathType, GetFormValidateFunValueType } from "../types";
|
|
2
|
+
export declare class Form<T> {
|
|
3
|
+
private data;
|
|
4
|
+
constructor(data?: T | undefined);
|
|
5
|
+
getFormData(): T | undefined;
|
|
6
|
+
setFormData(data: T | undefined): void;
|
|
7
|
+
get formData(): T | undefined;
|
|
8
|
+
set formData(data: T | undefined);
|
|
9
|
+
setField<const P extends FormPath<T>>(chain: P, value: FormValue<T, P> | undefined): void;
|
|
10
|
+
getField<const P extends FormPath<T>>(chain: P): FormValue<T, P> | undefined;
|
|
11
|
+
clear(): void;
|
|
12
|
+
}
|
|
13
|
+
export declare class FormError<T> {
|
|
14
|
+
private formErrors;
|
|
15
|
+
constructor(errors?: FormErrorsType<T>);
|
|
16
|
+
getErrors(): FormErrorsType<T>;
|
|
17
|
+
get errors(): FormErrorsType<T>;
|
|
18
|
+
setErrors(errors: FormErrorsType<T>): void;
|
|
19
|
+
addErrors(errors: FormErrorsType<T>): void;
|
|
20
|
+
set errors(errors: FormErrorsType<T>);
|
|
21
|
+
getError<const P extends FormPath<T>>(path: P): FormErrorType | undefined;
|
|
22
|
+
setError<const P extends FormPath<T>>(path: P, error: FormErrorType): void;
|
|
23
|
+
deleteError<const P extends FormPath<T>>(keyChain: P): void;
|
|
24
|
+
clear(): void;
|
|
25
|
+
}
|
|
26
|
+
type ValidateResArrayType<T> = FormErrorsType<T>;
|
|
27
|
+
export declare class FormValidateFun<T> {
|
|
28
|
+
private formValidateFunctions;
|
|
29
|
+
private form;
|
|
30
|
+
constructor(form: Form<T>, formValidateFunctions?: FormValidateFunType<T>);
|
|
31
|
+
setForm(form: Form<T>): void;
|
|
32
|
+
private getValueForValidate;
|
|
33
|
+
getFormValidateFunctions(): FormValidateFunType<T>;
|
|
34
|
+
setFormValidateFunctions(newValue: FormValidateFunType<T>): void;
|
|
35
|
+
getValidateFunctions<const P extends GetFormValidateFunPathType<T>>(path: P): FormValidateFunListType<GetFormValidateFunValueType<T, P>>;
|
|
36
|
+
setValidateFunctions<const P extends GetFormValidateFunPathType<T>>(path: P, func: FormValidateFunListType<GetFormValidateFunValueType<T, P>>): void;
|
|
37
|
+
deleteValidateFunctions<const P extends GetFormValidateFunPathType<T>>(chain: P): void;
|
|
38
|
+
addValidateFunctions<const P extends GetFormValidateFunPathType<T>>(chain: P, fun: FormValidateFunItemType<GetFormValidateFunValueType<T, P>>): void;
|
|
39
|
+
validate<const P extends GetFormValidateFunPathType<T>>(path: P): Promise<ValidateResArrayType<T>>;
|
|
40
|
+
isValid<const P extends GetFormValidateFunPathType<T>>(path: P): Promise<boolean>;
|
|
41
|
+
validateAllFields(): Promise<ValidateResArrayType<T>>;
|
|
42
|
+
isFormValid(): Promise<boolean>;
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FieldPropsType, FormPath, FormValue } from '../types';
|
|
2
|
+
import { Form, FormError } from "../classes";
|
|
3
|
+
type PropsType<T, P extends FormPath<T>> = {
|
|
4
|
+
path: P;
|
|
5
|
+
form: Form<T>;
|
|
6
|
+
setField: (path: P, value: FormValue<T, P> | undefined) => void;
|
|
7
|
+
formErrors: FormError<T>;
|
|
8
|
+
highlightField: (path: P) => void;
|
|
9
|
+
};
|
|
10
|
+
export declare function getFieldPropsType<T, P extends FormPath<T>>(props: PropsType<T, P>): FieldPropsType<FormValue<T, P>>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FieldConfigType, FormPath, FormSchemeType, GetFormValidateFunPathType, GetProcessArrayFieldValue } from '../types';
|
|
2
|
+
import { Form, FormValidateFun } from '../classes';
|
|
3
|
+
type PropsOptionsType<T> = {
|
|
4
|
+
form: Form<T>;
|
|
5
|
+
formValidateFun: FormValidateFun<T>;
|
|
6
|
+
};
|
|
7
|
+
/** Полностью заменяет валидаторы поля */
|
|
8
|
+
export declare function processValidators<T, F>(path: FormPath<T>, config: FieldConfigType<T, F>, options: PropsOptionsType<T>): void;
|
|
9
|
+
/** Полностью заменяет валидаторы полей */
|
|
10
|
+
export declare function processScheme<T>(scheme: FormSchemeType<T>, options: PropsOptionsType<T>): void;
|
|
11
|
+
export declare function getRealPathByArrayItemPath<T, P extends GetFormValidateFunPathType<T>>(path: P): GetProcessArrayFieldValue<T, P> | undefined;
|
|
12
|
+
export declare function getArrayItemPathByRealPath<T, P extends GetFormValidateFunPathType<T>>(path: P): GetProcessArrayFieldValue<T, P> | undefined;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { FormPath, FormValue } from "../types";
|
|
2
|
+
type PropsType<T, P extends FormPath<T>> = [formData: T, keyChain: P, value: FormValue<T, P> | undefined];
|
|
3
|
+
type FunReturnType<T> = T | undefined;
|
|
4
|
+
export declare function setDataByPath<T, const P extends FormPath<T>>(...[formData, path, value]: PropsType<T, P>): FunReturnType<T>;
|
|
5
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function copyData(data: unknown): unknown;
|
|
2
|
+
export declare function getBasePath(path: string): string | null;
|
|
3
|
+
export declare function getBaseRest(path: string): string | null;
|
|
4
|
+
export declare function getArrayIndex(path: string): number | null;
|
|
5
|
+
export declare function getArrayRest(path: string): string | null;
|
|
6
|
+
export declare function getObjectPath(path: string): string | null;
|
|
7
|
+
export declare function getObjectRest(path: string): string | null;
|
|
8
|
+
export declare function isArrayPathValue(path: string): boolean;
|
|
9
|
+
export declare function isObjPathValue(path: string): boolean;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { BuildTuple, IsAny, IsArray, IsTuple } from '../../../../../types';
|
|
2
|
+
export type ObjectFormType = Record<string, unknown>;
|
|
3
|
+
export type ArrayFormType = any[];
|
|
4
|
+
export type BaseFormType = Exclude<any, ObjectFormType | ArrayFormType>;
|
|
5
|
+
type SafeRecursiveArr = BuildTuple<20>;
|
|
6
|
+
type SafeRecursiveStep<T> = T extends [infer _, ...infer Rest] ? Rest : never;
|
|
7
|
+
type CanContinueRecursive<T> = SafeRecursiveStep<T> extends never ? false : true;
|
|
8
|
+
type IsObjectType<T> = T extends ObjectFormType ? true : false;
|
|
9
|
+
type ClearObjectType<T> = Extract<T, ObjectFormType>;
|
|
10
|
+
type ClearArrayType<T> = Extract<T, ArrayFormType>;
|
|
11
|
+
type GetBaseKeyChains<P extends string, T, SafeArr> = CanContinueRecursive<SafeArr> extends false ? never : IsAny<T> extends false ? P | `${P}${GetDeepKeyChains<T, SafeRecursiveStep<SafeArr>> | GetArrayKeyChains<T, SafeRecursiveStep<SafeArr>>}` : P | `${P}${'.' | '['}${string}`;
|
|
12
|
+
type GetArrayKeyChains<T, SafeArr> = CanContinueRecursive<SafeArr> extends false ? never : IsArray<T> extends false ? never : ClearArrayType<T> extends infer Arr ? IsTuple<Arr> extends true ? {
|
|
13
|
+
[K in Extract<keyof Arr, `${number}`>]: GetBaseKeyChains<`[${K}]`, Arr[K], SafeRecursiveStep<SafeArr>>;
|
|
14
|
+
}[Extract<keyof Arr, `${number}`>] : Arr extends any[] ? `[${number}]` | GetBaseKeyChains<`[${number}]`, Arr[number], SafeRecursiveStep<SafeArr>> : never : never;
|
|
15
|
+
type GetDeepKeyChains<T, SafeArr> = CanContinueRecursive<SafeArr> extends false ? never : IsObjectType<T> extends false ? never : ClearObjectType<T> extends infer Form ? {
|
|
16
|
+
[K in Extract<keyof Form, string>]: GetBaseKeyChains<`.${K}`, Form[K], SafeRecursiveStep<SafeArr>>;
|
|
17
|
+
}[Extract<keyof Form, string>] : never;
|
|
18
|
+
export type FormPath<T> = '' | (IsObjectType<T> extends false ? GetArrayKeyChains<T, SafeRecursiveArr> : ClearObjectType<T> extends infer Form ? {
|
|
19
|
+
[K in Extract<keyof Form, string>]: GetBaseKeyChains<`${K}`, Form[K], SafeRecursiveArr>;
|
|
20
|
+
}[Extract<keyof Form, string>] : never);
|
|
21
|
+
type HeadPart<S extends string, Acc extends string = ''> = S extends `${infer C}${infer Rest}` ? C extends '.' | '[' ? Acc : HeadPart<Rest, `${Acc}${C}`> : Acc;
|
|
22
|
+
type GetPath<P> = P extends string ? HeadPart<P> : never;
|
|
23
|
+
type GetArrayIndex<P> = P extends `[${`${infer NumIndex extends number}`}]${string}` ? NumIndex : never;
|
|
24
|
+
type GetArrayRest<P> = P extends `[${GetArrayIndex<P>}]${infer Path}` ? Path : never;
|
|
25
|
+
type GetDeepPath<P> = P extends `.${infer Rest}` ? GetPath<Rest> : never;
|
|
26
|
+
type GetDeepRest<P> = P extends `.${GetDeepPath<P>}${infer Rest}` ? Rest : never;
|
|
27
|
+
type GetBaseValue<T, P extends string, SafeArr> = CanContinueRecursive<SafeArr> extends false ? never : P extends '' ? T : P extends `.${string}` ? GetDeepValue<T, P, SafeRecursiveStep<SafeArr>> : P extends `[${string}` ? GetArrayValue<T, P, SafeRecursiveStep<SafeArr>> : never;
|
|
28
|
+
type GetDeepValue<T, P, SafeArr> = CanContinueRecursive<SafeArr> extends false ? never : ClearObjectType<T> extends infer Form ? GetDeepPath<P> extends infer Path extends keyof Form ? GetBaseValue<Form[Path], GetDeepRest<P>, SafeRecursiveStep<SafeArr>> : never : never;
|
|
29
|
+
type GetArrayValue<T, P, SafeArr> = CanContinueRecursive<SafeArr> extends false ? never : ClearArrayType<T> extends infer Form ? GetArrayIndex<P> extends infer Index extends keyof Form ? GetBaseValue<Form[Index], GetArrayRest<P>, SafeRecursiveStep<SafeArr>> : never : never;
|
|
30
|
+
export type FormValue<T, P extends FormPath<T>> = IsAny<T> extends false ? T extends ObjectFormType ? P extends '' ? GetBaseValue<T, P, SafeRecursiveArr> : GetBaseValue<T, `.${P}`, SafeRecursiveArr> : GetBaseValue<T, P, SafeRecursiveArr> : any;
|
|
31
|
+
export type FormErrorType = boolean | string;
|
|
32
|
+
export type FormErrorsType<T> = Array<{
|
|
33
|
+
[K in FormPath<T>]: {
|
|
34
|
+
path: K;
|
|
35
|
+
error: FormErrorType;
|
|
36
|
+
};
|
|
37
|
+
}[FormPath<T>]>;
|
|
38
|
+
type GetOnlyArrayField<P> = P extends string ? Extract<P, `${string}]`> : never;
|
|
39
|
+
export type ProcessArrayFields<P> = GetOnlyArrayField<P> extends infer T extends string ? T extends `${infer B}[${number}]` ? `${B}[*]` : never : never;
|
|
40
|
+
export type GetProcessArrayFieldValue<T, P> = P extends `${infer Rest}[*]` ? Rest extends FormPath<T> ? FormValue<T, Rest> extends infer Arr extends any[] ? Arr[number] : never : never : never;
|
|
41
|
+
export type GetFormValidateFunPathType<T> = FormPath<T> | ProcessArrayFields<FormPath<T>>;
|
|
42
|
+
export type GetFormValidateFunValueType<T, P> = GetProcessArrayFieldValue<T, P> | (P extends FormPath<T> ? FormValue<T, P> : never);
|
|
43
|
+
export type FormValidateFunItemType<T> = (value: T | undefined) => Promise<FormErrorType> | FormErrorType;
|
|
44
|
+
export type FormValidateFunListType<T> = Array<FormValidateFunItemType<T>>;
|
|
45
|
+
export type FormValidateFunType<T> = Array<{
|
|
46
|
+
[K in GetFormValidateFunPathType<T>]: {
|
|
47
|
+
path: K;
|
|
48
|
+
fun: FormValidateFunListType<GetFormValidateFunValueType<T, K>>;
|
|
49
|
+
};
|
|
50
|
+
}[GetFormValidateFunPathType<T>]>;
|
|
51
|
+
export {};
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
};
|
|
1
|
+
export * from './formTypes';
|
|
2
|
+
export * from './scheme';
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { FormErrorType, FormPath, FormValidateFunItemType, GetFormValidateFunPathType, GetFormValidateFunValueType } from './formTypes';
|
|
2
|
+
export type StringFieldValidators = Partial<{
|
|
3
|
+
/** Минимальная длина строки */
|
|
4
|
+
minStr: number;
|
|
5
|
+
/** Максимальная длина строки */
|
|
6
|
+
maxStr: number;
|
|
7
|
+
/** Регулярное выражение или функция для проверки строки */
|
|
8
|
+
pattern: RegExp | ((value: string) => boolean);
|
|
9
|
+
/** Разрешить пустую строку (""), игнорируя другие проверки */
|
|
10
|
+
allowEmpty: boolean;
|
|
11
|
+
/** Требование к регистру: верхний, нижний или любой */
|
|
12
|
+
case: 'upper' | 'lower' | 'any';
|
|
13
|
+
/** Запрет на пробелы в строке */
|
|
14
|
+
noSpace: boolean;
|
|
15
|
+
/** Разрешённые символы (строка, все остальные запрещены) */
|
|
16
|
+
allowedChars: string;
|
|
17
|
+
/** Запрещённые символы (строка, все остальные разрешены) */
|
|
18
|
+
disallowedChars: string;
|
|
19
|
+
}>;
|
|
20
|
+
export type DateTimeFieldValidators = Partial<{
|
|
21
|
+
/** Минимальная дата/время, значение должно быть больше или равно */
|
|
22
|
+
minDate: string | number | Date;
|
|
23
|
+
/** Максимальная дата/время, значение должно быть меньше или равно */
|
|
24
|
+
maxDate: string | number | Date;
|
|
25
|
+
/** Максимальное время (часы и минуты), значение должно быть меньше или равно */
|
|
26
|
+
maxTime: string | number | Date;
|
|
27
|
+
/** Минимальное время (часы и минуты), значение должно быть больше или равно */
|
|
28
|
+
minTime: string | number | Date;
|
|
29
|
+
/** Разрешены только даты из прошлого (не позже, чем минута назад от текущего момента) */
|
|
30
|
+
past: boolean;
|
|
31
|
+
/** Разрешены только даты из будущего (не раньше, чем через минуту от текущего момента) */
|
|
32
|
+
future: boolean;
|
|
33
|
+
/** Разрешены только даты сегодняшнего дня */
|
|
34
|
+
today: boolean;
|
|
35
|
+
}>;
|
|
36
|
+
export type NumberFieldValidators = Partial<{
|
|
37
|
+
/** Минимальное значение числа (включительно) */
|
|
38
|
+
minNum: number;
|
|
39
|
+
/** Максимальное значение числа (включительно) */
|
|
40
|
+
maxNum: number;
|
|
41
|
+
/** Числовое значение должно быть целым числом */
|
|
42
|
+
integer: boolean;
|
|
43
|
+
/** Числовое значение должно быть положительным (> 0) */
|
|
44
|
+
positive: boolean;
|
|
45
|
+
/** Числовое значение должно быть отрицательным (< 0) */
|
|
46
|
+
negative: boolean;
|
|
47
|
+
/** Числовое значение должно находиться в указанном диапазоне [min, max] */
|
|
48
|
+
range: [number, number];
|
|
49
|
+
}>;
|
|
50
|
+
export type FileFieldValidators = Partial<{
|
|
51
|
+
/** Минимальный размер файла в байтах (включительно) */
|
|
52
|
+
minFileSize: number;
|
|
53
|
+
/** Максимальный размер файла в байтах (включительно) */
|
|
54
|
+
maxFileSize: number;
|
|
55
|
+
/** Разрешённые MIME-типы файлов (например, ['image/png', 'image/jpeg']) */
|
|
56
|
+
allowedFileTypes: string[];
|
|
57
|
+
}>;
|
|
58
|
+
export type ArrayFieldValidators = Partial<{
|
|
59
|
+
/** Максимальное количество элементов в массиве */
|
|
60
|
+
maxItemCount: number;
|
|
61
|
+
}>;
|
|
62
|
+
export type BaseFieldValidators<T, F> = Partial<{
|
|
63
|
+
/** Поле обязательное */
|
|
64
|
+
required: ValidatorOption<boolean>;
|
|
65
|
+
/** Равенство другому полю */
|
|
66
|
+
equalsTo: ValidatorOption<FormPath<T>>;
|
|
67
|
+
/** Собственная функция валидации */
|
|
68
|
+
custom: FormValidateFunItemType<F> | {
|
|
69
|
+
fun: FormValidateFunItemType<F>;
|
|
70
|
+
priory?: number;
|
|
71
|
+
};
|
|
72
|
+
}>;
|
|
73
|
+
export type ExtendsValidatorOptions<T> = {
|
|
74
|
+
/** Значение валидотора */
|
|
75
|
+
setting: T;
|
|
76
|
+
/** Сообщение при ошибке */
|
|
77
|
+
message?: string;
|
|
78
|
+
/**
|
|
79
|
+
* Какой приоритете у проверки (чем выше, тем раньше произойдет проверка этим валидатором)
|
|
80
|
+
*
|
|
81
|
+
* По-умолчанию у всех `0`.
|
|
82
|
+
* */
|
|
83
|
+
priory?: number;
|
|
84
|
+
};
|
|
85
|
+
export type ValidatorOption<T> = T | ExtendsValidatorOptions<T>;
|
|
86
|
+
type ProcessValidator<T> = T extends Record<string, unknown> ? {
|
|
87
|
+
[K in keyof T]: T[K] | ValidatorOption<T[K]>;
|
|
88
|
+
} : never;
|
|
89
|
+
type GetValidatorValue<V> = V extends ExtendsValidatorOptions<infer T> ? T : never;
|
|
90
|
+
export type FieldConfigType<T, F> = BaseFieldValidators<T, F> & ProcessValidator<ArrayFieldValidators> & ProcessValidator<FileFieldValidators> & ProcessValidator<StringFieldValidators> & ProcessValidator<DateTimeFieldValidators> & ProcessValidator<NumberFieldValidators>;
|
|
91
|
+
/**
|
|
92
|
+
* Тип схемы валидации формы.
|
|
93
|
+
*
|
|
94
|
+
* Каждый ключ соответствует пути к полю формы (`FormPath`) и описывает правила валидации для этого поля.
|
|
95
|
+
* Используется внутри хука {@link useForm} для автоматической проверки значений и управления ошибками.
|
|
96
|
+
*
|
|
97
|
+
* Пример использования:
|
|
98
|
+
* ```ts
|
|
99
|
+
* const scheme: FormSchemeType<TestFormType> = {
|
|
100
|
+
* baseInput: {
|
|
101
|
+
* minStr: { setting: 3, message: 'Минимум 3 символа' },
|
|
102
|
+
* maxStr: 10,
|
|
103
|
+
* required: { setting: true, message: 'Обязательное поле' },
|
|
104
|
+
* },
|
|
105
|
+
* textarea: {
|
|
106
|
+
* custom: (value) => value?.includes('_') ? 'Символ _ запрещен' : false,
|
|
107
|
+
* noSpace: true,
|
|
108
|
+
* },
|
|
109
|
+
* 'selects.select': {
|
|
110
|
+
* required: true
|
|
111
|
+
* }
|
|
112
|
+
* };
|
|
113
|
+
* ```
|
|
114
|
+
*
|
|
115
|
+
* ---
|
|
116
|
+
* ### ⚙️ Поддерживаемые типы полей и валидаторы:
|
|
117
|
+
*
|
|
118
|
+
* | Тип данных | Валидаторы |
|
|
119
|
+
* |------------|------------|
|
|
120
|
+
* | Строка | {@link StringFieldValidators} |
|
|
121
|
+
* | Число | {@link NumberFieldValidators} |
|
|
122
|
+
* | Дата / Время | {@link DateTimeFieldValidators} |
|
|
123
|
+
* | Массив | {@link ArrayFieldValidators} |
|
|
124
|
+
* | Файл | {@link FileFieldValidators} |
|
|
125
|
+
* | Общие для всех полей | {@link BaseFieldValidators} (`required`, `equalsTo`, `custom`) |
|
|
126
|
+
*
|
|
127
|
+
* ---
|
|
128
|
+
* ### ⚙️ Настройки валидаторов:
|
|
129
|
+
*
|
|
130
|
+
* Каждый валидатор можно задать напрямую либо через обертку конфигурации:
|
|
131
|
+
* - {@link ValidatorOption} — либо значение валидатора, либо объект с настройкой и сообщением;
|
|
132
|
+
* - {@link ExtendsValidatorOptions} — расширенная конфигурация валидатора с полями `setting`, `message` и `priory`.
|
|
133
|
+
*
|
|
134
|
+
* Валидаторы с приоритетом `priory` выполняются раньше остальных.
|
|
135
|
+
*
|
|
136
|
+
* @template T — тип данных формы (например, интерфейс или тип объекта формы).
|
|
137
|
+
*/
|
|
138
|
+
export type FormSchemeType<T> = Partial<T> extends infer Form ? {
|
|
139
|
+
[K in GetFormValidateFunPathType<Form>]?: FieldConfigType<Form, GetFormValidateFunValueType<Form, K>>;
|
|
140
|
+
} : never;
|
|
141
|
+
export type FieldPropsType<V> = {
|
|
142
|
+
value?: V;
|
|
143
|
+
onChange?: (value?: V) => void;
|
|
144
|
+
error?: FormErrorType;
|
|
145
|
+
onBlur?: () => void;
|
|
146
|
+
};
|
|
147
|
+
export type AllValidatorsType = ArrayFieldValidators & FileFieldValidators & StringFieldValidators & DateTimeFieldValidators & NumberFieldValidators;
|
|
148
|
+
export type ValidatorsConfigType = {
|
|
149
|
+
[K in keyof AllValidatorsType]: (value: any, setting: GetValidatorValue<AllValidatorsType[K]>) => boolean;
|
|
150
|
+
};
|
|
151
|
+
export {};
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { FieldPropsType, FormErrorsType, FormErrorType, GetFormValidateFunPathType } from "../../hooks";
|
|
2
|
+
import { FormPath, FormSchemeType, FormValue } from "./types";
|
|
3
|
+
type PropsType<T> = [{
|
|
4
|
+
initFormData?: T;
|
|
5
|
+
scheme?: FormSchemeType<T>;
|
|
6
|
+
}];
|
|
7
|
+
/**
|
|
8
|
+
* Хук `useForm` — универсальное решение для управления и валидации форм с полной статической типизацией.
|
|
9
|
+
*
|
|
10
|
+
* При указании generic-типа `Form` (например, `useForm<MyFormType>()`) вы получаете:
|
|
11
|
+
* - строгую типизацию всех полей формы;
|
|
12
|
+
* - контроль значений, ошибок и валидации;
|
|
13
|
+
* - удобную интеграцию с готовыми компонентами (`FormField`, `FormSelectField`, `FormRadioField`, `FormSwitcherField`, `FormTextareaField`);
|
|
14
|
+
* - возможность легко использовать собственные поля.
|
|
15
|
+
*
|
|
16
|
+
* ---
|
|
17
|
+
* ### 💡 Основная идея
|
|
18
|
+
* Все поля формы управляются внутри хука.
|
|
19
|
+
* Для внешнего контроля состояния формы и ошибок можно использовать `setFormData` и `setError`.
|
|
20
|
+
*
|
|
21
|
+
* При регистрации поля через `register`:
|
|
22
|
+
* - создаются функции валидации;
|
|
23
|
+
* - возвращаются пропсы (`FieldPropsType`), которые можно напрямую передавать в компонент поля.
|
|
24
|
+
*
|
|
25
|
+
* ---
|
|
26
|
+
* ### ✅ Способы задания валидации
|
|
27
|
+
*
|
|
28
|
+
* **1. Через `register`:**
|
|
29
|
+
* ```tsx
|
|
30
|
+
* <FormField
|
|
31
|
+
* {...register('baseInput', { required: { setting: true, message: 'Обязательное поле' } })}
|
|
32
|
+
* label="Base input"
|
|
33
|
+
* hint="Обычная строка"
|
|
34
|
+
* />
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* **2. Через схему `scheme`:**
|
|
38
|
+
* ```ts
|
|
39
|
+
* const scheme: FormSchemeType<TestFormType> = {
|
|
40
|
+
* baseInput: {
|
|
41
|
+
* minStr: { setting: 3, message: 'Минимум 3 символа' },
|
|
42
|
+
* maxStr: 10,
|
|
43
|
+
* },
|
|
44
|
+
* textarea: {
|
|
45
|
+
* custom: (value) =>
|
|
46
|
+
* value?.includes('_') ? 'В тексте есть запрещенный символ' : false,
|
|
47
|
+
* noSpace: true,
|
|
48
|
+
* },
|
|
49
|
+
* 'selects.select': {
|
|
50
|
+
* required: { setting: true, message: 'Поле обязательное' },
|
|
51
|
+
* },
|
|
52
|
+
* };
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* Для более подробного ознакомления с полями схемы можно ознакомиться с типом {@link FormSchemeType}.
|
|
56
|
+
*
|
|
57
|
+
* ---
|
|
58
|
+
* ### 🧩 Пример использования
|
|
59
|
+
* ```tsx
|
|
60
|
+
* type TestFormType = {
|
|
61
|
+
* baseInput: string;
|
|
62
|
+
* textarea: string;
|
|
63
|
+
* selects: {
|
|
64
|
+
* select: number;
|
|
65
|
+
* selectMulti: number[];
|
|
66
|
+
* };
|
|
67
|
+
* addition: [
|
|
68
|
+
* { switcher: boolean },
|
|
69
|
+
* { radio: { multi: string[]; default: string } },
|
|
70
|
+
* ];
|
|
71
|
+
* };
|
|
72
|
+
*
|
|
73
|
+
* export function FormPage() {
|
|
74
|
+
* const { register, formData, errors, isFormValid } = useForm<TestFormType>({ scheme });
|
|
75
|
+
*
|
|
76
|
+
* return (
|
|
77
|
+
* <div>
|
|
78
|
+
* <FormField
|
|
79
|
+
* {...register('baseInput', { required: { setting: true, message: 'Обязательное поле' } })}
|
|
80
|
+
* label="base input"
|
|
81
|
+
* hint="Обычная строка"
|
|
82
|
+
* />
|
|
83
|
+
*
|
|
84
|
+
* <FormTextareaField {...register('textarea')} />
|
|
85
|
+
*
|
|
86
|
+
* <FormSwitcherField {...register('addition[0].switcher')} />
|
|
87
|
+
*
|
|
88
|
+
* <FormRadioField {...register('addition[1].radio.default')} options={radioOptions} />
|
|
89
|
+
* <FormRadioField {...register('addition[1].radio.multi')} options={radioOptions} multiple />
|
|
90
|
+
*
|
|
91
|
+
* <FormSelectField
|
|
92
|
+
* {...register('selects.select')}
|
|
93
|
+
* options={selectOptions}
|
|
94
|
+
* label="selects.select"
|
|
95
|
+
* required
|
|
96
|
+
* hint="Select с выбором только одного элемента"
|
|
97
|
+
* />
|
|
98
|
+
*
|
|
99
|
+
* <FormSelectField
|
|
100
|
+
* {...register('selects.selectMulti')}
|
|
101
|
+
* multiple
|
|
102
|
+
* required
|
|
103
|
+
* options={selectOptions}
|
|
104
|
+
* label="selects.selectMulti"
|
|
105
|
+
* hint="Select с выбором нескольких элементов"
|
|
106
|
+
* />
|
|
107
|
+
*
|
|
108
|
+
* <button disabled={!isFormValid()}>Отправить</button>
|
|
109
|
+
* </div>
|
|
110
|
+
* );
|
|
111
|
+
* }
|
|
112
|
+
* ```
|
|
113
|
+
*
|
|
114
|
+
* ---
|
|
115
|
+
* ### ⚙️ Основные методы и значения
|
|
116
|
+
*
|
|
117
|
+
* | Переменная / метод | Тип | Назначение |
|
|
118
|
+
* |---------------------|------|-------------|
|
|
119
|
+
* | `formData` | `T` | Текущее состояние формы (реактивное) |
|
|
120
|
+
* | `setFormData(data)` | `(data: T) => void` | Полностью заменяет состояние формы |
|
|
121
|
+
* | `getFormData()` | `() => T` | Возвращает актуальные данные формы |
|
|
122
|
+
* | `errors` | `FormErrorsType<T>` | Объект всех ошибок формы |
|
|
123
|
+
* | `setErrors(errors)` | `(errors: FormErrorsType<T>) => void` | Полностью заменяет состояние ошибок |
|
|
124
|
+
* | `getField(path)` | `(path) => value` | Возвращает текущее значение поля |
|
|
125
|
+
* | `setField(path, value)` | `(path, value) => void` | Устанавливает значение поля |
|
|
126
|
+
* | `getError(path)` | `(path) => FormErrorType` | Возвращает ошибку конкретного поля |
|
|
127
|
+
* | `setError(path, error)` | `(path, error) => void` | Устанавливает ошибку вручную |
|
|
128
|
+
* | `highlightField(path)` | `(path) => Promise<void>` | Проверяет конкретное поле и обновляет `errors` |
|
|
129
|
+
* | `highlightFormErrors()` | `() => Promise<void>` | Проверяет всю форму и обновляет `errors` |
|
|
130
|
+
* | `isFieldValid(path)` | `(path) => boolean` | Проверяет валидность поля (без обновления `errors`) |
|
|
131
|
+
* | `isFormValid()` | `() => boolean` | Проверяет, валидна ли вся форма (без обновления `errors`) |
|
|
132
|
+
* | `clearForm()` | `() => void` | Сбрасывает все значения формы |
|
|
133
|
+
* | `clearErrors()` | `() => void` | Очищает все ошибки |
|
|
134
|
+
* | `register(path, config?)` | `(path, config?) => FieldPropsType` | Регистрирует поле и возвращает пропсы для компонента |
|
|
135
|
+
*
|
|
136
|
+
* ---
|
|
137
|
+
* @template Form — объект, описывающий форму.
|
|
138
|
+
* @template T — частичный тип формы (используется для инициализации, по умолчанию `Partial<Form>`).
|
|
139
|
+
*
|
|
140
|
+
* @param {Object} [params]
|
|
141
|
+
* @param {T} [params.initFormData] — начальные данные формы.
|
|
142
|
+
* @param {FormSchemeType<T>} [params.scheme] — схема валидации формы.
|
|
143
|
+
*
|
|
144
|
+
* @returns {{
|
|
145
|
+
* /** Текущее состояние формы (реактивное) *\/
|
|
146
|
+
* formData: T;
|
|
147
|
+
*
|
|
148
|
+
* /** Установка полного состояния формы *\/
|
|
149
|
+
* setFormData: (data: T) => void;
|
|
150
|
+
*
|
|
151
|
+
* /** Получение текущего состояния формы *\/
|
|
152
|
+
* getFormData: () => T;
|
|
153
|
+
*
|
|
154
|
+
* /** Все ошибки формы *\/
|
|
155
|
+
* errors: FormErrorsType<T>;
|
|
156
|
+
*
|
|
157
|
+
* /** Замена всех ошибок формы *\/
|
|
158
|
+
* setErrors: (errors: FormErrorsType<T>) => void;
|
|
159
|
+
*
|
|
160
|
+
* /** Получение значения поля *\/
|
|
161
|
+
* getField: <P extends FormPath<T>>(path: P) => FormValue<T, P>;
|
|
162
|
+
*
|
|
163
|
+
* /** Установка значения поля *\/
|
|
164
|
+
* setField: <P extends FormPath<T>>(path: P, value: FormValue<T, P> | undefined) => void;
|
|
165
|
+
*
|
|
166
|
+
* /** Получение ошибки конкретного поля *\/
|
|
167
|
+
* getError: <P extends FormPath<T>>(path: P) => FormErrorType;
|
|
168
|
+
*
|
|
169
|
+
* /** Установка ошибки поля вручную *\/
|
|
170
|
+
* setError: <P extends FormPath<T>>(path: P, error: FormErrorType) => void;
|
|
171
|
+
*
|
|
172
|
+
* /** Проверка конкретного поля с обновлением `errors` *\/
|
|
173
|
+
* highlightField: <P extends GetFormValidateFunPathType<T>>(path: P) => Promise<void>;
|
|
174
|
+
*
|
|
175
|
+
* /** Проверка всех полей формы с обновлением `errors` *\/
|
|
176
|
+
* highlightFormErrors: () => Promise<void>;
|
|
177
|
+
*
|
|
178
|
+
* /** Проверка валидности конкретного поля (без обновления `errors`) *\/
|
|
179
|
+
* isFieldValid: <P extends GetFormValidateFunPathType<T>>(path: P) => boolean;
|
|
180
|
+
*
|
|
181
|
+
* /** Проверка валидности всей формы (без обновления `errors`) *\/
|
|
182
|
+
* isFormValid: () => boolean;
|
|
183
|
+
*
|
|
184
|
+
* /** Сброс всех значений формы *\/
|
|
185
|
+
* clearForm: () => void;
|
|
186
|
+
*
|
|
187
|
+
* /** Очистка всех ошибок *\/
|
|
188
|
+
* clearErrors: () => void;
|
|
189
|
+
*
|
|
190
|
+
* /** Регистрация поля с привязкой валидации и значений *\/
|
|
191
|
+
* register: <P extends FormPath<T>>(path: P, config?: FormSchemeType<T>[P]) => FieldPropsType<FormValue<T, P>>;
|
|
192
|
+
* }}
|
|
193
|
+
*/
|
|
194
|
+
export declare function useForm<Form, T extends Partial<Form> = Partial<Form>>(...args: PropsType<T>): {
|
|
195
|
+
formData: T | undefined;
|
|
196
|
+
setFormData: (formData: T) => void;
|
|
197
|
+
getFormData: () => T | undefined;
|
|
198
|
+
errors: FormErrorsType<T>;
|
|
199
|
+
setErrors: (errors: FormErrorsType<T>) => void;
|
|
200
|
+
getField: <P extends FormPath<T>>(path: P) => FormValue<T, P> | undefined;
|
|
201
|
+
setField: <P extends FormPath<T>>(path: P, value: FormValue<T, P> | undefined) => void;
|
|
202
|
+
getError: <P extends FormPath<T>>(path: P) => FormErrorType | undefined;
|
|
203
|
+
setError: <P extends FormPath<T>>(path: P, error: FormErrorType) => void;
|
|
204
|
+
highlightField: <P extends GetFormValidateFunPathType<T>>(path: P) => Promise<void>;
|
|
205
|
+
highlightFormErrors: () => Promise<void>;
|
|
206
|
+
isFieldValid: <P extends GetFormValidateFunPathType<T>>(path: P) => Promise<boolean>;
|
|
207
|
+
isFormValid: () => Promise<boolean>;
|
|
208
|
+
clearForm: () => void;
|
|
209
|
+
clearErrors: () => void;
|
|
210
|
+
register: <P extends FormPath<T>>(path: P, config?: FormSchemeType<T>[P]) => FieldPropsType<FormValue<T, P>>;
|
|
211
|
+
};
|
|
212
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './validateRequired';
|
|
2
|
+
export * from './validateEqualsTo';
|
|
3
|
+
export * from './validateArray';
|
|
4
|
+
export * from './validateDateTime';
|
|
5
|
+
export * from './validateNum';
|
|
6
|
+
export * from './validateFile';
|
|
7
|
+
export * from './validateStr';
|
|
8
|
+
export * from './config';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function validateArrayMaxCount(value: unknown, maxCount: number): boolean;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function validateDateTimeMinDate(value: unknown, min: string | number | Date): boolean;
|
|
2
|
+
export declare function validateDateTimeMaxDate(value: unknown, max: string | number | Date): boolean;
|
|
3
|
+
export declare function validateDateTimeMinTime(value: unknown, min: string | number | Date): boolean;
|
|
4
|
+
export declare function validateDateTimeMaxTime(value: unknown, max: string | number | Date): boolean;
|
|
5
|
+
export declare function validateDateTimePast(value: unknown): boolean;
|
|
6
|
+
export declare function validateDateTimeFuture(value: unknown): boolean;
|
|
7
|
+
export declare function validateDateTimeToday(value: unknown): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function validateEqualsTo<T>(currentValue: T, getExpectedValue: () => T): boolean;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function validateNumMin(value: unknown, min: number): boolean;
|
|
2
|
+
export declare function validateNumMax(value: unknown, max: number): boolean;
|
|
3
|
+
export declare function validateNumInteger(value: unknown): boolean;
|
|
4
|
+
export declare function validateNumPositive(value: unknown): boolean;
|
|
5
|
+
export declare function validateNumNegative(value: unknown): boolean;
|
|
6
|
+
export declare function validateNumRange(value: unknown, range: [number, number]): boolean;
|