@digigov/form 2.0.0-13876dba → 2.0.0-16da9467
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/Field/FieldBase/index.js +7 -3
- package/Field/FieldBase.js.map +2 -2
- package/Field/FieldBaseContainer/index.js +37 -18
- package/Field/FieldBaseContainer.d.ts +1 -1
- package/Field/FieldBaseContainer.js.map +2 -2
- package/Field/FieldConditional/index.js +4 -0
- package/Field/FieldConditional.js.map +2 -2
- package/Field/index.js +10 -4
- package/Field/index.js.map +2 -2
- package/Field/types.d.ts +10 -3
- package/Field/utils/index.js +3 -1
- package/Field/utils/index.js.map +2 -2
- package/Field/utils/useField/index.js +8 -1
- package/Field/utils/useField.js.map +2 -2
- package/FieldArray/FormDialog/index.js +314 -196
- package/FieldArray/FormDialog.d.ts +20 -7
- package/FieldArray/FormDialog.js.map +3 -3
- package/FieldArray/index.d.ts +1 -0
- package/FieldArray/index.js +32 -8
- package/FieldArray/index.js.map +2 -2
- package/FieldObject/index.d.ts +3 -0
- package/FieldObject/index.js +25 -14
- package/FieldObject/index.js.map +2 -2
- package/FormBuilder/index.d.ts +1 -1
- package/FormBuilder/index.js +11 -7
- package/FormBuilder/index.js.map +2 -2
- package/FormContext/index.js +6 -2
- package/FormContext.d.ts +1 -0
- package/FormContext.js.map +2 -2
- package/MultiplicityField/add-objects/index.js +2 -0
- package/MultiplicityField/add-objects.js.map +2 -2
- package/MultiplicityField/index.js +4 -1
- package/MultiplicityField/index.js.map +2 -2
- package/MultiplicityField/types.d.ts +1 -0
- package/cjs/Field/FieldBase/index.js +7 -3
- package/cjs/Field/FieldBase.js.map +2 -2
- package/cjs/Field/FieldBaseContainer/index.js +36 -17
- package/cjs/Field/FieldBaseContainer.js.map +3 -3
- package/cjs/Field/FieldConditional/index.js +4 -0
- package/cjs/Field/FieldConditional.js.map +2 -2
- package/cjs/Field/index.js +10 -4
- package/cjs/Field/index.js.map +2 -2
- package/cjs/Field/types.js.map +1 -1
- package/cjs/Field/utils/index.js +3 -1
- package/cjs/Field/utils/index.js.map +2 -2
- package/cjs/Field/utils/useField/index.js +8 -1
- package/cjs/Field/utils/useField.js.map +2 -2
- package/cjs/FieldArray/FormDialog/index.js +309 -194
- package/cjs/FieldArray/FormDialog.js.map +3 -3
- package/cjs/FieldArray/index.js +31 -7
- package/cjs/FieldArray/index.js.map +2 -2
- package/cjs/FieldObject/index.js +25 -14
- package/cjs/FieldObject/index.js.map +2 -2
- package/cjs/FormBuilder/index.js +11 -7
- package/cjs/FormBuilder/index.js.map +2 -2
- package/cjs/FormContext/index.js +7 -2
- package/cjs/FormContext.js.map +2 -2
- package/cjs/MultiplicityField/add-objects/index.js +2 -0
- package/cjs/MultiplicityField/add-objects.js.map +2 -2
- package/cjs/MultiplicityField/index.js +4 -1
- package/cjs/MultiplicityField/index.js.map +2 -2
- package/cjs/MultiplicityField/types.js.map +1 -1
- package/cjs/inputs/Checkboxes/index.js +2 -2
- package/cjs/inputs/Checkboxes/index.js.map +2 -2
- package/cjs/inputs/DateInput/index.js +41 -14
- package/cjs/inputs/DateInput/index.js.map +2 -2
- package/cjs/inputs/DateTimeInput/index.js +68 -34
- package/cjs/inputs/DateTimeInput/index.js.map +2 -2
- package/cjs/inputs/FileInput/index.js +52 -29
- package/cjs/inputs/FileInput/index.js.map +2 -2
- package/cjs/inputs/ImageInput/__stories__/logo.d/index.js +1 -0
- package/cjs/inputs/ImageInput/__stories__/logo.d.js.map +7 -0
- package/cjs/inputs/ImageInput/index.js +41 -10
- package/cjs/inputs/ImageInput/index.js.map +2 -2
- package/cjs/inputs/Input/index.js +4 -4
- package/cjs/inputs/Input/index.js.map +2 -2
- package/cjs/inputs/Select/index.js +4 -3
- package/cjs/inputs/Select/index.js.map +2 -2
- package/cjs/inputs/inputsScenarios/index.js +2 -2
- package/cjs/inputs/inputsScenarios.js.map +2 -2
- package/cjs/lazy/index.js +2 -1
- package/cjs/lazy.js.map +2 -2
- package/cjs/registry/index.js +4 -4
- package/cjs/registry.js.map +2 -2
- package/cjs/types.js.map +1 -1
- package/cjs/utils/index.js +20 -6
- package/cjs/utils.js.map +2 -2
- package/cjs/validators/index.js +11 -6
- package/cjs/validators/index.js.map +2 -2
- package/cjs/validators/utils/amka/index.js +60 -0
- package/cjs/validators/utils/amka.js.map +7 -0
- package/cjs/validators/utils/date/index.js +26 -3
- package/cjs/validators/utils/date.js.map +2 -2
- package/cjs/validators/utils/datetime/index.js +118 -24
- package/cjs/validators/utils/datetime.js.map +2 -2
- package/cjs/validators/utils/file/index.js +30 -17
- package/cjs/validators/utils/file.js.map +2 -2
- package/cjs/validators/utils/index.js +5 -1
- package/cjs/validators/utils/index.js.map +2 -2
- package/index.js +1 -1
- package/inputs/Checkboxes/index.js +2 -2
- package/inputs/Checkboxes/index.js.map +2 -2
- package/inputs/DateInput/DateInput.stories.d.ts +4 -0
- package/inputs/DateInput/__stories__/WithDefaultValue.d.ts +3 -0
- package/inputs/DateInput/__stories__/WithInitialValue.d.ts +3 -0
- package/inputs/DateInput/__stories__/WithWrongDefaultValue.d.ts +3 -0
- package/inputs/DateInput/__stories__/WithWrongInitialValue.d.ts +3 -0
- package/inputs/DateInput/index.js +42 -15
- package/inputs/DateInput/index.js.map +2 -2
- package/inputs/DateTimeInput/DateTimeInput.stories.d.ts +8 -3
- package/inputs/DateTimeInput/__stories__/WithDefaultValue.d.ts +3 -0
- package/inputs/DateTimeInput/__stories__/WithInitialValue.d.ts +3 -0
- package/inputs/DateTimeInput/__stories__/WithWrongDefaultValue.d.ts +3 -0
- package/inputs/DateTimeInput/__stories__/WithWrongInitialValue.d.ts +3 -0
- package/inputs/DateTimeInput/index.js +69 -35
- package/inputs/DateTimeInput/index.js.map +2 -2
- package/inputs/FileInput/FileInput.stories.d.ts +1 -0
- package/inputs/FileInput/__stories__/WithBorderAndLink.d.ts +3 -0
- package/inputs/FileInput/index.d.ts +11 -4
- package/inputs/FileInput/index.js +57 -31
- package/inputs/FileInput/index.js.map +2 -2
- package/inputs/ImageInput/ImageInput.stories.d.ts +2 -1
- package/inputs/ImageInput/__stories__/WithInitialValues.d.ts +3 -0
- package/inputs/ImageInput/__stories__/logo.d/index.js +1 -0
- package/inputs/ImageInput/__stories__/logo.d/package.json +6 -0
- package/inputs/ImageInput/__stories__/logo.d.js.map +7 -0
- package/inputs/ImageInput/index.d.ts +9 -1
- package/inputs/ImageInput/index.js +42 -11
- package/inputs/ImageInput/index.js.map +2 -2
- package/inputs/Input/Input.stories.d.ts +2 -0
- package/inputs/Input/__stories__/AMKA.d.ts +3 -0
- package/inputs/Input/__stories__/Email.d.ts +3 -0
- package/inputs/Input/index.d.ts +2 -1
- package/inputs/Input/index.js +4 -4
- package/inputs/Input/index.js.map +2 -2
- package/inputs/Select/index.d.ts +2 -1
- package/inputs/Select/index.js +4 -3
- package/inputs/Select/index.js.map +2 -2
- package/inputs/inputsScenarios/index.js +2 -2
- package/inputs/inputsScenarios.d.ts +1 -1
- package/inputs/inputsScenarios.js.map +2 -2
- package/lazy/index.js +2 -1
- package/package.json +8 -8
- package/registry/index.js +4 -4
- package/src/Field/FieldBase.tsx +6 -2
- package/src/Field/FieldBaseContainer.tsx +68 -48
- package/src/Field/FieldConditional.tsx +4 -0
- package/src/Field/index.tsx +15 -5
- package/src/Field/types.tsx +11 -3
- package/src/Field/utils/index.ts +2 -0
- package/src/Field/utils/useField.ts +9 -1
- package/src/FieldArray/FormDialog.tsx +430 -243
- package/src/FieldArray/__stories__/WithModal.tsx +3 -2
- package/src/FieldArray/index.tsx +53 -30
- package/src/FieldObject/index.tsx +29 -16
- package/src/FormBuilder/index.tsx +12 -7
- package/src/FormBuilder/scenarios.test.tsx +763 -5
- package/src/FormContext.tsx +5 -1
- package/src/MultiplicityField/add-objects.tsx +2 -0
- package/src/MultiplicityField/index.tsx +3 -0
- package/src/MultiplicityField/types.ts +1 -0
- package/src/inputs/Checkboxes/index.tsx +2 -6
- package/src/inputs/DateInput/DateInput.stories.js +4 -0
- package/src/inputs/DateInput/__stories__/WithDefaultValue.tsx +26 -0
- package/src/inputs/DateInput/__stories__/WithInitialValue.tsx +28 -0
- package/src/inputs/DateInput/__stories__/WithWrongDefaultValue.tsx +26 -0
- package/src/inputs/DateInput/__stories__/WithWrongInitialValue.tsx +28 -0
- package/src/inputs/DateInput/index.test.tsx +16 -0
- package/src/inputs/DateInput/index.tsx +46 -14
- package/src/inputs/DateTimeInput/DateTimeInput.stories.js +9 -6
- package/src/inputs/DateTimeInput/__stories__/WithDefaultValue.tsx +26 -0
- package/src/inputs/DateTimeInput/__stories__/WithInitialValue.tsx +28 -0
- package/src/inputs/DateTimeInput/__stories__/WithWrongDefaultValue.tsx +26 -0
- package/src/inputs/DateTimeInput/__stories__/WithWrongInitialValue.tsx +28 -0
- package/src/inputs/DateTimeInput/index.test.tsx +16 -0
- package/src/inputs/DateTimeInput/index.tsx +73 -34
- package/src/inputs/FileInput/FileInput.stories.js +1 -0
- package/src/inputs/FileInput/__stories__/WithBorderAndLink.tsx +34 -0
- package/src/inputs/FileInput/index.test.tsx +4 -0
- package/src/inputs/FileInput/index.tsx +90 -48
- package/src/inputs/ImageInput/ImageInput.stories.js +2 -1
- package/src/inputs/ImageInput/__stories__/MaxSize.tsx +2 -1
- package/src/inputs/ImageInput/__stories__/WithInitialValues.tsx +45 -0
- package/src/inputs/ImageInput/__stories__/logo.d.ts +4 -0
- package/src/inputs/ImageInput/__stories__/logo.png +0 -0
- package/src/inputs/ImageInput/index.test.tsx +21 -17
- package/src/inputs/ImageInput/index.tsx +100 -48
- package/src/inputs/Input/Input.stories.js +2 -0
- package/src/inputs/Input/__stories__/AMKA.tsx +23 -0
- package/src/inputs/Input/__stories__/Email.tsx +23 -0
- package/src/inputs/Input/index.test.tsx +8 -0
- package/src/inputs/Input/index.tsx +5 -3
- package/src/inputs/Select/index.tsx +7 -4
- package/src/inputs/inputsScenarios.ts +2 -2
- package/src/lazy.js +2 -1
- package/src/registry.js +4 -4
- package/src/types.tsx +2 -1
- package/src/utils.ts +27 -6
- package/src/validators/index.ts +17 -6
- package/src/validators/utils/amka.ts +39 -0
- package/src/validators/utils/date.ts +28 -4
- package/src/validators/utils/datetime.ts +121 -29
- package/src/validators/utils/file.ts +33 -19
- package/src/validators/utils/index.ts +4 -1
- package/types.d.ts +2 -1
- package/types.js.map +1 -1
- package/utils/index.js +20 -6
- package/utils.d.ts +2 -0
- package/utils.js.map +2 -2
- package/validators/index.d.ts +1 -1
- package/validators/index.js +12 -6
- package/validators/index.js.map +2 -2
- package/validators/utils/amka/index.js +36 -0
- package/{inputs/Input/inputsInputScenarios → validators/utils/amka}/package.json +1 -1
- package/validators/utils/amka.d.ts +6 -0
- package/validators/utils/amka.js.map +7 -0
- package/validators/utils/date/index.js +26 -3
- package/validators/utils/date.d.ts +1 -1
- package/validators/utils/date.js.map +2 -2
- package/validators/utils/datetime/index.js +118 -24
- package/validators/utils/datetime.d.ts +1 -1
- package/validators/utils/datetime.js.map +2 -2
- package/validators/utils/file/index.js +30 -17
- package/validators/utils/file.js.map +2 -2
- package/validators/utils/index.d.ts +1 -0
- package/validators/utils/index.js +4 -1
- package/validators/utils/index.js.map +2 -2
- package/cjs/inputs/Input/inputsInputScenarios/index.js +0 -439
- package/cjs/inputs/Input/inputsInputScenarios.js.map +0 -7
- package/inputs/Input/inputsInputScenarios/index.js +0 -406
- package/inputs/Input/inputsInputScenarios.d.ts +0 -57
- package/inputs/Input/inputsInputScenarios.js.map +0 -7
- package/src/inputs/Input/inputsInputScenarios.ts +0 -404
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import React, { useState, useCallback } from 'react';
|
|
1
|
+
import React, { useRef, useState, useEffect, useCallback } from 'react';
|
|
2
|
+
import { UseFormReturn } from 'react-hook-form';
|
|
2
3
|
import { UncontrolledFieldProps } from '@digigov/form/Field/types';
|
|
3
4
|
import { Button, ButtonGroup } from '@digigov/ui/form/Button';
|
|
4
5
|
import { FileUpload, FileUploadContainer } from '@digigov/ui/form/FileUpload';
|
|
@@ -7,7 +8,7 @@ import { Hint } from '@digigov/ui/typography/Hint';
|
|
|
7
8
|
import { Paragraph } from '@digigov/ui/typography/Paragraph';
|
|
8
9
|
import { Base } from '@digigov/ui/utils/Base';
|
|
9
10
|
export interface ImageProps {
|
|
10
|
-
src
|
|
11
|
+
src: string;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
export interface Limit {
|
|
@@ -21,6 +22,18 @@ export interface Limit {
|
|
|
21
22
|
export const Image: React.FC<ImageProps> = React.memo(function Image({ src }) {
|
|
22
23
|
return <Base as="img" src={src} className="ds-image--ratio" />;
|
|
23
24
|
});
|
|
25
|
+
|
|
26
|
+
interface ImageInputDefaultValue {
|
|
27
|
+
filename: string;
|
|
28
|
+
src: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const blobToFileList = (blob: Blob, fileName: string): FileList => {
|
|
32
|
+
const file = new File([blob], fileName, { type: 'image/jpeg' });
|
|
33
|
+
const dataTransfer = new DataTransfer();
|
|
34
|
+
dataTransfer.items.add(file);
|
|
35
|
+
return dataTransfer.files;
|
|
36
|
+
};
|
|
24
37
|
export interface ImageInputProps extends Omit<UncontrolledFieldProps, 'extra'> {
|
|
25
38
|
extra?: {
|
|
26
39
|
className?: string;
|
|
@@ -29,25 +42,40 @@ export interface ImageInputProps extends Omit<UncontrolledFieldProps, 'extra'> {
|
|
|
29
42
|
limit?: Limit;
|
|
30
43
|
};
|
|
31
44
|
reset: (values?: any) => void;
|
|
45
|
+
resetField: UseFormReturn['resetField'];
|
|
32
46
|
onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
47
|
+
defaultValue?: ImageInputDefaultValue | null;
|
|
48
|
+
value: any;
|
|
33
49
|
}
|
|
34
50
|
|
|
35
51
|
export const ImageInput: React.FC<ImageInputProps> = React.forwardRef(
|
|
36
|
-
function ImageInput(
|
|
52
|
+
function ImageInput(
|
|
53
|
+
{ name, disabled, onChange, resetField, defaultValue, value, ...props },
|
|
54
|
+
ref: any
|
|
55
|
+
) {
|
|
56
|
+
const imageRef = useRef(ref?.current);
|
|
37
57
|
const { t } = useTranslation();
|
|
38
|
-
const
|
|
39
|
-
|
|
58
|
+
const currentValue: ImageInputDefaultValue | null =
|
|
59
|
+
defaultValue || value || null;
|
|
60
|
+
const [selectedImage, setSelectedImage] = useState<
|
|
61
|
+
File | ImageInputDefaultValue | null
|
|
62
|
+
>(currentValue);
|
|
63
|
+
const [imageUrl, setImageUrl] = useState<string | null>(
|
|
64
|
+
currentValue?.src || null
|
|
65
|
+
);
|
|
66
|
+
|
|
40
67
|
const handleImageChange = useCallback(
|
|
41
68
|
(e: React.ChangeEvent<HTMLInputElement>) => {
|
|
42
69
|
e.preventDefault();
|
|
43
70
|
const target = e.target as HTMLInputElement;
|
|
44
71
|
const selectedFile = target.files?.[0];
|
|
45
|
-
|
|
46
72
|
if (selectedFile) {
|
|
47
73
|
setSelectedImage(selectedFile);
|
|
48
74
|
setImageUrl(URL.createObjectURL(selectedFile));
|
|
49
75
|
}
|
|
50
|
-
onChange(
|
|
76
|
+
onChange(
|
|
77
|
+
target.files as unknown as React.ChangeEvent<HTMLInputElement>
|
|
78
|
+
);
|
|
51
79
|
},
|
|
52
80
|
[selectedImage]
|
|
53
81
|
);
|
|
@@ -55,55 +83,79 @@ export const ImageInput: React.FC<ImageInputProps> = React.forwardRef(
|
|
|
55
83
|
const handleDeleteImage = useCallback(
|
|
56
84
|
(event) => {
|
|
57
85
|
event.preventDefault();
|
|
58
|
-
|
|
86
|
+
resetField(name);
|
|
59
87
|
setSelectedImage(null);
|
|
60
|
-
setImageUrl(
|
|
88
|
+
setImageUrl(null);
|
|
61
89
|
},
|
|
62
90
|
[selectedImage]
|
|
63
91
|
);
|
|
64
92
|
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
// This is to fill the input with the default value (image)
|
|
95
|
+
if (defaultValue?.src && imageRef.current) {
|
|
96
|
+
fetch(defaultValue?.src)
|
|
97
|
+
.then((response) => response.blob())
|
|
98
|
+
.then((blob) => {
|
|
99
|
+
const fileList = blobToFileList(blob, defaultValue.filename);
|
|
100
|
+
imageRef.current.files = fileList;
|
|
101
|
+
const fileChangeEvent = new Event('change', { bubbles: true });
|
|
102
|
+
imageRef.current.dispatchEvent(fileChangeEvent);
|
|
103
|
+
return;
|
|
104
|
+
})
|
|
105
|
+
.catch((error) => console.error('Error fetching image:', error));
|
|
106
|
+
}
|
|
107
|
+
}, [defaultValue, imageRef]);
|
|
108
|
+
|
|
65
109
|
return (
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
{selectedImage !== null ? (
|
|
69
|
-
<>
|
|
70
|
-
<Paragraph>
|
|
71
|
-
<Base as="b">{t('upload.image')}:</Base>{' '}
|
|
72
|
-
{`${selectedImage?.name}`}
|
|
73
|
-
</Paragraph>
|
|
74
|
-
</>
|
|
75
|
-
) : (
|
|
76
|
-
<Hint className="ds-dashed--border">{t('upload.no_image')}</Hint>
|
|
77
|
-
)}
|
|
110
|
+
<FileUploadContainer>
|
|
111
|
+
{selectedImage !== null ? (
|
|
78
112
|
<>
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
)}
|
|
86
|
-
<FileUpload
|
|
87
|
-
ref={ref}
|
|
88
|
-
hasFiles={selectedImage !== null}
|
|
89
|
-
name={name}
|
|
90
|
-
id={name}
|
|
91
|
-
disabled={disabled}
|
|
92
|
-
accept="image/*"
|
|
93
|
-
onChange={handleImageChange}
|
|
94
|
-
{...{
|
|
95
|
-
...props,
|
|
96
|
-
required: undefined,
|
|
97
|
-
Field: undefined,
|
|
98
|
-
type: 'file',
|
|
99
|
-
}}
|
|
100
|
-
>
|
|
101
|
-
{t('upload.choose_image')}
|
|
102
|
-
</FileUpload>
|
|
103
|
-
</ButtonGroup>
|
|
113
|
+
<Paragraph>
|
|
114
|
+
<Base as="b">{t('upload.image')}:</Base>{' '}
|
|
115
|
+
<em>
|
|
116
|
+
{`${(selectedImage as File)?.name || (selectedImage as ImageInputDefaultValue)?.filename}`}
|
|
117
|
+
</em>
|
|
118
|
+
</Paragraph>
|
|
104
119
|
</>
|
|
105
|
-
|
|
106
|
-
|
|
120
|
+
) : (
|
|
121
|
+
<Hint className="ds-dashed--border">{t('upload.no_image')}</Hint>
|
|
122
|
+
)}
|
|
123
|
+
{imageUrl !== null && selectedImage !== null && (
|
|
124
|
+
<Image src={imageUrl} />
|
|
125
|
+
)}
|
|
126
|
+
{!disabled && (
|
|
127
|
+
<ButtonGroup marginTop={2}>
|
|
128
|
+
<FileUpload
|
|
129
|
+
ref={imageRef}
|
|
130
|
+
hasFiles={selectedImage !== null}
|
|
131
|
+
name={name}
|
|
132
|
+
id={name}
|
|
133
|
+
disabled={disabled}
|
|
134
|
+
accept="image/*"
|
|
135
|
+
onChange={handleImageChange}
|
|
136
|
+
{...{
|
|
137
|
+
...(props as any),
|
|
138
|
+
required: undefined,
|
|
139
|
+
Field: undefined,
|
|
140
|
+
type: 'file',
|
|
141
|
+
}}
|
|
142
|
+
>
|
|
143
|
+
{selectedImage
|
|
144
|
+
? t('upload.change_image')
|
|
145
|
+
: t('upload.choose_image')}
|
|
146
|
+
</FileUpload>
|
|
147
|
+
{selectedImage !== null && (
|
|
148
|
+
<Button
|
|
149
|
+
color="warning"
|
|
150
|
+
variant="link"
|
|
151
|
+
onClick={handleDeleteImage}
|
|
152
|
+
>
|
|
153
|
+
{t('upload.reset_file')}
|
|
154
|
+
</Button>
|
|
155
|
+
)}
|
|
156
|
+
</ButtonGroup>
|
|
157
|
+
)}
|
|
158
|
+
</FileUploadContainer>
|
|
107
159
|
);
|
|
108
160
|
}
|
|
109
161
|
);
|
|
@@ -15,6 +15,8 @@ export { PhoneNumber } from '@digigov/form/inputs/Input/__stories__/PhoneNumber'
|
|
|
15
15
|
export { LandlineNumber } from '@digigov/form/inputs/Input/__stories__/LandlineNumber';
|
|
16
16
|
export { MobilePhone } from '@digigov/form/inputs/Input/__stories__/MobilePhone';
|
|
17
17
|
export { AFM } from '@digigov/form/inputs/Input/__stories__/AFM';
|
|
18
|
+
export { AMKA } from '@digigov/form/inputs/Input/__stories__/AMKA';
|
|
18
19
|
export { IBAN } from '@digigov/form/inputs/Input/__stories__/IBAN';
|
|
20
|
+
export { Email } from '@digigov/form/inputs/Input/__stories__/Email';
|
|
19
21
|
export { PostalCode } from '@digigov/form/inputs/Input/__stories__/PostalCode';
|
|
20
22
|
export { TextWithLimit } from '@digigov/form/inputs/Input/__stories__/TextWithLimit';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import FormBuilder, { Field } from '@digigov/form';
|
|
3
|
+
import { Button } from '@digigov/ui/form/Button';
|
|
4
|
+
|
|
5
|
+
export const AMKA = () => (
|
|
6
|
+
<FormBuilder
|
|
7
|
+
onSubmit={(data) => {
|
|
8
|
+
console.log(data);
|
|
9
|
+
}}
|
|
10
|
+
>
|
|
11
|
+
<Field
|
|
12
|
+
key="amka"
|
|
13
|
+
name="amka"
|
|
14
|
+
type="amka"
|
|
15
|
+
label={{
|
|
16
|
+
primary: 'Αριθμός μητρώου κοινωνικής ασφάλισης',
|
|
17
|
+
}}
|
|
18
|
+
required
|
|
19
|
+
/>
|
|
20
|
+
<Button type="submit">Συνέχεια</Button>
|
|
21
|
+
</FormBuilder>
|
|
22
|
+
);
|
|
23
|
+
export default AMKA;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import FormBuilder, { Field } from '@digigov/form';
|
|
3
|
+
import { Button } from '@digigov/ui/form/Button';
|
|
4
|
+
|
|
5
|
+
export const Email = (_: any) => (
|
|
6
|
+
<FormBuilder
|
|
7
|
+
onSubmit={(data) => {
|
|
8
|
+
console.log(data);
|
|
9
|
+
}}
|
|
10
|
+
>
|
|
11
|
+
<Field
|
|
12
|
+
key="email"
|
|
13
|
+
name="email"
|
|
14
|
+
type="email"
|
|
15
|
+
label={{
|
|
16
|
+
primary: 'Δ/νση Ηλεκτρ. Ταχυδρομείου (Ε-mail)',
|
|
17
|
+
}}
|
|
18
|
+
required
|
|
19
|
+
/>
|
|
20
|
+
<Button type="submit">Συνέχεια</Button>
|
|
21
|
+
</FormBuilder>
|
|
22
|
+
);
|
|
23
|
+
export default Email;
|
|
@@ -2,7 +2,9 @@ import React from 'react';
|
|
|
2
2
|
import { test, expect } from '@playwright/experimental-ct-react';
|
|
3
3
|
import TestVariant from '@digigov/ui/utils/TestVariant'
|
|
4
4
|
import { AFM } from '@digigov/form/inputs/Input/__stories__/AFM';
|
|
5
|
+
import { AMKA } from '@digigov/form/inputs/Input/__stories__/AMKA';
|
|
5
6
|
import { Boolean } from '@digigov/form/inputs/Input/__stories__/Boolean';
|
|
7
|
+
import { Email } from '@digigov/form/inputs/Input/__stories__/Email';
|
|
6
8
|
import { IBAN } from '@digigov/form/inputs/Input/__stories__/IBAN';
|
|
7
9
|
import { Integer } from '@digigov/form/inputs/Input/__stories__/Integer';
|
|
8
10
|
import { LandlineNumber } from '@digigov/form/inputs/Input/__stories__/LandlineNumber';
|
|
@@ -20,9 +22,15 @@ test('renders the All Input variants', async ({ mount, page }) => {
|
|
|
20
22
|
<TestVariant title="AFM">
|
|
21
23
|
<AFM />
|
|
22
24
|
</TestVariant>
|
|
25
|
+
<TestVariant title="AMKA">
|
|
26
|
+
<AMKA />
|
|
27
|
+
</TestVariant>
|
|
23
28
|
<TestVariant title="Boolean">
|
|
24
29
|
<Boolean />
|
|
25
30
|
</TestVariant>
|
|
31
|
+
<TestVariant title="Email">
|
|
32
|
+
<Email />
|
|
33
|
+
</TestVariant>
|
|
26
34
|
<TestVariant title="IBAN">
|
|
27
35
|
<IBAN />
|
|
28
36
|
</TestVariant>
|
|
@@ -8,12 +8,14 @@ import { Hint } from '@digigov/ui/typography/Hint';
|
|
|
8
8
|
|
|
9
9
|
const TYPES_MAP = {
|
|
10
10
|
string: 'text',
|
|
11
|
+
password: 'password',
|
|
11
12
|
int: 'text',
|
|
12
13
|
text: 'text',
|
|
13
14
|
date: 'date',
|
|
14
15
|
};
|
|
15
16
|
|
|
16
|
-
export interface InputProps
|
|
17
|
+
export interface InputProps
|
|
18
|
+
extends Omit<UncontrolledFieldProps, 'extra' | 'Field'> {
|
|
17
19
|
extra?: {
|
|
18
20
|
fullWidth?: boolean;
|
|
19
21
|
multiline?: boolean;
|
|
@@ -25,10 +27,12 @@ export interface InputProps extends Omit<UncontrolledFieldProps, 'extra'> {
|
|
|
25
27
|
max?: number;
|
|
26
28
|
};
|
|
27
29
|
};
|
|
30
|
+
Field?: UncontrolledFieldProps['Field'];
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
export const Input: React.ExoticComponent<InputProps> = React.forwardRef(
|
|
31
34
|
function WrappedInput({ name, control, type, extra, ...props }, ref: never) {
|
|
35
|
+
delete props['Field'];
|
|
32
36
|
// eslint-disable-next-line prefer-const
|
|
33
37
|
let { multiline = false, rows, limit } = extra || {};
|
|
34
38
|
const { className } = extra || {};
|
|
@@ -75,7 +79,6 @@ export const Input: React.ExoticComponent<InputProps> = React.forwardRef(
|
|
|
75
79
|
reset: undefined,
|
|
76
80
|
required: undefined,
|
|
77
81
|
type: fieldType,
|
|
78
|
-
Field: undefined,
|
|
79
82
|
}}
|
|
80
83
|
/>
|
|
81
84
|
{limit?.max && (
|
|
@@ -103,7 +106,6 @@ export const Input: React.ExoticComponent<InputProps> = React.forwardRef(
|
|
|
103
106
|
...props,
|
|
104
107
|
reset: undefined,
|
|
105
108
|
required: undefined,
|
|
106
|
-
Field: undefined,
|
|
107
109
|
}}
|
|
108
110
|
/>
|
|
109
111
|
);
|
|
@@ -6,11 +6,13 @@ import {
|
|
|
6
6
|
SelectOption,
|
|
7
7
|
} from '@digigov/ui/form/SelectContainer';
|
|
8
8
|
|
|
9
|
-
export interface SelectProps
|
|
9
|
+
export interface SelectProps
|
|
10
|
+
extends Omit<UncontrolledFieldProps, 'extra' | 'Field'> {
|
|
10
11
|
extra: {
|
|
11
12
|
className?: string;
|
|
12
13
|
options: FieldOptionProps[];
|
|
13
14
|
};
|
|
15
|
+
Field?: UncontrolledFieldProps['Field'];
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
export const Select: React.ExoticComponent<SelectProps> = React.forwardRef(
|
|
@@ -18,6 +20,7 @@ export const Select: React.ExoticComponent<SelectProps> = React.forwardRef(
|
|
|
18
20
|
{ name, extra: { options, className }, disabled, ...props },
|
|
19
21
|
ref: never
|
|
20
22
|
) {
|
|
23
|
+
delete props.Field;
|
|
21
24
|
return (
|
|
22
25
|
<SelectContainer
|
|
23
26
|
className={className}
|
|
@@ -28,12 +31,12 @@ export const Select: React.ExoticComponent<SelectProps> = React.forwardRef(
|
|
|
28
31
|
{...{
|
|
29
32
|
...props,
|
|
30
33
|
reset: undefined,
|
|
34
|
+
error: undefined,
|
|
31
35
|
required: undefined,
|
|
32
|
-
Field: undefined,
|
|
33
36
|
}}
|
|
34
37
|
>
|
|
35
|
-
{options.map(({ value, label }) => (
|
|
36
|
-
<SelectOption key={
|
|
38
|
+
{options.map(({ value, label }, index) => (
|
|
39
|
+
<SelectOption key={index} value={value}>
|
|
37
40
|
{label && label.primary ? label.primary : value}
|
|
38
41
|
</SelectOption>
|
|
39
42
|
))}
|
|
@@ -432,7 +432,7 @@ export const scenarios = [
|
|
|
432
432
|
type: 'error',
|
|
433
433
|
fieldKey: 'image',
|
|
434
434
|
args: {
|
|
435
|
-
|
|
435
|
+
maxSize: 0.0003,
|
|
436
436
|
},
|
|
437
437
|
text: el.form.error.file_size,
|
|
438
438
|
},
|
|
@@ -440,7 +440,7 @@ export const scenarios = [
|
|
|
440
440
|
type: 'error',
|
|
441
441
|
fieldKey: 'file',
|
|
442
442
|
args: {
|
|
443
|
-
|
|
443
|
+
maxSize: 0.0003,
|
|
444
444
|
},
|
|
445
445
|
text: el.form.error.file_size,
|
|
446
446
|
},
|
package/src/lazy.js
CHANGED
|
@@ -9,12 +9,12 @@ export default {
|
|
|
9
9
|
'FieldBase': lazy(() => import('@digigov/form/Field/FieldBase').then((module) => ({ default: module['FieldBase'] }))),
|
|
10
10
|
'FieldBaseContainer': lazy(() => import('@digigov/form/Field/FieldBaseContainer').then((module) => ({ default: module['FieldBaseContainer'] }))),
|
|
11
11
|
'FieldConditional': lazy(() => import('@digigov/form/Field/FieldConditional').then((module) => ({ default: module['FieldConditional'] }))),
|
|
12
|
-
'FieldObject': lazy(() => import('@digigov/form/FieldObject').then((module) => ({ default: module['FieldObject'] }))),
|
|
13
12
|
'FormDialog': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['FormDialog'] }))),
|
|
14
13
|
'ArrayItemModal': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['ArrayItemModal'] }))),
|
|
15
14
|
'ArrayItemHeader': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['ArrayItemHeader'] }))),
|
|
16
15
|
'ArrayItemDisplay': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['ArrayItemDisplay'] }))),
|
|
17
16
|
'FieldArray': lazy(() => import('@digigov/form/FieldArray').then((module) => ({ default: module['FieldArray'] }))),
|
|
17
|
+
'FieldObject': lazy(() => import('@digigov/form/FieldObject').then((module) => ({ default: module['FieldObject'] }))),
|
|
18
18
|
'FieldsetWithContext': lazy(() => import('@digigov/form/Fieldset/FieldsetWithContext').then((module) => ({ default: module['FieldsetWithContext'] }))),
|
|
19
19
|
'FieldsetLabel': lazy(() => import('@digigov/form/Fieldset').then((module) => ({ default: module['FieldsetLabel'] }))),
|
|
20
20
|
'FieldsetCaption': lazy(() => import('@digigov/form/Fieldset').then((module) => ({ default: module['FieldsetCaption'] }))),
|
|
@@ -57,6 +57,7 @@ export default {
|
|
|
57
57
|
'RadioButtonsGroup': lazy(() => import('@digigov/form/inputs/Radio').then((module) => ({ default: module['RadioButtonsGroup'] }))),
|
|
58
58
|
'ControlledRadioButtonsGroup': lazy(() => import('@digigov/form/inputs/Radio').then((module) => ({ default: module['ControlledRadioButtonsGroup'] }))),
|
|
59
59
|
'AFM_VALIDATOR': lazy(() => import('@digigov/form/validators/utils').then((module) => ({ default: module['AFM_VALIDATOR'] }))),
|
|
60
|
+
'AMKA_VALIDATOR': lazy(() => import('@digigov/form/validators/utils').then((module) => ({ default: module['AMKA_VALIDATOR'] }))),
|
|
60
61
|
'LATER_THAN_VALIDATOR': lazy(() => import('@digigov/form/validators/utils').then((module) => ({ default: module['LATER_THAN_VALIDATOR'] }))),
|
|
61
62
|
'EARLIER_THAN_VALIDATOR': lazy(() => import('@digigov/form/validators/utils').then((module) => ({ default: module['EARLIER_THAN_VALIDATOR'] }))),
|
|
62
63
|
'DATE_VALIDATOR': lazy(() => import('@digigov/form/validators/utils').then((module) => ({ default: module['DATE_VALIDATOR'] }))),
|
package/src/registry.js
CHANGED
|
@@ -10,9 +10,9 @@ import * as _digigov_form_Field_FieldBaseContainer from "@digigov/form/Field/Fie
|
|
|
10
10
|
import * as _digigov_form_Field_FieldConditional from "@digigov/form/Field/FieldConditional";
|
|
11
11
|
import * as _digigov_form_Field from "@digigov/form/Field";
|
|
12
12
|
import * as _digigov_form_Field_types from "@digigov/form/Field/types";
|
|
13
|
-
import * as _digigov_form_FieldObject from "@digigov/form/FieldObject";
|
|
14
13
|
import * as _digigov_form_FieldArray_FormDialog from "@digigov/form/FieldArray/FormDialog";
|
|
15
14
|
import * as _digigov_form_FieldArray from "@digigov/form/FieldArray";
|
|
15
|
+
import * as _digigov_form_FieldObject from "@digigov/form/FieldObject";
|
|
16
16
|
import * as _digigov_form_Fieldset_FieldsetWithContext from "@digigov/form/Fieldset/FieldsetWithContext";
|
|
17
17
|
import * as _digigov_form_Fieldset from "@digigov/form/Fieldset";
|
|
18
18
|
import * as _digigov_form_Fieldset_types from "@digigov/form/Fieldset/types";
|
|
@@ -52,12 +52,12 @@ import * as _digigov_form_inputs_DateTimeInput from "@digigov/form/inputs/DateTi
|
|
|
52
52
|
import * as _digigov_form_inputs_FileInput from "@digigov/form/inputs/FileInput";
|
|
53
53
|
import * as _digigov_form_inputs_ImageInput from "@digigov/form/inputs/ImageInput";
|
|
54
54
|
import * as _digigov_form_inputs_Input from "@digigov/form/inputs/Input";
|
|
55
|
-
import * as _digigov_form_inputs_Input_inputsInputScenarios from "@digigov/form/inputs/Input/inputsInputScenarios";
|
|
56
55
|
import * as _digigov_form_inputs_Label from "@digigov/form/inputs/Label";
|
|
57
56
|
import * as _digigov_form_inputs_OtpInput from "@digigov/form/inputs/OtpInput";
|
|
58
57
|
import * as _digigov_form_inputs_Radio from "@digigov/form/inputs/Radio";
|
|
59
58
|
import * as _digigov_form_inputs_Select from "@digigov/form/inputs/Select";
|
|
60
59
|
import * as _digigov_form_validators_utils_afm from "@digigov/form/validators/utils/afm";
|
|
60
|
+
import * as _digigov_form_validators_utils_amka from "@digigov/form/validators/utils/amka";
|
|
61
61
|
import * as _digigov_form_validators_utils_date from "@digigov/form/validators/utils/date";
|
|
62
62
|
import * as _digigov_form_validators_utils_datetime from "@digigov/form/validators/utils/datetime";
|
|
63
63
|
import * as _digigov_form_validators_utils_file from "@digigov/form/validators/utils/file";
|
|
@@ -101,9 +101,9 @@ export default {
|
|
|
101
101
|
'@digigov/form/Field/FieldConditional': lazyImport(_digigov_form_Field_FieldConditional),
|
|
102
102
|
'@digigov/form/Field': lazyImport(_digigov_form_Field),
|
|
103
103
|
'@digigov/form/Field/types': lazyImport(_digigov_form_Field_types),
|
|
104
|
-
'@digigov/form/FieldObject': lazyImport(_digigov_form_FieldObject),
|
|
105
104
|
'@digigov/form/FieldArray/FormDialog': lazyImport(_digigov_form_FieldArray_FormDialog),
|
|
106
105
|
'@digigov/form/FieldArray': lazyImport(_digigov_form_FieldArray),
|
|
106
|
+
'@digigov/form/FieldObject': lazyImport(_digigov_form_FieldObject),
|
|
107
107
|
'@digigov/form/Fieldset/FieldsetWithContext': lazyImport(_digigov_form_Fieldset_FieldsetWithContext),
|
|
108
108
|
'@digigov/form/Fieldset': lazyImport(_digigov_form_Fieldset),
|
|
109
109
|
'@digigov/form/Fieldset/types': lazyImport(_digigov_form_Fieldset_types),
|
|
@@ -143,12 +143,12 @@ export default {
|
|
|
143
143
|
'@digigov/form/inputs/FileInput': lazyImport(_digigov_form_inputs_FileInput),
|
|
144
144
|
'@digigov/form/inputs/ImageInput': lazyImport(_digigov_form_inputs_ImageInput),
|
|
145
145
|
'@digigov/form/inputs/Input': lazyImport(_digigov_form_inputs_Input),
|
|
146
|
-
'@digigov/form/inputs/Input/inputsInputScenarios': lazyImport(_digigov_form_inputs_Input_inputsInputScenarios),
|
|
147
146
|
'@digigov/form/inputs/Label': lazyImport(_digigov_form_inputs_Label),
|
|
148
147
|
'@digigov/form/inputs/OtpInput': lazyImport(_digigov_form_inputs_OtpInput),
|
|
149
148
|
'@digigov/form/inputs/Radio': lazyImport(_digigov_form_inputs_Radio),
|
|
150
149
|
'@digigov/form/inputs/Select': lazyImport(_digigov_form_inputs_Select),
|
|
151
150
|
'@digigov/form/validators/utils/afm': lazyImport(_digigov_form_validators_utils_afm),
|
|
151
|
+
'@digigov/form/validators/utils/amka': lazyImport(_digigov_form_validators_utils_amka),
|
|
152
152
|
'@digigov/form/validators/utils/date': lazyImport(_digigov_form_validators_utils_date),
|
|
153
153
|
'@digigov/form/validators/utils/datetime': lazyImport(_digigov_form_validators_utils_datetime),
|
|
154
154
|
'@digigov/form/validators/utils/file': lazyImport(_digigov_form_validators_utils_file),
|
package/src/types.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { UseFormReturn, UseFormProps } from 'react-hook-form';
|
|
1
|
+
import { UseFormReturn, UseFormProps, ErrorOption } from 'react-hook-form';
|
|
2
2
|
import {
|
|
3
3
|
FieldComponentRegistry,
|
|
4
4
|
FieldLabelProps,
|
|
@@ -54,6 +54,7 @@ export interface FormBuilderProps {
|
|
|
54
54
|
componentRegistry?: FieldComponentRegistry;
|
|
55
55
|
grid?: boolean;
|
|
56
56
|
controlledFieldsOnly?: boolean;
|
|
57
|
+
errors?: ErrorOption;
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
export interface FormBaseProps
|
package/src/utils.ts
CHANGED
|
@@ -13,6 +13,7 @@ const parseErrorSchema = (
|
|
|
13
13
|
return (error.inner || []).reduce<Record<string, FieldError>>(
|
|
14
14
|
(previous, error) => {
|
|
15
15
|
error.path = error.path?.replace(/\[([0-9]+)\]/g, '.$1');
|
|
16
|
+
// error.path = error.path?.replace(/\["(.*?)"\]/g, '$1');
|
|
16
17
|
if (!previous[error.path!]) {
|
|
17
18
|
previous[error.path!] = { message: error.message, type: error.type! };
|
|
18
19
|
}
|
|
@@ -37,6 +38,26 @@ const parseErrorSchema = (
|
|
|
37
38
|
{}
|
|
38
39
|
);
|
|
39
40
|
};
|
|
41
|
+
function isPlainObject(obj) {
|
|
42
|
+
return (
|
|
43
|
+
typeof obj === 'object' &&
|
|
44
|
+
obj !== null &&
|
|
45
|
+
Object.prototype.toString.call(obj) === '[object Object]'
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
function flattenObject(obj, prefix = '') {
|
|
49
|
+
return Object.keys(obj).reduce((acc, key) => {
|
|
50
|
+
const prefixedKey = prefix ? `${prefix}.${key}` : key;
|
|
51
|
+
|
|
52
|
+
if (isPlainObject(obj[key])) {
|
|
53
|
+
Object.assign(acc, flattenObject(obj[key], prefixedKey));
|
|
54
|
+
} else {
|
|
55
|
+
acc[prefixedKey] = obj[key];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return acc;
|
|
59
|
+
}, {});
|
|
60
|
+
}
|
|
40
61
|
|
|
41
62
|
export const yupResolver =
|
|
42
63
|
(schema: any, schemaOptions: any = {}, resolverOptions: any = {}) =>
|
|
@@ -51,7 +72,7 @@ export const yupResolver =
|
|
|
51
72
|
const result = await schema[
|
|
52
73
|
resolverOptions.mode === 'sync' ? 'validateSync' : 'validate'
|
|
53
74
|
](
|
|
54
|
-
values,
|
|
75
|
+
flattenObject(values),
|
|
55
76
|
Object.assign({ abortEarly: false }, schemaOptions, { context })
|
|
56
77
|
);
|
|
57
78
|
|
|
@@ -67,13 +88,13 @@ export const yupResolver =
|
|
|
67
88
|
throw e;
|
|
68
89
|
}
|
|
69
90
|
|
|
70
|
-
const parsed = parseErrorSchema(
|
|
71
|
-
e,
|
|
72
|
-
!options.shouldUseNativeValidation && options.criteriaMode === 'all'
|
|
73
|
-
);
|
|
74
91
|
return {
|
|
75
92
|
values: {},
|
|
76
|
-
errors:
|
|
93
|
+
errors: parseErrorSchema(
|
|
94
|
+
e,
|
|
95
|
+
!options.shouldUseNativeValidation && options.criteriaMode === 'all'
|
|
96
|
+
),
|
|
97
|
+
options,
|
|
77
98
|
};
|
|
78
99
|
}
|
|
79
100
|
};
|
package/src/validators/index.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { ValidatorSchema } from '@digigov/form/validators/types';
|
|
|
11
11
|
import {
|
|
12
12
|
getYupObjectShape,
|
|
13
13
|
AFM_VALIDATOR,
|
|
14
|
+
AMKA_VALIDATOR,
|
|
14
15
|
FILE_MAX_SIZE_VALIDATOR,
|
|
15
16
|
IBAN_VALIDATOR,
|
|
16
17
|
OTP_VALIDATOR,
|
|
@@ -30,13 +31,15 @@ import {
|
|
|
30
31
|
import { INT_VALIDATOR } from '@digigov/form/validators/utils/int';
|
|
31
32
|
import { NUMBER_VALIDATOR } from '@digigov/form/validators/utils/number';
|
|
32
33
|
|
|
33
|
-
export const getYUPTypeMap = (
|
|
34
|
+
export const getYUPTypeMap = (
|
|
35
|
+
validatorRegistry?: Record<string, any>
|
|
36
|
+
): Record<string, any> => {
|
|
34
37
|
const yupTypeMap = {
|
|
35
38
|
file: (field): MixedSchema => {
|
|
36
39
|
return yup
|
|
37
40
|
.mixed()
|
|
38
41
|
.transform((value) => {
|
|
39
|
-
if (!value.length) {
|
|
42
|
+
if (!value || value.length === 0) {
|
|
40
43
|
return null;
|
|
41
44
|
}
|
|
42
45
|
return value;
|
|
@@ -81,10 +84,13 @@ export const getYUPTypeMap = (): Record<string, any> => {
|
|
|
81
84
|
if (typeof field.extra.of === 'object') {
|
|
82
85
|
// else if the field is an object then it is a scalar type
|
|
83
86
|
// eg. number, string etc.
|
|
87
|
+
if (field.required) {
|
|
88
|
+
field.extra.min = 1;
|
|
89
|
+
}
|
|
84
90
|
let arrayValidator = yup
|
|
85
91
|
.array()
|
|
86
|
-
.
|
|
87
|
-
.
|
|
92
|
+
.nullable()
|
|
93
|
+
.of(yupTypeMap[field.extra.of.type](field.extra.of));
|
|
88
94
|
if (field.extra.length)
|
|
89
95
|
arrayValidator = arrayValidator.length(field.extra.length, {
|
|
90
96
|
key: 'form.error.array.length',
|
|
@@ -133,6 +139,10 @@ export const getYUPTypeMap = (): Record<string, any> => {
|
|
|
133
139
|
field.trim
|
|
134
140
|
? yup.string().trim().test(AFM_VALIDATOR)
|
|
135
141
|
: yup.string().test(AFM_VALIDATOR),
|
|
142
|
+
amka: (field): yup.StringSchema =>
|
|
143
|
+
field.trim
|
|
144
|
+
? yup.string().trim().test(AMKA_VALIDATOR)
|
|
145
|
+
: yup.string().test(AMKA_VALIDATOR),
|
|
136
146
|
uuid4: (field): yup.StringSchema =>
|
|
137
147
|
field.trim
|
|
138
148
|
? yup.string().trim().test(UUID4_VALIDATOR)
|
|
@@ -215,6 +225,7 @@ export const getYUPTypeMap = (): Record<string, any> => {
|
|
|
215
225
|
}
|
|
216
226
|
return yup.string().test(DATETIME_VALIDATOR);
|
|
217
227
|
},
|
|
228
|
+
...validatorRegistry,
|
|
218
229
|
};
|
|
219
230
|
return yupTypeMap;
|
|
220
231
|
};
|
|
@@ -226,7 +237,7 @@ export function useValidationSchema(
|
|
|
226
237
|
validatorRegistry?: Record<string, ValidatorSchema[]>
|
|
227
238
|
): Lazy<any, unknown> | AnyObjectSchema | void {
|
|
228
239
|
return useMemo(() => {
|
|
229
|
-
const yupTypeMap = getYUPTypeMap();
|
|
240
|
+
const yupTypeMap = getYUPTypeMap(validatorRegistry);
|
|
230
241
|
return getYupObjectShape(fields, yupTypeMap, validatorRegistry);
|
|
231
|
-
}, []);
|
|
242
|
+
}, [fields, validatorRegistry]);
|
|
232
243
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
function digitSum(number) {
|
|
2
|
+
const sum = number > 9 ? 1 : 0;
|
|
3
|
+
return sum + (number % 10);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export function validateAMKA(amka: string): boolean {
|
|
7
|
+
// Validate that the last digit is the correct check digit (created using the
|
|
8
|
+
// Luhn algorithm https://en.wikipedia.org/wiki/Luhn_algorithm).
|
|
9
|
+
amka = String(amka);
|
|
10
|
+
const checkDigitIndex = amka.length - 1;
|
|
11
|
+
let sum = 0;
|
|
12
|
+
amka
|
|
13
|
+
.substring(0, checkDigitIndex)
|
|
14
|
+
.split('')
|
|
15
|
+
.reverse()
|
|
16
|
+
.forEach(function (value, index) {
|
|
17
|
+
const weight = ((index + 1) % 2) + 1;
|
|
18
|
+
sum += digitSum(parseInt(value, 10) * weight);
|
|
19
|
+
});
|
|
20
|
+
const sumMod10 = sum % 10;
|
|
21
|
+
if (sumMod10 === 0) {
|
|
22
|
+
return amka.substring(checkDigitIndex) === '0';
|
|
23
|
+
} else {
|
|
24
|
+
return amka.substring(checkDigitIndex) === 10 - sumMod10 + '';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const AMKA_VALIDATOR = {
|
|
29
|
+
name: 'amka-validator',
|
|
30
|
+
message: 'form.error.amka',
|
|
31
|
+
test: (value): boolean => {
|
|
32
|
+
if (!value) return true;
|
|
33
|
+
const AMKA_REGEX = /^[0-9]{11}$/;
|
|
34
|
+
if (!AMKA_REGEX.test(value) || value === '00000000000') {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
return validateAMKA(value);
|
|
38
|
+
},
|
|
39
|
+
};
|