tp-react-elements 1.2.14 → 1.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.
@@ -1,3 +1,3 @@
1
- var DateInput = {};
1
+ var InputRangeField = {};
2
2
 
3
- export { DateInput as __exports };
3
+ export { InputRangeField as __exports };
@@ -1,3 +1,3 @@
1
- var InputRangeField = {};
1
+ var DateInput = {};
2
2
 
3
- export { InputRangeField as __exports };
3
+ export { DateInput as __exports };
@@ -1,3 +1,3 @@
1
- var DateRangePicker = {};
1
+ var DefinedRange = {};
2
2
 
3
- export { DateRangePicker as __exports };
3
+ export { DefinedRange as __exports };
@@ -1,3 +1,3 @@
1
- var Calendar = {};
1
+ var DateRangePicker = {};
2
2
 
3
- export { Calendar as __exports };
3
+ export { DateRangePicker as __exports };
@@ -1,3 +1,3 @@
1
- var DefinedRange = {};
1
+ var Calendar = {};
2
2
 
3
- export { DefinedRange as __exports };
3
+ export { Calendar as __exports };
@@ -221,6 +221,7 @@ const useFormValidatingContext = (formArray) => {
221
221
  return true; // Skip validation if no value is present
222
222
  });
223
223
  }
224
+ renderCustomError(field);
224
225
  break;
225
226
  case 'select':
226
227
  case 'single-select-search':
@@ -16,6 +16,7 @@ import FormTextFieldWithSelect from '../FormComponents/FormTextFieldWithSelect/F
16
16
  import DateRangePickerComponent from '../DateRangePicker/DateRangePicker.esm.js';
17
17
  import RichTextEditorWrapper from '../FormComponents/RichTextEditor/RichTextEditorWrapper.esm.js';
18
18
  import SingleSelectSearchApi from '../FormComponents/Select/SingleSelectSearchApi.esm.js';
19
+ import DatetimepickerWrapper from '../FormComponents/DatePicker/DatetimepickerWrapper.esm.js';
19
20
 
20
21
  // Lazy-loaded heavy components
21
22
  // const RichTextEditorWrapper = lazy(() =>
@@ -107,9 +108,10 @@ const RenderForm = (props) => {
107
108
  // Radio group (single option)
108
109
  case 'radio-group':
109
110
  return jsx(FormRadioGroup, { props: props, variant: variant });
110
- // Date picker
111
111
  case 'datepicker':
112
112
  return (jsx(Suspense, { fallback: jsx(LoadingFallback, {}), children: jsx(DatepickerWrapperV2, { props: props, variant: variant }) }));
113
+ case 'datetimepicker':
114
+ return (jsx(Suspense, { fallback: jsx(LoadingFallback, {}), children: jsx(DatetimepickerWrapper, { props: props, variant: variant }) }));
113
115
  // Time picker
114
116
  case 'timepicker':
115
117
  return (jsx(Suspense, { fallback: jsx(LoadingFallback, {}), children: jsx(TimePickerFieldWrapper, { props: props, variant: variant }) }));
@@ -0,0 +1,6 @@
1
+ import { FormRenderProps, VariantProps } from '../../../utils';
2
+ declare const DatetimepickerWrapper: ({ props, variant, }: {
3
+ props: FormRenderProps;
4
+ variant: VariantProps;
5
+ }) => import("react/jsx-runtime").JSX.Element;
6
+ export default DatetimepickerWrapper;
@@ -0,0 +1,107 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { useRef, useState, useEffect } from 'react';
3
+ import { getDateTimePicker } from '../../../utils/Constants/date-pickers.esm.js';
4
+ import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
5
+ import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
6
+ import dayjs from 'dayjs';
7
+ import { Controller } from 'react-hook-form';
8
+ import FormBottomField from '../FormBottomField/FormBottomField.esm.js';
9
+ import { renderLabel } from '../../../utils/Constants/FormConstants.esm.js';
10
+
11
+ const DatetimepickerWrapper = ({ props, variant, }) => {
12
+ const inputTextRef = useRef(null);
13
+ const [open, setOpen] = useState(false);
14
+ const [DateTimePicker, setDateTimePicker] = useState(null);
15
+ const [isLoading, setIsLoading] = useState(true);
16
+ const isAmpm = props.item.ampm !== false;
17
+ const timeFormat = isAmpm ? 'hh:mm A' : 'HH:mm';
18
+ const defaultDateFormat = `DD/MM/YYYY ${timeFormat}`;
19
+ const displayFormat = props.item.DateFormat || defaultDateFormat;
20
+ // useEffect(() => {
21
+ // const loadComponents = async () => {
22
+ // setIsLoading(true);
23
+ // const [dateTimePicker] = await Promise.all([getDateTimePicker()]);
24
+ // setDateTimePicker(() => dateTimePicker);
25
+ // setIsLoading(false);
26
+ // };
27
+ // loadComponents();
28
+ // }, []);
29
+ useEffect(() => {
30
+ const loadComponents = async () => {
31
+ try {
32
+ setIsLoading(true);
33
+ const component = await getDateTimePicker();
34
+ if (!component) {
35
+ console.error("DateTimePicker component resolved to undefined. Check your utility export.");
36
+ }
37
+ setDateTimePicker(() => component);
38
+ }
39
+ catch (err) {
40
+ console.error("Failed to load component:", err);
41
+ }
42
+ finally {
43
+ setIsLoading(false);
44
+ }
45
+ };
46
+ loadComponents();
47
+ }, []);
48
+ const handleToggle = () => {
49
+ if (!open)
50
+ inputTextRef.current?.blur();
51
+ document.activeElement?.blur();
52
+ setOpen(!open);
53
+ };
54
+ const isError = !!props.errors?.[props.item.name];
55
+ if (isLoading) {
56
+ return jsx("div", { style: { minHeight: '36px' }, children: "Loading..." });
57
+ }
58
+ return (jsx(Controller, { control: props.control, name: props.item.name, render: ({ field }) => {
59
+ // --- SYNC LOGIC FOR RESET / INITIAL VALUES ---
60
+ // This effect runs whenever the value in the form state changes
61
+ // eslint-disable-next-line react-hooks/rules-of-hooks
62
+ useEffect(() => {
63
+ if (field.value && props.setValue) {
64
+ const dateObj = dayjs(field.value, displayFormat);
65
+ if (dateObj.isValid()) {
66
+ props.setValue(`${props.item.name}Date`, dateObj.format('DD/MM/YYYY'));
67
+ props.setValue(`${props.item.name}Time`, dateObj.format(timeFormat));
68
+ }
69
+ }
70
+ }, [field.value, props.item.name, props.setValue, displayFormat, timeFormat]);
71
+ return (jsxs(Fragment, { children: [DateTimePicker && (jsxs(LocalizationProvider, { dateAdapter: AdapterDayjs, children: [renderLabel(variant, props), jsx(DateTimePicker, { views: ['year', 'month', 'day', 'hours', 'minutes'], ampm: isAmpm, format: displayFormat, label: variant !== 'standard' ? `${props.item.label}${props.item.required ? ' *' : ''}` : '', value: field.value
72
+ ? dayjs(field.value, displayFormat).isValid()
73
+ ? dayjs(field.value, displayFormat)
74
+ : dayjs(field.value)
75
+ : null, className: 'read-only', open: open, onOpen: handleToggle, onClose: handleToggle, minDateTime: props?.item?.minDate ? dayjs(props?.item?.minDate, displayFormat) : undefined, maxDateTime: props?.item?.maxDate ? dayjs(props?.item?.maxDate, displayFormat) : undefined, disabled: props.item.disable || false, onChange: (date) => {
76
+ const formattedDateTime = dayjs(date).format(displayFormat);
77
+ field.onChange(formattedDateTime);
78
+ props?.item?.onChangeFn && props?.item?.onChangeFn(formattedDateTime);
79
+ props?.clearErrors && props?.clearErrors(props.item.name);
80
+ }, slotProps: {
81
+ textField: {
82
+ onClick: () => handleToggle(),
83
+ inputRef: inputTextRef,
84
+ onBlur: (e) => props?.item?.onBlurFn && props?.item?.onBlurFn(e),
85
+ inputProps: {
86
+ style: { cursor: 'pointer' },
87
+ 'aria-labelledby': `${props.item.name}-label`,
88
+ },
89
+ readOnly: true,
90
+ error: isError,
91
+ sx: {
92
+ '& .MuiFormLabel-root': { top: -10 },
93
+ '& .MuiInputLabel-shrink': { top: 0 },
94
+ },
95
+ },
96
+ desktopPaper: {
97
+ sx: {
98
+ '& .MuiPickersLayout-root': {
99
+ flexDirection: 'column',
100
+ }
101
+ }
102
+ },
103
+ } })] })), jsx(FormBottomField, { ...props })] }));
104
+ } }, props.item.name));
105
+ };
106
+
107
+ export { DatetimepickerWrapper as default };
@@ -92,7 +92,9 @@ const FormNumberField = ({ props, variant }) => {
92
92
  * Additional input properties for the TextField
93
93
  * Controls input pattern, length restrictions, and additional input handling
94
94
  */
95
- inputProps: {
95
+ onInput: (e) => {
96
+ props.item.onInputProps && props.item.onInputProps(e);
97
+ }, inputProps: {
96
98
  pattern: '[0-9]*',
97
99
  maxLength: props.item.maxLength || 20,
98
100
  maxValue: props.item.maxValue || 9999999999,
@@ -1,4 +1,4 @@
1
- import { __exports as Calendar } from '../../../../../_virtual/index.esm6.js';
1
+ import { __exports as Calendar } from '../../../../../_virtual/index.esm7.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireDayCell } from '../DayCell/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DateInput } from '../../../../../_virtual/index.esm12.js';
1
+ import { __exports as DateInput } from '../../../../../_virtual/index.esm14.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireClassnames } from '../../../../classnames/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DateRangePicker } from '../../../../../_virtual/index.esm5.js';
1
+ import { __exports as DateRangePicker } from '../../../../../_virtual/index.esm6.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireDateRange } from '../DateRange/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DefinedRange } from '../../../../../_virtual/index.esm7.js';
1
+ import { __exports as DefinedRange } from '../../../../../_virtual/index.esm5.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireStyles } from '../../styles.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as InputRangeField } from '../../../../../_virtual/index.esm14.js';
1
+ import { __exports as InputRangeField } from '../../../../../_virtual/index.esm12.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
 
@@ -8,6 +8,7 @@
8
8
  * @returns DatePicker component
9
9
  */
10
10
  export declare const getDatePicker: () => Promise<any>;
11
+ export declare const getDateTimePicker: () => Promise<any>;
11
12
  /**
12
13
  * Get LocalizationProvider component
13
14
  * @returns LocalizationProvider component
@@ -24,6 +25,7 @@ export declare const getAdapterDayjs: () => Promise<any>;
24
25
  */
25
26
  export declare const getTimePicker: () => Promise<any>;
26
27
  export declare const DatePicker: () => null;
28
+ export declare const DateTimePicker: () => null;
27
29
  export declare const LocalizationProvider: () => null;
28
30
  export declare const AdapterDayjs: () => any;
29
31
  export declare const TimePicker: () => null;
@@ -16,6 +16,14 @@ const getDatePicker = async () => {
16
16
  }
17
17
  return DatePickerCache;
18
18
  };
19
+ let DateTimePickerCache = null;
20
+ const getDateTimePicker = async () => {
21
+ if (!DateTimePickerCache) {
22
+ const module = await import('@mui/x-date-pickers/DateTimePicker');
23
+ DateTimePickerCache = module.DateTimePicker || module.default;
24
+ }
25
+ return DateTimePickerCache;
26
+ };
19
27
  // Dynamic import for TimePicker component
20
28
  let TimePickerCache = null;
21
29
  /**
@@ -30,4 +38,4 @@ const getTimePicker = async () => {
30
38
  return TimePickerCache;
31
39
  };
32
40
 
33
- export { getDatePicker, getTimePicker };
41
+ export { getDatePicker, getDateTimePicker, getTimePicker };
@@ -11,7 +11,7 @@ export interface TextFieldInputProps {
11
11
  export interface FormSectionPropsItem {
12
12
  name: string;
13
13
  label: string;
14
- inputType: 'text' | 'password' | 'number' | 'select' | 'autocomplete-select' | 'autocomplete-multi-select' | 'single-select-search' | 'datepicker' | 'multiselect' | 'select-v2' | 'basic-select' | 'decimal' | 'alpha-numerical' | 'yearpicker' | 'dateRangePicker' | 'monthpicker' | 'multiselect' | 'file' | 'multifile' | 'multifile-with-preview' | 'textarea' | 'phoneNumber' | 'pincode' | 'email' | 'toggleSwitch' | 'rich-text-editor' | 'multiEmail' | 'timepicker' | 'checkbox-group' | 'radio-group' | 'checkbox' | 'custom' | 'input-select' | 'date-range-picker' | 'multiselect-table' | '';
14
+ inputType: 'text' | 'password' | 'number' | 'select' | 'autocomplete-select' | 'autocomplete-multi-select' | 'single-select-search' | 'datepicker' | 'datetimepicker' | 'multiselect' | 'select-v2' | 'basic-select' | 'decimal' | 'alpha-numerical' | 'yearpicker' | 'dateRangePicker' | 'monthpicker' | 'multiselect' | 'file' | 'multifile' | 'multifile-with-preview' | 'textarea' | 'phoneNumber' | 'pincode' | 'email' | 'toggleSwitch' | 'rich-text-editor' | 'multiEmail' | 'timepicker' | 'checkbox-group' | 'radio-group' | 'checkbox' | 'custom' | 'input-select' | 'date-range-picker' | 'multiselect-table' | '';
15
15
  options?: OptionsProps[];
16
16
  required?: boolean;
17
17
  errorMessage?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tp-react-elements",
3
- "version": "1.2.14",
3
+ "version": "1.3.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "React form components library built with React Hook Form and Yup",