envoc-form 4.1.0 → 4.3.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.
Files changed (48) hide show
  1. package/README.md +5266 -940
  2. package/es/DatePicker/DatePickerGroup.d.ts +1 -1
  3. package/es/DatePicker/DatePickerGroup.js +7 -3
  4. package/es/DateTimePicker/DateTimePickerGroup.d.ts +13 -0
  5. package/es/DateTimePicker/DateTimePickerGroup.js +90 -0
  6. package/es/DateTimePicker/DateTimePickerHelper.d.ts +3 -0
  7. package/es/DateTimePicker/DateTimePickerHelper.js +1 -0
  8. package/es/DateTimePicker/StringDateTimePickerGroup.d.ts +10 -0
  9. package/es/DateTimePicker/StringDateTimePickerGroup.js +53 -0
  10. package/es/Input/PhoneNumberInputGroup.d.ts +10 -0
  11. package/es/Input/PhoneNumberInputGroup.js +47 -0
  12. package/es/hooks/index.d.ts +2 -0
  13. package/es/hooks/index.js +2 -0
  14. package/es/hooks/useFormValue.d.ts +2 -0
  15. package/es/hooks/useFormValue.js +7 -0
  16. package/es/index.d.ts +6 -0
  17. package/es/index.js +4 -0
  18. package/lib/DatePicker/DatePickerGroup.d.ts +1 -1
  19. package/lib/DatePicker/DatePickerGroup.js +7 -3
  20. package/lib/DateTimePicker/DateTimePickerGroup.d.ts +13 -0
  21. package/lib/DateTimePicker/DateTimePickerGroup.js +96 -0
  22. package/lib/DateTimePicker/DateTimePickerHelper.d.ts +3 -0
  23. package/lib/DateTimePicker/DateTimePickerHelper.js +2 -0
  24. package/lib/DateTimePicker/StringDateTimePickerGroup.d.ts +10 -0
  25. package/lib/DateTimePicker/StringDateTimePickerGroup.js +59 -0
  26. package/lib/Input/PhoneNumberInputGroup.d.ts +10 -0
  27. package/lib/Input/PhoneNumberInputGroup.js +52 -0
  28. package/lib/hooks/index.d.ts +2 -0
  29. package/lib/hooks/index.js +8 -0
  30. package/lib/hooks/useFormValue.d.ts +2 -0
  31. package/lib/hooks/useFormValue.js +10 -0
  32. package/lib/index.d.ts +6 -0
  33. package/lib/index.js +8 -1
  34. package/package.json +5 -4
  35. package/src/DatePicker/DatePickerGroup.tsx +22 -9
  36. package/src/DatePicker/__snapshots__/DatePicker.test.tsx.snap +119 -117
  37. package/src/DateTimePicker/DateTimePicker.test.tsx +243 -0
  38. package/src/DateTimePicker/DateTimePickerGroup.tsx +128 -0
  39. package/src/DateTimePicker/DateTimePickerHelper.ts +4 -0
  40. package/src/DateTimePicker/StringDateTimePickerGroup.tsx +61 -0
  41. package/src/DateTimePicker/__snapshots__/DateTimePicker.test.tsx.snap +218 -0
  42. package/src/Input/PhoneNumberInputGroup.tsx +49 -0
  43. package/src/Input/__Tests__/PhoneNumberInputGroup.test.tsx +37 -0
  44. package/src/Input/__Tests__/__snapshots__/PhoneNumberInputGroup.test.tsx.snap +33 -0
  45. package/src/__Tests__/FormTestBase.tsx +1 -0
  46. package/src/hooks/index.ts +3 -0
  47. package/src/hooks/useFormValue.ts +16 -0
  48. package/src/index.ts +10 -0
@@ -10,5 +10,5 @@ export interface DatePickerGroupProps<T> extends InjectedFieldProps<T | undefine
10
10
  *
11
11
  * Uses [react-date-picker](https://www.npmjs.com/package/react-date-picker)
12
12
  */
13
- export default function DatePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, ...rest }: DatePickerGroupProps<T>): JSX.Element;
13
+ export default function DatePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, maxDate, minDate, ...rest }: DatePickerGroupProps<T>): JSX.Element;
14
14
  export declare function convertToTimeZoneInsensitiveISOString(date: Date): string;
@@ -33,8 +33,8 @@ import Group from '../Group';
33
33
  * Uses [react-date-picker](https://www.npmjs.com/package/react-date-picker)
34
34
  */
35
35
  export default function DatePickerGroup(_a) {
36
- var input = _a.input, meta = _a.meta, label = _a.label, helpText = _a.helpText, className = _a.className, required = _a.required, disabled = _a.disabled, convert = _a.convert, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "convert"]);
37
- var _b = useState(null), displayDate = _b[0], setDisplayDate = _b[1];
36
+ var input = _a.input, meta = _a.meta, label = _a.label, helpText = _a.helpText, className = _a.className, required = _a.required, disabled = _a.disabled, convert = _a.convert, _b = _a.maxDate, maxDate = _b === void 0 ? new Date(9999, 11, 31) : _b, _c = _a.minDate, minDate = _c === void 0 ? new Date(1000, 0, 1) : _c, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "convert", "maxDate", "minDate"]);
37
+ var _d = useState(null), displayDate = _d[0], setDisplayDate = _d[1];
38
38
  useEffect(function () {
39
39
  if (!input.value) {
40
40
  setDisplayDate(null);
@@ -48,7 +48,10 @@ export default function DatePickerGroup(_a) {
48
48
  }
49
49
  }
50
50
  }, [setDisplayDate, input.value]);
51
- return (_jsx(Group, __assign({ input: input, meta: meta, label: label, helpText: helpText, className: classnames(className, FormDefaults.cssClassPrefix + 'date-picker'), required: required, disabled: disabled }, { children: _jsx(DatePicker, __assign({}, rest, { className: classnames(FormDefaults.cssClassPrefix + 'date-picker', className), value: displayDate, onChange: handleChange })) })));
51
+ return (_jsx(Group, __assign({ input: input, meta: meta, label: label, helpText: helpText, className: classnames(className, FormDefaults.cssClassPrefix + 'date-picker'), required: required, disabled: disabled }, { children: _jsx("div", __assign({ onBlur: function () {
52
+ // Manually trigger Formik's onBlur when the user clicks away from the date picker
53
+ input.onBlur();
54
+ } }, { children: _jsx(DatePicker, __assign({}, rest, { className: classnames(FormDefaults.cssClassPrefix + 'date-picker', className), value: displayDate, onChange: handleChange, disabled: disabled, required: required, maxDate: maxDate, minDate: minDate })) })) })));
52
55
  function handleChange(e) {
53
56
  var onChange = input.onChange;
54
57
  if (onChange === null) {
@@ -80,6 +83,7 @@ export default function DatePickerGroup(_a) {
80
83
  export function convertToTimeZoneInsensitiveISOString(date) {
81
84
  var year = new Intl.DateTimeFormat('en', { year: 'numeric' })
82
85
  .format(date)
86
+ .substring(0, 4)
83
87
  .padStart(4, '0');
84
88
  var month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(date);
85
89
  var day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(date);
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ import { DateTimePickerProps } from 'react-datetime-picker';
3
+ import { InjectedFieldProps } from '../Field/InjectedFieldProps';
4
+ import { GroupProps } from '../Group';
5
+ export interface DateTimePickerGroupProps<T> extends InjectedFieldProps<T | undefined | null>, Omit<DateTimePickerProps, keyof InjectedFieldProps<T> | 'name' | 'value' | 'className'>, Omit<GroupProps, keyof InjectedFieldProps<T> | 'children'> {
6
+ convert: (date: Date) => T;
7
+ }
8
+ /**
9
+ * Field for inputting date and time. Uses `<Group/>` and `<DateTimePicker/>`.
10
+ *
11
+ * Uses [react-datetime-picker](https://www.npmjs.com/package/react-datetime-picker)
12
+ */
13
+ export default function DateTimePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, maxDate, minDate, ...rest }: DateTimePickerGroupProps<T>): JSX.Element;
@@ -0,0 +1,90 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ import { jsx as _jsx } from "react/jsx-runtime";
24
+ import { useEffect, useState } from 'react';
25
+ import { DateTimePicker } from 'react-datetime-picker';
26
+ import classnames from 'classnames';
27
+ import parseISO from 'date-fns/parseISO';
28
+ import { FormDefaults } from '../FormDefaults';
29
+ import Group from '../Group';
30
+ /**
31
+ * Field for inputting date and time. Uses `<Group/>` and `<DateTimePicker/>`.
32
+ *
33
+ * Uses [react-datetime-picker](https://www.npmjs.com/package/react-datetime-picker)
34
+ */
35
+ export default function DateTimePickerGroup(_a) {
36
+ var input = _a.input, meta = _a.meta, label = _a.label, helpText = _a.helpText, className = _a.className, required = _a.required, disabled = _a.disabled, convert = _a.convert, _b = _a.maxDate, maxDate = _b === void 0 ? new Date(9999, 11, 31) : _b, _c = _a.minDate, minDate = _c === void 0 ? new Date(1000, 0, 1) : _c, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "convert", "maxDate", "minDate"]);
37
+ var _d = useState(null), displayDateTime = _d[0], setDisplayDateTime = _d[1];
38
+ useEffect(function () {
39
+ var inputValue = input.value;
40
+ if (!inputValue) {
41
+ setDisplayDateTime(null);
42
+ }
43
+ else if (typeof inputValue === 'string') {
44
+ var parsedDateTime = convertISODateTimeStringToDate(inputValue);
45
+ setDisplayDateTime(parsedDateTime);
46
+ }
47
+ else if (inputValue instanceof Date) {
48
+ setDisplayDateTime(inputValue);
49
+ }
50
+ }, [setDisplayDateTime, input.value]);
51
+ return (_jsx(Group, __assign({ input: input, meta: meta, label: label, helpText: helpText, className: classnames(className, FormDefaults.cssClassPrefix + 'date-time-picker'), required: required, disabled: disabled }, { children: _jsx("div", __assign({ onBlur: function () {
52
+ // Manually trigger Formik's onBlur when the user clicks away from the date picker
53
+ input.onBlur();
54
+ } }, { children: _jsx(DateTimePicker, __assign({}, rest, { className: classnames(FormDefaults.cssClassPrefix + 'date-time-picker', className), value: displayDateTime, onChange: handleChange, required: required, disabled: disabled, maxDate: maxDate, minDate: minDate })) })) })));
55
+ function handleChange(newDateTime) {
56
+ var onChange = input.onChange;
57
+ if (onChange === null) {
58
+ return;
59
+ }
60
+ if (!newDateTime) {
61
+ onChange(undefined);
62
+ setDisplayDateTime(null);
63
+ return;
64
+ }
65
+ else if (typeof newDateTime === 'string') {
66
+ var parsedDateTime = parseISO(newDateTime);
67
+ setDisplayDateTime(parsedDateTime);
68
+ onChange(convert(parsedDateTime));
69
+ }
70
+ else if (newDateTime instanceof Date) {
71
+ setDisplayDateTime(newDateTime);
72
+ onChange(convert(newDateTime));
73
+ }
74
+ }
75
+ }
76
+ function convertISODateTimeStringToDate(isoDateTimeString) {
77
+ var isoDateTimeRegex = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?)([+-]\d{2}:\d{2}|Z)?$/;
78
+ var isValidIsoDateTimeString = isoDateTimeRegex.test(isoDateTimeString);
79
+ if (isValidIsoDateTimeString) {
80
+ return new Date(isoDateTimeString);
81
+ }
82
+ var errorMessage = "Invalid \"date time\" value of ".concat(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");
83
+ if (process.env.NODE_ENV !== 'production') {
84
+ throw new Error(errorMessage);
85
+ }
86
+ else {
87
+ console.error(errorMessage);
88
+ }
89
+ return null;
90
+ }
@@ -0,0 +1,3 @@
1
+ import { DateTimePickerGroupProps } from './DateTimePickerGroup';
2
+ export interface DateTimePickerHelper<T> extends Omit<DateTimePickerGroupProps<T>, 'convert'> {
3
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ import { DateTimePickerHelper } from './DateTimePickerHelper';
3
+ export interface StringDateTimePickerGroupProps extends DateTimePickerHelper<string | undefined | null> {
4
+ }
5
+ /**
6
+ * Date Time picker input that consumes JS Date object and outputs as a date time offset string in ISO format `YYYY-MM-DDTHH:mm:ss.sss±hh:mm`.
7
+ *
8
+ * Default display to the user is in `MM/DD/YYYY HH:mm:ss AM/PM` format.
9
+ */
10
+ export default function StringDateTimePickerGroup(props: StringDateTimePickerGroupProps): JSX.Element;
@@ -0,0 +1,53 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import DateTimePickerGroup from './DateTimePickerGroup';
14
+ /**
15
+ * Date Time picker input that consumes JS Date object and outputs as a date time offset string in ISO format `YYYY-MM-DDTHH:mm:ss.sss±hh:mm`.
16
+ *
17
+ * Default display to the user is in `MM/DD/YYYY HH:mm:ss AM/PM` format.
18
+ */
19
+ export default function StringDateTimePickerGroup(props) {
20
+ return _jsx(DateTimePickerGroup, __assign({}, props, { convert: convertToISOString }));
21
+ }
22
+ function convertToISOString(date) {
23
+ // Get the offset in minutes
24
+ var offsetMinutes = date.getTimezoneOffset();
25
+ // Calculate the offset in hours and minutes
26
+ var offsetHours = Math.floor(Math.abs(offsetMinutes) / 60);
27
+ var offsetMinutesPart = Math.abs(offsetMinutes) % 60;
28
+ // Format the offset in the required format (+/-hh:mm)
29
+ var offsetString = (offsetMinutes >= 0 ? '-' : '+') +
30
+ String(offsetHours).padStart(2, '0') +
31
+ ':' +
32
+ String(offsetMinutesPart).padStart(2, '0');
33
+ // Format the date in the required format using `intl.DateTimeFormat`
34
+ var year = new Intl.DateTimeFormat('en', { year: 'numeric' })
35
+ .format(date)
36
+ .padStart(4, '0');
37
+ var month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(date);
38
+ var day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(date);
39
+ var hour = new Intl.DateTimeFormat('en', {
40
+ hour: '2-digit',
41
+ hourCycle: 'h23',
42
+ }).format(date);
43
+ var minute = new Intl.DateTimeFormat('en', { minute: '2-digit' })
44
+ .format(date)
45
+ .padStart(2, '0');
46
+ var second = new Intl.DateTimeFormat('en', {
47
+ second: '2-digit',
48
+ fractionalSecondDigits: 3,
49
+ })
50
+ .format(date)
51
+ .padStart(6, '0');
52
+ return "".concat(year, "-").concat(month, "-").concat(day, "T").concat(hour, ":").concat(minute, ":").concat(second).concat(offsetString);
53
+ }
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { InputGroupProps } from './InputGroup';
3
+ export interface PhoneNumberInputGroupProps extends Omit<InputGroupProps<string | undefined | null>, 'onChange' | 'type' | 'value'> {
4
+ }
5
+ /**A standard phone number input. Will display to the user in `+XXX XXX-XXX-XXXX` format as the number is being inputted.
6
+ * The data will get sent in the same format as displayed. Uses `normalizers.phoneNumber`.
7
+ * @default autoComplete="tel-national"
8
+ */
9
+ declare const PhoneNumberInputGroupWithRef: React.ComponentType<PhoneNumberInputGroupProps>;
10
+ export default PhoneNumberInputGroupWithRef;
@@ -0,0 +1,47 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ import { jsx as _jsx } from "react/jsx-runtime";
24
+ import React from 'react';
25
+ import classNames from 'classnames';
26
+ import InputGroup from './InputGroup';
27
+ import { FormDefaults } from '../FormDefaults';
28
+ import { phoneNumber } from '../Normalization/normalizers';
29
+ function PhoneNumberInputGroup(_a, ref) {
30
+ var _b;
31
+ var className = _a.className, rest = __rest(_a, ["className"]);
32
+ var input = rest.input;
33
+ return (_jsx(InputGroup, __assign({ ref: ref, autoComplete: "tel-national" }, rest, { type: "text", className: classNames(className, FormDefaults.cssClassPrefix + 'phone-number-group'), value: (_b = input.value) !== null && _b !== void 0 ? _b : '', onChange: function (e) {
34
+ if (!e.target.value) {
35
+ input.onChange(undefined);
36
+ }
37
+ else {
38
+ input.onChange(phoneNumber(e.target.value));
39
+ }
40
+ } })));
41
+ }
42
+ /**A standard phone number input. Will display to the user in `+XXX XXX-XXX-XXXX` format as the number is being inputted.
43
+ * The data will get sent in the same format as displayed. Uses `normalizers.phoneNumber`.
44
+ * @default autoComplete="tel-national"
45
+ */
46
+ var PhoneNumberInputGroupWithRef = React.forwardRef(PhoneNumberInputGroup);
47
+ export default PhoneNumberInputGroupWithRef;
@@ -0,0 +1,2 @@
1
+ import useFormValue from './useFormValue';
2
+ export { useFormValue };
@@ -0,0 +1,2 @@
1
+ import useFormValue from './useFormValue';
2
+ export { useFormValue };
@@ -0,0 +1,2 @@
1
+ import { FormBuilderProp } from 'Form/Form';
2
+ export default function useFormValue<TForm extends object, TPropKey extends keyof TForm>(formBuilder: FormBuilderProp<TForm>, fieldName: TPropKey): readonly [TForm[TPropKey], (value: TForm[TPropKey]) => void];
@@ -0,0 +1,7 @@
1
+ import { useCallback } from 'react';
2
+ import { useFormikContext } from 'formik';
3
+ export default function useFormValue(formBuilder, fieldName) {
4
+ var _a = useFormikContext(), values = _a.values, setFieldValue = _a.setFieldValue;
5
+ var setValue = useCallback(function (value) { return setFieldValue(fieldName, value); }, [fieldName, setFieldValue]);
6
+ return [values[fieldName], setValue];
7
+ }
package/es/index.d.ts CHANGED
@@ -14,6 +14,10 @@ export { default as StringDatePickerGroup } from './DatePicker/StringDatePickerG
14
14
  export type { StringDatePickerGroupProps } from './DatePicker/StringDatePickerGroup';
15
15
  export { default as StringDateOnlyPickerGroup } from './DatePicker/StringDateOnlyPickerGroup';
16
16
  export type { StringDateOnlyPickerGroupProps } from './DatePicker/StringDateOnlyPickerGroup';
17
+ export { default as DateTimePickerGroup } from './DateTimePicker/DateTimePickerGroup';
18
+ export type { DateTimePickerGroupProps } from './DateTimePicker/DateTimePickerGroup';
19
+ export { default as StringDateTimePickerGroup } from './DateTimePicker/StringDateTimePickerGroup';
20
+ export type { StringDateTimePickerGroupProps } from './DateTimePicker/StringDateTimePickerGroup';
17
21
  export { default as Field } from './Field/Field';
18
22
  export type { FieldProps } from './Field/Field';
19
23
  export type { RenderComponent } from './Field/Field';
@@ -48,6 +52,8 @@ export { default as MoneyInputGroup } from './Input/MoneyInputGroup';
48
52
  export type { MoneyInputGroupProps } from './Input/MoneyInputGroup';
49
53
  export { default as NumberInputGroup } from './Input/NumberInputGroup';
50
54
  export type { NumberInputGroupProps } from './Input/NumberInputGroup';
55
+ export { default as PhoneNumberInputGroup } from './Input/PhoneNumberInputGroup';
56
+ export type { PhoneNumberInputGroupProps } from './Input/PhoneNumberInputGroup';
51
57
  export { default as StringInputGroup } from './Input/StringInputGroup';
52
58
  export type { StringInputGroupProps } from './Input/StringInputGroup';
53
59
  export type { NormalizationFunction } from './Normalization/NormalizationFunction';
package/es/index.js CHANGED
@@ -11,6 +11,9 @@ export { default as DatePickerGroup } from './DatePicker/DatePickerGroup';
11
11
  export { convertToTimeZoneInsensitiveISOString } from './DatePicker/DatePickerGroup';
12
12
  export { default as StringDatePickerGroup } from './DatePicker/StringDatePickerGroup';
13
13
  export { default as StringDateOnlyPickerGroup } from './DatePicker/StringDateOnlyPickerGroup';
14
+ // DateTime
15
+ export { default as DateTimePickerGroup } from './DateTimePicker/DateTimePickerGroup';
16
+ export { default as StringDateTimePickerGroup } from './DateTimePicker/StringDateTimePickerGroup';
14
17
  // Field
15
18
  export { default as Field } from './Field/Field';
16
19
  export { default as FieldErrorScrollTarget } from './Field/FieldErrorScrollTarget';
@@ -34,6 +37,7 @@ export { default as IconInputGroup } from './Input/IconInputGroup';
34
37
  export { default as InputGroup } from './Input/InputGroup';
35
38
  export { default as MoneyInputGroup } from './Input/MoneyInputGroup';
36
39
  export { default as NumberInputGroup } from './Input/NumberInputGroup';
40
+ export { default as PhoneNumberInputGroup } from './Input/PhoneNumberInputGroup';
37
41
  export { default as StringInputGroup } from './Input/StringInputGroup';
38
42
  export * as normalizers from './Normalization/normalizers';
39
43
  // Select
@@ -10,5 +10,5 @@ export interface DatePickerGroupProps<T> extends InjectedFieldProps<T | undefine
10
10
  *
11
11
  * Uses [react-date-picker](https://www.npmjs.com/package/react-date-picker)
12
12
  */
13
- export default function DatePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, ...rest }: DatePickerGroupProps<T>): JSX.Element;
13
+ export default function DatePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, maxDate, minDate, ...rest }: DatePickerGroupProps<T>): JSX.Element;
14
14
  export declare function convertToTimeZoneInsensitiveISOString(date: Date): string;
@@ -39,8 +39,8 @@ var Group_1 = __importDefault(require("../Group"));
39
39
  * Uses [react-date-picker](https://www.npmjs.com/package/react-date-picker)
40
40
  */
41
41
  function DatePickerGroup(_a) {
42
- var input = _a.input, meta = _a.meta, label = _a.label, helpText = _a.helpText, className = _a.className, required = _a.required, disabled = _a.disabled, convert = _a.convert, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "convert"]);
43
- var _b = (0, react_1.useState)(null), displayDate = _b[0], setDisplayDate = _b[1];
42
+ var input = _a.input, meta = _a.meta, label = _a.label, helpText = _a.helpText, className = _a.className, required = _a.required, disabled = _a.disabled, convert = _a.convert, _b = _a.maxDate, maxDate = _b === void 0 ? new Date(9999, 11, 31) : _b, _c = _a.minDate, minDate = _c === void 0 ? new Date(1000, 0, 1) : _c, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "convert", "maxDate", "minDate"]);
43
+ var _d = (0, react_1.useState)(null), displayDate = _d[0], setDisplayDate = _d[1];
44
44
  (0, react_1.useEffect)(function () {
45
45
  if (!input.value) {
46
46
  setDisplayDate(null);
@@ -54,7 +54,10 @@ function DatePickerGroup(_a) {
54
54
  }
55
55
  }
56
56
  }, [setDisplayDate, input.value]);
57
- return ((0, jsx_runtime_1.jsx)(Group_1.default, __assign({ input: input, meta: meta, label: label, helpText: helpText, className: (0, classnames_1.default)(className, FormDefaults_1.FormDefaults.cssClassPrefix + 'date-picker'), required: required, disabled: disabled }, { children: (0, jsx_runtime_1.jsx)(entry_nostyle_1.default, __assign({}, rest, { className: (0, classnames_1.default)(FormDefaults_1.FormDefaults.cssClassPrefix + 'date-picker', className), value: displayDate, onChange: handleChange })) })));
57
+ return ((0, jsx_runtime_1.jsx)(Group_1.default, __assign({ input: input, meta: meta, label: label, helpText: helpText, className: (0, classnames_1.default)(className, FormDefaults_1.FormDefaults.cssClassPrefix + 'date-picker'), required: required, disabled: disabled }, { children: (0, jsx_runtime_1.jsx)("div", __assign({ onBlur: function () {
58
+ // Manually trigger Formik's onBlur when the user clicks away from the date picker
59
+ input.onBlur();
60
+ } }, { children: (0, jsx_runtime_1.jsx)(entry_nostyle_1.default, __assign({}, rest, { className: (0, classnames_1.default)(FormDefaults_1.FormDefaults.cssClassPrefix + 'date-picker', className), value: displayDate, onChange: handleChange, disabled: disabled, required: required, maxDate: maxDate, minDate: minDate })) })) })));
58
61
  function handleChange(e) {
59
62
  var onChange = input.onChange;
60
63
  if (onChange === null) {
@@ -87,6 +90,7 @@ exports.default = DatePickerGroup;
87
90
  function convertToTimeZoneInsensitiveISOString(date) {
88
91
  var year = new Intl.DateTimeFormat('en', { year: 'numeric' })
89
92
  .format(date)
93
+ .substring(0, 4)
90
94
  .padStart(4, '0');
91
95
  var month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(date);
92
96
  var day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(date);
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ import { DateTimePickerProps } from 'react-datetime-picker';
3
+ import { InjectedFieldProps } from '../Field/InjectedFieldProps';
4
+ import { GroupProps } from '../Group';
5
+ export interface DateTimePickerGroupProps<T> extends InjectedFieldProps<T | undefined | null>, Omit<DateTimePickerProps, keyof InjectedFieldProps<T> | 'name' | 'value' | 'className'>, Omit<GroupProps, keyof InjectedFieldProps<T> | 'children'> {
6
+ convert: (date: Date) => T;
7
+ }
8
+ /**
9
+ * Field for inputting date and time. Uses `<Group/>` and `<DateTimePicker/>`.
10
+ *
11
+ * Uses [react-datetime-picker](https://www.npmjs.com/package/react-datetime-picker)
12
+ */
13
+ export default function DateTimePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, maxDate, minDate, ...rest }: DateTimePickerGroupProps<T>): JSX.Element;
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __rest = (this && this.__rest) || function (s, e) {
14
+ var t = {};
15
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
+ t[p] = s[p];
17
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
+ t[p[i]] = s[p[i]];
21
+ }
22
+ return t;
23
+ };
24
+ var __importDefault = (this && this.__importDefault) || function (mod) {
25
+ return (mod && mod.__esModule) ? mod : { "default": mod };
26
+ };
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ var jsx_runtime_1 = require("react/jsx-runtime");
29
+ var react_1 = require("react");
30
+ var react_datetime_picker_1 = require("react-datetime-picker");
31
+ var classnames_1 = __importDefault(require("classnames"));
32
+ var parseISO_1 = __importDefault(require("date-fns/parseISO"));
33
+ var FormDefaults_1 = require("../FormDefaults");
34
+ var Group_1 = __importDefault(require("../Group"));
35
+ /**
36
+ * Field for inputting date and time. Uses `<Group/>` and `<DateTimePicker/>`.
37
+ *
38
+ * Uses [react-datetime-picker](https://www.npmjs.com/package/react-datetime-picker)
39
+ */
40
+ function DateTimePickerGroup(_a) {
41
+ var input = _a.input, meta = _a.meta, label = _a.label, helpText = _a.helpText, className = _a.className, required = _a.required, disabled = _a.disabled, convert = _a.convert, _b = _a.maxDate, maxDate = _b === void 0 ? new Date(9999, 11, 31) : _b, _c = _a.minDate, minDate = _c === void 0 ? new Date(1000, 0, 1) : _c, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "convert", "maxDate", "minDate"]);
42
+ var _d = (0, react_1.useState)(null), displayDateTime = _d[0], setDisplayDateTime = _d[1];
43
+ (0, react_1.useEffect)(function () {
44
+ var inputValue = input.value;
45
+ if (!inputValue) {
46
+ setDisplayDateTime(null);
47
+ }
48
+ else if (typeof inputValue === 'string') {
49
+ var parsedDateTime = convertISODateTimeStringToDate(inputValue);
50
+ setDisplayDateTime(parsedDateTime);
51
+ }
52
+ else if (inputValue instanceof Date) {
53
+ setDisplayDateTime(inputValue);
54
+ }
55
+ }, [setDisplayDateTime, input.value]);
56
+ return ((0, jsx_runtime_1.jsx)(Group_1.default, __assign({ input: input, meta: meta, label: label, helpText: helpText, className: (0, classnames_1.default)(className, FormDefaults_1.FormDefaults.cssClassPrefix + 'date-time-picker'), required: required, disabled: disabled }, { children: (0, jsx_runtime_1.jsx)("div", __assign({ onBlur: function () {
57
+ // Manually trigger Formik's onBlur when the user clicks away from the date picker
58
+ input.onBlur();
59
+ } }, { children: (0, jsx_runtime_1.jsx)(react_datetime_picker_1.DateTimePicker, __assign({}, rest, { className: (0, classnames_1.default)(FormDefaults_1.FormDefaults.cssClassPrefix + 'date-time-picker', className), value: displayDateTime, onChange: handleChange, required: required, disabled: disabled, maxDate: maxDate, minDate: minDate })) })) })));
60
+ function handleChange(newDateTime) {
61
+ var onChange = input.onChange;
62
+ if (onChange === null) {
63
+ return;
64
+ }
65
+ if (!newDateTime) {
66
+ onChange(undefined);
67
+ setDisplayDateTime(null);
68
+ return;
69
+ }
70
+ else if (typeof newDateTime === 'string') {
71
+ var parsedDateTime = (0, parseISO_1.default)(newDateTime);
72
+ setDisplayDateTime(parsedDateTime);
73
+ onChange(convert(parsedDateTime));
74
+ }
75
+ else if (newDateTime instanceof Date) {
76
+ setDisplayDateTime(newDateTime);
77
+ onChange(convert(newDateTime));
78
+ }
79
+ }
80
+ }
81
+ exports.default = DateTimePickerGroup;
82
+ function convertISODateTimeStringToDate(isoDateTimeString) {
83
+ var isoDateTimeRegex = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?)([+-]\d{2}:\d{2}|Z)?$/;
84
+ var isValidIsoDateTimeString = isoDateTimeRegex.test(isoDateTimeString);
85
+ if (isValidIsoDateTimeString) {
86
+ return new Date(isoDateTimeString);
87
+ }
88
+ var errorMessage = "Invalid \"date time\" value of ".concat(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");
89
+ if (process.env.NODE_ENV !== 'production') {
90
+ throw new Error(errorMessage);
91
+ }
92
+ else {
93
+ console.error(errorMessage);
94
+ }
95
+ return null;
96
+ }
@@ -0,0 +1,3 @@
1
+ import { DateTimePickerGroupProps } from './DateTimePickerGroup';
2
+ export interface DateTimePickerHelper<T> extends Omit<DateTimePickerGroupProps<T>, 'convert'> {
3
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ import { DateTimePickerHelper } from './DateTimePickerHelper';
3
+ export interface StringDateTimePickerGroupProps extends DateTimePickerHelper<string | undefined | null> {
4
+ }
5
+ /**
6
+ * Date Time picker input that consumes JS Date object and outputs as a date time offset string in ISO format `YYYY-MM-DDTHH:mm:ss.sss±hh:mm`.
7
+ *
8
+ * Default display to the user is in `MM/DD/YYYY HH:mm:ss AM/PM` format.
9
+ */
10
+ export default function StringDateTimePickerGroup(props: StringDateTimePickerGroupProps): JSX.Element;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ var jsx_runtime_1 = require("react/jsx-runtime");
18
+ var DateTimePickerGroup_1 = __importDefault(require("./DateTimePickerGroup"));
19
+ /**
20
+ * Date Time picker input that consumes JS Date object and outputs as a date time offset string in ISO format `YYYY-MM-DDTHH:mm:ss.sss±hh:mm`.
21
+ *
22
+ * Default display to the user is in `MM/DD/YYYY HH:mm:ss AM/PM` format.
23
+ */
24
+ function StringDateTimePickerGroup(props) {
25
+ return (0, jsx_runtime_1.jsx)(DateTimePickerGroup_1.default, __assign({}, props, { convert: convertToISOString }));
26
+ }
27
+ exports.default = StringDateTimePickerGroup;
28
+ function convertToISOString(date) {
29
+ // Get the offset in minutes
30
+ var offsetMinutes = date.getTimezoneOffset();
31
+ // Calculate the offset in hours and minutes
32
+ var offsetHours = Math.floor(Math.abs(offsetMinutes) / 60);
33
+ var offsetMinutesPart = Math.abs(offsetMinutes) % 60;
34
+ // Format the offset in the required format (+/-hh:mm)
35
+ var offsetString = (offsetMinutes >= 0 ? '-' : '+') +
36
+ String(offsetHours).padStart(2, '0') +
37
+ ':' +
38
+ String(offsetMinutesPart).padStart(2, '0');
39
+ // Format the date in the required format using `intl.DateTimeFormat`
40
+ var year = new Intl.DateTimeFormat('en', { year: 'numeric' })
41
+ .format(date)
42
+ .padStart(4, '0');
43
+ var month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(date);
44
+ var day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(date);
45
+ var hour = new Intl.DateTimeFormat('en', {
46
+ hour: '2-digit',
47
+ hourCycle: 'h23',
48
+ }).format(date);
49
+ var minute = new Intl.DateTimeFormat('en', { minute: '2-digit' })
50
+ .format(date)
51
+ .padStart(2, '0');
52
+ var second = new Intl.DateTimeFormat('en', {
53
+ second: '2-digit',
54
+ fractionalSecondDigits: 3,
55
+ })
56
+ .format(date)
57
+ .padStart(6, '0');
58
+ return "".concat(year, "-").concat(month, "-").concat(day, "T").concat(hour, ":").concat(minute, ":").concat(second).concat(offsetString);
59
+ }
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { InputGroupProps } from './InputGroup';
3
+ export interface PhoneNumberInputGroupProps extends Omit<InputGroupProps<string | undefined | null>, 'onChange' | 'type' | 'value'> {
4
+ }
5
+ /**A standard phone number input. Will display to the user in `+XXX XXX-XXX-XXXX` format as the number is being inputted.
6
+ * The data will get sent in the same format as displayed. Uses `normalizers.phoneNumber`.
7
+ * @default autoComplete="tel-national"
8
+ */
9
+ declare const PhoneNumberInputGroupWithRef: React.ComponentType<PhoneNumberInputGroupProps>;
10
+ export default PhoneNumberInputGroupWithRef;