envoc-form 5.0.3 → 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,54 +0,0 @@
|
|
1
|
-
import React, { LegacyRef } from 'react';
|
2
|
-
import classNames from 'classnames';
|
3
|
-
import InputGroupWithRef, { InputGroupProps } from './InputGroup';
|
4
|
-
import { FormDefaults } from '../FormDefaults';
|
5
|
-
|
6
|
-
// TODO: make className tailwind-able instead of css. make it typeof string ????
|
7
|
-
// or should we just give a div a className and let each project decide? (this seems to be the patern)
|
8
|
-
export interface IconInputGroupProps
|
9
|
-
extends Omit<
|
10
|
-
InputGroupProps<string | undefined | null>,
|
11
|
-
'onChange' | 'type' | 'value'
|
12
|
-
> {
|
13
|
-
type?: 'color' | 'email' | 'search' | 'tel' | 'text' | 'url';
|
14
|
-
/** Icon to display on the input group. */
|
15
|
-
icon: React.ReactNode;
|
16
|
-
/** Text to display after the input group to give more information to the user. */
|
17
|
-
helpText?: string;
|
18
|
-
}
|
19
|
-
|
20
|
-
function IconInputGroup(
|
21
|
-
{ icon, className, ...rest }: IconInputGroupProps,
|
22
|
-
ref: LegacyRef<HTMLInputElement>
|
23
|
-
) {
|
24
|
-
const { input } = rest;
|
25
|
-
|
26
|
-
return (
|
27
|
-
<>
|
28
|
-
<InputGroupWithRef
|
29
|
-
icon={icon}
|
30
|
-
ref={ref}
|
31
|
-
className={classNames(
|
32
|
-
className,
|
33
|
-
FormDefaults.cssClassPrefix + 'icon-input-group'
|
34
|
-
)}
|
35
|
-
value={input.value ?? ''}
|
36
|
-
onChange={(e) => {
|
37
|
-
if (!e.target.value) {
|
38
|
-
input.onChange(undefined);
|
39
|
-
} else {
|
40
|
-
input.onChange(e.target.value);
|
41
|
-
}
|
42
|
-
}}
|
43
|
-
{...rest}
|
44
|
-
/>
|
45
|
-
</>
|
46
|
-
);
|
47
|
-
}
|
48
|
-
|
49
|
-
/** Input group with an icon. */
|
50
|
-
const IconInputGroupWithRef = React.forwardRef(
|
51
|
-
IconInputGroup
|
52
|
-
) as React.ComponentType<IconInputGroupProps>;
|
53
|
-
|
54
|
-
export default IconInputGroupWithRef;
|
package/src/Input/InputGroup.tsx
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
import React, { ChangeEventHandler, LegacyRef } from 'react';
|
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 InputGroupProps<TValue>
|
8
|
-
extends InjectedFieldProps<TValue>,
|
9
|
-
Omit<
|
10
|
-
React.HTMLProps<HTMLInputElement>,
|
11
|
-
| keyof InjectedFieldProps<any>
|
12
|
-
| 'children'
|
13
|
-
| 'className'
|
14
|
-
| 'label'
|
15
|
-
| 'value'
|
16
|
-
>,
|
17
|
-
Omit<GroupProps, keyof InjectedFieldProps<any> | 'children'> {
|
18
|
-
onChange: ChangeEventHandler<HTMLInputElement>;
|
19
|
-
value: string | number | null | undefined;
|
20
|
-
icon?: React.ReactNode;
|
21
|
-
}
|
22
|
-
|
23
|
-
function InputGroup<TValue>(
|
24
|
-
{
|
25
|
-
input,
|
26
|
-
meta,
|
27
|
-
label,
|
28
|
-
helpText,
|
29
|
-
className,
|
30
|
-
required,
|
31
|
-
disabled,
|
32
|
-
onChange,
|
33
|
-
value,
|
34
|
-
icon,
|
35
|
-
...rest
|
36
|
-
}: InputGroupProps<TValue>,
|
37
|
-
ref: LegacyRef<HTMLInputElement>
|
38
|
-
) {
|
39
|
-
return (
|
40
|
-
<Group
|
41
|
-
input={input}
|
42
|
-
meta={meta}
|
43
|
-
required={required}
|
44
|
-
disabled={disabled}
|
45
|
-
label={label}
|
46
|
-
helpText={helpText}
|
47
|
-
className={classNames(
|
48
|
-
className,
|
49
|
-
FormDefaults.cssClassPrefix + 'input-group'
|
50
|
-
)}>
|
51
|
-
{icon}
|
52
|
-
<input
|
53
|
-
{...input}
|
54
|
-
{...rest}
|
55
|
-
aria-invalid={!!meta.error}
|
56
|
-
aria-errormessage={!!meta.error ? `${input.name}-error` : undefined}
|
57
|
-
value={value ?? ''}
|
58
|
-
onChange={onChange}
|
59
|
-
ref={ref}
|
60
|
-
className={classNames(
|
61
|
-
className,
|
62
|
-
FormDefaults.cssClassPrefix + 'input-group'
|
63
|
-
)}
|
64
|
-
/>
|
65
|
-
</Group>
|
66
|
-
);
|
67
|
-
}
|
68
|
-
|
69
|
-
/** Generic controlled `<input/>` wrapped by a `<Group/>` */
|
70
|
-
const InputGroupWithRef = React.forwardRef(InputGroup) as typeof InputGroup;
|
71
|
-
|
72
|
-
export default InputGroupWithRef;
|
@@ -1,50 +0,0 @@
|
|
1
|
-
import React, { LegacyRef } from 'react';
|
2
|
-
import classNames from 'classnames';
|
3
|
-
import InputGroup, { InputGroupProps } from './InputGroup';
|
4
|
-
import { FormDefaults } from '../FormDefaults';
|
5
|
-
|
6
|
-
export interface MoneyInputGroupProps
|
7
|
-
extends Omit<
|
8
|
-
InputGroupProps<number | undefined | null>,
|
9
|
-
'onChange' | 'type' | 'value'
|
10
|
-
> {
|
11
|
-
/** Custom parsing function when the value changes. */
|
12
|
-
parseFunc?: typeof parseInt | typeof parseFloat;
|
13
|
-
}
|
14
|
-
|
15
|
-
function MoneyInputGroup(
|
16
|
-
{ parseFunc, className, ...rest }: MoneyInputGroupProps,
|
17
|
-
ref: LegacyRef<HTMLInputElement>
|
18
|
-
) {
|
19
|
-
const effectiveParse = parseFunc ?? parseFloat;
|
20
|
-
const { input } = rest;
|
21
|
-
|
22
|
-
return (
|
23
|
-
<InputGroup
|
24
|
-
ref={ref}
|
25
|
-
step={0.01}
|
26
|
-
min={0}
|
27
|
-
{...rest}
|
28
|
-
type="number"
|
29
|
-
className={classNames(
|
30
|
-
className,
|
31
|
-
FormDefaults.cssClassPrefix + 'money-group'
|
32
|
-
)}
|
33
|
-
value={input.value || ''}
|
34
|
-
onChange={(e) => {
|
35
|
-
if (!e.target.value) {
|
36
|
-
input.onChange(undefined);
|
37
|
-
} else {
|
38
|
-
input.onChange(effectiveParse(e.target.value));
|
39
|
-
}
|
40
|
-
}}
|
41
|
-
/>
|
42
|
-
);
|
43
|
-
}
|
44
|
-
|
45
|
-
/** Input group for inputting money. */
|
46
|
-
const MoneyInputGroupWithRef = React.forwardRef(
|
47
|
-
MoneyInputGroup
|
48
|
-
) as React.FunctionComponent<MoneyInputGroupProps>;
|
49
|
-
|
50
|
-
export default MoneyInputGroupWithRef;
|
@@ -1,48 +0,0 @@
|
|
1
|
-
import React, { LegacyRef } from 'react';
|
2
|
-
import classNames from 'classnames';
|
3
|
-
import InputGroup, { InputGroupProps } from './InputGroup';
|
4
|
-
import { FormDefaults } from '../FormDefaults';
|
5
|
-
|
6
|
-
export interface NumberInputGroupProps
|
7
|
-
extends Omit<
|
8
|
-
InputGroupProps<number | undefined | null>,
|
9
|
-
'onChange' | 'type' | 'value'
|
10
|
-
> {
|
11
|
-
/** Custom parsing function when the value changes. */
|
12
|
-
parseFunc?: typeof parseInt | typeof parseFloat;
|
13
|
-
}
|
14
|
-
|
15
|
-
function NumberInputGroup(
|
16
|
-
{ parseFunc, className, ...rest }: NumberInputGroupProps,
|
17
|
-
ref: LegacyRef<HTMLInputElement>
|
18
|
-
) {
|
19
|
-
const effectiveParse = parseFunc ?? parseFloat;
|
20
|
-
const { input } = rest;
|
21
|
-
|
22
|
-
return (
|
23
|
-
<InputGroup
|
24
|
-
ref={ref}
|
25
|
-
{...rest}
|
26
|
-
type="number"
|
27
|
-
className={classNames(
|
28
|
-
className,
|
29
|
-
FormDefaults.cssClassPrefix + 'number-group'
|
30
|
-
)}
|
31
|
-
value={input.value || ''}
|
32
|
-
onChange={(e) => {
|
33
|
-
if (!e.target.value) {
|
34
|
-
input.onChange(undefined);
|
35
|
-
} else {
|
36
|
-
input.onChange(effectiveParse(e.target.value));
|
37
|
-
}
|
38
|
-
}}
|
39
|
-
/>
|
40
|
-
);
|
41
|
-
}
|
42
|
-
|
43
|
-
/** Standard number input group. By default allows for float values. */
|
44
|
-
const NumberInputGroupWithRef = React.forwardRef(
|
45
|
-
NumberInputGroup
|
46
|
-
) as React.ComponentType<NumberInputGroupProps>;
|
47
|
-
|
48
|
-
export default NumberInputGroupWithRef;
|
@@ -1,45 +0,0 @@
|
|
1
|
-
import React, { LegacyRef } from 'react';
|
2
|
-
import classNames from 'classnames';
|
3
|
-
import InputGroup, { InputGroupProps } from './InputGroup';
|
4
|
-
import { FormDefaults } from '../FormDefaults';
|
5
|
-
import { phoneNumber } from '../Normalization/normalizers';
|
6
|
-
|
7
|
-
export interface PhoneNumberInputGroupProps
|
8
|
-
extends Omit<
|
9
|
-
InputGroupProps<string | undefined | null>,
|
10
|
-
'onChange' | 'type' | 'value'
|
11
|
-
> {}
|
12
|
-
function PhoneNumberInputGroup(
|
13
|
-
{ className, ...rest }: PhoneNumberInputGroupProps,
|
14
|
-
ref: LegacyRef<HTMLInputElement>
|
15
|
-
) {
|
16
|
-
const { input } = rest;
|
17
|
-
return (
|
18
|
-
<InputGroup
|
19
|
-
ref={ref}
|
20
|
-
autoComplete="tel-national"
|
21
|
-
{...rest}
|
22
|
-
type="text"
|
23
|
-
className={classNames(
|
24
|
-
className,
|
25
|
-
FormDefaults.cssClassPrefix + 'phone-number-group'
|
26
|
-
)}
|
27
|
-
value={input.value ?? ''}
|
28
|
-
onChange={(e) => {
|
29
|
-
if (!e.target.value) {
|
30
|
-
input.onChange(undefined);
|
31
|
-
} else {
|
32
|
-
input.onChange(phoneNumber(e.target.value));
|
33
|
-
}
|
34
|
-
}}
|
35
|
-
/>
|
36
|
-
);
|
37
|
-
}
|
38
|
-
/**A standard phone number input. Will display to the user in `+XXX XXX-XXX-XXXX` format as the number is being inputted.
|
39
|
-
* The data will get sent in the same format as displayed. Uses `normalizers.phoneNumber`.
|
40
|
-
* @default autoComplete="tel-national"
|
41
|
-
*/
|
42
|
-
const PhoneNumberInputGroupWithRef = React.forwardRef(
|
43
|
-
PhoneNumberInputGroup
|
44
|
-
) as React.ComponentType<PhoneNumberInputGroupProps>;
|
45
|
-
export default PhoneNumberInputGroupWithRef;
|
@@ -1,53 +0,0 @@
|
|
1
|
-
import React, { LegacyRef } from 'react';
|
2
|
-
import classNames from 'classnames';
|
3
|
-
import InputGroup, { InputGroupProps } from './InputGroup';
|
4
|
-
import { FormDefaults } from '../FormDefaults';
|
5
|
-
|
6
|
-
export interface StringInputGroupProps
|
7
|
-
extends Omit<
|
8
|
-
InputGroupProps<string | undefined | null>,
|
9
|
-
'onChange' | 'type' | 'value'
|
10
|
-
> {
|
11
|
-
type?:
|
12
|
-
| 'color'
|
13
|
-
| 'email'
|
14
|
-
| 'search'
|
15
|
-
| 'tel'
|
16
|
-
| 'text'
|
17
|
-
| 'url'
|
18
|
-
| 'password'
|
19
|
-
| 'textarea';
|
20
|
-
}
|
21
|
-
|
22
|
-
function StringInputGroup(
|
23
|
-
{ className, ...rest }: StringInputGroupProps,
|
24
|
-
ref: LegacyRef<HTMLInputElement>
|
25
|
-
) {
|
26
|
-
const { input } = rest;
|
27
|
-
|
28
|
-
return (
|
29
|
-
<InputGroup
|
30
|
-
ref={ref}
|
31
|
-
{...rest}
|
32
|
-
className={classNames(
|
33
|
-
className,
|
34
|
-
FormDefaults.cssClassPrefix + 'string-group'
|
35
|
-
)}
|
36
|
-
value={input.value ?? ''}
|
37
|
-
onChange={(e) => {
|
38
|
-
if (!e.target.value) {
|
39
|
-
input.onChange(undefined);
|
40
|
-
} else {
|
41
|
-
input.onChange(e.target.value);
|
42
|
-
}
|
43
|
-
}}
|
44
|
-
/>
|
45
|
-
);
|
46
|
-
}
|
47
|
-
|
48
|
-
/** Standard string input group. */
|
49
|
-
const StringInputGroupWithRef = React.forwardRef(
|
50
|
-
StringInputGroup
|
51
|
-
) as React.ComponentType<StringInputGroupProps>;
|
52
|
-
|
53
|
-
export default StringInputGroupWithRef;
|
@@ -1,35 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import { render } from '@testing-library/react';
|
3
|
-
import FormTestBase from '../../__Tests__/FormTestBase';
|
4
|
-
import IconInputGroup from '../IconInputGroup';
|
5
|
-
|
6
|
-
describe('IconInputGroup', () => {
|
7
|
-
it('renders without crashing', () => {
|
8
|
-
render(
|
9
|
-
<FormTestBase>
|
10
|
-
{({ Field }) => (
|
11
|
-
<Field
|
12
|
-
name="nameWithIcon"
|
13
|
-
Component={IconInputGroup}
|
14
|
-
icon={<span>Pretend this is an icon</span>}
|
15
|
-
/>
|
16
|
-
)}
|
17
|
-
</FormTestBase>
|
18
|
-
);
|
19
|
-
});
|
20
|
-
|
21
|
-
it('has matching snapshot', () => {
|
22
|
-
const renderResult = render(
|
23
|
-
<FormTestBase>
|
24
|
-
{({ Field }) => (
|
25
|
-
<Field
|
26
|
-
name="nameWithIcon"
|
27
|
-
Component={IconInputGroup}
|
28
|
-
icon={<span>Pretend this is an icon</span>}
|
29
|
-
/>
|
30
|
-
)}
|
31
|
-
</FormTestBase>
|
32
|
-
);
|
33
|
-
expect(renderResult.asFragment()).toMatchSnapshot();
|
34
|
-
});
|
35
|
-
});
|
@@ -1,37 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import { render } from '@testing-library/react';
|
3
|
-
import FormTestBase from '../../__Tests__/FormTestBase';
|
4
|
-
import MoneyInputGroup from '../MoneyInputGroup';
|
5
|
-
|
6
|
-
describe('MoneyInputGroup', () => {
|
7
|
-
it('renders without crashing', () => {
|
8
|
-
render(
|
9
|
-
<FormTestBase>
|
10
|
-
{({ Field }) => (
|
11
|
-
<Field
|
12
|
-
name="yearlySalaryUSD"
|
13
|
-
Component={MoneyInputGroup}
|
14
|
-
label="Salary"
|
15
|
-
className="something-here"
|
16
|
-
/>
|
17
|
-
)}
|
18
|
-
</FormTestBase>
|
19
|
-
);
|
20
|
-
});
|
21
|
-
|
22
|
-
it('has matching snapshot', () => {
|
23
|
-
const renderResult = render(
|
24
|
-
<FormTestBase>
|
25
|
-
{({ Field }) => (
|
26
|
-
<Field
|
27
|
-
name="yearlySalaryUSD"
|
28
|
-
Component={MoneyInputGroup}
|
29
|
-
label="Salary"
|
30
|
-
className="something-here"
|
31
|
-
/>
|
32
|
-
)}
|
33
|
-
</FormTestBase>
|
34
|
-
);
|
35
|
-
expect(renderResult.asFragment()).toMatchSnapshot();
|
36
|
-
});
|
37
|
-
});
|
@@ -1,35 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import { render } from '@testing-library/react';
|
3
|
-
import FormTestBase from '../../__Tests__/FormTestBase';
|
4
|
-
import NumberInputGroup from '../NumberInputGroup';
|
5
|
-
|
6
|
-
describe('NumberInputGroup', () => {
|
7
|
-
it('renders without crashing', () => {
|
8
|
-
render(
|
9
|
-
<FormTestBase>
|
10
|
-
{({ Field }) => (
|
11
|
-
<Field
|
12
|
-
name="numberOfArms"
|
13
|
-
Component={NumberInputGroup}
|
14
|
-
label="Arm Count"
|
15
|
-
/>
|
16
|
-
)}
|
17
|
-
</FormTestBase>
|
18
|
-
);
|
19
|
-
});
|
20
|
-
|
21
|
-
it('has matching snapshot', () => {
|
22
|
-
const renderResult = render(
|
23
|
-
<FormTestBase>
|
24
|
-
{({ Field }) => (
|
25
|
-
<Field
|
26
|
-
name="numberOfArms"
|
27
|
-
Component={NumberInputGroup}
|
28
|
-
label="Arm Count"
|
29
|
-
/>
|
30
|
-
)}
|
31
|
-
</FormTestBase>
|
32
|
-
);
|
33
|
-
expect(renderResult.asFragment()).toMatchSnapshot();
|
34
|
-
});
|
35
|
-
});
|
@@ -1,36 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import { render } from '@testing-library/react';
|
3
|
-
import FormTestBase from '../../__Tests__/FormTestBase';
|
4
|
-
import PhoneNumberInputGroup from '../PhoneNumberInputGroup';
|
5
|
-
|
6
|
-
describe('PhoneNumberInputGroup', () => {
|
7
|
-
it('renders without crashing', () => {
|
8
|
-
render(
|
9
|
-
<FormTestBase>
|
10
|
-
{({ Field }) => (
|
11
|
-
<Field
|
12
|
-
name="phoneNumber"
|
13
|
-
Component={PhoneNumberInputGroup}
|
14
|
-
label="Phone Number"
|
15
|
-
className="something-here"
|
16
|
-
/>
|
17
|
-
)}
|
18
|
-
</FormTestBase>
|
19
|
-
);
|
20
|
-
});
|
21
|
-
it('has matching snapshot', () => {
|
22
|
-
const renderResult = render(
|
23
|
-
<FormTestBase>
|
24
|
-
{({ Field }) => (
|
25
|
-
<Field
|
26
|
-
name="phoneNumber"
|
27
|
-
Component={PhoneNumberInputGroup}
|
28
|
-
label="Phone Number"
|
29
|
-
className="something-here"
|
30
|
-
/>
|
31
|
-
)}
|
32
|
-
</FormTestBase>
|
33
|
-
);
|
34
|
-
expect(renderResult.asFragment()).toMatchSnapshot();
|
35
|
-
});
|
36
|
-
});
|
@@ -1,27 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import { render } from '@testing-library/react';
|
3
|
-
import FormTestBase from '../../__Tests__/FormTestBase';
|
4
|
-
import StringInputGroup from '../StringInputGroup';
|
5
|
-
|
6
|
-
describe('StringInputGroup', () => {
|
7
|
-
it('renders without crashing', () => {
|
8
|
-
render(
|
9
|
-
<FormTestBase>
|
10
|
-
{({ Field }) => (
|
11
|
-
<Field name="name" Component={StringInputGroup} label="Name" />
|
12
|
-
)}
|
13
|
-
</FormTestBase>
|
14
|
-
);
|
15
|
-
});
|
16
|
-
|
17
|
-
it('has matching snapshot', () => {
|
18
|
-
const renderResult = render(
|
19
|
-
<FormTestBase>
|
20
|
-
{({ Field }) => (
|
21
|
-
<Field name="name" Component={StringInputGroup} label="Name" />
|
22
|
-
)}
|
23
|
-
</FormTestBase>
|
24
|
-
);
|
25
|
-
expect(renderResult.asFragment()).toMatchSnapshot();
|
26
|
-
});
|
27
|
-
});
|
@@ -1,32 +0,0 @@
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
-
|
3
|
-
exports[`IconInputGroup has matching snapshot 1`] = `
|
4
|
-
<DocumentFragment>
|
5
|
-
<form
|
6
|
-
action="#"
|
7
|
-
class="envoc-form-form"
|
8
|
-
>
|
9
|
-
<div
|
10
|
-
class="envoc-form-icon-input-group envoc-form-input-group envoc-form-group"
|
11
|
-
>
|
12
|
-
<div
|
13
|
-
id="namewithicon-error-scroll-target"
|
14
|
-
style="display: none;"
|
15
|
-
/>
|
16
|
-
<label
|
17
|
-
for="nameWithIcon"
|
18
|
-
/>
|
19
|
-
<span>
|
20
|
-
Pretend this is an icon
|
21
|
-
</span>
|
22
|
-
<input
|
23
|
-
aria-invalid="false"
|
24
|
-
class="envoc-form-icon-input-group envoc-form-input-group"
|
25
|
-
id="nameWithIcon"
|
26
|
-
name="nameWithIcon"
|
27
|
-
value=""
|
28
|
-
/>
|
29
|
-
</div>
|
30
|
-
</form>
|
31
|
-
</DocumentFragment>
|
32
|
-
`;
|
@@ -1,34 +0,0 @@
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
-
|
3
|
-
exports[`MoneyInputGroup has matching snapshot 1`] = `
|
4
|
-
<DocumentFragment>
|
5
|
-
<form
|
6
|
-
action="#"
|
7
|
-
class="envoc-form-form"
|
8
|
-
>
|
9
|
-
<div
|
10
|
-
class="something-here envoc-form-money-group envoc-form-input-group envoc-form-group"
|
11
|
-
>
|
12
|
-
<div
|
13
|
-
id="yearlysalaryusd-error-scroll-target"
|
14
|
-
style="display: none;"
|
15
|
-
/>
|
16
|
-
<label
|
17
|
-
for="yearlySalaryUSD"
|
18
|
-
>
|
19
|
-
Salary
|
20
|
-
</label>
|
21
|
-
<input
|
22
|
-
aria-invalid="false"
|
23
|
-
class="something-here envoc-form-money-group envoc-form-input-group"
|
24
|
-
id="yearlySalaryUSD"
|
25
|
-
min="0"
|
26
|
-
name="yearlySalaryUSD"
|
27
|
-
step="0.01"
|
28
|
-
type="number"
|
29
|
-
value=""
|
30
|
-
/>
|
31
|
-
</div>
|
32
|
-
</form>
|
33
|
-
</DocumentFragment>
|
34
|
-
`;
|
@@ -1,32 +0,0 @@
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
-
|
3
|
-
exports[`NumberInputGroup has matching snapshot 1`] = `
|
4
|
-
<DocumentFragment>
|
5
|
-
<form
|
6
|
-
action="#"
|
7
|
-
class="envoc-form-form"
|
8
|
-
>
|
9
|
-
<div
|
10
|
-
class="envoc-form-number-group envoc-form-input-group envoc-form-group"
|
11
|
-
>
|
12
|
-
<div
|
13
|
-
id="numberofarms-error-scroll-target"
|
14
|
-
style="display: none;"
|
15
|
-
/>
|
16
|
-
<label
|
17
|
-
for="numberOfArms"
|
18
|
-
>
|
19
|
-
Arm Count
|
20
|
-
</label>
|
21
|
-
<input
|
22
|
-
aria-invalid="false"
|
23
|
-
class="envoc-form-number-group envoc-form-input-group"
|
24
|
-
id="numberOfArms"
|
25
|
-
name="numberOfArms"
|
26
|
-
type="number"
|
27
|
-
value=""
|
28
|
-
/>
|
29
|
-
</div>
|
30
|
-
</form>
|
31
|
-
</DocumentFragment>
|
32
|
-
`;
|
@@ -1,33 +0,0 @@
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
-
|
3
|
-
exports[`PhoneNumberInputGroup has matching snapshot 1`] = `
|
4
|
-
<DocumentFragment>
|
5
|
-
<form
|
6
|
-
action="#"
|
7
|
-
class="envoc-form-form"
|
8
|
-
>
|
9
|
-
<div
|
10
|
-
class="something-here envoc-form-phone-number-group envoc-form-input-group envoc-form-group"
|
11
|
-
>
|
12
|
-
<div
|
13
|
-
id="phonenumber-error-scroll-target"
|
14
|
-
style="display: none;"
|
15
|
-
/>
|
16
|
-
<label
|
17
|
-
for="phoneNumber"
|
18
|
-
>
|
19
|
-
Phone Number
|
20
|
-
</label>
|
21
|
-
<input
|
22
|
-
aria-invalid="false"
|
23
|
-
autocomplete="tel-national"
|
24
|
-
class="something-here envoc-form-phone-number-group envoc-form-input-group"
|
25
|
-
id="phoneNumber"
|
26
|
-
name="phoneNumber"
|
27
|
-
type="text"
|
28
|
-
value=""
|
29
|
-
/>
|
30
|
-
</div>
|
31
|
-
</form>
|
32
|
-
</DocumentFragment>
|
33
|
-
`;
|
@@ -1,31 +0,0 @@
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
-
|
3
|
-
exports[`StringInputGroup has matching snapshot 1`] = `
|
4
|
-
<DocumentFragment>
|
5
|
-
<form
|
6
|
-
action="#"
|
7
|
-
class="envoc-form-form"
|
8
|
-
>
|
9
|
-
<div
|
10
|
-
class="envoc-form-string-group envoc-form-input-group envoc-form-group"
|
11
|
-
>
|
12
|
-
<div
|
13
|
-
id="name-error-scroll-target"
|
14
|
-
style="display: none;"
|
15
|
-
/>
|
16
|
-
<label
|
17
|
-
for="name"
|
18
|
-
>
|
19
|
-
Name
|
20
|
-
</label>
|
21
|
-
<input
|
22
|
-
aria-invalid="false"
|
23
|
-
class="envoc-form-string-group envoc-form-input-group"
|
24
|
-
id="name"
|
25
|
-
name="name"
|
26
|
-
value=""
|
27
|
-
/>
|
28
|
-
</div>
|
29
|
-
</form>
|
30
|
-
</DocumentFragment>
|
31
|
-
`;
|