envoc-form 5.0.2 → 5.0.4-0
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/README.md +4650 -1250
- package/dist/index.cjs +21523 -0
- package/dist/index.d.ts +575 -0
- package/dist/index.js +21456 -0
- package/package.json +107 -111
- package/dist/css/envoc-form-styles.css +0 -3
- package/dist/css/envoc-form-styles.css.map +0 -1
- package/es/AddressInput/AddressInput.d.ts +0 -24
- package/es/AddressInput/AddressInput.js +0 -20
- package/es/AddressInput/UsStates.d.ts +0 -3
- package/es/AddressInput/UsStates.js +0 -53
- package/es/ConfirmBaseForm/ConfirmBaseForm.d.ts +0 -26
- package/es/ConfirmBaseForm/ConfirmBaseForm.js +0 -42
- package/es/ConfirmDeleteForm/ConfirmDeleteForm.d.ts +0 -24
- package/es/ConfirmDeleteForm/ConfirmDeleteForm.js +0 -60
- package/es/DatePicker/DatePickerGroup.d.ts +0 -13
- package/es/DatePicker/DatePickerGroup.js +0 -87
- package/es/DatePicker/DatePickerHelper.d.ts +0 -3
- package/es/DatePicker/DatePickerHelper.js +0 -1
- package/es/DatePicker/StringDateOnlyPickerGroup.d.ts +0 -9
- package/es/DatePicker/StringDateOnlyPickerGroup.js +0 -29
- package/es/DatePicker/StringDatePickerGroup.d.ts +0 -9
- package/es/DatePicker/StringDatePickerGroup.js +0 -24
- package/es/Field/CustomFieldInputProps.d.ts +0 -7
- package/es/Field/CustomFieldInputProps.js +0 -1
- package/es/Field/CustomFieldMetaProps.d.ts +0 -4
- package/es/Field/CustomFieldMetaProps.js +0 -1
- package/es/Field/Field.d.ts +0 -28
- package/es/Field/Field.js +0 -51
- package/es/Field/FieldErrorScrollTarget.d.ts +0 -2
- package/es/Field/FieldErrorScrollTarget.js +0 -12
- package/es/Field/FieldNameContext.d.ts +0 -3
- package/es/Field/FieldNameContext.js +0 -3
- package/es/Field/FieldSection.d.ts +0 -7
- package/es/Field/FieldSection.js +0 -9
- package/es/Field/InjectedFieldProps.d.ts +0 -7
- package/es/Field/InjectedFieldProps.js +0 -1
- package/es/Field/StandAloneInput.d.ts +0 -13
- package/es/Field/StandAloneInput.js +0 -50
- package/es/Field/useStandardField.d.ts +0 -21
- package/es/Field/useStandardField.js +0 -92
- package/es/FieldArray/FieldArray.d.ts +0 -24
- package/es/FieldArray/FieldArray.js +0 -77
- package/es/File/FileGroup.d.ts +0 -10
- package/es/File/FileGroup.js +0 -53
- package/es/File/FileList.d.ts +0 -5
- package/es/File/FileList.js +0 -10
- package/es/File/humanFileSize.d.ts +0 -1
- package/es/File/humanFileSize.js +0 -6
- package/es/Form/FocusError.d.ts +0 -7
- package/es/Form/FocusError.js +0 -42
- package/es/Form/Form.d.ts +0 -33
- package/es/Form/Form.js +0 -141
- package/es/Form/FormBasedPreventNavigation.d.ts +0 -6
- package/es/Form/FormBasedPreventNavigation.js +0 -20
- package/es/Form/LegacyFormBasedPreventNavigation.d.ts +0 -17
- package/es/Form/LegacyFormBasedPreventNavigation.js +0 -69
- package/es/Form/NewFormBasedPreventNavigation.d.ts +0 -14
- package/es/Form/NewFormBasedPreventNavigation.js +0 -39
- package/es/Form/ServerErrorContext.d.ts +0 -11
- package/es/Form/ServerErrorContext.js +0 -9
- package/es/FormActions.d.ts +0 -12
- package/es/FormActions.js +0 -16
- package/es/FormDefaults.d.ts +0 -4
- package/es/FormDefaults.js +0 -2
- package/es/Group.d.ts +0 -16
- package/es/Group.js +0 -14
- package/es/Input/IconInputGroup.d.ts +0 -12
- package/es/Input/IconInputGroup.js +0 -43
- package/es/Input/InputGroup.d.ts +0 -12
- package/es/Input/InputGroup.js +0 -34
- package/es/Input/MoneyInputGroup.d.ts +0 -9
- package/es/Input/MoneyInputGroup.js +0 -43
- package/es/Input/NumberInputGroup.d.ts +0 -9
- package/es/Input/NumberInputGroup.js +0 -43
- package/es/Input/PhoneNumberInputGroup.d.ts +0 -10
- package/es/Input/PhoneNumberInputGroup.js +0 -47
- package/es/Input/StringInputGroup.d.ts +0 -8
- package/es/Input/StringInputGroup.js +0 -43
- package/es/Normalization/NormalizationFunction.d.ts +0 -4
- package/es/Normalization/NormalizationFunction.js +0 -1
- package/es/Normalization/normalizers.d.ts +0 -4
- package/es/Normalization/normalizers.js +0 -32
- package/es/Select/BooleanSelectGroup.d.ts +0 -7
- package/es/Select/BooleanSelectGroup.js +0 -28
- package/es/Select/NumberSelectGroup.d.ts +0 -9
- package/es/Select/NumberSelectGroup.js +0 -21
- package/es/Select/SelectGroup.d.ts +0 -27
- package/es/Select/SelectGroup.js +0 -65
- package/es/Select/SelectGroupPropsHelper.d.ts +0 -3
- package/es/Select/SelectGroupPropsHelper.js +0 -1
- package/es/Select/StringSelectGroup.d.ts +0 -9
- package/es/Select/StringSelectGroup.js +0 -21
- package/es/StandardFormActions.d.ts +0 -11
- package/es/StandardFormActions.js +0 -14
- package/es/SubmitFormButton.d.ts +0 -10
- package/es/SubmitFormButton.js +0 -40
- package/es/TextArea/TextAreaGroup.d.ts +0 -9
- package/es/TextArea/TextAreaGroup.js +0 -35
- package/es/Validation/ValidatedApiResult.d.ts +0 -6
- package/es/Validation/ValidatedApiResult.js +0 -1
- package/es/Validation/ValidationError.d.ts +0 -5
- package/es/Validation/ValidationError.js +0 -1
- package/es/Validation/ValidationFunction.d.ts +0 -4
- package/es/Validation/ValidationFunction.js +0 -1
- package/es/Validation/validators.d.ts +0 -18
- package/es/Validation/validators.js +0 -77
- package/es/index.d.ts +0 -75
- package/es/index.js +0 -51
- package/es/setupTests.d.ts +0 -1
- package/es/setupTests.js +0 -1
- package/es/utils/objectContainsNonSerializableProperty.d.ts +0 -1
- package/es/utils/objectContainsNonSerializableProperty.js +0 -14
- package/es/utils/objectToFormData.d.ts +0 -10
- package/es/utils/objectToFormData.js +0 -77
- package/es/utils/typeChecks.d.ts +0 -8
- package/es/utils/typeChecks.js +0 -18
- package/lib/AddressInput/AddressInput.d.ts +0 -24
- package/lib/AddressInput/AddressInput.js +0 -26
- package/lib/AddressInput/UsStates.d.ts +0 -3
- package/lib/AddressInput/UsStates.js +0 -55
- package/lib/ConfirmBaseForm/ConfirmBaseForm.d.ts +0 -26
- package/lib/ConfirmBaseForm/ConfirmBaseForm.js +0 -48
- package/lib/ConfirmDeleteForm/ConfirmDeleteForm.d.ts +0 -24
- package/lib/ConfirmDeleteForm/ConfirmDeleteForm.js +0 -66
- package/lib/DatePicker/DatePickerGroup.d.ts +0 -13
- package/lib/DatePicker/DatePickerGroup.js +0 -95
- package/lib/DatePicker/DatePickerHelper.d.ts +0 -3
- package/lib/DatePicker/DatePickerHelper.js +0 -2
- package/lib/DatePicker/StringDateOnlyPickerGroup.d.ts +0 -9
- package/lib/DatePicker/StringDateOnlyPickerGroup.js +0 -35
- package/lib/DatePicker/StringDatePickerGroup.d.ts +0 -9
- package/lib/DatePicker/StringDatePickerGroup.js +0 -30
- package/lib/Field/CustomFieldInputProps.d.ts +0 -7
- package/lib/Field/CustomFieldInputProps.js +0 -2
- package/lib/Field/CustomFieldMetaProps.d.ts +0 -4
- package/lib/Field/CustomFieldMetaProps.js +0 -2
- package/lib/Field/Field.d.ts +0 -28
- package/lib/Field/Field.js +0 -56
- package/lib/Field/FieldErrorScrollTarget.d.ts +0 -2
- package/lib/Field/FieldErrorScrollTarget.js +0 -15
- package/lib/Field/FieldNameContext.d.ts +0 -3
- package/lib/Field/FieldNameContext.js +0 -9
- package/lib/Field/FieldSection.d.ts +0 -7
- package/lib/Field/FieldSection.js +0 -12
- package/lib/Field/InjectedFieldProps.d.ts +0 -7
- package/lib/Field/InjectedFieldProps.js +0 -2
- package/lib/Field/StandAloneInput.d.ts +0 -13
- package/lib/Field/StandAloneInput.js +0 -76
- package/lib/Field/useStandardField.d.ts +0 -21
- package/lib/Field/useStandardField.js +0 -95
- package/lib/FieldArray/FieldArray.d.ts +0 -24
- package/lib/FieldArray/FieldArray.js +0 -83
- package/lib/File/FileGroup.d.ts +0 -10
- package/lib/File/FileGroup.js +0 -58
- package/lib/File/FileList.d.ts +0 -5
- package/lib/File/FileList.js +0 -13
- package/lib/File/humanFileSize.d.ts +0 -1
- package/lib/File/humanFileSize.js +0 -10
- package/lib/Form/FocusError.d.ts +0 -7
- package/lib/Form/FocusError.js +0 -48
- package/lib/Form/Form.d.ts +0 -33
- package/lib/Form/Form.js +0 -147
- package/lib/Form/FormBasedPreventNavigation.d.ts +0 -6
- package/lib/Form/FormBasedPreventNavigation.js +0 -26
- package/lib/Form/LegacyFormBasedPreventNavigation.d.ts +0 -17
- package/lib/Form/LegacyFormBasedPreventNavigation.js +0 -72
- package/lib/Form/NewFormBasedPreventNavigation.d.ts +0 -14
- package/lib/Form/NewFormBasedPreventNavigation.js +0 -42
- package/lib/Form/ServerErrorContext.d.ts +0 -11
- package/lib/Form/ServerErrorContext.js +0 -15
- package/lib/FormActions.d.ts +0 -12
- package/lib/FormActions.js +0 -22
- package/lib/FormDefaults.d.ts +0 -4
- package/lib/FormDefaults.js +0 -5
- package/lib/Group.d.ts +0 -16
- package/lib/Group.js +0 -20
- package/lib/Input/IconInputGroup.d.ts +0 -12
- package/lib/Input/IconInputGroup.js +0 -48
- package/lib/Input/InputGroup.d.ts +0 -12
- package/lib/Input/InputGroup.js +0 -39
- package/lib/Input/MoneyInputGroup.d.ts +0 -9
- package/lib/Input/MoneyInputGroup.js +0 -48
- package/lib/Input/NumberInputGroup.d.ts +0 -9
- package/lib/Input/NumberInputGroup.js +0 -48
- package/lib/Input/PhoneNumberInputGroup.d.ts +0 -10
- package/lib/Input/PhoneNumberInputGroup.js +0 -52
- package/lib/Input/StringInputGroup.d.ts +0 -8
- package/lib/Input/StringInputGroup.js +0 -48
- package/lib/Normalization/NormalizationFunction.d.ts +0 -4
- package/lib/Normalization/NormalizationFunction.js +0 -2
- package/lib/Normalization/normalizers.d.ts +0 -4
- package/lib/Normalization/normalizers.js +0 -37
- package/lib/Select/BooleanSelectGroup.d.ts +0 -7
- package/lib/Select/BooleanSelectGroup.js +0 -35
- package/lib/Select/NumberSelectGroup.d.ts +0 -9
- package/lib/Select/NumberSelectGroup.js +0 -29
- package/lib/Select/SelectGroup.d.ts +0 -27
- package/lib/Select/SelectGroup.js +0 -71
- package/lib/Select/SelectGroupPropsHelper.d.ts +0 -3
- package/lib/Select/SelectGroupPropsHelper.js +0 -2
- package/lib/Select/StringSelectGroup.d.ts +0 -9
- package/lib/Select/StringSelectGroup.js +0 -29
- package/lib/StandardFormActions.d.ts +0 -11
- package/lib/StandardFormActions.js +0 -20
- package/lib/SubmitFormButton.d.ts +0 -10
- package/lib/SubmitFormButton.js +0 -45
- package/lib/TextArea/TextAreaGroup.d.ts +0 -9
- package/lib/TextArea/TextAreaGroup.js +0 -40
- package/lib/Validation/ValidatedApiResult.d.ts +0 -6
- package/lib/Validation/ValidatedApiResult.js +0 -2
- package/lib/Validation/ValidationError.d.ts +0 -5
- package/lib/Validation/ValidationError.js +0 -2
- package/lib/Validation/ValidationFunction.d.ts +0 -4
- package/lib/Validation/ValidationFunction.js +0 -2
- package/lib/Validation/validators.d.ts +0 -18
- package/lib/Validation/validators.js +0 -90
- package/lib/index.d.ts +0 -75
- package/lib/index.js +0 -119
- package/lib/setupTests.d.ts +0 -1
- package/lib/setupTests.js +0 -3
- package/lib/utils/objectContainsNonSerializableProperty.d.ts +0 -1
- package/lib/utils/objectContainsNonSerializableProperty.js +0 -17
- package/lib/utils/objectToFormData.d.ts +0 -10
- package/lib/utils/objectToFormData.js +0 -79
- package/lib/utils/typeChecks.d.ts +0 -8
- package/lib/utils/typeChecks.js +0 -29
- package/src/AddressInput/AddressInput.test.tsx +0 -27
- package/src/AddressInput/AddressInput.tsx +0 -82
- package/src/AddressInput/UsStates.ts +0 -55
- package/src/AddressInput/__snapshots__/AddressInput.test.tsx.snap +0 -182
- package/src/ConfirmBaseForm/ConfirmBaseForm.test.tsx +0 -24
- package/src/ConfirmBaseForm/ConfirmBaseForm.tsx +0 -74
- package/src/ConfirmBaseForm/__snapshots__/ConfirmBaseForm.test.tsx.snap +0 -23
- package/src/ConfirmDeleteForm/ConfirmDeleteForm.test.tsx +0 -24
- package/src/ConfirmDeleteForm/ConfirmDeleteForm.tsx +0 -87
- package/src/ConfirmDeleteForm/__snapshots__/ConfirmDeleteForm.test.tsx.snap +0 -25
- package/src/DatePicker/DatePicker.test.tsx +0 -48
- package/src/DatePicker/DatePickerGroup.tsx +0 -115
- package/src/DatePicker/DatePickerHelper.ts +0 -4
- package/src/DatePicker/StringDateOnlyPickerGroup.tsx +0 -28
- package/src/DatePicker/StringDatePickerGroup.tsx +0 -20
- package/src/DatePicker/__snapshots__/DatePicker.test.tsx.snap +0 -152
- package/src/Field/CustomFieldInputProps.ts +0 -10
- package/src/Field/CustomFieldMetaProps.ts +0 -5
- package/src/Field/Field.tsx +0 -113
- package/src/Field/FieldErrorScrollTarget.tsx +0 -12
- package/src/Field/FieldNameContext.ts +0 -6
- package/src/Field/FieldSection.tsx +0 -18
- package/src/Field/InjectedFieldProps.ts +0 -8
- package/src/Field/StandAloneInput.tsx +0 -55
- package/src/Field/useStandardField.ts +0 -125
- package/src/FieldArray/FieldArray.tsx +0 -154
- package/src/File/FileGroup.test.tsx +0 -35
- package/src/File/FileGroup.tsx +0 -85
- package/src/File/FileList.tsx +0 -21
- package/src/File/__snapshots__/FileGroup.test.tsx.snap +0 -34
- package/src/File/humanFileSize.ts +0 -8
- package/src/Form/FocusError.tsx +0 -55
- package/src/Form/Form.test.tsx +0 -14
- package/src/Form/Form.tsx +0 -237
- package/src/Form/FormBasedPreventNavigation.tsx +0 -56
- package/src/Form/LegacyFormBasedPreventNavigation.tsx +0 -77
- package/src/Form/NewFormBasedPreventNavigation.tsx +0 -59
- package/src/Form/ServerErrorContext.ts +0 -18
- package/src/Form/__snapshots__/Form.test.tsx.snap +0 -10
- package/src/FormActions.tsx +0 -47
- package/src/FormDefaults.ts +0 -2
- package/src/Group.tsx +0 -62
- package/src/Input/IconInputGroup.tsx +0 -54
- package/src/Input/InputGroup.tsx +0 -72
- package/src/Input/MoneyInputGroup.tsx +0 -50
- package/src/Input/NumberInputGroup.tsx +0 -48
- package/src/Input/PhoneNumberInputGroup.tsx +0 -45
- package/src/Input/StringInputGroup.tsx +0 -53
- package/src/Input/__Tests__/IconInputGroup.test.tsx +0 -35
- package/src/Input/__Tests__/MoneyInputGroup.test.tsx +0 -37
- package/src/Input/__Tests__/NumberInputGroup.test.tsx +0 -35
- package/src/Input/__Tests__/PhoneNumberInputGroup.test.tsx +0 -36
- package/src/Input/__Tests__/StringInputGroup.test.tsx +0 -27
- package/src/Input/__Tests__/__snapshots__/IconInputGroup.test.tsx.snap +0 -32
- package/src/Input/__Tests__/__snapshots__/MoneyInputGroup.test.tsx.snap +0 -34
- package/src/Input/__Tests__/__snapshots__/NumberInputGroup.test.tsx.snap +0 -32
- package/src/Input/__Tests__/__snapshots__/PhoneNumberInputGroup.test.tsx.snap +0 -33
- package/src/Input/__Tests__/__snapshots__/StringInputGroup.test.tsx.snap +0 -31
- package/src/Normalization/NormalizationFunction.ts +0 -4
- package/src/Normalization/normalizers.ts +0 -44
- package/src/Select/BooleanSelectGroup.tsx +0 -28
- package/src/Select/NumberSelectGroup.tsx +0 -16
- package/src/Select/SelectGroup.tsx +0 -124
- package/src/Select/SelectGroupPropsHelper.ts +0 -4
- package/src/Select/StringSelectGroup.tsx +0 -16
- package/src/Select/__tests__/BooleanSelectGroup.test.tsx +0 -35
- package/src/Select/__tests__/NumberSelectGroup.test.tsx +0 -87
- package/src/Select/__tests__/StringSelectGroup.test.tsx +0 -89
- package/src/Select/__tests__/__snapshots__/BooleanSelectGroup.test.tsx.snap +0 -98
- package/src/Select/__tests__/__snapshots__/NumberSelectGroup.test.tsx.snap +0 -195
- package/src/Select/__tests__/__snapshots__/StringSelectGroup.test.tsx.snap +0 -195
- package/src/StandardFormActions.tsx +0 -41
- package/src/SubmitFormButton.tsx +0 -54
- package/src/TextArea/TextAreaGroup.tsx +0 -64
- package/src/Validation/ValidatedApiResult.ts +0 -8
- package/src/Validation/ValidationError.ts +0 -6
- package/src/Validation/ValidationFunction.ts +0 -4
- package/src/Validation/validators.test.tsx +0 -81
- package/src/Validation/validators.ts +0 -97
- package/src/__Tests__/FormTestBase.tsx +0 -64
- package/src/__Tests__/RealisticForm.test.tsx +0 -82
- package/src/__Tests__/StandardFormActions.test.tsx +0 -17
- package/src/__Tests__/SubmitFormButton.test.tsx +0 -17
- package/src/__Tests__/__snapshots__/StandardFormActions.test.tsx.snap +0 -27
- package/src/__Tests__/__snapshots__/SubmitFormButton.test.tsx.snap +0 -20
- package/src/__Tests__/index.ts +0 -3
- package/src/_variables.scss +0 -11
- package/src/index.ts +0 -153
- package/src/react-app-env.d.ts +0 -1
- package/src/setupTests.ts +0 -1
- package/src/styles.scss +0 -0
- package/src/utils/objectContainsNonSerializableProperty.test.tsx +0 -49
- package/src/utils/objectContainsNonSerializableProperty.ts +0 -17
- package/src/utils/objectToFormData.test.tsx +0 -76
- package/src/utils/objectToFormData.ts +0 -105
- package/src/utils/typeChecks.ts +0 -18
@@ -1,44 +0,0 @@
|
|
1
|
-
/** Normalizer for converting a string into a valid phone number. */
|
2
|
-
export const phoneNumber = (value: string | undefined | null) => {
|
3
|
-
if (!value) {
|
4
|
-
return undefined;
|
5
|
-
}
|
6
|
-
|
7
|
-
const onlyNums = value.replace(/[^\d]/g, '');
|
8
|
-
if (onlyNums.length <= 3) {
|
9
|
-
return onlyNums;
|
10
|
-
}
|
11
|
-
if (onlyNums.length <= 7) {
|
12
|
-
return `${onlyNums.slice(0, 3)}-${onlyNums.slice(3)}`;
|
13
|
-
}
|
14
|
-
if (onlyNums.length <= 10) {
|
15
|
-
return `${onlyNums.slice(0, 3)}-${onlyNums.slice(3, 6)}-${onlyNums.slice(
|
16
|
-
6,
|
17
|
-
10
|
18
|
-
)}`;
|
19
|
-
}
|
20
|
-
if (onlyNums.length <= 13) {
|
21
|
-
const countryCodeLength = onlyNums.length - 10;
|
22
|
-
return `+${onlyNums.slice(0, countryCodeLength)} ${onlyNums.slice(
|
23
|
-
countryCodeLength,
|
24
|
-
3 + countryCodeLength
|
25
|
-
)}-${onlyNums.slice(
|
26
|
-
3 + countryCodeLength,
|
27
|
-
6 + countryCodeLength
|
28
|
-
)}-${onlyNums.slice(6 + countryCodeLength, onlyNums.length)}`;
|
29
|
-
}
|
30
|
-
|
31
|
-
return onlyNums;
|
32
|
-
};
|
33
|
-
|
34
|
-
/** Normalizer for converting a string into a valid zip code. Allows for XXXXX and XXXXX-XXXX format. */
|
35
|
-
export const zipCode = (value: string | undefined | null) => {
|
36
|
-
if (!value) {
|
37
|
-
return undefined;
|
38
|
-
}
|
39
|
-
const onlyNums = value.replace(/[^\d]/g, '');
|
40
|
-
if (onlyNums.length > 5) {
|
41
|
-
return onlyNums.substring(0, 5) + '-' + onlyNums.substring(5, 9);
|
42
|
-
}
|
43
|
-
return onlyNums;
|
44
|
-
};
|
@@ -1,28 +0,0 @@
|
|
1
|
-
import SelectGroup, { SelectOption } from './SelectGroup';
|
2
|
-
import { SelectGroupPropsHelper } from './SelectGroupPropsHelper';
|
3
|
-
|
4
|
-
const booleanOptions: SelectOption<boolean>[] = [
|
5
|
-
{
|
6
|
-
label: 'Yes',
|
7
|
-
value: true,
|
8
|
-
},
|
9
|
-
{
|
10
|
-
label: 'No',
|
11
|
-
value: false,
|
12
|
-
},
|
13
|
-
];
|
14
|
-
|
15
|
-
export interface BooleanSelectGroupProps
|
16
|
-
extends Omit<SelectGroupPropsHelper<boolean | undefined | null>, 'options'> {
|
17
|
-
options?: SelectOption<boolean>[];
|
18
|
-
}
|
19
|
-
/** A `<SelectGroup/>` dropdown with two options. Default options are 'Yes' and 'No' with values of `true` and `false`. */
|
20
|
-
export function BooleanSelectGroup(props: BooleanSelectGroupProps) {
|
21
|
-
return (
|
22
|
-
<SelectGroup
|
23
|
-
multiple={false}
|
24
|
-
{...props}
|
25
|
-
options={props.options ?? booleanOptions}
|
26
|
-
/>
|
27
|
-
);
|
28
|
-
}
|
@@ -1,16 +0,0 @@
|
|
1
|
-
import SelectGroup from './SelectGroup';
|
2
|
-
import { SelectGroupPropsHelper } from './SelectGroupPropsHelper';
|
3
|
-
|
4
|
-
export interface MultiNumberSelectGroupProps
|
5
|
-
extends SelectGroupPropsHelper<number[] | undefined | null> {}
|
6
|
-
/** A `<SelectGroup/>` dropdown with values as numbers. Many options can be selected at a time. */
|
7
|
-
export function MultiNumberSelectGroup(props: MultiNumberSelectGroupProps) {
|
8
|
-
return <SelectGroup multiple={true} {...props} />;
|
9
|
-
}
|
10
|
-
|
11
|
-
export interface SingleNumberSelectGroupProps
|
12
|
-
extends SelectGroupPropsHelper<number | undefined | null> {}
|
13
|
-
/** A `<SelectGroup/>` dropdown with values as numbers. Only one option can be selected at a time. */
|
14
|
-
export function SingleNumberSelectGroup(props: SingleNumberSelectGroupProps) {
|
15
|
-
return <SelectGroup multiple={false} {...props} />;
|
16
|
-
}
|
@@ -1,124 +0,0 @@
|
|
1
|
-
import { default as ReactSelect } from 'react-select';
|
2
|
-
import classNames from 'classnames';
|
3
|
-
import { InjectedFieldProps } from '../Field/InjectedFieldProps';
|
4
|
-
import { FormDefaults } from '../FormDefaults';
|
5
|
-
import Group, { GroupProps } from '../Group';
|
6
|
-
|
7
|
-
export interface SelectOption<TValue> {
|
8
|
-
/** Value for the select. This will be sent to the API. */
|
9
|
-
value: (TValue extends Array<infer P> ? P : TValue) | undefined;
|
10
|
-
/** Label for the select. This is displayed to the user. */
|
11
|
-
label: string;
|
12
|
-
}
|
13
|
-
|
14
|
-
// types roughly like the useService (envoc-core) result
|
15
|
-
interface OptionsApiResult<TValue> {
|
16
|
-
// we must apply Partial here because all results from template code gen are optional
|
17
|
-
result?: Partial<SelectOption<TValue>>[];
|
18
|
-
}
|
19
|
-
|
20
|
-
interface OptionsUseServiceResult<TValue> {
|
21
|
-
loading?: boolean;
|
22
|
-
// we must apply Partial here because all results from template code gen are optional
|
23
|
-
resp?: Partial<SelectOption<TValue>>[] | OptionsApiResult<TValue> | null;
|
24
|
-
error?: any;
|
25
|
-
}
|
26
|
-
|
27
|
-
export interface SelectGroupProps<TValue>
|
28
|
-
extends InjectedFieldProps<TValue | undefined | null>,
|
29
|
-
Omit<GroupProps, 'input' | 'meta' | 'children'> {
|
30
|
-
// allows for "useService" or other handles to control the data - including cache
|
31
|
-
// TODO: do we still want a version of select that has a "url" or maybe a promise func or something?
|
32
|
-
// eventually we can just add the shape of, say, useQuery (TanStack) to the union type
|
33
|
-
/** Options for the dropdown. Includes the label and value. */
|
34
|
-
options: SelectOption<TValue>[] | OptionsUseServiceResult<TValue>;
|
35
|
-
/** Whether the user should be able to have multiple values selected. */
|
36
|
-
multiple: TValue extends Array<any> ? true : false;
|
37
|
-
/** Text diplayed when no value is selected. */
|
38
|
-
placeholder?: string;
|
39
|
-
}
|
40
|
-
|
41
|
-
// TODO: we could also name this "ReactSelectGroup" or similar but the types are strongly defined now so kept the names consistent
|
42
|
-
/** Generic select dropdown. Uses [react-select](https://react-select.com/home). */
|
43
|
-
export default function SelectGroup<TValue>({
|
44
|
-
input,
|
45
|
-
meta,
|
46
|
-
className,
|
47
|
-
required,
|
48
|
-
disabled,
|
49
|
-
options,
|
50
|
-
multiple,
|
51
|
-
placeholder,
|
52
|
-
...rest
|
53
|
-
}: SelectGroupProps<TValue>) {
|
54
|
-
const effectiveOptions: Partial<SelectOption<TValue>>[] = !options
|
55
|
-
? []
|
56
|
-
: Array.isArray(options)
|
57
|
-
? options
|
58
|
-
: 'resp' in options &&
|
59
|
-
!!options.resp &&
|
60
|
-
'result' in options.resp &&
|
61
|
-
!!options.resp.result
|
62
|
-
? options.resp.result
|
63
|
-
: 'resp' in options && !!options.resp && Array.isArray(options.resp)
|
64
|
-
? options.resp
|
65
|
-
: [];
|
66
|
-
|
67
|
-
const isLoading =
|
68
|
-
(options && 'loading' in options && options.loading) || false;
|
69
|
-
|
70
|
-
return (
|
71
|
-
<Group
|
72
|
-
{...rest}
|
73
|
-
input={input}
|
74
|
-
meta={meta}
|
75
|
-
required={required}
|
76
|
-
disabled={disabled}
|
77
|
-
className={classNames(
|
78
|
-
className,
|
79
|
-
{
|
80
|
-
[FormDefaults.cssClassPrefix + 'multiple']: multiple,
|
81
|
-
[FormDefaults.cssClassPrefix + 'loading']: isLoading,
|
82
|
-
},
|
83
|
-
FormDefaults.cssClassPrefix + 'select-group'
|
84
|
-
)}>
|
85
|
-
<ReactSelect<
|
86
|
-
Partial<SelectOption<TValue>>,
|
87
|
-
TValue extends Array<any> ? true : false
|
88
|
-
>
|
89
|
-
inputId={input.id}
|
90
|
-
isMulti={multiple}
|
91
|
-
isDisabled={disabled}
|
92
|
-
options={effectiveOptions}
|
93
|
-
onBlur={input.onBlur}
|
94
|
-
value={getValue()}
|
95
|
-
onChange={(e: any) => {
|
96
|
-
if (multiple === true) {
|
97
|
-
input.onChange(e?.map((x: any) => x.value));
|
98
|
-
} else {
|
99
|
-
input.onChange(e?.value as any);
|
100
|
-
}
|
101
|
-
}}
|
102
|
-
getOptionLabel={(option) => option?.label ?? ''}
|
103
|
-
className={classNames(
|
104
|
-
className,
|
105
|
-
FormDefaults.cssClassPrefix + 'select-group'
|
106
|
-
)}
|
107
|
-
classNamePrefix="react-select"
|
108
|
-
menuPortalTarget={document.body}
|
109
|
-
menuPlacement="auto"
|
110
|
-
placeholder={placeholder}
|
111
|
-
/>
|
112
|
-
</Group>
|
113
|
-
);
|
114
|
-
|
115
|
-
function getValue() {
|
116
|
-
if (multiple) {
|
117
|
-
return effectiveOptions.filter(
|
118
|
-
(o) =>
|
119
|
-
Array.isArray(input.value) && !!input.value.find((x) => o.value === x)
|
120
|
-
);
|
121
|
-
}
|
122
|
-
return effectiveOptions.find((o) => o.value === input.value);
|
123
|
-
}
|
124
|
-
}
|
@@ -1,16 +0,0 @@
|
|
1
|
-
import SelectGroup from './SelectGroup';
|
2
|
-
import { SelectGroupPropsHelper } from './SelectGroupPropsHelper';
|
3
|
-
|
4
|
-
export interface MultiStringSelectGroupProps
|
5
|
-
extends SelectGroupPropsHelper<string[]> {}
|
6
|
-
/** A `<SelectGroup/>` dropdown with values as strings. Multiple options can be selected at a time. */
|
7
|
-
export function MultiStringSelectGroup(props: MultiStringSelectGroupProps) {
|
8
|
-
return <SelectGroup multiple={true} {...props} />;
|
9
|
-
}
|
10
|
-
|
11
|
-
export interface SingleStringSelectGroupProps
|
12
|
-
extends SelectGroupPropsHelper<string> {}
|
13
|
-
/** A `<SelectGroup/>` dropdown with the value as a string. Only one option can be selected at a time. */
|
14
|
-
export function SingleStringSelectGroup(props: SingleStringSelectGroupProps) {
|
15
|
-
return <SelectGroup multiple={false} {...props} />;
|
16
|
-
}
|
@@ -1,35 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import { render } from '@testing-library/react';
|
3
|
-
import FormTestBase from '../../__Tests__/FormTestBase';
|
4
|
-
import { BooleanSelectGroup } from '../BooleanSelectGroup';
|
5
|
-
|
6
|
-
describe('BooleanSelectGroup', () => {
|
7
|
-
it('renders without crashing', () => {
|
8
|
-
render(
|
9
|
-
<FormTestBase>
|
10
|
-
{({ Field }) => (
|
11
|
-
<Field
|
12
|
-
name="allowLogin"
|
13
|
-
Component={BooleanSelectGroup}
|
14
|
-
label="Allow Login"
|
15
|
-
/>
|
16
|
-
)}
|
17
|
-
</FormTestBase>
|
18
|
-
);
|
19
|
-
});
|
20
|
-
|
21
|
-
it('has matching snapshot', () => {
|
22
|
-
const renderResult = render(
|
23
|
-
<FormTestBase>
|
24
|
-
{({ Field }) => (
|
25
|
-
<Field
|
26
|
-
name="allowLogin"
|
27
|
-
Component={BooleanSelectGroup}
|
28
|
-
label="Allow Login"
|
29
|
-
/>
|
30
|
-
)}
|
31
|
-
</FormTestBase>
|
32
|
-
);
|
33
|
-
expect(renderResult.asFragment()).toMatchSnapshot();
|
34
|
-
});
|
35
|
-
});
|
@@ -1,87 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import { render } from '@testing-library/react';
|
3
|
-
import FormTestBase from '../../__Tests__/FormTestBase';
|
4
|
-
import {
|
5
|
-
MultiNumberSelectGroup,
|
6
|
-
SingleNumberSelectGroup,
|
7
|
-
} from '../NumberSelectGroup';
|
8
|
-
|
9
|
-
describe('SingleNumberSelectGroup', () => {
|
10
|
-
it('renders without crashing', () => {
|
11
|
-
render(
|
12
|
-
<FormTestBase>
|
13
|
-
{({ Field }) => (
|
14
|
-
<Field
|
15
|
-
name="favoriteNumber"
|
16
|
-
Component={SingleNumberSelectGroup}
|
17
|
-
label="Favorite Number"
|
18
|
-
options={[
|
19
|
-
{ label: 'I like one', value: 1 },
|
20
|
-
{ label: 'Occasionally two', value: 2 },
|
21
|
-
{ label: 'Forever three', value: 3 },
|
22
|
-
]}
|
23
|
-
/>
|
24
|
-
)}
|
25
|
-
</FormTestBase>
|
26
|
-
);
|
27
|
-
});
|
28
|
-
|
29
|
-
it('has matching snapshot', () => {
|
30
|
-
const renderResult = render(
|
31
|
-
<FormTestBase>
|
32
|
-
{({ Field }) => (
|
33
|
-
<Field
|
34
|
-
name="favoriteNumber"
|
35
|
-
Component={SingleNumberSelectGroup}
|
36
|
-
label="Favorite Number"
|
37
|
-
options={[
|
38
|
-
{ label: 'I like one', value: 1 },
|
39
|
-
{ label: 'Occasionally two', value: 2 },
|
40
|
-
{ label: 'Forever three', value: 3 },
|
41
|
-
]}
|
42
|
-
/>
|
43
|
-
)}
|
44
|
-
</FormTestBase>
|
45
|
-
);
|
46
|
-
expect(renderResult.asFragment()).toMatchSnapshot();
|
47
|
-
});
|
48
|
-
});
|
49
|
-
|
50
|
-
describe('MultiNumberSelectGroup', () => {
|
51
|
-
it('renders without crashing', () => {
|
52
|
-
render(
|
53
|
-
<FormTestBase>
|
54
|
-
{({ Field }) => (
|
55
|
-
<Field
|
56
|
-
name="userRoles"
|
57
|
-
Component={MultiNumberSelectGroup}
|
58
|
-
label="Favorite Number"
|
59
|
-
options={[
|
60
|
-
{ label: 'Tyrannosaurus Rex', value: 1 },
|
61
|
-
{ label: 'Stegosaurus', value: 2 },
|
62
|
-
]}
|
63
|
-
/>
|
64
|
-
)}
|
65
|
-
</FormTestBase>
|
66
|
-
);
|
67
|
-
});
|
68
|
-
|
69
|
-
it('has matching snapshot', () => {
|
70
|
-
const renderResult = render(
|
71
|
-
<FormTestBase>
|
72
|
-
{({ Field }) => (
|
73
|
-
<Field
|
74
|
-
name="userRoles"
|
75
|
-
Component={MultiNumberSelectGroup}
|
76
|
-
label="Favorite Number"
|
77
|
-
options={[
|
78
|
-
{ label: 'Tyrannosaurus Rex', value: 1 },
|
79
|
-
{ label: 'Stegosaurus', value: 2 },
|
80
|
-
]}
|
81
|
-
/>
|
82
|
-
)}
|
83
|
-
</FormTestBase>
|
84
|
-
);
|
85
|
-
expect(renderResult.asFragment()).toMatchSnapshot();
|
86
|
-
});
|
87
|
-
});
|
@@ -1,89 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import { render } from '@testing-library/react';
|
3
|
-
import FormTestBase from '../../__Tests__/FormTestBase';
|
4
|
-
import {
|
5
|
-
MultiStringSelectGroup,
|
6
|
-
SingleStringSelectGroup,
|
7
|
-
} from '../StringSelectGroup';
|
8
|
-
|
9
|
-
describe('SingleStringSelectGroup', () => {
|
10
|
-
it('renders without crashing', () => {
|
11
|
-
render(
|
12
|
-
<FormTestBase>
|
13
|
-
{({ Field }) => (
|
14
|
-
<Field
|
15
|
-
name="favoriteColor"
|
16
|
-
Component={SingleStringSelectGroup}
|
17
|
-
label="Favorite Color"
|
18
|
-
options={[
|
19
|
-
{ label: 'Blue', value: 'Blue' },
|
20
|
-
{ label: 'Green', value: 'Green' },
|
21
|
-
{ label: 'Red', value: 'Red' },
|
22
|
-
]}
|
23
|
-
/>
|
24
|
-
)}
|
25
|
-
</FormTestBase>
|
26
|
-
);
|
27
|
-
});
|
28
|
-
|
29
|
-
it('has matching snapshot', () => {
|
30
|
-
const renderResult = render(
|
31
|
-
<FormTestBase>
|
32
|
-
{({ Field }) => (
|
33
|
-
<Field
|
34
|
-
name="favoriteColor"
|
35
|
-
Component={SingleStringSelectGroup}
|
36
|
-
label="Favorite Color"
|
37
|
-
options={[
|
38
|
-
{ label: 'Blue', value: 'Blue' },
|
39
|
-
{ label: 'Green', value: 'Green' },
|
40
|
-
{ label: 'Red', value: 'Red' },
|
41
|
-
]}
|
42
|
-
/>
|
43
|
-
)}
|
44
|
-
</FormTestBase>
|
45
|
-
);
|
46
|
-
expect(renderResult.asFragment()).toMatchSnapshot();
|
47
|
-
});
|
48
|
-
});
|
49
|
-
|
50
|
-
describe('MultiStringSelectGroup', () => {
|
51
|
-
it('renders without crashing', () => {
|
52
|
-
render(
|
53
|
-
<FormTestBase>
|
54
|
-
{({ Field }) => (
|
55
|
-
<Field
|
56
|
-
name="favoriteColors"
|
57
|
-
Component={MultiStringSelectGroup}
|
58
|
-
label="Favorite Color"
|
59
|
-
options={[
|
60
|
-
{ label: 'Blue', value: 'Blue' },
|
61
|
-
{ label: 'Green', value: 'Green' },
|
62
|
-
{ label: 'Red', value: 'Red' },
|
63
|
-
]}
|
64
|
-
/>
|
65
|
-
)}
|
66
|
-
</FormTestBase>
|
67
|
-
);
|
68
|
-
});
|
69
|
-
|
70
|
-
it('has matching snapshot', () => {
|
71
|
-
const renderResult = render(
|
72
|
-
<FormTestBase>
|
73
|
-
{({ Field }) => (
|
74
|
-
<Field
|
75
|
-
name="favoriteColors"
|
76
|
-
Component={MultiStringSelectGroup}
|
77
|
-
label="Favorite Color"
|
78
|
-
options={[
|
79
|
-
{ label: 'Blue', value: 'Blue' },
|
80
|
-
{ label: 'Green', value: 'Green' },
|
81
|
-
{ label: 'Red', value: 'Red' },
|
82
|
-
]}
|
83
|
-
/>
|
84
|
-
)}
|
85
|
-
</FormTestBase>
|
86
|
-
);
|
87
|
-
expect(renderResult.asFragment()).toMatchSnapshot();
|
88
|
-
});
|
89
|
-
});
|
@@ -1,98 +0,0 @@
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
-
|
3
|
-
exports[`BooleanSelectGroup has matching snapshot 1`] = `
|
4
|
-
<DocumentFragment>
|
5
|
-
<form
|
6
|
-
action="#"
|
7
|
-
class="envoc-form-form"
|
8
|
-
>
|
9
|
-
<div
|
10
|
-
class="envoc-form-select-group envoc-form-group"
|
11
|
-
>
|
12
|
-
<div
|
13
|
-
id="allowlogin-error-scroll-target"
|
14
|
-
style="display: none;"
|
15
|
-
/>
|
16
|
-
<label
|
17
|
-
for="allowLogin"
|
18
|
-
>
|
19
|
-
Allow Login
|
20
|
-
</label>
|
21
|
-
<div
|
22
|
-
class="envoc-form-select-group css-b62m3t-container"
|
23
|
-
>
|
24
|
-
<span
|
25
|
-
class="css-1f43avz-a11yText-A11yText"
|
26
|
-
id="react-select-3-live-region"
|
27
|
-
/>
|
28
|
-
<span
|
29
|
-
aria-atomic="false"
|
30
|
-
aria-live="polite"
|
31
|
-
aria-relevant="additions text"
|
32
|
-
class="css-1f43avz-a11yText-A11yText"
|
33
|
-
/>
|
34
|
-
<div
|
35
|
-
class="react-select__control css-13cymwt-control"
|
36
|
-
>
|
37
|
-
<div
|
38
|
-
class="react-select__value-container css-16674sh-Component"
|
39
|
-
>
|
40
|
-
<div
|
41
|
-
class="react-select__placeholder css-1jqq78o-placeholder"
|
42
|
-
id="react-select-3-placeholder"
|
43
|
-
>
|
44
|
-
Select...
|
45
|
-
</div>
|
46
|
-
<div
|
47
|
-
class="react-select__input-container css-d9r47t-Component"
|
48
|
-
data-value=""
|
49
|
-
>
|
50
|
-
<input
|
51
|
-
aria-autocomplete="list"
|
52
|
-
aria-describedby="react-select-3-placeholder"
|
53
|
-
aria-expanded="false"
|
54
|
-
aria-haspopup="true"
|
55
|
-
autocapitalize="none"
|
56
|
-
autocomplete="off"
|
57
|
-
autocorrect="off"
|
58
|
-
class="react-select__input"
|
59
|
-
id="allowLogin"
|
60
|
-
role="combobox"
|
61
|
-
spellcheck="false"
|
62
|
-
style="opacity: 1; width: 100%; grid-area: 1 / 2; min-width: 2px; border: 0px; margin: 0px; outline: 0; padding: 0px;"
|
63
|
-
tabindex="0"
|
64
|
-
type="text"
|
65
|
-
value=""
|
66
|
-
/>
|
67
|
-
</div>
|
68
|
-
</div>
|
69
|
-
<div
|
70
|
-
class="react-select__indicators css-ny0e4k-Component"
|
71
|
-
>
|
72
|
-
<span
|
73
|
-
class="react-select__indicator-separator css-1u9des2-indicatorSeparator"
|
74
|
-
/>
|
75
|
-
<div
|
76
|
-
aria-hidden="true"
|
77
|
-
class="react-select__indicator react-select__dropdown-indicator css-1xc3v61-indicatorContainer"
|
78
|
-
>
|
79
|
-
<svg
|
80
|
-
aria-hidden="true"
|
81
|
-
class="css-tj5bde-Svg"
|
82
|
-
focusable="false"
|
83
|
-
height="20"
|
84
|
-
viewBox="0 0 20 20"
|
85
|
-
width="20"
|
86
|
-
>
|
87
|
-
<path
|
88
|
-
d="M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"
|
89
|
-
/>
|
90
|
-
</svg>
|
91
|
-
</div>
|
92
|
-
</div>
|
93
|
-
</div>
|
94
|
-
</div>
|
95
|
-
</div>
|
96
|
-
</form>
|
97
|
-
</DocumentFragment>
|
98
|
-
`;
|