envoc-form 5.0.9 → 6.0.1-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4930 -1645
- package/dist/index.cjs +25531 -0
- package/dist/index.d.ts +624 -0
- package/dist/index.js +25461 -0
- package/package.json +73 -77
- 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 -88
- 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/DateTimePicker/DateTimePickerGroup.d.ts +0 -12
- package/es/DateTimePicker/DateTimePickerGroup.js +0 -87
- package/es/DateTimePicker/DateTimePickerHelper.d.ts +0 -3
- package/es/DateTimePicker/DateTimePickerHelper.js +0 -1
- package/es/DateTimePicker/StringDateTimePickerGroup.d.ts +0 -9
- package/es/DateTimePicker/StringDateTimePickerGroup.js +0 -53
- 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 -29
- package/es/Field/Field.js +0 -59
- 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/CheckboxGroup.d.ts +0 -6
- package/es/Input/CheckboxGroup.js +0 -14
- package/es/Input/CheckboxInputGroup.d.ts +0 -13
- package/es/Input/CheckboxInputGroup.js +0 -41
- 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 -29
- 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 -81
- package/es/index.js +0 -55
- 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 -45
- 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 -96
- 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/DateTimePicker/DateTimePickerGroup.d.ts +0 -12
- package/lib/DateTimePicker/DateTimePickerGroup.js +0 -93
- package/lib/DateTimePicker/DateTimePickerHelper.d.ts +0 -3
- package/lib/DateTimePicker/DateTimePickerHelper.js +0 -2
- package/lib/DateTimePicker/StringDateTimePickerGroup.d.ts +0 -9
- package/lib/DateTimePicker/StringDateTimePickerGroup.js +0 -59
- 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 -29
- package/lib/Field/Field.js +0 -64
- 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/CheckboxGroup.d.ts +0 -6
- package/lib/Input/CheckboxGroup.js +0 -20
- package/lib/Input/CheckboxInputGroup.d.ts +0 -13
- package/lib/Input/CheckboxInputGroup.js +0 -46
- 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 -29
- 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 -81
- package/lib/index.js +0 -126
- 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 -183
- 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/DateTimePicker/DateTimePicker.test.tsx +0 -243
- package/src/DateTimePicker/DateTimePickerGroup.tsx +0 -116
- package/src/DateTimePicker/DateTimePickerHelper.ts +0 -4
- package/src/DateTimePicker/StringDateTimePickerGroup.tsx +0 -61
- package/src/DateTimePicker/__snapshots__/DateTimePicker.test.tsx.snap +0 -217
- package/src/Field/CustomFieldInputProps.ts +0 -10
- package/src/Field/CustomFieldMetaProps.ts +0 -5
- package/src/Field/Field.tsx +0 -127
- 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 -82
- 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 -234
- 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/CheckboxGroup.tsx +0 -60
- package/src/Input/CheckboxInputGroup.tsx +0 -78
- package/src/Input/IconInputGroup.tsx +0 -54
- package/src/Input/InputGroup.tsx +0 -69
- package/src/Input/MoneyInputGroup.tsx +0 -47
- package/src/Input/NumberInputGroup.tsx +0 -45
- package/src/Input/PhoneNumberInputGroup.tsx +0 -45
- package/src/Input/StringInputGroup.tsx +0 -50
- package/src/Input/__Tests__/CheckboxInputGroup.test.tsx +0 -26
- 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__/CheckboxInputGroup.test.tsx.snap +0 -33
- 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 -132
- 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 -99
- package/src/Select/__tests__/__snapshots__/NumberSelectGroup.test.tsx.snap +0 -197
- package/src/Select/__tests__/__snapshots__/StringSelectGroup.test.tsx.snap +0 -197
- 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 -66
- 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 -163
- 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,115 +0,0 @@
|
|
1
|
-
import { useEffect, useState } from 'react';
|
2
|
-
import DatePicker, {
|
3
|
-
DatePickerProps,
|
4
|
-
} from 'react-date-picker/dist/entry.nostyle';
|
5
|
-
import { clsx } from 'clsx';
|
6
|
-
import parseISO from 'date-fns/parseISO';
|
7
|
-
import { InjectedFieldProps } from '../Field/InjectedFieldProps';
|
8
|
-
import { FormDefaults } from '../FormDefaults';
|
9
|
-
import Group, { GroupProps } from '../Group';
|
10
|
-
|
11
|
-
export interface DatePickerGroupProps<T>
|
12
|
-
extends InjectedFieldProps<T | undefined | null>,
|
13
|
-
Omit<
|
14
|
-
DatePickerProps,
|
15
|
-
keyof InjectedFieldProps<T> | 'name' | 'value' | 'className'
|
16
|
-
>,
|
17
|
-
Omit<GroupProps, keyof InjectedFieldProps<T> | 'children'> {
|
18
|
-
convert: (arg: Date) => T;
|
19
|
-
}
|
20
|
-
|
21
|
-
/**
|
22
|
-
* Field for inputting dates. Uses `<Group/>` and `<DatePicker/>`.
|
23
|
-
*
|
24
|
-
* Uses [react-date-picker](https://www.npmjs.com/package/react-date-picker)
|
25
|
-
*/
|
26
|
-
export default function DatePickerGroup<T>({
|
27
|
-
input,
|
28
|
-
meta,
|
29
|
-
label,
|
30
|
-
helpText,
|
31
|
-
className,
|
32
|
-
required,
|
33
|
-
disabled,
|
34
|
-
convert,
|
35
|
-
maxDate = new Date(9999, 11, 31),
|
36
|
-
minDate = new Date(1000, 0, 1),
|
37
|
-
...rest
|
38
|
-
}: DatePickerGroupProps<T>) {
|
39
|
-
const [displayDate, setDisplayDate] = useState<Date | null>(null);
|
40
|
-
|
41
|
-
useEffect(() => {
|
42
|
-
if (!input.value) {
|
43
|
-
setDisplayDate(null);
|
44
|
-
} else if (typeof input.value === 'string') {
|
45
|
-
if (input.value.indexOf('T') === -1) {
|
46
|
-
setDisplayDate(new Date(`${input.value}T00:00:00.000`));
|
47
|
-
} else {
|
48
|
-
setDisplayDate(new Date(input.value));
|
49
|
-
}
|
50
|
-
}
|
51
|
-
}, [setDisplayDate, input.value]);
|
52
|
-
|
53
|
-
return (
|
54
|
-
<Group
|
55
|
-
input={input}
|
56
|
-
meta={meta}
|
57
|
-
label={label}
|
58
|
-
helpText={helpText}
|
59
|
-
className={clsx(className, FormDefaults.cssClassPrefix + 'date-picker')}
|
60
|
-
required={required}
|
61
|
-
disabled={disabled}>
|
62
|
-
<DatePicker
|
63
|
-
{...rest}
|
64
|
-
className={clsx(FormDefaults.cssClassPrefix + 'date-picker', className)}
|
65
|
-
value={displayDate}
|
66
|
-
onChange={handleChange}
|
67
|
-
maxDate={maxDate}
|
68
|
-
minDate={minDate}
|
69
|
-
disabled={disabled}
|
70
|
-
/>
|
71
|
-
</Group>
|
72
|
-
);
|
73
|
-
|
74
|
-
function handleChange(e: Date | Date[] | string | undefined) {
|
75
|
-
const { onChange } = input;
|
76
|
-
if (onChange === null) {
|
77
|
-
return;
|
78
|
-
}
|
79
|
-
|
80
|
-
if (!e) {
|
81
|
-
onChange(undefined);
|
82
|
-
setDisplayDate(null);
|
83
|
-
return;
|
84
|
-
} else if (typeof e === 'string') {
|
85
|
-
const parsedValue = parseISO(e.toString().split('T')[0]);
|
86
|
-
setDisplayDate(parsedValue);
|
87
|
-
onChange(convert(parsedValue));
|
88
|
-
} else if (e instanceof Date) {
|
89
|
-
const parsedValue = parseISO(
|
90
|
-
convertToTimeZoneInsensitiveISOString(e).split('T')[0]
|
91
|
-
);
|
92
|
-
setDisplayDate(parsedValue);
|
93
|
-
onChange(convert(parsedValue));
|
94
|
-
} else {
|
95
|
-
// e is instanceof Date[]
|
96
|
-
const parsedValue = parseISO(
|
97
|
-
convertToTimeZoneInsensitiveISOString(e[0]).split('T')[0]
|
98
|
-
);
|
99
|
-
setDisplayDate(parsedValue);
|
100
|
-
onChange(convert(parsedValue));
|
101
|
-
}
|
102
|
-
}
|
103
|
-
}
|
104
|
-
|
105
|
-
export function convertToTimeZoneInsensitiveISOString(date: Date): string {
|
106
|
-
const year = new Intl.DateTimeFormat('en', { year: 'numeric' })
|
107
|
-
.format(date)
|
108
|
-
.substring(0, 4)
|
109
|
-
.padStart(4, '0');
|
110
|
-
const month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(
|
111
|
-
date
|
112
|
-
);
|
113
|
-
const day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(date);
|
114
|
-
return `${year}-${month}-${day}T00:00:00.000Z`;
|
115
|
-
}
|
@@ -1,28 +0,0 @@
|
|
1
|
-
import DatePickerGroup from './DatePickerGroup';
|
2
|
-
import { DatePickerHelper } from './DatePickerHelper';
|
3
|
-
|
4
|
-
export interface StringDateOnlyPickerGroupProps
|
5
|
-
extends DatePickerHelper<string | undefined | null> {}
|
6
|
-
|
7
|
-
/**
|
8
|
-
* Date picker input that consumes and outputs as a date only string in ISO format `YYYY-MM-DD`.
|
9
|
-
*
|
10
|
-
* Default display to the user is in `MM/DD/YYYY` format.
|
11
|
-
*/
|
12
|
-
export default function StringDatePickerGroup(
|
13
|
-
props: StringDateOnlyPickerGroupProps
|
14
|
-
) {
|
15
|
-
return <DatePickerGroup {...props} convert={convertToDateOnly} />;
|
16
|
-
}
|
17
|
-
|
18
|
-
function convertToDateOnly(arg: Date) {
|
19
|
-
const year = new Intl.DateTimeFormat('en', { year: 'numeric' })
|
20
|
-
.format(arg)
|
21
|
-
.padStart(4, '0');
|
22
|
-
|
23
|
-
const month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(arg);
|
24
|
-
|
25
|
-
const day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(arg);
|
26
|
-
|
27
|
-
return `${year}-${month}-${day}`;
|
28
|
-
}
|
@@ -1,20 +0,0 @@
|
|
1
|
-
import DatePickerGroup from './DatePickerGroup';
|
2
|
-
import { DatePickerHelper } from './DatePickerHelper';
|
3
|
-
|
4
|
-
export interface StringDatePickerGroupProps
|
5
|
-
extends DatePickerHelper<string | undefined | null> {}
|
6
|
-
|
7
|
-
/**
|
8
|
-
* Date picker input that consumes and outputs as a date only string in ISO format `YYYY-MM-DDTHH:mm:ss.sssZ` or `±YYYYYY-MM-DDTHH:mm:ss.sssZ`
|
9
|
-
*
|
10
|
-
* If you need `YYYY-MM-DD` format use `<StringDateOnlyPickerGroup/>`.
|
11
|
-
*/
|
12
|
-
export default function StringDatePickerGroup(
|
13
|
-
props: StringDatePickerGroupProps
|
14
|
-
) {
|
15
|
-
return <DatePickerGroup {...props} convert={convertToDateOnly} />;
|
16
|
-
}
|
17
|
-
|
18
|
-
function convertToDateOnly(arg: Date) {
|
19
|
-
return arg.toISOString();
|
20
|
-
}
|
@@ -1,152 +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-date-picker envoc-form-group"
|
11
|
-
>
|
12
|
-
<div
|
13
|
-
id="favoritedate-error-scroll-target"
|
14
|
-
style="display: none;"
|
15
|
-
/>
|
16
|
-
<label
|
17
|
-
for="favoriteDate"
|
18
|
-
>
|
19
|
-
Favorite Date
|
20
|
-
</label>
|
21
|
-
<div
|
22
|
-
class="react-date-picker react-date-picker--closed react-date-picker--enabled envoc-form-date-picker"
|
23
|
-
>
|
24
|
-
<div
|
25
|
-
class="react-date-picker__wrapper"
|
26
|
-
>
|
27
|
-
<div
|
28
|
-
class="react-date-picker__inputGroup"
|
29
|
-
>
|
30
|
-
<input
|
31
|
-
max="2023-09-23"
|
32
|
-
min="2022-06-22"
|
33
|
-
name="date"
|
34
|
-
style="visibility: hidden; position: absolute; z-index: -999;"
|
35
|
-
type="date"
|
36
|
-
value=""
|
37
|
-
/>
|
38
|
-
<input
|
39
|
-
autocomplete="off"
|
40
|
-
class="react-date-picker__inputGroup__input react-date-picker__inputGroup__month"
|
41
|
-
data-input="true"
|
42
|
-
inputmode="numeric"
|
43
|
-
max="12"
|
44
|
-
min="1"
|
45
|
-
name="month"
|
46
|
-
placeholder="mm"
|
47
|
-
type="number"
|
48
|
-
value=""
|
49
|
-
/>
|
50
|
-
<span
|
51
|
-
class="react-date-picker__inputGroup__divider"
|
52
|
-
>
|
53
|
-
/
|
54
|
-
</span>
|
55
|
-
<input
|
56
|
-
autocomplete="off"
|
57
|
-
class="react-date-picker__inputGroup__input react-date-picker__inputGroup__day"
|
58
|
-
data-input="true"
|
59
|
-
inputmode="numeric"
|
60
|
-
max="31"
|
61
|
-
min="1"
|
62
|
-
name="day"
|
63
|
-
placeholder="dd"
|
64
|
-
type="number"
|
65
|
-
value=""
|
66
|
-
/>
|
67
|
-
<span
|
68
|
-
class="react-date-picker__inputGroup__divider"
|
69
|
-
>
|
70
|
-
/
|
71
|
-
</span>
|
72
|
-
<input
|
73
|
-
autocomplete="off"
|
74
|
-
class="react-date-picker__inputGroup__input react-date-picker__inputGroup__year"
|
75
|
-
data-input="true"
|
76
|
-
inputmode="numeric"
|
77
|
-
max="2023"
|
78
|
-
min="2022"
|
79
|
-
name="year"
|
80
|
-
placeholder="yyyy"
|
81
|
-
step="1"
|
82
|
-
type="number"
|
83
|
-
value=""
|
84
|
-
/>
|
85
|
-
</div>
|
86
|
-
<button
|
87
|
-
class="react-date-picker__clear-button react-date-picker__button"
|
88
|
-
type="button"
|
89
|
-
>
|
90
|
-
<svg
|
91
|
-
class="react-date-picker__clear-button__icon react-date-picker__button__icon"
|
92
|
-
height="19"
|
93
|
-
stroke="black"
|
94
|
-
stroke-width="2"
|
95
|
-
viewBox="0 0 19 19"
|
96
|
-
width="19"
|
97
|
-
xmlns="http://www.w3.org/2000/svg"
|
98
|
-
>
|
99
|
-
<line
|
100
|
-
x1="4"
|
101
|
-
x2="15"
|
102
|
-
y1="4"
|
103
|
-
y2="15"
|
104
|
-
/>
|
105
|
-
<line
|
106
|
-
x1="15"
|
107
|
-
x2="4"
|
108
|
-
y1="4"
|
109
|
-
y2="15"
|
110
|
-
/>
|
111
|
-
</svg>
|
112
|
-
</button>
|
113
|
-
<button
|
114
|
-
class="react-date-picker__calendar-button react-date-picker__button"
|
115
|
-
type="button"
|
116
|
-
>
|
117
|
-
<svg
|
118
|
-
class="react-date-picker__calendar-button__icon react-date-picker__button__icon"
|
119
|
-
height="19"
|
120
|
-
stroke="black"
|
121
|
-
stroke-width="2"
|
122
|
-
viewBox="0 0 19 19"
|
123
|
-
width="19"
|
124
|
-
xmlns="http://www.w3.org/2000/svg"
|
125
|
-
>
|
126
|
-
<rect
|
127
|
-
fill="none"
|
128
|
-
height="15"
|
129
|
-
width="15"
|
130
|
-
x="2"
|
131
|
-
y="2"
|
132
|
-
/>
|
133
|
-
<line
|
134
|
-
x1="6"
|
135
|
-
x2="6"
|
136
|
-
y1="0"
|
137
|
-
y2="4"
|
138
|
-
/>
|
139
|
-
<line
|
140
|
-
x1="13"
|
141
|
-
x2="13"
|
142
|
-
y1="0"
|
143
|
-
y2="4"
|
144
|
-
/>
|
145
|
-
</svg>
|
146
|
-
</button>
|
147
|
-
</div>
|
148
|
-
</div>
|
149
|
-
</div>
|
150
|
-
</form>
|
151
|
-
</DocumentFragment>
|
152
|
-
`;
|
@@ -1,243 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import { render } from '@testing-library/react';
|
3
|
-
import StringDateTimePickerGroup from './StringDateTimePickerGroup';
|
4
|
-
import FormTestBase, { PersonDto } from '../__Tests__/FormTestBase';
|
5
|
-
|
6
|
-
//hack so the datetimepicker internals don't complain about this not existing in the context of jest
|
7
|
-
HTMLCanvasElement.prototype.getContext = () => null;
|
8
|
-
|
9
|
-
describe('StringDateTimePickerGroup', () => {
|
10
|
-
it('renders without crashing', () => {
|
11
|
-
render(
|
12
|
-
<FormTestBase>
|
13
|
-
{({ Field }) => (
|
14
|
-
<Field
|
15
|
-
name="createdDateTime"
|
16
|
-
Component={StringDateTimePickerGroup}
|
17
|
-
label="Created Date Time"
|
18
|
-
monthPlaceholder="mm"
|
19
|
-
dayPlaceholder="dd"
|
20
|
-
yearPlaceholder="yyyy"
|
21
|
-
disableClock
|
22
|
-
maxDate={new Date('9/23/2023')}
|
23
|
-
minDate={new Date('6/22/2022')}
|
24
|
-
/>
|
25
|
-
)}
|
26
|
-
</FormTestBase>
|
27
|
-
);
|
28
|
-
});
|
29
|
-
|
30
|
-
it('has matching snapshot', () => {
|
31
|
-
const renderResult = render(
|
32
|
-
<FormTestBase>
|
33
|
-
{({ Field }) => (
|
34
|
-
<Field
|
35
|
-
name="createdDateTime"
|
36
|
-
Component={StringDateTimePickerGroup}
|
37
|
-
label="Created Date Time"
|
38
|
-
monthPlaceholder="mm"
|
39
|
-
dayPlaceholder="dd"
|
40
|
-
yearPlaceholder="yyyy"
|
41
|
-
disableClock
|
42
|
-
maxDate={new Date('9/23/2023')}
|
43
|
-
minDate={new Date('6/22/2022')}
|
44
|
-
/>
|
45
|
-
)}
|
46
|
-
</FormTestBase>
|
47
|
-
);
|
48
|
-
expect(renderResult.asFragment()).toMatchSnapshot();
|
49
|
-
});
|
50
|
-
|
51
|
-
it('does not render with initial date-only string and throws exception', () => {
|
52
|
-
const dateOnlyString = '2024-09-04';
|
53
|
-
const personDtoWithDateOnlyString: PersonDto = {
|
54
|
-
createdDateTime: dateOnlyString,
|
55
|
-
};
|
56
|
-
|
57
|
-
try {
|
58
|
-
render(
|
59
|
-
<FormTestBase initialValues={personDtoWithDateOnlyString}>
|
60
|
-
{({ Field }) => (
|
61
|
-
<Field
|
62
|
-
name="createdDateTime"
|
63
|
-
Component={StringDateTimePickerGroup}
|
64
|
-
label="Created Date Time"
|
65
|
-
monthPlaceholder="mm"
|
66
|
-
dayPlaceholder="dd"
|
67
|
-
yearPlaceholder="yyyy"
|
68
|
-
disableClock
|
69
|
-
/>
|
70
|
-
)}
|
71
|
-
</FormTestBase>
|
72
|
-
);
|
73
|
-
|
74
|
-
fail('Expected an exception to be thrown for date-only string');
|
75
|
-
} catch (error: any) {
|
76
|
-
// Assert that the error message matches the expected message
|
77
|
-
expect(error.message).toEqual(
|
78
|
-
`Invalid "date time" value of ${dateOnlyString} provided to DateTimePickerGroup component. Please provide ISO 8601 string that includes the time zone designator. Sample strings: 2022-09-24T:08:54:12+00:00, 2022-09-24T:08:54:12Z, 2022-09-24T:08:54:12.123-05:00`
|
79
|
-
);
|
80
|
-
}
|
81
|
-
});
|
82
|
-
|
83
|
-
it('renders with ISO UTC date time string taking browser timezone into account', () => {
|
84
|
-
const isoUTCDateTimeString = '2024-04-09T21:00:24.670Z';
|
85
|
-
const personDtoWithDateTimeString: PersonDto = {
|
86
|
-
createdDateTime: isoUTCDateTimeString,
|
87
|
-
};
|
88
|
-
|
89
|
-
render(
|
90
|
-
<FormTestBase initialValues={personDtoWithDateTimeString}>
|
91
|
-
{({ Field }) => (
|
92
|
-
<Field
|
93
|
-
name="createdDateTime"
|
94
|
-
Component={StringDateTimePickerGroup}
|
95
|
-
label="Created Date Time"
|
96
|
-
monthPlaceholder="mm"
|
97
|
-
dayPlaceholder="dd"
|
98
|
-
yearPlaceholder="yyyy"
|
99
|
-
disableClock
|
100
|
-
/>
|
101
|
-
)}
|
102
|
-
</FormTestBase>
|
103
|
-
);
|
104
|
-
|
105
|
-
const dateTimePickerInputComponent = document.querySelector(
|
106
|
-
'input[name="datetime"][type="datetime-local"]'
|
107
|
-
);
|
108
|
-
const utcDate = new Date(isoUTCDateTimeString);
|
109
|
-
const localDateTimeString =
|
110
|
-
convertToDateTimePickerComponentValueString(utcDate);
|
111
|
-
|
112
|
-
// Assert that no exception is thrown during rendering
|
113
|
-
expect(true).toBe(true);
|
114
|
-
// Assert the value of the component
|
115
|
-
expect(dateTimePickerInputComponent).toHaveValue(localDateTimeString);
|
116
|
-
});
|
117
|
-
|
118
|
-
it('does not render with invalid datetime ISO string and throws exception', () => {
|
119
|
-
const invalidISODateTimeString = '2024-04-11T01:00:00.000-5:00';
|
120
|
-
const personDtoWithDateOnlyString: PersonDto = {
|
121
|
-
createdDateTime: invalidISODateTimeString,
|
122
|
-
};
|
123
|
-
|
124
|
-
try {
|
125
|
-
render(
|
126
|
-
<FormTestBase initialValues={personDtoWithDateOnlyString}>
|
127
|
-
{({ Field }) => (
|
128
|
-
<Field
|
129
|
-
name="createdDateTime"
|
130
|
-
Component={StringDateTimePickerGroup}
|
131
|
-
label="Created Date Time"
|
132
|
-
monthPlaceholder="mm"
|
133
|
-
dayPlaceholder="dd"
|
134
|
-
yearPlaceholder="yyyy"
|
135
|
-
disableClock
|
136
|
-
/>
|
137
|
-
)}
|
138
|
-
</FormTestBase>
|
139
|
-
);
|
140
|
-
|
141
|
-
fail('Expected an exception to be thrown for invalid datetime string');
|
142
|
-
} catch (error: any) {
|
143
|
-
// Assert that the error message matches the expected message
|
144
|
-
expect(error.message).toEqual(
|
145
|
-
`Invalid "date time" value of ${invalidISODateTimeString} provided to DateTimePickerGroup component. Please provide ISO 8601 string that includes the time zone designator. Sample strings: 2022-09-24T:08:54:12+00:00, 2022-09-24T:08:54:12Z, 2022-09-24T:08:54:12.123-05:00`
|
146
|
-
);
|
147
|
-
}
|
148
|
-
});
|
149
|
-
|
150
|
-
it('renders with ISO date time string with different offset than browser taking browser timezone into account', () => {
|
151
|
-
const isoDateTimeString = '2024-04-09T21:00:24.670-01:00';
|
152
|
-
const personDtoWithDateTimeString: PersonDto = {
|
153
|
-
createdDateTime: isoDateTimeString,
|
154
|
-
};
|
155
|
-
|
156
|
-
render(
|
157
|
-
<FormTestBase initialValues={personDtoWithDateTimeString}>
|
158
|
-
{({ Field }) => (
|
159
|
-
<Field
|
160
|
-
name="createdDateTime"
|
161
|
-
Component={StringDateTimePickerGroup}
|
162
|
-
label="Created Date Time"
|
163
|
-
monthPlaceholder="mm"
|
164
|
-
dayPlaceholder="dd"
|
165
|
-
yearPlaceholder="yyyy"
|
166
|
-
disableClock
|
167
|
-
/>
|
168
|
-
)}
|
169
|
-
</FormTestBase>
|
170
|
-
);
|
171
|
-
|
172
|
-
const dateTimePickerInputComponent = document.querySelector(
|
173
|
-
'input[name="datetime"][type="datetime-local"]'
|
174
|
-
);
|
175
|
-
const utcDate = new Date(isoDateTimeString);
|
176
|
-
const localDateTimeString =
|
177
|
-
convertToDateTimePickerComponentValueString(utcDate);
|
178
|
-
|
179
|
-
// Assert that no exception is thrown during rendering
|
180
|
-
expect(true).toBe(true);
|
181
|
-
// Assert the value of the component
|
182
|
-
expect(dateTimePickerInputComponent).toHaveValue(localDateTimeString);
|
183
|
-
});
|
184
|
-
|
185
|
-
it('renders with ISO date time string with same offset as the browser taking browser timezone into account', () => {
|
186
|
-
const isoDateTimeString = '2024-04-09T21:00:24.670-05:00';
|
187
|
-
const personDtoWithDateTimeString: PersonDto = {
|
188
|
-
createdDateTime: isoDateTimeString,
|
189
|
-
};
|
190
|
-
|
191
|
-
render(
|
192
|
-
<FormTestBase initialValues={personDtoWithDateTimeString}>
|
193
|
-
{({ Field }) => (
|
194
|
-
<Field
|
195
|
-
name="createdDateTime"
|
196
|
-
Component={StringDateTimePickerGroup}
|
197
|
-
label="Created Date Time"
|
198
|
-
monthPlaceholder="mm"
|
199
|
-
dayPlaceholder="dd"
|
200
|
-
yearPlaceholder="yyyy"
|
201
|
-
disableClock
|
202
|
-
/>
|
203
|
-
)}
|
204
|
-
</FormTestBase>
|
205
|
-
);
|
206
|
-
|
207
|
-
const dateTimePickerInputComponent = document.querySelector(
|
208
|
-
'input[name="datetime"][type="datetime-local"]'
|
209
|
-
);
|
210
|
-
const utcDate = new Date(isoDateTimeString);
|
211
|
-
const localDateTimeString =
|
212
|
-
convertToDateTimePickerComponentValueString(utcDate);
|
213
|
-
|
214
|
-
// Assert that no exception is thrown during rendering
|
215
|
-
expect(true).toBe(true);
|
216
|
-
// Assert the value of the component
|
217
|
-
expect(dateTimePickerInputComponent).toHaveValue(localDateTimeString);
|
218
|
-
});
|
219
|
-
});
|
220
|
-
|
221
|
-
function convertToDateTimePickerComponentValueString(date: Date): string {
|
222
|
-
// Format the date in the required format using `intl.DateTimeFormat`
|
223
|
-
const year = new Intl.DateTimeFormat('en', { year: 'numeric' })
|
224
|
-
.format(date)
|
225
|
-
.padStart(4, '0');
|
226
|
-
|
227
|
-
const month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(
|
228
|
-
date
|
229
|
-
);
|
230
|
-
|
231
|
-
const day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(date);
|
232
|
-
|
233
|
-
const hour = new Intl.DateTimeFormat('en', {
|
234
|
-
hour: '2-digit',
|
235
|
-
hourCycle: 'h23',
|
236
|
-
}).format(date);
|
237
|
-
|
238
|
-
const minute = new Intl.DateTimeFormat('en', { minute: '2-digit' })
|
239
|
-
.format(date)
|
240
|
-
.padStart(2, '0');
|
241
|
-
|
242
|
-
return `${year}-${month}-${day}T${hour}:${minute}`;
|
243
|
-
}
|
@@ -1,116 +0,0 @@
|
|
1
|
-
import { useEffect, useState } from 'react';
|
2
|
-
import { DateTimePicker, DateTimePickerProps } from 'react-datetime-picker';
|
3
|
-
import { clsx } from 'clsx';
|
4
|
-
import parseISO from 'date-fns/parseISO';
|
5
|
-
import { InjectedFieldProps } from '../Field/InjectedFieldProps';
|
6
|
-
import { FormDefaults } from '../FormDefaults';
|
7
|
-
import Group, { GroupProps } from '../Group';
|
8
|
-
|
9
|
-
// Represents a single date/date string, or null
|
10
|
-
type DateTimePickerValuePiece = Date | string | null;
|
11
|
-
// Represents either a single date/date string, a pair of dates/date strings for a range, or null
|
12
|
-
type DateTimePickerValue =
|
13
|
-
| DateTimePickerValuePiece
|
14
|
-
| [DateTimePickerValuePiece, DateTimePickerValuePiece];
|
15
|
-
|
16
|
-
export interface DateTimePickerGroupProps<T>
|
17
|
-
extends InjectedFieldProps<T | undefined | null>,
|
18
|
-
Omit<
|
19
|
-
DateTimePickerProps,
|
20
|
-
keyof InjectedFieldProps<T> | 'name' | 'value' | 'className'
|
21
|
-
>,
|
22
|
-
Omit<GroupProps, keyof InjectedFieldProps<T> | 'children'> {
|
23
|
-
convert: (date: Date) => T;
|
24
|
-
}
|
25
|
-
|
26
|
-
/**
|
27
|
-
* Field for inputting date and time. Uses `<Group/>` and `<DateTimePicker/>`.
|
28
|
-
*
|
29
|
-
* Uses [react-datetime-picker](https://www.npmjs.com/package/react-datetime-picker)
|
30
|
-
*/
|
31
|
-
export default function DateTimePickerGroup<T>({
|
32
|
-
input,
|
33
|
-
meta,
|
34
|
-
label,
|
35
|
-
helpText,
|
36
|
-
className,
|
37
|
-
required,
|
38
|
-
disabled,
|
39
|
-
convert,
|
40
|
-
...rest
|
41
|
-
}: DateTimePickerGroupProps<T>) {
|
42
|
-
const [displayDateTime, setDisplayDateTime] = useState<Date | null>(null);
|
43
|
-
|
44
|
-
useEffect(() => {
|
45
|
-
const inputValue = input.value;
|
46
|
-
if (!inputValue) {
|
47
|
-
setDisplayDateTime(null);
|
48
|
-
} else if (typeof inputValue === 'string') {
|
49
|
-
const parsedDateTime = convertISODateTimeStringToDate(inputValue);
|
50
|
-
setDisplayDateTime(parsedDateTime);
|
51
|
-
} else if (inputValue instanceof Date) {
|
52
|
-
setDisplayDateTime(inputValue);
|
53
|
-
}
|
54
|
-
}, [setDisplayDateTime, input.value]);
|
55
|
-
|
56
|
-
return (
|
57
|
-
<Group
|
58
|
-
input={input}
|
59
|
-
meta={meta}
|
60
|
-
label={label}
|
61
|
-
helpText={helpText}
|
62
|
-
className={clsx(
|
63
|
-
className,
|
64
|
-
FormDefaults.cssClassPrefix + 'date-time-picker'
|
65
|
-
)}
|
66
|
-
required={required}
|
67
|
-
disabled={disabled}>
|
68
|
-
<DateTimePicker
|
69
|
-
{...rest}
|
70
|
-
className={clsx(
|
71
|
-
FormDefaults.cssClassPrefix + 'date-time-picker',
|
72
|
-
className
|
73
|
-
)}
|
74
|
-
value={displayDateTime}
|
75
|
-
onChange={handleChange}
|
76
|
-
/>
|
77
|
-
</Group>
|
78
|
-
);
|
79
|
-
|
80
|
-
function handleChange(newDateTime: DateTimePickerValue) {
|
81
|
-
const { onChange } = input;
|
82
|
-
if (onChange === null) {
|
83
|
-
return;
|
84
|
-
}
|
85
|
-
|
86
|
-
if (!newDateTime) {
|
87
|
-
onChange(undefined);
|
88
|
-
setDisplayDateTime(null);
|
89
|
-
return;
|
90
|
-
} else if (typeof newDateTime === 'string') {
|
91
|
-
const parsedDateTime = parseISO(newDateTime);
|
92
|
-
setDisplayDateTime(parsedDateTime);
|
93
|
-
onChange(convert(parsedDateTime));
|
94
|
-
} else if (newDateTime instanceof Date) {
|
95
|
-
setDisplayDateTime(newDateTime);
|
96
|
-
onChange(convert(newDateTime));
|
97
|
-
}
|
98
|
-
}
|
99
|
-
}
|
100
|
-
|
101
|
-
function convertISODateTimeStringToDate(isoDateTimeString: string) {
|
102
|
-
const isoDateTimeRegex =
|
103
|
-
/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?)([+-]\d{2}:\d{2}|Z)?$/;
|
104
|
-
const isValidIsoDateTimeString = isoDateTimeRegex.test(isoDateTimeString);
|
105
|
-
if (isValidIsoDateTimeString) {
|
106
|
-
return new Date(isoDateTimeString);
|
107
|
-
}
|
108
|
-
|
109
|
-
const errorMessage = `Invalid "date time" value of ${isoDateTimeString} provided to DateTimePickerGroup component. Please provide ISO 8601 string that includes the time zone designator. Sample strings: 2022-09-24T:08:54:12+00:00, 2022-09-24T:08:54:12Z, 2022-09-24T:08:54:12.123-05:00`;
|
110
|
-
if (process.env.NODE_ENV !== 'production') {
|
111
|
-
throw new Error(errorMessage);
|
112
|
-
} else {
|
113
|
-
console.error(errorMessage);
|
114
|
-
}
|
115
|
-
return null;
|
116
|
-
}
|