envoc-form 5.0.8 → 5.0.9

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 (35) hide show
  1. package/README.md +3079 -1068
  2. package/es/DatePicker/DatePickerGroup.d.ts +1 -1
  3. package/es/DatePicker/DatePickerGroup.js +4 -3
  4. package/es/DateTimePicker/DateTimePickerGroup.d.ts +12 -0
  5. package/es/DateTimePicker/DateTimePickerGroup.js +87 -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 +9 -0
  9. package/es/DateTimePicker/StringDateTimePickerGroup.js +53 -0
  10. package/es/Input/InputGroup.d.ts +1 -1
  11. package/es/Input/InputGroup.js +2 -2
  12. package/es/index.d.ts +4 -0
  13. package/es/index.js +3 -0
  14. package/lib/DatePicker/DatePickerGroup.d.ts +1 -1
  15. package/lib/DatePicker/DatePickerGroup.js +4 -3
  16. package/lib/DateTimePicker/DateTimePickerGroup.d.ts +12 -0
  17. package/lib/DateTimePicker/DateTimePickerGroup.js +93 -0
  18. package/lib/DateTimePicker/DateTimePickerHelper.d.ts +3 -0
  19. package/lib/DateTimePicker/DateTimePickerHelper.js +2 -0
  20. package/lib/DateTimePicker/StringDateTimePickerGroup.d.ts +9 -0
  21. package/lib/DateTimePicker/StringDateTimePickerGroup.js +59 -0
  22. package/lib/Input/InputGroup.d.ts +1 -1
  23. package/lib/Input/InputGroup.js +2 -2
  24. package/lib/index.d.ts +4 -0
  25. package/lib/index.js +6 -1
  26. package/package.json +4 -3
  27. package/src/DatePicker/DatePickerGroup.tsx +6 -0
  28. package/src/DateTimePicker/DateTimePicker.test.tsx +243 -0
  29. package/src/DateTimePicker/DateTimePickerGroup.tsx +116 -0
  30. package/src/DateTimePicker/DateTimePickerHelper.ts +4 -0
  31. package/src/DateTimePicker/StringDateTimePickerGroup.tsx +61 -0
  32. package/src/DateTimePicker/__snapshots__/DateTimePicker.test.tsx.snap +217 -0
  33. package/src/Input/InputGroup.tsx +3 -0
  34. package/src/__Tests__/FormTestBase.tsx +1 -0
  35. package/src/index.ts +7 -0
@@ -9,5 +9,5 @@ export interface DatePickerGroupProps<T> extends InjectedFieldProps<T | undefine
9
9
  *
10
10
  * Uses [react-date-picker](https://www.npmjs.com/package/react-date-picker)
11
11
  */
12
- export default function DatePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, ...rest }: DatePickerGroupProps<T>): import("react/jsx-runtime").JSX.Element;
12
+ export default function DatePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, maxDate, minDate, ...rest }: DatePickerGroupProps<T>): import("react/jsx-runtime").JSX.Element;
13
13
  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,7 @@ export default function DatePickerGroup(_a) {
48
48
  }
49
49
  }
50
50
  }, [setDisplayDate, input.value]);
51
- return (_jsx(Group, { input: input, meta: meta, label: label, helpText: helpText, className: clsx(className, FormDefaults.cssClassPrefix + 'date-picker'), required: required, disabled: disabled, children: _jsx(DatePicker, __assign({}, rest, { className: clsx(FormDefaults.cssClassPrefix + 'date-picker', className), value: displayDate, onChange: handleChange })) }));
51
+ return (_jsx(Group, { input: input, meta: meta, label: label, helpText: helpText, className: clsx(className, FormDefaults.cssClassPrefix + 'date-picker'), required: required, disabled: disabled, children: _jsx(DatePicker, __assign({}, rest, { className: clsx(FormDefaults.cssClassPrefix + 'date-picker', className), value: displayDate, onChange: handleChange, maxDate: maxDate, minDate: minDate, disabled: disabled })) }));
52
52
  function handleChange(e) {
53
53
  var onChange = input.onChange;
54
54
  if (onChange === null) {
@@ -80,6 +80,7 @@ export default function DatePickerGroup(_a) {
80
80
  export function convertToTimeZoneInsensitiveISOString(date) {
81
81
  var year = new Intl.DateTimeFormat('en', { year: 'numeric' })
82
82
  .format(date)
83
+ .substring(0, 4)
83
84
  .padStart(4, '0');
84
85
  var month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(date);
85
86
  var day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(date);
@@ -0,0 +1,12 @@
1
+ import { DateTimePickerProps } from 'react-datetime-picker';
2
+ import { InjectedFieldProps } from '../Field/InjectedFieldProps';
3
+ import { GroupProps } from '../Group';
4
+ export interface DateTimePickerGroupProps<T> extends InjectedFieldProps<T | undefined | null>, Omit<DateTimePickerProps, keyof InjectedFieldProps<T> | 'name' | 'value' | 'className'>, Omit<GroupProps, keyof InjectedFieldProps<T> | 'children'> {
5
+ convert: (date: Date) => T;
6
+ }
7
+ /**
8
+ * Field for inputting date and time. Uses `<Group/>` and `<DateTimePicker/>`.
9
+ *
10
+ * Uses [react-datetime-picker](https://www.npmjs.com/package/react-datetime-picker)
11
+ */
12
+ export default function DateTimePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, ...rest }: DateTimePickerGroupProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,87 @@
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 { clsx } from 'clsx';
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, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "convert"]);
37
+ var _b = useState(null), displayDateTime = _b[0], setDisplayDateTime = _b[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, { input: input, meta: meta, label: label, helpText: helpText, className: clsx(className, FormDefaults.cssClassPrefix + 'date-time-picker'), required: required, disabled: disabled, children: _jsx(DateTimePicker, __assign({}, rest, { className: clsx(FormDefaults.cssClassPrefix + 'date-time-picker', className), value: displayDateTime, onChange: handleChange })) }));
52
+ function handleChange(newDateTime) {
53
+ var onChange = input.onChange;
54
+ if (onChange === null) {
55
+ return;
56
+ }
57
+ if (!newDateTime) {
58
+ onChange(undefined);
59
+ setDisplayDateTime(null);
60
+ return;
61
+ }
62
+ else if (typeof newDateTime === 'string') {
63
+ var parsedDateTime = parseISO(newDateTime);
64
+ setDisplayDateTime(parsedDateTime);
65
+ onChange(convert(parsedDateTime));
66
+ }
67
+ else if (newDateTime instanceof Date) {
68
+ setDisplayDateTime(newDateTime);
69
+ onChange(convert(newDateTime));
70
+ }
71
+ }
72
+ }
73
+ function convertISODateTimeStringToDate(isoDateTimeString) {
74
+ var isoDateTimeRegex = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?)([+-]\d{2}:\d{2}|Z)?$/;
75
+ var isValidIsoDateTimeString = isoDateTimeRegex.test(isoDateTimeString);
76
+ if (isValidIsoDateTimeString) {
77
+ return new Date(isoDateTimeString);
78
+ }
79
+ 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");
80
+ if (process.env.NODE_ENV !== 'production') {
81
+ throw new Error(errorMessage);
82
+ }
83
+ else {
84
+ console.error(errorMessage);
85
+ }
86
+ return null;
87
+ }
@@ -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,9 @@
1
+ import { DateTimePickerHelper } from './DateTimePickerHelper';
2
+ export interface StringDateTimePickerGroupProps extends DateTimePickerHelper<string | undefined | null> {
3
+ }
4
+ /**
5
+ * 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`.
6
+ *
7
+ * Default display to the user is in `MM/DD/YYYY HH:mm:ss AM/PM` format.
8
+ */
9
+ export default function StringDateTimePickerGroup(props: StringDateTimePickerGroupProps): import("react/jsx-runtime").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
+ }
@@ -6,7 +6,7 @@ export interface InputGroupProps<TValue> extends InjectedFieldProps<TValue>, Omi
6
6
  value: string | number | null | undefined;
7
7
  icon?: React.ReactNode;
8
8
  }
9
- declare function InputGroup<TValue>({ input, meta, label, helpText, className, required, disabled, onChange, value, icon, ...rest }: InputGroupProps<TValue>, ref: LegacyRef<HTMLInputElement>): import("react/jsx-runtime").JSX.Element;
9
+ declare function InputGroup<TValue>({ input, meta, label, helpText, className, required, disabled, onChange, value, icon, type, ...rest }: InputGroupProps<TValue>, ref: LegacyRef<HTMLInputElement>): import("react/jsx-runtime").JSX.Element;
10
10
  /** Generic controlled `<input/>` wrapped by a `<Group/>` */
11
11
  declare const InputGroupWithRef: typeof InputGroup;
12
12
  export default InputGroupWithRef;
@@ -26,8 +26,8 @@ import { clsx } from 'clsx';
26
26
  import { FormDefaults } from '../FormDefaults';
27
27
  import Group from '../Group';
28
28
  function InputGroup(_a, ref) {
29
- var input = _a.input, meta = _a.meta, label = _a.label, helpText = _a.helpText, className = _a.className, required = _a.required, disabled = _a.disabled, onChange = _a.onChange, value = _a.value, icon = _a.icon, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "onChange", "value", "icon"]);
30
- return (_jsxs(Group, { input: input, meta: meta, required: required, disabled: disabled, label: label, helpText: helpText, className: clsx(className, FormDefaults.cssClassPrefix + 'input-group'), children: [icon, _jsx("input", __assign({}, input, rest, { "aria-invalid": !!meta.error, "aria-errormessage": !!meta.error ? "".concat(input.name, "-error") : undefined, value: value !== null && value !== void 0 ? value : '', onChange: onChange, ref: ref, className: clsx(className, FormDefaults.cssClassPrefix + 'input-group') }))] }));
29
+ var input = _a.input, meta = _a.meta, label = _a.label, helpText = _a.helpText, className = _a.className, required = _a.required, disabled = _a.disabled, onChange = _a.onChange, value = _a.value, icon = _a.icon, type = _a.type, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "onChange", "value", "icon", "type"]);
30
+ return (_jsxs(Group, { input: input, meta: meta, required: required, disabled: disabled, label: label, helpText: helpText, className: clsx(className, FormDefaults.cssClassPrefix + 'input-group'), children: [icon, _jsx("input", __assign({}, input, rest, { "aria-invalid": !!meta.error, "aria-errormessage": !!meta.error ? "".concat(input.name, "-error") : undefined, value: value !== null && value !== void 0 ? value : '', onChange: onChange, ref: ref, className: clsx(className, FormDefaults.cssClassPrefix + 'input-group'), disabled: disabled, type: disabled ? 'text' : type }))] }));
31
31
  }
32
32
  /** Generic controlled `<input/>` wrapped by a `<Group/>` */
33
33
  var InputGroupWithRef = React.forwardRef(InputGroup);
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';
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';
@@ -9,5 +9,5 @@ export interface DatePickerGroupProps<T> extends InjectedFieldProps<T | undefine
9
9
  *
10
10
  * Uses [react-date-picker](https://www.npmjs.com/package/react-date-picker)
11
11
  */
12
- export default function DatePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, ...rest }: DatePickerGroupProps<T>): import("react/jsx-runtime").JSX.Element;
12
+ export default function DatePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, maxDate, minDate, ...rest }: DatePickerGroupProps<T>): import("react/jsx-runtime").JSX.Element;
13
13
  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,7 @@ function DatePickerGroup(_a) {
54
54
  }
55
55
  }
56
56
  }, [setDisplayDate, input.value]);
57
- return ((0, jsx_runtime_1.jsx)(Group_1.default, { input: input, meta: meta, label: label, helpText: helpText, className: (0, clsx_1.clsx)(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, clsx_1.clsx)(FormDefaults_1.FormDefaults.cssClassPrefix + 'date-picker', className), value: displayDate, onChange: handleChange })) }));
57
+ return ((0, jsx_runtime_1.jsx)(Group_1.default, { input: input, meta: meta, label: label, helpText: helpText, className: (0, clsx_1.clsx)(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, clsx_1.clsx)(FormDefaults_1.FormDefaults.cssClassPrefix + 'date-picker', className), value: displayDate, onChange: handleChange, maxDate: maxDate, minDate: minDate, disabled: disabled })) }));
58
58
  function handleChange(e) {
59
59
  var onChange = input.onChange;
60
60
  if (onChange === null) {
@@ -87,6 +87,7 @@ exports.default = DatePickerGroup;
87
87
  function convertToTimeZoneInsensitiveISOString(date) {
88
88
  var year = new Intl.DateTimeFormat('en', { year: 'numeric' })
89
89
  .format(date)
90
+ .substring(0, 4)
90
91
  .padStart(4, '0');
91
92
  var month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(date);
92
93
  var day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(date);
@@ -0,0 +1,12 @@
1
+ import { DateTimePickerProps } from 'react-datetime-picker';
2
+ import { InjectedFieldProps } from '../Field/InjectedFieldProps';
3
+ import { GroupProps } from '../Group';
4
+ export interface DateTimePickerGroupProps<T> extends InjectedFieldProps<T | undefined | null>, Omit<DateTimePickerProps, keyof InjectedFieldProps<T> | 'name' | 'value' | 'className'>, Omit<GroupProps, keyof InjectedFieldProps<T> | 'children'> {
5
+ convert: (date: Date) => T;
6
+ }
7
+ /**
8
+ * Field for inputting date and time. Uses `<Group/>` and `<DateTimePicker/>`.
9
+ *
10
+ * Uses [react-datetime-picker](https://www.npmjs.com/package/react-datetime-picker)
11
+ */
12
+ export default function DateTimePickerGroup<T>({ input, meta, label, helpText, className, required, disabled, convert, ...rest }: DateTimePickerGroupProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,93 @@
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 clsx_1 = require("clsx");
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, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "convert"]);
42
+ var _b = (0, react_1.useState)(null), displayDateTime = _b[0], setDisplayDateTime = _b[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, { input: input, meta: meta, label: label, helpText: helpText, className: (0, clsx_1.clsx)(className, FormDefaults_1.FormDefaults.cssClassPrefix + 'date-time-picker'), required: required, disabled: disabled, children: (0, jsx_runtime_1.jsx)(react_datetime_picker_1.DateTimePicker, __assign({}, rest, { className: (0, clsx_1.clsx)(FormDefaults_1.FormDefaults.cssClassPrefix + 'date-time-picker', className), value: displayDateTime, onChange: handleChange })) }));
57
+ function handleChange(newDateTime) {
58
+ var onChange = input.onChange;
59
+ if (onChange === null) {
60
+ return;
61
+ }
62
+ if (!newDateTime) {
63
+ onChange(undefined);
64
+ setDisplayDateTime(null);
65
+ return;
66
+ }
67
+ else if (typeof newDateTime === 'string') {
68
+ var parsedDateTime = (0, parseISO_1.default)(newDateTime);
69
+ setDisplayDateTime(parsedDateTime);
70
+ onChange(convert(parsedDateTime));
71
+ }
72
+ else if (newDateTime instanceof Date) {
73
+ setDisplayDateTime(newDateTime);
74
+ onChange(convert(newDateTime));
75
+ }
76
+ }
77
+ }
78
+ exports.default = DateTimePickerGroup;
79
+ function convertISODateTimeStringToDate(isoDateTimeString) {
80
+ var isoDateTimeRegex = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?)([+-]\d{2}:\d{2}|Z)?$/;
81
+ var isValidIsoDateTimeString = isoDateTimeRegex.test(isoDateTimeString);
82
+ if (isValidIsoDateTimeString) {
83
+ return new Date(isoDateTimeString);
84
+ }
85
+ 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");
86
+ if (process.env.NODE_ENV !== 'production') {
87
+ throw new Error(errorMessage);
88
+ }
89
+ else {
90
+ console.error(errorMessage);
91
+ }
92
+ return null;
93
+ }
@@ -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,9 @@
1
+ import { DateTimePickerHelper } from './DateTimePickerHelper';
2
+ export interface StringDateTimePickerGroupProps extends DateTimePickerHelper<string | undefined | null> {
3
+ }
4
+ /**
5
+ * 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`.
6
+ *
7
+ * Default display to the user is in `MM/DD/YYYY HH:mm:ss AM/PM` format.
8
+ */
9
+ export default function StringDateTimePickerGroup(props: StringDateTimePickerGroupProps): import("react/jsx-runtime").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
+ }
@@ -6,7 +6,7 @@ export interface InputGroupProps<TValue> extends InjectedFieldProps<TValue>, Omi
6
6
  value: string | number | null | undefined;
7
7
  icon?: React.ReactNode;
8
8
  }
9
- declare function InputGroup<TValue>({ input, meta, label, helpText, className, required, disabled, onChange, value, icon, ...rest }: InputGroupProps<TValue>, ref: LegacyRef<HTMLInputElement>): import("react/jsx-runtime").JSX.Element;
9
+ declare function InputGroup<TValue>({ input, meta, label, helpText, className, required, disabled, onChange, value, icon, type, ...rest }: InputGroupProps<TValue>, ref: LegacyRef<HTMLInputElement>): import("react/jsx-runtime").JSX.Element;
10
10
  /** Generic controlled `<input/>` wrapped by a `<Group/>` */
11
11
  declare const InputGroupWithRef: typeof InputGroup;
12
12
  export default InputGroupWithRef;
@@ -31,8 +31,8 @@ var clsx_1 = require("clsx");
31
31
  var FormDefaults_1 = require("../FormDefaults");
32
32
  var Group_1 = __importDefault(require("../Group"));
33
33
  function InputGroup(_a, ref) {
34
- var input = _a.input, meta = _a.meta, label = _a.label, helpText = _a.helpText, className = _a.className, required = _a.required, disabled = _a.disabled, onChange = _a.onChange, value = _a.value, icon = _a.icon, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "onChange", "value", "icon"]);
35
- return ((0, jsx_runtime_1.jsxs)(Group_1.default, { input: input, meta: meta, required: required, disabled: disabled, label: label, helpText: helpText, className: (0, clsx_1.clsx)(className, FormDefaults_1.FormDefaults.cssClassPrefix + 'input-group'), children: [icon, (0, jsx_runtime_1.jsx)("input", __assign({}, input, rest, { "aria-invalid": !!meta.error, "aria-errormessage": !!meta.error ? "".concat(input.name, "-error") : undefined, value: value !== null && value !== void 0 ? value : '', onChange: onChange, ref: ref, className: (0, clsx_1.clsx)(className, FormDefaults_1.FormDefaults.cssClassPrefix + 'input-group') }))] }));
34
+ var input = _a.input, meta = _a.meta, label = _a.label, helpText = _a.helpText, className = _a.className, required = _a.required, disabled = _a.disabled, onChange = _a.onChange, value = _a.value, icon = _a.icon, type = _a.type, rest = __rest(_a, ["input", "meta", "label", "helpText", "className", "required", "disabled", "onChange", "value", "icon", "type"]);
35
+ return ((0, jsx_runtime_1.jsxs)(Group_1.default, { input: input, meta: meta, required: required, disabled: disabled, label: label, helpText: helpText, className: (0, clsx_1.clsx)(className, FormDefaults_1.FormDefaults.cssClassPrefix + 'input-group'), children: [icon, (0, jsx_runtime_1.jsx)("input", __assign({}, input, rest, { "aria-invalid": !!meta.error, "aria-errormessage": !!meta.error ? "".concat(input.name, "-error") : undefined, value: value !== null && value !== void 0 ? value : '', onChange: onChange, ref: ref, className: (0, clsx_1.clsx)(className, FormDefaults_1.FormDefaults.cssClassPrefix + 'input-group'), disabled: disabled, type: disabled ? 'text' : type }))] }));
36
36
  }
37
37
  /** Generic controlled `<input/>` wrapped by a `<Group/>` */
38
38
  var InputGroupWithRef = react_1.default.forwardRef(InputGroup);
package/lib/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';
package/lib/index.js CHANGED
@@ -29,7 +29,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
29
29
  return (mod && mod.__esModule) ? mod : { "default": mod };
30
30
  };
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.validators = exports.serialize = exports.objectContainsNonSerializableProperty = exports.TextAreaGroup = exports.SingleStringSelectGroup = exports.MultiStringSelectGroup = exports.SingleNumberSelectGroup = exports.MultiNumberSelectGroup = exports.CheckboxInputGroup = exports.BooleanSelectGroup = exports.SelectGroup = exports.normalizers = exports.StringInputGroup = exports.PhoneNumberInputGroup = exports.NumberInputGroup = exports.MoneyInputGroup = exports.InputGroup = exports.IconInputGroup = exports.Group = exports.FormDefaults = exports.StandardFormActions = exports.FormActions = exports.ServerErrorContext = exports.Form = exports.FileGroup = exports.FieldArray = exports.useStandardField = exports.StandAloneInput = exports.FieldNameContext = exports.FieldErrorScrollTarget = exports.Field = exports.StringDateOnlyPickerGroup = exports.StringDatePickerGroup = exports.convertToTimeZoneInsensitiveISOString = exports.DatePickerGroup = exports.ConfirmDeleteForm = exports.ConfirmBaseForm = exports.SubmitFormButton = exports.AddressInput = void 0;
32
+ exports.validators = exports.serialize = exports.objectContainsNonSerializableProperty = exports.TextAreaGroup = exports.SingleStringSelectGroup = exports.MultiStringSelectGroup = exports.SingleNumberSelectGroup = exports.MultiNumberSelectGroup = exports.CheckboxInputGroup = exports.BooleanSelectGroup = exports.SelectGroup = exports.normalizers = exports.StringInputGroup = exports.PhoneNumberInputGroup = exports.NumberInputGroup = exports.MoneyInputGroup = exports.InputGroup = exports.IconInputGroup = exports.Group = exports.FormDefaults = exports.StandardFormActions = exports.FormActions = exports.ServerErrorContext = exports.Form = exports.FileGroup = exports.FieldArray = exports.useStandardField = exports.StandAloneInput = exports.FieldNameContext = exports.FieldErrorScrollTarget = exports.Field = exports.StringDateTimePickerGroup = exports.DateTimePickerGroup = exports.StringDateOnlyPickerGroup = exports.StringDatePickerGroup = exports.convertToTimeZoneInsensitiveISOString = exports.DatePickerGroup = exports.ConfirmDeleteForm = exports.ConfirmBaseForm = exports.SubmitFormButton = exports.AddressInput = void 0;
33
33
  // Address
34
34
  var AddressInput_1 = require("./AddressInput/AddressInput");
35
35
  Object.defineProperty(exports, "AddressInput", { enumerable: true, get: function () { return __importDefault(AddressInput_1).default; } });
@@ -51,6 +51,11 @@ var StringDatePickerGroup_1 = require("./DatePicker/StringDatePickerGroup");
51
51
  Object.defineProperty(exports, "StringDatePickerGroup", { enumerable: true, get: function () { return __importDefault(StringDatePickerGroup_1).default; } });
52
52
  var StringDateOnlyPickerGroup_1 = require("./DatePicker/StringDateOnlyPickerGroup");
53
53
  Object.defineProperty(exports, "StringDateOnlyPickerGroup", { enumerable: true, get: function () { return __importDefault(StringDateOnlyPickerGroup_1).default; } });
54
+ // DateTime
55
+ var DateTimePickerGroup_1 = require("./DateTimePicker/DateTimePickerGroup");
56
+ Object.defineProperty(exports, "DateTimePickerGroup", { enumerable: true, get: function () { return __importDefault(DateTimePickerGroup_1).default; } });
57
+ var StringDateTimePickerGroup_1 = require("./DateTimePicker/StringDateTimePickerGroup");
58
+ Object.defineProperty(exports, "StringDateTimePickerGroup", { enumerable: true, get: function () { return __importDefault(StringDateTimePickerGroup_1).default; } });
54
59
  // Field
55
60
  var Field_1 = require("./Field/Field");
56
61
  Object.defineProperty(exports, "Field", { enumerable: true, get: function () { return __importDefault(Field_1).default; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "envoc-form",
3
- "version": "5.0.8",
3
+ "version": "5.0.9",
4
4
  "description": "Envoc form components",
5
5
  "keywords": [
6
6
  "react-component",
@@ -37,7 +37,7 @@
37
37
  "dependencies": {
38
38
  "axios": "^0.21.1",
39
39
  "date-fns": "^2.22.1",
40
- "envoc-request": "^5.0.8",
40
+ "envoc-request": "^5.0.9",
41
41
  "lru-cache": "^6.0.0",
42
42
  "prop-types": "^15.7.2",
43
43
  "react-date-picker": "^8.2.0",
@@ -53,7 +53,8 @@
53
53
  "@fortawesome/react-fontawesome": "~0.1.16",
54
54
  "@fortawesome/free-solid-svg-icons": "~5.15.4",
55
55
  "@fortawesome/fontawesome-svg-core": "~1.2.36",
56
- "clsx": "^2.1.0"
56
+ "clsx": "^2.1.0",
57
+ "react-datetime-picker": "~6.0.1"
57
58
  },
58
59
  "devDependencies": {
59
60
  "@babel/cli": "^7.14.5",
@@ -32,6 +32,8 @@ export default function DatePickerGroup<T>({
32
32
  required,
33
33
  disabled,
34
34
  convert,
35
+ maxDate = new Date(9999, 11, 31),
36
+ minDate = new Date(1000, 0, 1),
35
37
  ...rest
36
38
  }: DatePickerGroupProps<T>) {
37
39
  const [displayDate, setDisplayDate] = useState<Date | null>(null);
@@ -62,6 +64,9 @@ export default function DatePickerGroup<T>({
62
64
  className={clsx(FormDefaults.cssClassPrefix + 'date-picker', className)}
63
65
  value={displayDate}
64
66
  onChange={handleChange}
67
+ maxDate={maxDate}
68
+ minDate={minDate}
69
+ disabled={disabled}
65
70
  />
66
71
  </Group>
67
72
  );
@@ -100,6 +105,7 @@ export default function DatePickerGroup<T>({
100
105
  export function convertToTimeZoneInsensitiveISOString(date: Date): string {
101
106
  const year = new Intl.DateTimeFormat('en', { year: 'numeric' })
102
107
  .format(date)
108
+ .substring(0, 4)
103
109
  .padStart(4, '0');
104
110
  const month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(
105
111
  date