@ttoss/forms 0.25.6 → 0.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -674
- package/dist/Brazil/index.d.ts +24 -0
- package/dist/FormFieldPatternFormat-CkcL14ho.d.ts +10 -0
- package/dist/MultistepForm/index.d.ts +65 -0
- package/dist/esm/Brazil/index.js +51 -0
- package/dist/esm/MultistepForm/index.js +2502 -0
- package/dist/esm/chunk-6U527R3X.js +741 -0
- package/dist/esm/index.js +3 -0
- package/dist/index.d.ts +107 -0
- package/{src/yup/typings.d.ts → dist/typings.d-HZBqJJjn.d.ts} +1 -3
- package/package.json +11 -11
- package/src/Brazil/FormFieldCEP.tsx +0 -25
- package/src/Brazil/FormFieldCNPJ.tsx +0 -93
- package/src/Brazil/FormFieldPhone.tsx +0 -41
- package/src/Brazil/index.ts +0 -4
- package/src/Form.tsx +0 -29
- package/src/FormErrorMessage.tsx +0 -60
- package/src/FormField.tsx +0 -86
- package/src/FormFieldCheckbox.tsx +0 -49
- package/src/FormFieldCreditCardNumber.tsx +0 -25
- package/src/FormFieldCurrencyInput.tsx +0 -36
- package/src/FormFieldInput.tsx +0 -43
- package/src/FormFieldNumericFormat.tsx +0 -35
- package/src/FormFieldPassword.tsx +0 -43
- package/src/FormFieldPatternFormat.tsx +0 -36
- package/src/FormFieldRadio.tsx +0 -57
- package/src/FormFieldSelect.tsx +0 -47
- package/src/FormFieldTextarea.tsx +0 -36
- package/src/FormGroup.tsx +0 -136
- package/src/MultistepForm/MultistepFlowMessage.tsx +0 -14
- package/src/MultistepForm/MultistepFlowMessageImageText.tsx +0 -37
- package/src/MultistepForm/MultistepFooter.tsx +0 -18
- package/src/MultistepForm/MultistepForm.tsx +0 -117
- package/src/MultistepForm/MultistepFormStepper.tsx +0 -70
- package/src/MultistepForm/MultistepHeader.tsx +0 -78
- package/src/MultistepForm/MultistepNavigation.tsx +0 -38
- package/src/MultistepForm/MultistepQuestion.tsx +0 -28
- package/src/MultistepForm/index.ts +0 -1
- package/src/MultistepForm/types.ts +0 -7
- package/src/index.ts +0 -35
- package/src/yup/i18n.ts +0 -31
- package/src/yup/schema.ts +0 -26
- package/src/yup/yup.ts +0 -4
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
|
|
2
|
+
import { Controller, Form, FormErrorMessage, FormField, FormFieldCheckbox, FormFieldCreditCardNumber, FormFieldCurrencyInput, FormFieldInput, FormFieldNumericFormat, FormFieldPassword, FormFieldPatternFormat, FormFieldRadio, FormFieldSelect, FormFieldTextarea, FormGroup, FormProvider, useController, useFieldArray, useForm, useFormContext, useFormGroup, useFormState, useWatch, yup, yupResolver } from "./chunk-6U527R3X.js";
|
|
3
|
+
export { Controller, Form, FormErrorMessage, FormField, FormFieldCheckbox, FormFieldCreditCardNumber, FormFieldCurrencyInput, FormFieldInput, FormFieldNumericFormat, FormFieldPassword, FormFieldPatternFormat, FormFieldRadio, FormFieldSelect, FormFieldTextarea, FormGroup, FormProvider, useController, useFieldArray, useForm, useFormContext, useFormGroup, useFormState, useWatch, yup, yupResolver };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export { yupResolver } from '@hookform/resolvers/yup';
|
|
2
|
+
import './typings.d-HZBqJJjn.js';
|
|
3
|
+
import * as yup from 'yup';
|
|
4
|
+
export { yup };
|
|
5
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import { BoxProps, SxProp, CheckboxProps, InputProps, InputPasswordProps, RadioProps, SelectProps, TextareaProps } from '@ttoss/ui';
|
|
8
|
+
import { FieldValues, FormProviderProps, FieldName, FieldPath, UseControllerReturn, FieldPathValue } from 'react-hook-form';
|
|
9
|
+
export * from 'react-hook-form';
|
|
10
|
+
export { Controller, FormProvider, useController, useFieldArray, useForm, useFormContext, useFormState, useWatch } from 'react-hook-form';
|
|
11
|
+
import { F as FormFieldPatternFormatProps } from './FormFieldPatternFormat-CkcL14ho.js';
|
|
12
|
+
export { a as FormFieldPatternFormat } from './FormFieldPatternFormat-CkcL14ho.js';
|
|
13
|
+
import { NumericFormatProps } from 'react-number-format';
|
|
14
|
+
|
|
15
|
+
declare const Form: <TFieldValues extends FieldValues = FieldValues>({ children, onSubmit, sx, ...formMethods }: {
|
|
16
|
+
children?: React.ReactNode;
|
|
17
|
+
onSubmit?: (data: TFieldValues) => Promise<void> | void;
|
|
18
|
+
sx?: BoxProps["sx"];
|
|
19
|
+
} & FormProviderProps<TFieldValues>) => react_jsx_runtime.JSX.Element;
|
|
20
|
+
|
|
21
|
+
declare const FormErrorMessage: <TFieldValues extends FieldValues = FieldValues>({ name, disabled, }: {
|
|
22
|
+
name: FieldName<TFieldValues>;
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
25
|
+
|
|
26
|
+
type FormFieldProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> = {
|
|
27
|
+
label?: string;
|
|
28
|
+
id?: string;
|
|
29
|
+
name: TName;
|
|
30
|
+
defaultValue?: FieldPathValue<TFieldValues, TName>;
|
|
31
|
+
disabled?: boolean;
|
|
32
|
+
tooltip?: boolean;
|
|
33
|
+
onTooltipClick?: () => void;
|
|
34
|
+
} & SxProp;
|
|
35
|
+
type FormFieldCompleteProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> = {
|
|
36
|
+
render: (props: UseControllerReturn<TFieldValues, TName>) => React.ReactElement;
|
|
37
|
+
} & FormFieldProps<TFieldValues, TName>;
|
|
38
|
+
declare const FormField: <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ label, id: idProp, name, defaultValue, disabled, tooltip, onTooltipClick, sx, css, render, }: FormFieldCompleteProps<TFieldValues, TName>) => react_jsx_runtime.JSX.Element;
|
|
39
|
+
|
|
40
|
+
declare const FormFieldCheckbox: <TFieldValues extends FieldValues = FieldValues>({ label, name, sx, ...checkboxProps }: {
|
|
41
|
+
label?: string;
|
|
42
|
+
name: FieldPath<TFieldValues>;
|
|
43
|
+
} & CheckboxProps) => react_jsx_runtime.JSX.Element;
|
|
44
|
+
|
|
45
|
+
type FormFieldCreditCardNumberProps = {
|
|
46
|
+
label: string;
|
|
47
|
+
name: string;
|
|
48
|
+
} & Partial<FormFieldPatternFormatProps>;
|
|
49
|
+
declare const FormFieldCreditCardNumber: ({ label, name, ...formFieldPatternFormatProps }: FormFieldCreditCardNumberProps) => react_jsx_runtime.JSX.Element;
|
|
50
|
+
|
|
51
|
+
type FormFieldNumericFormatProps = {
|
|
52
|
+
label?: string;
|
|
53
|
+
name: string;
|
|
54
|
+
} & NumericFormatProps;
|
|
55
|
+
declare const FormFieldNumericFormat: ({ label, name, ...numericFormatProps }: FormFieldNumericFormatProps) => react_jsx_runtime.JSX.Element;
|
|
56
|
+
|
|
57
|
+
type FormFieldCurrencyInputProps = {
|
|
58
|
+
label?: string;
|
|
59
|
+
name: string;
|
|
60
|
+
prefix: string;
|
|
61
|
+
decimalSeparator: string;
|
|
62
|
+
thousandSeparator: string;
|
|
63
|
+
} & FormFieldNumericFormatProps;
|
|
64
|
+
declare const FormFieldCurrencyInput: ({ label, name, prefix, decimalSeparator, thousandSeparator, ...formFieldNumericFormatProps }: FormFieldCurrencyInputProps) => react_jsx_runtime.JSX.Element;
|
|
65
|
+
|
|
66
|
+
type FormFieldInputProps<TName> = {
|
|
67
|
+
label?: string;
|
|
68
|
+
name: TName;
|
|
69
|
+
} & InputProps & FormFieldProps;
|
|
70
|
+
declare const FormFieldInput: <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ label, name, tooltip, onTooltipClick, sx, defaultValue, ...inputProps }: FormFieldInputProps<TName>) => react_jsx_runtime.JSX.Element;
|
|
71
|
+
|
|
72
|
+
type FormFieldPasswordProps<TName> = {
|
|
73
|
+
label?: string;
|
|
74
|
+
name: TName;
|
|
75
|
+
} & InputPasswordProps & FormFieldProps;
|
|
76
|
+
declare const FormFieldPassword: <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ label, name, tooltip, onTooltipClick, sx, defaultValue, ...inputProps }: FormFieldPasswordProps<TName>) => react_jsx_runtime.JSX.Element;
|
|
77
|
+
|
|
78
|
+
type FormRadioOption = {
|
|
79
|
+
value: string | number;
|
|
80
|
+
label: string;
|
|
81
|
+
};
|
|
82
|
+
declare const FormFieldRadio: <TFieldValues extends FieldValues = FieldValues>({ label, name, options, sx, ...radioProps }: {
|
|
83
|
+
label?: string;
|
|
84
|
+
name: FieldPath<TFieldValues>;
|
|
85
|
+
options: FormRadioOption[];
|
|
86
|
+
} & RadioProps) => react_jsx_runtime.JSX.Element;
|
|
87
|
+
|
|
88
|
+
type FormFieldSelectProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> = Omit<SelectProps, 'defaultValue'> & FormFieldProps<TFieldValues, TName>;
|
|
89
|
+
declare const FormFieldSelect: <TFieldValues extends FieldValues = FieldValues>({ label, name, id, defaultValue, sx, css, disabled, tooltip, onTooltipClick, ...selectProps }: FormFieldSelectProps<TFieldValues>) => react_jsx_runtime.JSX.Element;
|
|
90
|
+
|
|
91
|
+
declare const FormFieldTextarea: <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ label, name, sx, ...textareaProps }: {
|
|
92
|
+
label?: string;
|
|
93
|
+
name: TName;
|
|
94
|
+
} & TextareaProps) => react_jsx_runtime.JSX.Element;
|
|
95
|
+
|
|
96
|
+
declare const useFormGroup: () => {
|
|
97
|
+
level: number | undefined;
|
|
98
|
+
levelsLength: number;
|
|
99
|
+
};
|
|
100
|
+
type FormGroupProps = {
|
|
101
|
+
name?: string;
|
|
102
|
+
title?: string;
|
|
103
|
+
direction?: 'column' | 'row';
|
|
104
|
+
} & BoxProps;
|
|
105
|
+
declare const FormGroup: (props: FormGroupProps) => react_jsx_runtime.JSX.Element;
|
|
106
|
+
|
|
107
|
+
export { Form, FormErrorMessage, FormField, FormFieldCheckbox, FormFieldCreditCardNumber, FormFieldCurrencyInput, FormFieldInput, FormFieldNumericFormat, FormFieldPassword, FormFieldRadio, FormFieldSelect, FormFieldTextarea, FormGroup, useFormGroup };
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ttoss/forms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.1",
|
|
4
|
+
"license": "MIT",
|
|
4
5
|
"author": "ttoss",
|
|
5
6
|
"contributors": [
|
|
6
7
|
"Pedro Arantes <pedro@arantespp.com> (https://arantespp.com/contact)"
|
|
@@ -26,8 +27,7 @@
|
|
|
26
27
|
}
|
|
27
28
|
},
|
|
28
29
|
"files": [
|
|
29
|
-
"dist"
|
|
30
|
-
"src"
|
|
30
|
+
"dist"
|
|
31
31
|
],
|
|
32
32
|
"sideEffects": true,
|
|
33
33
|
"dependencies": {
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
41
|
"react": ">=16.8.0",
|
|
42
|
-
"@ttoss/react-i18n": "^2.0.
|
|
43
|
-
"@ttoss/ui": "^5.0.
|
|
42
|
+
"@ttoss/react-i18n": "^2.0.4",
|
|
43
|
+
"@ttoss/ui": "^5.0.8"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/jest": "^29.5.13",
|
|
@@ -50,12 +50,12 @@
|
|
|
50
50
|
"react-error-boundary": "^4.0.13",
|
|
51
51
|
"tsup": "^8.3.0",
|
|
52
52
|
"yup": "^1.4.0",
|
|
53
|
-
"@ttoss/
|
|
54
|
-
"@ttoss/
|
|
55
|
-
"@ttoss/react-
|
|
56
|
-
"@ttoss/
|
|
57
|
-
"@ttoss/
|
|
58
|
-
"@ttoss/
|
|
53
|
+
"@ttoss/config": "^1.34.1",
|
|
54
|
+
"@ttoss/i18n-cli": "^0.7.22",
|
|
55
|
+
"@ttoss/react-icons": "^0.4.4",
|
|
56
|
+
"@ttoss/ui": "^5.0.8",
|
|
57
|
+
"@ttoss/react-i18n": "^2.0.4",
|
|
58
|
+
"@ttoss/test-utils": "^2.1.17"
|
|
59
59
|
},
|
|
60
60
|
"publishConfig": {
|
|
61
61
|
"access": "public",
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
FormFieldPatternFormat,
|
|
3
|
-
FormFieldPatternFormatProps,
|
|
4
|
-
} from '../FormFieldPatternFormat';
|
|
5
|
-
|
|
6
|
-
export type FormFieldCEPProps = {
|
|
7
|
-
label: string;
|
|
8
|
-
name: string;
|
|
9
|
-
} & Partial<FormFieldPatternFormatProps>;
|
|
10
|
-
|
|
11
|
-
export const FormFieldCEP = ({
|
|
12
|
-
label,
|
|
13
|
-
name,
|
|
14
|
-
...formFieldPatternFormatProps
|
|
15
|
-
}: FormFieldCEPProps) => {
|
|
16
|
-
return (
|
|
17
|
-
<FormFieldPatternFormat
|
|
18
|
-
name={name}
|
|
19
|
-
label={label}
|
|
20
|
-
format="#####-###"
|
|
21
|
-
placeholder="12345-678"
|
|
22
|
-
{...formFieldPatternFormatProps}
|
|
23
|
-
/>
|
|
24
|
-
);
|
|
25
|
-
};
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { FormField } from '..';
|
|
2
|
-
import { Input } from '@ttoss/ui';
|
|
3
|
-
import { PatternFormat, PatternFormatProps } from 'react-number-format';
|
|
4
|
-
|
|
5
|
-
export type FormFieldCNPJProps = {
|
|
6
|
-
label: string;
|
|
7
|
-
name: string;
|
|
8
|
-
} & Partial<PatternFormatProps>;
|
|
9
|
-
|
|
10
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
-
export const isCnpjValid = (cnpj: any) => {
|
|
12
|
-
if (cnpj?.length != 14) {
|
|
13
|
-
return false;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
if (
|
|
17
|
-
cnpj == '00000000000000' ||
|
|
18
|
-
cnpj == '11111111111111' ||
|
|
19
|
-
cnpj == '22222222222222' ||
|
|
20
|
-
cnpj == '33333333333333' ||
|
|
21
|
-
cnpj == '44444444444444' ||
|
|
22
|
-
cnpj == '55555555555555' ||
|
|
23
|
-
cnpj == '66666666666666' ||
|
|
24
|
-
cnpj == '77777777777777' ||
|
|
25
|
-
cnpj == '88888888888888' ||
|
|
26
|
-
cnpj == '99999999999999'
|
|
27
|
-
) {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Valida DVs
|
|
32
|
-
let size = cnpj.length - 2;
|
|
33
|
-
let numbers = cnpj.substring(0, size);
|
|
34
|
-
const digits = cnpj.substring(size);
|
|
35
|
-
let soma = 0;
|
|
36
|
-
let pos = size - 7;
|
|
37
|
-
for (let i = size; i >= 1; i--) {
|
|
38
|
-
soma += numbers.charAt(size - i) * pos--;
|
|
39
|
-
if (pos < 2) {
|
|
40
|
-
pos = 9;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
let result = soma % 11 < 2 ? 0 : 11 - (soma % 11);
|
|
44
|
-
if (result != digits.charAt(0)) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
size = size + 1;
|
|
49
|
-
numbers = cnpj.substring(0, size);
|
|
50
|
-
soma = 0;
|
|
51
|
-
pos = size - 7;
|
|
52
|
-
for (let i = size; i >= 1; i--) {
|
|
53
|
-
soma += numbers.charAt(size - i) * pos--;
|
|
54
|
-
if (pos < 2) {
|
|
55
|
-
pos = 9;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
result = soma % 11 < 2 ? 0 : 11 - (soma % 11);
|
|
59
|
-
if (result != digits.charAt(1)) {
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return true;
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
export const FormFieldCNPJ = ({
|
|
67
|
-
label,
|
|
68
|
-
name,
|
|
69
|
-
...patternFormatProps
|
|
70
|
-
}: FormFieldCNPJProps) => {
|
|
71
|
-
return (
|
|
72
|
-
<FormField
|
|
73
|
-
name={name}
|
|
74
|
-
label={label}
|
|
75
|
-
render={({ field }) => {
|
|
76
|
-
return (
|
|
77
|
-
<PatternFormat
|
|
78
|
-
name={field.name}
|
|
79
|
-
value={field.value}
|
|
80
|
-
onBlur={field.onBlur}
|
|
81
|
-
onValueChange={(values) => {
|
|
82
|
-
field.onChange(values.value);
|
|
83
|
-
}}
|
|
84
|
-
format={'##.###.###/####-##'}
|
|
85
|
-
customInput={Input}
|
|
86
|
-
placeholder="12.345.678/0000-00"
|
|
87
|
-
{...patternFormatProps}
|
|
88
|
-
/>
|
|
89
|
-
);
|
|
90
|
-
}}
|
|
91
|
-
/>
|
|
92
|
-
);
|
|
93
|
-
};
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { FormField } from '../FormField';
|
|
2
|
-
import { Input } from '@ttoss/ui';
|
|
3
|
-
|
|
4
|
-
import { PatternFormat, PatternFormatProps } from 'react-number-format';
|
|
5
|
-
|
|
6
|
-
export type FormFieldPhoneProps = {
|
|
7
|
-
label: string;
|
|
8
|
-
name: string;
|
|
9
|
-
} & Partial<PatternFormatProps>;
|
|
10
|
-
|
|
11
|
-
export const FormFieldPhone = ({
|
|
12
|
-
label,
|
|
13
|
-
name,
|
|
14
|
-
...patternFormatProps
|
|
15
|
-
}: FormFieldPhoneProps) => {
|
|
16
|
-
return (
|
|
17
|
-
<FormField
|
|
18
|
-
name={name}
|
|
19
|
-
label={label}
|
|
20
|
-
render={({ field }) => {
|
|
21
|
-
const format =
|
|
22
|
-
field.value?.length > 10 ? '(##) #####-####' : '(##) ####-#####';
|
|
23
|
-
|
|
24
|
-
return (
|
|
25
|
-
<PatternFormat
|
|
26
|
-
name={field.name}
|
|
27
|
-
value={field.value}
|
|
28
|
-
onBlur={field.onBlur}
|
|
29
|
-
onValueChange={(values) => {
|
|
30
|
-
field.onChange(values.value);
|
|
31
|
-
}}
|
|
32
|
-
format={format}
|
|
33
|
-
customInput={Input}
|
|
34
|
-
placeholder="(11) 91234-1234"
|
|
35
|
-
{...patternFormatProps}
|
|
36
|
-
/>
|
|
37
|
-
);
|
|
38
|
-
}}
|
|
39
|
-
/>
|
|
40
|
-
);
|
|
41
|
-
};
|
package/src/Brazil/index.ts
DELETED
package/src/Form.tsx
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { Box, BoxProps } from '@ttoss/ui';
|
|
3
|
-
import { FieldValues, FormProvider, FormProviderProps } from 'react-hook-form';
|
|
4
|
-
|
|
5
|
-
export const Form = <TFieldValues extends FieldValues = FieldValues>({
|
|
6
|
-
children,
|
|
7
|
-
onSubmit,
|
|
8
|
-
sx,
|
|
9
|
-
...formMethods
|
|
10
|
-
}: {
|
|
11
|
-
children?: React.ReactNode;
|
|
12
|
-
onSubmit?: (data: TFieldValues) => Promise<void> | void;
|
|
13
|
-
sx?: BoxProps['sx'];
|
|
14
|
-
} & FormProviderProps<TFieldValues>) => {
|
|
15
|
-
return (
|
|
16
|
-
<FormProvider {...formMethods}>
|
|
17
|
-
<Box
|
|
18
|
-
as="form"
|
|
19
|
-
variant="forms.form"
|
|
20
|
-
onSubmit={formMethods.handleSubmit((data) => {
|
|
21
|
-
return onSubmit?.(data);
|
|
22
|
-
})}
|
|
23
|
-
sx={sx}
|
|
24
|
-
>
|
|
25
|
-
{children}
|
|
26
|
-
</Box>
|
|
27
|
-
</FormProvider>
|
|
28
|
-
);
|
|
29
|
-
};
|
package/src/FormErrorMessage.tsx
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { ErrorMessage } from '@hookform/error-message';
|
|
3
|
-
import {
|
|
4
|
-
FieldError,
|
|
5
|
-
FieldName,
|
|
6
|
-
FieldValues,
|
|
7
|
-
useFormContext,
|
|
8
|
-
} from 'react-hook-form';
|
|
9
|
-
import { FormattedMessage, MessageDescriptor } from '@ttoss/react-i18n';
|
|
10
|
-
import { HelpText } from '@ttoss/ui';
|
|
11
|
-
|
|
12
|
-
type ModifiedDescriptor = MessageDescriptor & { values?: any };
|
|
13
|
-
|
|
14
|
-
const isMessageDescriptor = (
|
|
15
|
-
possibleMessageDescriptor: unknown
|
|
16
|
-
): possibleMessageDescriptor is ModifiedDescriptor => {
|
|
17
|
-
return (
|
|
18
|
-
possibleMessageDescriptor !== undefined &&
|
|
19
|
-
(possibleMessageDescriptor as ModifiedDescriptor).defaultMessage !==
|
|
20
|
-
undefined
|
|
21
|
-
);
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export const FormErrorMessage = <
|
|
25
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
26
|
-
>({
|
|
27
|
-
name,
|
|
28
|
-
disabled,
|
|
29
|
-
}: {
|
|
30
|
-
name: FieldName<TFieldValues>;
|
|
31
|
-
disabled?: boolean;
|
|
32
|
-
}) => {
|
|
33
|
-
const {
|
|
34
|
-
formState: { errors },
|
|
35
|
-
} = useFormContext<TFieldValues>();
|
|
36
|
-
|
|
37
|
-
return (
|
|
38
|
-
<ErrorMessage
|
|
39
|
-
name={name as any}
|
|
40
|
-
errors={errors}
|
|
41
|
-
render={({ message }: { message: FieldError | string }) => {
|
|
42
|
-
return (
|
|
43
|
-
<HelpText negative disabled={disabled}>
|
|
44
|
-
{(() => {
|
|
45
|
-
if (typeof message === 'string') {
|
|
46
|
-
return message;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (isMessageDescriptor(message)) {
|
|
50
|
-
return <FormattedMessage {...message} />;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return JSON.stringify(message);
|
|
54
|
-
})()}
|
|
55
|
-
</HelpText>
|
|
56
|
-
);
|
|
57
|
-
}}
|
|
58
|
-
/>
|
|
59
|
-
);
|
|
60
|
-
};
|
package/src/FormField.tsx
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
FieldPath,
|
|
4
|
-
FieldPathValue,
|
|
5
|
-
FieldValues,
|
|
6
|
-
UseControllerReturn,
|
|
7
|
-
useController,
|
|
8
|
-
} from 'react-hook-form';
|
|
9
|
-
import { Flex, Label, type SxProp } from '@ttoss/ui';
|
|
10
|
-
import { FormErrorMessage } from './FormErrorMessage';
|
|
11
|
-
|
|
12
|
-
export type FormFieldProps<
|
|
13
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
14
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
15
|
-
> = {
|
|
16
|
-
label?: string;
|
|
17
|
-
id?: string;
|
|
18
|
-
name: TName;
|
|
19
|
-
defaultValue?: FieldPathValue<TFieldValues, TName>;
|
|
20
|
-
disabled?: boolean;
|
|
21
|
-
tooltip?: boolean;
|
|
22
|
-
onTooltipClick?: () => void;
|
|
23
|
-
} & SxProp;
|
|
24
|
-
|
|
25
|
-
type FormFieldCompleteProps<
|
|
26
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
27
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
28
|
-
> = {
|
|
29
|
-
render: (
|
|
30
|
-
props: UseControllerReturn<TFieldValues, TName>
|
|
31
|
-
) => React.ReactElement;
|
|
32
|
-
} & FormFieldProps<TFieldValues, TName>;
|
|
33
|
-
|
|
34
|
-
export const FormField = <
|
|
35
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
36
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
37
|
-
>({
|
|
38
|
-
label,
|
|
39
|
-
id: idProp,
|
|
40
|
-
name,
|
|
41
|
-
defaultValue,
|
|
42
|
-
disabled,
|
|
43
|
-
tooltip,
|
|
44
|
-
onTooltipClick,
|
|
45
|
-
sx,
|
|
46
|
-
css,
|
|
47
|
-
render,
|
|
48
|
-
}: FormFieldCompleteProps<TFieldValues, TName>) => {
|
|
49
|
-
const controllerReturn = useController<TFieldValues, TName>({
|
|
50
|
-
name,
|
|
51
|
-
defaultValue,
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
const id = idProp || `form-field-${name}`;
|
|
55
|
-
|
|
56
|
-
const memoizedRender = React.useMemo(() => {
|
|
57
|
-
return React.Children.map(render(controllerReturn), (child) => {
|
|
58
|
-
return (
|
|
59
|
-
<>
|
|
60
|
-
{label && (
|
|
61
|
-
<Label
|
|
62
|
-
aria-disabled={disabled}
|
|
63
|
-
htmlFor={id}
|
|
64
|
-
tooltip={tooltip}
|
|
65
|
-
onTooltipClick={onTooltipClick}
|
|
66
|
-
>
|
|
67
|
-
{label}
|
|
68
|
-
</Label>
|
|
69
|
-
)}
|
|
70
|
-
|
|
71
|
-
{React.createElement(child.type, { id, ...child.props })}
|
|
72
|
-
</>
|
|
73
|
-
);
|
|
74
|
-
});
|
|
75
|
-
}, [controllerReturn, disabled, onTooltipClick, tooltip, id, label, render]);
|
|
76
|
-
|
|
77
|
-
return (
|
|
78
|
-
<Flex
|
|
79
|
-
sx={{ flexDirection: 'column', width: '100%', gap: 'md', ...sx }}
|
|
80
|
-
css={css}
|
|
81
|
-
>
|
|
82
|
-
{memoizedRender}
|
|
83
|
-
<FormErrorMessage name={name} />
|
|
84
|
-
</Flex>
|
|
85
|
-
);
|
|
86
|
-
};
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Checkbox, type CheckboxProps, Flex, Label } from '@ttoss/ui';
|
|
2
|
-
import { FieldPath, FieldValues, useController } from 'react-hook-form';
|
|
3
|
-
import { FormErrorMessage } from './FormErrorMessage';
|
|
4
|
-
|
|
5
|
-
export const FormFieldCheckbox = <
|
|
6
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
7
|
-
>({
|
|
8
|
-
label,
|
|
9
|
-
name,
|
|
10
|
-
sx,
|
|
11
|
-
...checkboxProps
|
|
12
|
-
}: {
|
|
13
|
-
label?: string;
|
|
14
|
-
name: FieldPath<TFieldValues>;
|
|
15
|
-
} & CheckboxProps) => {
|
|
16
|
-
const {
|
|
17
|
-
field: { onChange, onBlur, value, ref },
|
|
18
|
-
formState: { errors },
|
|
19
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
-
} = useController<any>({
|
|
21
|
-
name,
|
|
22
|
-
defaultValue: false,
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
const id = `form-field-checkbox-${name}`;
|
|
26
|
-
|
|
27
|
-
const error = !!errors[name]?.message;
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<Flex sx={{ flexDirection: 'column', width: '100%', ...sx }}>
|
|
31
|
-
<Flex sx={{ alignItems: 'center' }}>
|
|
32
|
-
<Label aria-disabled={checkboxProps.disabled} htmlFor={id}>
|
|
33
|
-
<Checkbox
|
|
34
|
-
id={id}
|
|
35
|
-
ref={ref}
|
|
36
|
-
checked={value}
|
|
37
|
-
onChange={onChange}
|
|
38
|
-
onBlur={onBlur}
|
|
39
|
-
name={name}
|
|
40
|
-
aria-invalid={error ? 'true' : 'false'}
|
|
41
|
-
{...checkboxProps}
|
|
42
|
-
/>
|
|
43
|
-
{label}
|
|
44
|
-
</Label>
|
|
45
|
-
</Flex>
|
|
46
|
-
<FormErrorMessage name={name} />
|
|
47
|
-
</Flex>
|
|
48
|
-
);
|
|
49
|
-
};
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
FormFieldPatternFormat,
|
|
3
|
-
FormFieldPatternFormatProps,
|
|
4
|
-
} from './FormFieldPatternFormat';
|
|
5
|
-
|
|
6
|
-
export type FormFieldCreditCardNumberProps = {
|
|
7
|
-
label: string;
|
|
8
|
-
name: string;
|
|
9
|
-
} & Partial<FormFieldPatternFormatProps>;
|
|
10
|
-
|
|
11
|
-
export const FormFieldCreditCardNumber = ({
|
|
12
|
-
label,
|
|
13
|
-
name,
|
|
14
|
-
...formFieldPatternFormatProps
|
|
15
|
-
}: FormFieldCreditCardNumberProps) => {
|
|
16
|
-
return (
|
|
17
|
-
<FormFieldPatternFormat
|
|
18
|
-
name={name}
|
|
19
|
-
label={label}
|
|
20
|
-
format="#### #### #### ####"
|
|
21
|
-
placeholder="1234 1234 1234 1234"
|
|
22
|
-
{...formFieldPatternFormatProps}
|
|
23
|
-
/>
|
|
24
|
-
);
|
|
25
|
-
};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
FormFieldNumericFormat,
|
|
3
|
-
FormFieldNumericFormatProps,
|
|
4
|
-
} from './FormFieldNumericFormat';
|
|
5
|
-
|
|
6
|
-
export type FormFieldCurrencyInputProps = {
|
|
7
|
-
label?: string;
|
|
8
|
-
name: string;
|
|
9
|
-
prefix: string;
|
|
10
|
-
decimalSeparator: string;
|
|
11
|
-
thousandSeparator: string;
|
|
12
|
-
} & FormFieldNumericFormatProps;
|
|
13
|
-
|
|
14
|
-
export const FormFieldCurrencyInput = ({
|
|
15
|
-
label,
|
|
16
|
-
name,
|
|
17
|
-
prefix,
|
|
18
|
-
decimalSeparator,
|
|
19
|
-
thousandSeparator,
|
|
20
|
-
...formFieldNumericFormatProps
|
|
21
|
-
}: FormFieldCurrencyInputProps) => {
|
|
22
|
-
return (
|
|
23
|
-
<FormFieldNumericFormat
|
|
24
|
-
name={name}
|
|
25
|
-
label={label}
|
|
26
|
-
fixedDecimalScale
|
|
27
|
-
decimalScale={2}
|
|
28
|
-
prefix={prefix}
|
|
29
|
-
decimalSeparator={decimalSeparator}
|
|
30
|
-
thousandSeparator={thousandSeparator}
|
|
31
|
-
placeholder={`${prefix} 0${decimalSeparator}00`}
|
|
32
|
-
allowNegative={false}
|
|
33
|
-
{...formFieldNumericFormatProps}
|
|
34
|
-
/>
|
|
35
|
-
);
|
|
36
|
-
};
|
package/src/FormFieldInput.tsx
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { FieldPath, FieldPathValue, FieldValues } from 'react-hook-form';
|
|
2
|
-
import { FormField, type FormFieldProps } from './FormField';
|
|
3
|
-
import { Input, type InputProps } from '@ttoss/ui';
|
|
4
|
-
|
|
5
|
-
export type FormFieldInputProps<TName> = {
|
|
6
|
-
label?: string;
|
|
7
|
-
name: TName;
|
|
8
|
-
} & InputProps &
|
|
9
|
-
FormFieldProps;
|
|
10
|
-
|
|
11
|
-
export const FormFieldInput = <
|
|
12
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
13
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
14
|
-
>({
|
|
15
|
-
label,
|
|
16
|
-
name,
|
|
17
|
-
tooltip,
|
|
18
|
-
onTooltipClick,
|
|
19
|
-
sx,
|
|
20
|
-
defaultValue = '',
|
|
21
|
-
...inputProps
|
|
22
|
-
}: FormFieldInputProps<TName>) => {
|
|
23
|
-
return (
|
|
24
|
-
<FormField
|
|
25
|
-
name={name}
|
|
26
|
-
label={label}
|
|
27
|
-
disabled={inputProps.disabled}
|
|
28
|
-
tooltip={tooltip}
|
|
29
|
-
onTooltipClick={onTooltipClick}
|
|
30
|
-
sx={sx}
|
|
31
|
-
defaultValue={defaultValue as FieldPathValue<TFieldValues, TName>}
|
|
32
|
-
render={({ field, fieldState }) => {
|
|
33
|
-
return (
|
|
34
|
-
<Input
|
|
35
|
-
{...inputProps}
|
|
36
|
-
{...field}
|
|
37
|
-
aria-invalid={fieldState.error ? 'true' : undefined}
|
|
38
|
-
/>
|
|
39
|
-
);
|
|
40
|
-
}}
|
|
41
|
-
/>
|
|
42
|
-
);
|
|
43
|
-
};
|