@arquimedes.co/eureka-forms 3.0.31-test → 3.0.31
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/dist/@Types/FormStep.d.ts +4 -1
- package/dist/@Types/GenericFormSteps.d.ts +6 -0
- package/dist/FormSteps/DatePickerRangeStep/DatePickerRangeStep.d.ts +10 -0
- package/dist/FormSteps/DatePickerRangeStep/DatePickerRangeStep.js +14 -0
- package/dist/FormSteps/DatePickerRangeStep/MaterialDatePickerRangeStep/MaterialDatePickerRangeStep.d.ts +3 -0
- package/dist/FormSteps/DatePickerRangeStep/MaterialDatePickerRangeStep/MaterialDatePickerRangeStep.js +27 -0
- package/dist/FormSteps/Step.js +4 -0
- package/dist/FormSteps/StepFunctions.js +1 -0
- package/dist/FormSteps/StepFunctions.test.js +7 -0
- package/dist/FormSteps/Utils/MaterialInputContainer/MaterialInputContainer.d.ts +2 -2
- package/dist/Shared/ErkDatePickerRange/ErkDatePickerRange.d.ts +18 -0
- package/dist/Shared/ErkDatePickerRange/ErkDatePickerRange.js +160 -0
- package/dist/Shared/ErkDatePickerRange/ErkDatePickerRange.stories.d.ts +36 -0
- package/dist/Shared/ErkDatePickerRange/ErkDatePickerRange.stories.js +274 -0
- package/dist/constants/FormStepTypes.d.ts +1 -0
- package/dist/constants/FormStepTypes.js +1 -0
- package/package.json +2 -2
|
@@ -4,7 +4,7 @@ import { Condition } from './Condition';
|
|
|
4
4
|
import { EurekaDraft } from './Draft/Draft';
|
|
5
5
|
import * as GSteps from './GenericFormSteps';
|
|
6
6
|
import { Time } from './Time';
|
|
7
|
-
export type FormStep = Title | TimePicker | Rating | CheckBox | TextArea | TextInput | DatePicker | FileUpload | Separator | FormSelector | ClassifierSelector | Collapsible | EntityValuePicker | ApiSelector | Mapper;
|
|
7
|
+
export type FormStep = Title | TimePicker | Rating | CheckBox | TextArea | TextInput | DatePicker | FileUpload | Separator | FormSelector | ClassifierSelector | Collapsible | EntityValuePicker | ApiSelector | Mapper | DatePickerRange;
|
|
8
8
|
export interface Title extends GSteps.GBaseStep {
|
|
9
9
|
type: FormStepTypes.TITLE;
|
|
10
10
|
title?: EurekaDraft;
|
|
@@ -48,6 +48,9 @@ export interface TextInput extends GSteps.GTextInput {
|
|
|
48
48
|
export interface DatePicker extends GSteps.GDatePicker {
|
|
49
49
|
type: FormStepTypes.DATEPICKER;
|
|
50
50
|
}
|
|
51
|
+
export interface DatePickerRange extends GSteps.GDatePickerRange {
|
|
52
|
+
type: FormStepTypes.DATEPICKER_RANGE;
|
|
53
|
+
}
|
|
51
54
|
export interface Collapsible extends GSteps.GBaseStep {
|
|
52
55
|
type: FormStepTypes.COLLAPSIBLE;
|
|
53
56
|
label: string;
|
|
@@ -51,6 +51,12 @@ export interface GDatePicker extends GBaseStep {
|
|
|
51
51
|
required: boolean;
|
|
52
52
|
size: 1 | 2 | 3 | 4;
|
|
53
53
|
}
|
|
54
|
+
export interface GDatePickerRange extends GBaseStep {
|
|
55
|
+
label: string;
|
|
56
|
+
description: string | null;
|
|
57
|
+
required: boolean;
|
|
58
|
+
size: 1 | 2 | 3 | 4;
|
|
59
|
+
}
|
|
54
60
|
export interface GTimePicker extends GBaseStep {
|
|
55
61
|
label: string;
|
|
56
62
|
description: string | null;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DatePickerRange } from '../../@Types/FormStep';
|
|
2
|
+
import { StepProps } from '../Step';
|
|
3
|
+
export interface DatePickerRangeStepProps extends StepProps {
|
|
4
|
+
/** The DatePickerRangeStep to display */
|
|
5
|
+
step: DatePickerRange;
|
|
6
|
+
/** Default value to display */
|
|
7
|
+
defaultValue?: string[] | null;
|
|
8
|
+
}
|
|
9
|
+
declare function DatePickerRangeStep(props: DatePickerRangeStepProps): JSX.Element;
|
|
10
|
+
export default DatePickerRangeStep;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { FormStyleTypes } from '../../constants/FormStepTypes';
|
|
3
|
+
import MaterialDatePickerRangeStep from './MaterialDatePickerRangeStep/MaterialDatePickerRangeStep';
|
|
4
|
+
import { useAppSelector } from '../../hooks';
|
|
5
|
+
function DatePickerRangeStep(props) {
|
|
6
|
+
const { formStyle } = useAppSelector((state) => state.global);
|
|
7
|
+
switch (formStyle.type) {
|
|
8
|
+
case FormStyleTypes.MATERIAL:
|
|
9
|
+
default: {
|
|
10
|
+
return _jsx(MaterialDatePickerRangeStep, { ...props });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export default DatePickerRangeStep;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import ErkDatePickerRange from '../../../Shared/ErkDatePickerRange/ErkDatePickerRange';
|
|
4
|
+
import { useAppSelector } from '../../../hooks';
|
|
5
|
+
import { useFormStep } from '../../StepHooks';
|
|
6
|
+
import MaterialInputContainer from '../../Utils/MaterialInputContainer/MaterialInputContainer';
|
|
7
|
+
function MaterialDatePickerRangeStep({ step, editable, defaultValue }) {
|
|
8
|
+
const postview = useAppSelector((state) => state.global.postview);
|
|
9
|
+
const { ref, value, onChange, error, field } = useFormStep(step, {
|
|
10
|
+
defaultValue,
|
|
11
|
+
rules: {
|
|
12
|
+
required: step.required ? 'Este campo es obligatorio' : undefined,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
const handleChange = useCallback((dateRange) => {
|
|
16
|
+
const [start, end] = dateRange;
|
|
17
|
+
if (start && end) {
|
|
18
|
+
onChange([start.toISOString(), end.toISOString()]);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
onChange(null);
|
|
22
|
+
}
|
|
23
|
+
}, [onChange]);
|
|
24
|
+
const dateRangeValue = value && value.length === 2 ? [new Date(value[0]), new Date(value[1])] : [null, null];
|
|
25
|
+
return (_jsx(MaterialInputContainer, { step: step, editable: editable, children: _jsx(ErkDatePickerRange, { ...field, value: dateRangeValue, inputRef: ref, error: !!error, labelMargin: 0, onChange: handleChange, required: step.required, readOnly: !editable || postview, helperText: error?.message ?? step.description }) }));
|
|
26
|
+
}
|
|
27
|
+
export default MaterialDatePickerRangeStep;
|
package/dist/FormSteps/Step.js
CHANGED
|
@@ -7,6 +7,7 @@ import TitleStep from './TitleStep/TitleStep';
|
|
|
7
7
|
import ClassifierSelectorStep from './ClassifierSelectorStep/ClassifierSelectorStep';
|
|
8
8
|
import TextAreaStep from './TextAreaStep/TextAreaStep';
|
|
9
9
|
import DatePickerStep from './DatePickerStep/DatePickerStep';
|
|
10
|
+
import DatePickerRangeStep from './DatePickerRangeStep/DatePickerRangeStep';
|
|
10
11
|
import FileUploadStep from './FileUploadStep/FileUploadStep';
|
|
11
12
|
import CheckBoxStep from './CheckBoxStep/MaterialCheckBoxStep/MaterialCheckBoxStep';
|
|
12
13
|
import CBRStepMapper from './CBRStepMapper';
|
|
@@ -73,6 +74,9 @@ function StepComponent({ step, ...props }) {
|
|
|
73
74
|
case FormStepTypes.DATEPICKER: {
|
|
74
75
|
return _jsx(DatePickerStep, { ...props, step: step, editable: editable });
|
|
75
76
|
}
|
|
77
|
+
case FormStepTypes.DATEPICKER_RANGE: {
|
|
78
|
+
return _jsx(DatePickerRangeStep, { ...props, step: step, editable: editable });
|
|
79
|
+
}
|
|
76
80
|
case FormStepTypes.SEPARATOR: {
|
|
77
81
|
return _jsx(SeparatorStep, { ...props, step: step, editable: editable });
|
|
78
82
|
}
|
|
@@ -119,6 +119,7 @@ export const calcDefaultValue = (step) => {
|
|
|
119
119
|
return '';
|
|
120
120
|
case FormStepTypes.RATING:
|
|
121
121
|
case FormStepTypes.DATEPICKER:
|
|
122
|
+
case FormStepTypes.DATEPICKER_RANGE:
|
|
122
123
|
case FormStepTypes.API_SELECTOR:
|
|
123
124
|
case FormStepTypes.ENTITYVALUEPICKER:
|
|
124
125
|
return null;
|
|
@@ -489,6 +489,13 @@ describe('StepFunctions', function () {
|
|
|
489
489
|
expect(defaultValue3).toBe(null);
|
|
490
490
|
expect(defaultValue4).toBe(null);
|
|
491
491
|
});
|
|
492
|
+
test('DatePickerRange step type', async () => {
|
|
493
|
+
const step = {
|
|
494
|
+
type: FormStepTypes.DATEPICKER_RANGE,
|
|
495
|
+
};
|
|
496
|
+
const defaultValue = calcDefaultValue(step);
|
|
497
|
+
expect(defaultValue).toBe(null);
|
|
498
|
+
});
|
|
492
499
|
test('Mapper, FileUpload, CBRFormStep types', async () => {
|
|
493
500
|
const step1 = {
|
|
494
501
|
type: FormStepTypes.MAPPER,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { GSmartSelect } from '../../../@Types/GenericFormSteps';
|
|
2
|
-
import { CheckBox, DatePicker, ClassifierSelector, FormSelector, TimePicker } from '../../../@Types/FormStep';
|
|
2
|
+
import { CheckBox, DatePicker, ClassifierSelector, FormSelector, TimePicker, DatePickerRange } from '../../../@Types/FormStep';
|
|
3
3
|
interface MaterialInputProps {
|
|
4
|
-
step: GSmartSelect | CheckBox | ClassifierSelector | DatePicker | TimePicker | FormSelector;
|
|
4
|
+
step: GSmartSelect | CheckBox | ClassifierSelector | DatePicker | TimePicker | FormSelector | DatePickerRange;
|
|
5
5
|
editable: boolean;
|
|
6
6
|
onClick?: () => void;
|
|
7
7
|
children: React.ReactNode;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { MobileDateRangePickerProps as MuiDateRangePickerProps } from '@mui/x-date-pickers-pro/MobileDateRangePicker';
|
|
3
|
+
import { DateRange } from '@mui/x-date-pickers-pro';
|
|
4
|
+
import { ErkTextFieldProps } from '../ErkTextField/ErkTextField';
|
|
5
|
+
interface ErkDatePickerRangeProps extends Omit<MuiDateRangePickerProps<boolean>, 'ref' | 'onChange' | 'value' | 'slotProps'>, Pick<ErkTextFieldProps, 'error' | 'required' | 'helperText' | 'size'> {
|
|
6
|
+
onChange?: (dateRange: DateRange<Date>) => void;
|
|
7
|
+
value?: DateRange<Date>;
|
|
8
|
+
inputRef?: React.Ref<HTMLInputElement>;
|
|
9
|
+
/** labelMargin */
|
|
10
|
+
labelMargin?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generic datepicker with apps designs. Is class due to the use in the react-hook-forms library
|
|
14
|
+
*/
|
|
15
|
+
declare class ErkDatePickerRange extends React.Component<ErkDatePickerRangeProps> {
|
|
16
|
+
render(): JSX.Element;
|
|
17
|
+
}
|
|
18
|
+
export default ErkDatePickerRange;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { styled, Dialog as MuiDialog } from '@mui/material';
|
|
4
|
+
import { DatePickerToolbar as MuiDatePickerToolbar, } from '@mui/x-date-pickers';
|
|
5
|
+
import { MobileDateRangePicker as MuiDateRangePicker, } from '@mui/x-date-pickers-pro/MobileDateRangePicker';
|
|
6
|
+
import { DateRangePickerDay as MuiDateRangePickerDay } from '@mui/x-date-pickers-pro';
|
|
7
|
+
import { SingleInputDateRangeField } from '@mui/x-date-pickers-pro/SingleInputDateRangeField';
|
|
8
|
+
import { format } from 'date-fns';
|
|
9
|
+
import CalendarIcon from '../../Icons/CalendarIcon';
|
|
10
|
+
const StyledDateRangePicker = styled(MuiDateRangePicker, {
|
|
11
|
+
shouldForwardProp: (propName) => propName !== 'size',
|
|
12
|
+
})(({ disabled, size }) => ({
|
|
13
|
+
'& .Erk-MuiInputBase-root': {
|
|
14
|
+
cursor: disabled ? 'default' : 'pointer',
|
|
15
|
+
'& input': {
|
|
16
|
+
cursor: disabled ? 'default' : 'pointer',
|
|
17
|
+
paddingRight: '0px',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
'& .Erk-MuiInputBase-adornedEnd': {
|
|
21
|
+
paddingRight: '7px',
|
|
22
|
+
},
|
|
23
|
+
'& .Erk-MuiInputAdornment-root': {
|
|
24
|
+
minWidth: size === 'small' ? 24 : 26,
|
|
25
|
+
'& .Erk-MuiButtonBase-root': {
|
|
26
|
+
margin: '-2px',
|
|
27
|
+
padding: 3,
|
|
28
|
+
width: size === 'small' ? 28 : 26,
|
|
29
|
+
height: size === 'small' ? 28 : 26,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
}));
|
|
33
|
+
const StyledDateToolBar = styled(MuiDatePickerToolbar)(({ theme }) => ({
|
|
34
|
+
'&.Erk-MuiPickersToolbar-root': {
|
|
35
|
+
backgroundColor: theme.palette.primary.main,
|
|
36
|
+
color: theme.palette.primary.contrastText,
|
|
37
|
+
maxWidth: 'none',
|
|
38
|
+
'& span': {
|
|
39
|
+
fontSize: '1rem',
|
|
40
|
+
textTransform: 'capitalize',
|
|
41
|
+
color: theme.palette.primary.contrastText,
|
|
42
|
+
},
|
|
43
|
+
'& .Erk-MuiDatePickerToolbar-title': {
|
|
44
|
+
margin: 'auto auto auto 0px',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
cursor: 'default',
|
|
48
|
+
'& .Erk-MuiTypography-root': {
|
|
49
|
+
textTransform: 'capitalize',
|
|
50
|
+
color: theme.palette.primary.contrastText,
|
|
51
|
+
},
|
|
52
|
+
}));
|
|
53
|
+
const StyledDialog = styled(MuiDialog)(({ theme }) => ({
|
|
54
|
+
'& .Erk-MuiDialog-paper': {
|
|
55
|
+
borderRadius: '5px',
|
|
56
|
+
backgroundColor: 'transparent',
|
|
57
|
+
},
|
|
58
|
+
'& .Erk-MuiPickersLayout-root': {
|
|
59
|
+
display: 'flex',
|
|
60
|
+
flexDirection: 'column',
|
|
61
|
+
},
|
|
62
|
+
'& .Erk-MuiDialogActions-root': {
|
|
63
|
+
'& .Erk-MuiButtonBase-root': { fontWeight: 700 },
|
|
64
|
+
},
|
|
65
|
+
'& .Erk-MuiDialogContent-root': {
|
|
66
|
+
scrollbarColor: theme.palette.primary.main + ' white',
|
|
67
|
+
},
|
|
68
|
+
}));
|
|
69
|
+
const StyledDay = styled(MuiDateRangePickerDay)(({ theme }) => ({
|
|
70
|
+
fontWeight: 500,
|
|
71
|
+
fontSize: '0.9rem',
|
|
72
|
+
lineHeight: 'normal',
|
|
73
|
+
'&.Erk-MuiPickersDay-today:not(.Erk-MuiDateRangePickerDay-rangeIntervalDayHighlight)': {
|
|
74
|
+
backgroundColor: theme.palette.primary.main + '33',
|
|
75
|
+
},
|
|
76
|
+
'&.Erk-MuiPickersDay-dayOutsideMonth': {
|
|
77
|
+
color: 'rgb(0,0,0,0.4)',
|
|
78
|
+
'&.Mui-selected': {
|
|
79
|
+
color: theme.palette.primary.contrastText,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
'&.Erk-MuiDateRangePickerDay-rangeIntervalDayHighlight': {
|
|
83
|
+
backgroundColor: theme.palette.primary.main + '1a',
|
|
84
|
+
},
|
|
85
|
+
}));
|
|
86
|
+
const formatDate = (date, showYear) => {
|
|
87
|
+
if (!date)
|
|
88
|
+
return '';
|
|
89
|
+
return format(date, showYear ? 'PP' : 'dd MMM');
|
|
90
|
+
};
|
|
91
|
+
function CustomDatePickerRange({ error, disabled, readOnly, helperText, size = 'small', labelMargin = 5, value, onChange, ...others }) {
|
|
92
|
+
const [startDate, endDate] = value ?? [null, null];
|
|
93
|
+
const hasCompleteRange = Boolean(startDate) && Boolean(endDate);
|
|
94
|
+
const showYear = startDate && endDate && startDate.getFullYear() !== endDate.getFullYear();
|
|
95
|
+
const formattedStartDate = formatDate(startDate, Boolean(showYear));
|
|
96
|
+
const formattedEndDate = formatDate(endDate, Boolean(showYear));
|
|
97
|
+
const toolbarText = hasCompleteRange ? `${formattedStartDate} – ${formattedEndDate}` : '– –';
|
|
98
|
+
return (_jsx(StyledDateRangePicker, { ...others, value: value, onChange: onChange, size: size, disabled: disabled ?? readOnly, reduceAnimations: true, showDaysOutsideCurrentMonth: true, enableAccessibleFieldDOMStructure: false, slots: {
|
|
99
|
+
field: SingleInputDateRangeField,
|
|
100
|
+
day: StyledDay,
|
|
101
|
+
dialog: StyledDialog,
|
|
102
|
+
toolbar: StyledDateToolBar,
|
|
103
|
+
openPickerIcon: CalendarIcon,
|
|
104
|
+
}, slotProps: {
|
|
105
|
+
actionBar: {
|
|
106
|
+
actions: ['clear', 'accept'],
|
|
107
|
+
},
|
|
108
|
+
layout: {
|
|
109
|
+
sx: {
|
|
110
|
+
backgroundColor: '#ffffff',
|
|
111
|
+
textTransform: 'capitalize',
|
|
112
|
+
'& .Erk-MuiDayCalendar-weekDayLabel': {
|
|
113
|
+
cursor: 'default',
|
|
114
|
+
},
|
|
115
|
+
'& .Erk-MuiPickersCalendarHeader-root': {
|
|
116
|
+
marginTop: '5px',
|
|
117
|
+
},
|
|
118
|
+
'& .Erk-MuiDateCalendar-root': {
|
|
119
|
+
height: 'fit-content',
|
|
120
|
+
},
|
|
121
|
+
'& .Erk-MuiPickersToolbar-content > *:first-child': {
|
|
122
|
+
fontSize: showYear ? '1.3rem' : '1.8rem',
|
|
123
|
+
},
|
|
124
|
+
/* TODO: Remove the text "you need a license" this is only temporary */
|
|
125
|
+
'& .Erk-MuiDateRangeCalendar-root > *:first-child': {
|
|
126
|
+
display: 'none',
|
|
127
|
+
},
|
|
128
|
+
'& .Erk-MuiPickersMonth-monthButton': {
|
|
129
|
+
textTransform: 'capitalize',
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
toolbar: {
|
|
134
|
+
toolbarFormat: 'eee, d MMM',
|
|
135
|
+
hidden: false,
|
|
136
|
+
toolbarPlaceholder: toolbarText,
|
|
137
|
+
},
|
|
138
|
+
textField: {
|
|
139
|
+
size,
|
|
140
|
+
error,
|
|
141
|
+
disabled,
|
|
142
|
+
helperText,
|
|
143
|
+
labelMargin,
|
|
144
|
+
fullWidth: true,
|
|
145
|
+
placeholder: '',
|
|
146
|
+
InputProps: {
|
|
147
|
+
disabled: disabled ?? readOnly,
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
} }));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Generic datepicker with apps designs. Is class due to the use in the react-hook-forms library
|
|
154
|
+
*/
|
|
155
|
+
class ErkDatePickerRange extends React.Component {
|
|
156
|
+
render() {
|
|
157
|
+
return _jsx(CustomDatePickerRange, { ...this.props });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
export default ErkDatePickerRange;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import ErkDatePickerRange from './ErkDatePickerRange';
|
|
3
|
+
declare const meta: {
|
|
4
|
+
component: typeof ErkDatePickerRange;
|
|
5
|
+
tags: string[];
|
|
6
|
+
args: {
|
|
7
|
+
readOnly: false;
|
|
8
|
+
};
|
|
9
|
+
parameters: {
|
|
10
|
+
dateRange: Date[];
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export default meta;
|
|
14
|
+
type Story = StoryObj<typeof meta>;
|
|
15
|
+
export declare const Empty: Story;
|
|
16
|
+
export declare const Default: Story;
|
|
17
|
+
export declare const Interactive: Story;
|
|
18
|
+
export declare const ValueAndLabel: Story;
|
|
19
|
+
export declare const Full: Story;
|
|
20
|
+
export declare const Error: Story;
|
|
21
|
+
export declare const Menu: Story;
|
|
22
|
+
export declare const WithSelectedRange: Story;
|
|
23
|
+
export declare const Disabled: Story;
|
|
24
|
+
export declare const ReadOnly: Story;
|
|
25
|
+
export declare const WithError: Story;
|
|
26
|
+
export declare const Required: Story;
|
|
27
|
+
export declare const SmallSize: Story;
|
|
28
|
+
export declare const MediumSize: Story;
|
|
29
|
+
export declare const CurrentMonth: Story;
|
|
30
|
+
export declare const LastWeek: Story;
|
|
31
|
+
export declare const NextMonth: Story;
|
|
32
|
+
export declare const WithMinMaxDates: Story;
|
|
33
|
+
export declare const YearRange: Story;
|
|
34
|
+
export declare const QuarterRange: Story;
|
|
35
|
+
export declare const EventDuration: Story;
|
|
36
|
+
export declare const MultipleStates: Story;
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import ErkDatePickerRange from './ErkDatePickerRange';
|
|
3
|
+
import { useArgs } from 'storybook/internal/preview-api';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
const meta = {
|
|
6
|
+
component: ErkDatePickerRange,
|
|
7
|
+
tags: ['autodocs'],
|
|
8
|
+
args: {
|
|
9
|
+
readOnly: false,
|
|
10
|
+
},
|
|
11
|
+
parameters: {
|
|
12
|
+
dateRange: [new Date('2021-07-01'), new Date('2021-07-21')],
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
export default meta;
|
|
16
|
+
export const Empty = {
|
|
17
|
+
args: {
|
|
18
|
+
label: 'Seleccionar Rango',
|
|
19
|
+
value: [null, null],
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
export const Default = {
|
|
23
|
+
args: {
|
|
24
|
+
label: 'Rango de Fechas',
|
|
25
|
+
value: [new Date('2021-07-01'), new Date('2021-07-21')],
|
|
26
|
+
},
|
|
27
|
+
render: function Component(args) {
|
|
28
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
29
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
export const Interactive = {
|
|
33
|
+
args: {
|
|
34
|
+
label: 'Rango Interactivo',
|
|
35
|
+
value: [null, null],
|
|
36
|
+
helperText: 'Seleccione un rango de fechas',
|
|
37
|
+
},
|
|
38
|
+
render: function Component(args) {
|
|
39
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
40
|
+
const handleChange = (newValue) => {
|
|
41
|
+
setValue(newValue);
|
|
42
|
+
args.onChange?.(newValue);
|
|
43
|
+
};
|
|
44
|
+
return (_jsxs("div", { children: [_jsx(ErkDatePickerRange, { ...args, value: value, onChange: handleChange }), _jsxs("div", { style: { marginTop: '20px', fontSize: '14px' }, children: [_jsx("strong", { children: "Valor seleccionado:" }), _jsxs("div", { children: ["Inicio: ", value[0]?.toLocaleDateString('es-ES') ?? 'No seleccionado'] }), _jsxs("div", { children: ["Fin: ", value[1]?.toLocaleDateString('es-ES') ?? 'No seleccionado'] })] })] }));
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
export const ValueAndLabel = {
|
|
48
|
+
args: {
|
|
49
|
+
label: 'Rango de Fechas',
|
|
50
|
+
value: [null, null],
|
|
51
|
+
},
|
|
52
|
+
render: function Component(args) {
|
|
53
|
+
const [, setArgs] = useArgs();
|
|
54
|
+
const onValueChange = (value) => {
|
|
55
|
+
args.onChange?.(value);
|
|
56
|
+
setArgs({ value });
|
|
57
|
+
};
|
|
58
|
+
return _jsx(ErkDatePickerRange, { ...args, onChange: onValueChange });
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
export const Full = {
|
|
62
|
+
args: {
|
|
63
|
+
label: 'Rango de Fechas',
|
|
64
|
+
value: [null, null],
|
|
65
|
+
helperText: 'Seleccione un rango de fechas',
|
|
66
|
+
},
|
|
67
|
+
render: function Component(args) {
|
|
68
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
69
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
export const Error = {
|
|
73
|
+
args: {
|
|
74
|
+
label: 'Rango de Fechas',
|
|
75
|
+
value: [null, null],
|
|
76
|
+
helperText: 'Error: Rango de fechas inválido',
|
|
77
|
+
error: true,
|
|
78
|
+
},
|
|
79
|
+
render: function Component(args) {
|
|
80
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
81
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
export const Menu = {
|
|
85
|
+
args: {
|
|
86
|
+
label: 'Rango de Fechas',
|
|
87
|
+
value: [null, null],
|
|
88
|
+
},
|
|
89
|
+
render: function Component(args) {
|
|
90
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
91
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
92
|
+
},
|
|
93
|
+
play: async ({ canvas, userEvent }) => {
|
|
94
|
+
const selector = canvas.getByTestId('date-picker');
|
|
95
|
+
await userEvent.click(selector);
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
export const WithSelectedRange = {
|
|
99
|
+
args: {
|
|
100
|
+
label: 'Vacaciones',
|
|
101
|
+
value: [new Date('2024-12-20'), new Date('2025-01-05')],
|
|
102
|
+
helperText: 'Período de vacaciones',
|
|
103
|
+
},
|
|
104
|
+
render: function Component(args) {
|
|
105
|
+
const [, setArgs] = useArgs();
|
|
106
|
+
const onValueChange = (value) => {
|
|
107
|
+
args.onChange?.(value);
|
|
108
|
+
setArgs({ value });
|
|
109
|
+
};
|
|
110
|
+
return _jsx(ErkDatePickerRange, { ...args, onChange: onValueChange });
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
export const Disabled = {
|
|
114
|
+
args: {
|
|
115
|
+
label: 'Rango de Fechas',
|
|
116
|
+
value: [new Date('2021-07-01'), new Date('2021-07-21')],
|
|
117
|
+
disabled: true,
|
|
118
|
+
helperText: 'Campo deshabilitado',
|
|
119
|
+
},
|
|
120
|
+
render: function Component(args) {
|
|
121
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
122
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
export const ReadOnly = {
|
|
126
|
+
args: {
|
|
127
|
+
label: 'Rango de Fechas',
|
|
128
|
+
value: [new Date('2021-07-01'), new Date('2021-07-21')],
|
|
129
|
+
readOnly: true,
|
|
130
|
+
helperText: 'Campo de solo lectura',
|
|
131
|
+
},
|
|
132
|
+
render: function Component(args) {
|
|
133
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
134
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
export const WithError = {
|
|
138
|
+
args: {
|
|
139
|
+
label: 'Rango de Fechas',
|
|
140
|
+
value: [new Date('2021-07-21'), new Date('2021-07-01')],
|
|
141
|
+
helperText: 'La fecha de inicio debe ser anterior a la fecha de fin',
|
|
142
|
+
error: true,
|
|
143
|
+
},
|
|
144
|
+
render: function Component(args) {
|
|
145
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
146
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
export const Required = {
|
|
150
|
+
args: {
|
|
151
|
+
label: 'Rango de Fechas',
|
|
152
|
+
value: [null, null],
|
|
153
|
+
helperText: 'Este campo es obligatorio',
|
|
154
|
+
required: true,
|
|
155
|
+
},
|
|
156
|
+
render: function Component(args) {
|
|
157
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
158
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
export const SmallSize = {
|
|
162
|
+
args: {
|
|
163
|
+
label: 'Rango Pequeño',
|
|
164
|
+
value: [new Date('2021-07-01'), new Date('2021-07-21')],
|
|
165
|
+
size: 'small',
|
|
166
|
+
helperText: 'Tamaño pequeño',
|
|
167
|
+
},
|
|
168
|
+
render: function Component(args) {
|
|
169
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
170
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
export const MediumSize = {
|
|
174
|
+
args: {
|
|
175
|
+
label: 'Rango Mediano',
|
|
176
|
+
value: [new Date('2021-07-01'), new Date('2021-07-21')],
|
|
177
|
+
size: 'medium',
|
|
178
|
+
helperText: 'Tamaño mediano',
|
|
179
|
+
},
|
|
180
|
+
render: function Component(args) {
|
|
181
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
182
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
export const CurrentMonth = {
|
|
186
|
+
args: {
|
|
187
|
+
label: 'Mes Actual',
|
|
188
|
+
value: [new Date(2025, 10, 1), new Date(2025, 10, 30)],
|
|
189
|
+
helperText: 'Noviembre 2025',
|
|
190
|
+
},
|
|
191
|
+
render: function Component(args) {
|
|
192
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
193
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
export const LastWeek = {
|
|
197
|
+
args: {
|
|
198
|
+
label: 'Última Semana',
|
|
199
|
+
value: [new Date(new Date().setDate(new Date().getDate() - 7)), new Date()],
|
|
200
|
+
helperText: 'Últimos 7 días',
|
|
201
|
+
},
|
|
202
|
+
render: function Component(args) {
|
|
203
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
204
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
export const NextMonth = {
|
|
208
|
+
args: {
|
|
209
|
+
label: 'Próximo Mes',
|
|
210
|
+
value: [
|
|
211
|
+
new Date(new Date().getFullYear(), new Date().getMonth() + 1, 1),
|
|
212
|
+
new Date(new Date().getFullYear(), new Date().getMonth() + 2, 0),
|
|
213
|
+
],
|
|
214
|
+
helperText: 'Planificación del próximo mes',
|
|
215
|
+
},
|
|
216
|
+
render: function Component(args) {
|
|
217
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
218
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
export const WithMinMaxDates = {
|
|
222
|
+
args: {
|
|
223
|
+
label: 'Reserva de Hotel',
|
|
224
|
+
value: [null, null],
|
|
225
|
+
helperText: 'Seleccione fechas entre hoy y 3 meses',
|
|
226
|
+
minDate: new Date(),
|
|
227
|
+
maxDate: new Date(new Date().setMonth(new Date().getMonth() + 3)),
|
|
228
|
+
},
|
|
229
|
+
render: function Component(args) {
|
|
230
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
231
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
export const YearRange = {
|
|
235
|
+
args: {
|
|
236
|
+
label: 'Período Fiscal',
|
|
237
|
+
value: [new Date('2025-01-01'), new Date('2025-12-31')],
|
|
238
|
+
helperText: 'Año fiscal 2025',
|
|
239
|
+
},
|
|
240
|
+
render: function Component(args) {
|
|
241
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
242
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
export const QuarterRange = {
|
|
246
|
+
args: {
|
|
247
|
+
label: 'Trimestre Q1 2025',
|
|
248
|
+
value: [new Date('2025-01-01'), new Date('2025-03-31')],
|
|
249
|
+
helperText: 'Primer trimestre del año',
|
|
250
|
+
},
|
|
251
|
+
render: function Component(args) {
|
|
252
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
253
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
export const EventDuration = {
|
|
257
|
+
args: {
|
|
258
|
+
label: 'Duración del Evento',
|
|
259
|
+
value: [new Date('2025-06-15'), new Date('2025-06-18')],
|
|
260
|
+
helperText: 'Conferencia anual (4 días)',
|
|
261
|
+
},
|
|
262
|
+
render: function Component(args) {
|
|
263
|
+
const [value, setValue] = useState(args.value ?? [null, null]);
|
|
264
|
+
return _jsx(ErkDatePickerRange, { ...args, value: value, onChange: setValue });
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
export const MultipleStates = {
|
|
268
|
+
render: function Component() {
|
|
269
|
+
const [range1, setRange1] = useState([null, null]);
|
|
270
|
+
const [range2, setRange2] = useState([new Date('2025-01-01'), new Date('2025-01-31')]);
|
|
271
|
+
const [range3, setRange3] = useState([null, null]);
|
|
272
|
+
return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '20px' }, children: [_jsx(ErkDatePickerRange, { label: "Fecha de Inicio del Proyecto", value: range1, onChange: setRange1, helperText: "Seleccione el per\u00EDodo del proyecto" }), _jsx(ErkDatePickerRange, { label: "Per\u00EDodo de Pruebas", value: range2, onChange: setRange2, helperText: "Enero 2025" }), _jsx(ErkDatePickerRange, { label: "Fecha de Entrega", value: range3, onChange: setRange3, error: range3[0] === null, helperText: range3[0] === null ? 'Este campo es obligatorio' : 'Fecha confirmada', required: true })] }));
|
|
273
|
+
},
|
|
274
|
+
};
|
|
@@ -15,6 +15,7 @@ export var FormStepTypes;
|
|
|
15
15
|
FormStepTypes["CHECKBOX"] = "CHECKBOX";
|
|
16
16
|
FormStepTypes["TEXTAREA"] = "TEXTAREA";
|
|
17
17
|
FormStepTypes["DATEPICKER"] = "DATEPICKER";
|
|
18
|
+
FormStepTypes["DATEPICKER_RANGE"] = "DATEPICKER_RANGE";
|
|
18
19
|
FormStepTypes["FILEUPLOAD"] = "FILEUPLOAD";
|
|
19
20
|
FormStepTypes["TEXTINPUT"] = "TEXTINPUT";
|
|
20
21
|
FormStepTypes["SEPARATOR"] = "SEPARATOR";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arquimedes.co/eureka-forms",
|
|
3
3
|
"repository": "git://github.com/Arquimede5/Eureka-Forms.git",
|
|
4
|
-
"version":"3.0.31
|
|
4
|
+
"version": "3.0.31",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"watch": "tsc --noEmit --watch --project tsconfig.app.json",
|
|
7
7
|
"start": "vite",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"@faker-js/faker": "^10.0.0",
|
|
52
52
|
"@mui/material": "^7.3.4",
|
|
53
53
|
"@mui/x-data-grid-pro": "^8.13.1",
|
|
54
|
-
"@mui/x-date-pickers": "^8.
|
|
54
|
+
"@mui/x-date-pickers": "^8.12.0",
|
|
55
55
|
"@mui/x-date-pickers-pro": "^8.12.0",
|
|
56
56
|
"@storybook/addon-docs": "^9.1.10",
|
|
57
57
|
"@storybook/addon-onboarding": "^9.1.10",
|