intelicoreact 0.0.94 → 0.0.95

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 (38) hide show
  1. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.js +23 -4
  2. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +3 -3
  3. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.js +20 -9
  4. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +7 -5
  5. package/dist/Atomic/FormElements/InputDateRange/components/Datepicker.js +29 -24
  6. package/dist/Atomic/FormElements/InputDateRange/components/OpenedPart.js +13 -7
  7. package/dist/Atomic/FormElements/MobileCalendar/MobileCalendar.js +427 -0
  8. package/dist/Atomic/FormElements/MobileCalendar/MobileCalendar.scss +120 -0
  9. package/dist/{Molecular/Datepicker/Datepicker.stories.js → Atomic/FormElements/MobileCalendar/MobileCalendar.stories.js} +33 -21
  10. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.js +11 -8
  11. package/dist/Atomic/UI/Calendar/Calendar.js +13 -12
  12. package/dist/Functions/customEventListener.js +66 -0
  13. package/package.json +1 -1
  14. package/src/Atomic/FormElements/InputCalendar/InputCalendar.js +34 -3
  15. package/src/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +4 -4
  16. package/src/Atomic/FormElements/InputDateRange/InputDateRange.js +57 -22
  17. package/src/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +10 -8
  18. package/src/Atomic/FormElements/InputDateRange/components/Datepicker.js +391 -392
  19. package/src/Atomic/FormElements/InputDateRange/components/OpenedPart.js +11 -3
  20. package/src/Atomic/FormElements/MobileCalendar/MobileCalendar.js +315 -0
  21. package/src/Atomic/FormElements/MobileCalendar/MobileCalendar.scss +120 -0
  22. package/src/Atomic/FormElements/MobileCalendar/MobileCalendar.stories.js +30 -0
  23. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.js +132 -126
  24. package/src/Atomic/UI/Calendar/Calendar.js +21 -11
  25. package/src/Functions/customEventListener.js +58 -0
  26. package/src/Functions/useMouseUpOutside.js +14 -0
  27. package/dist/Functions/useToggle.js +0 -40
  28. package/dist/Functions/utils.js +0 -66
  29. package/dist/Molecular/Datepicker/Datepicker.js +0 -451
  30. package/dist/Molecular/Datepicker/Datepicker.scss +0 -8
  31. package/dist/Molecular/Datepicker/components/Calendar.js +0 -156
  32. package/dist/Molecular/FormElements/FormElement.js +0 -40
  33. package/dist/Molecular/FormElements/FormElement.scss +0 -8
  34. package/dist/Molecular/FormElements/FormElement.stories.js +0 -73
  35. package/dist/index.js +0 -15
  36. package/dist/scss/_fonts.scss +0 -109
  37. package/dist/scss/_vars.scss +0 -48
  38. package/dist/scss/main.scss +0 -40
@@ -11,403 +11,402 @@ import Btn from '../../../UI/Button/Button';
11
11
  // import Switcher from '../../Switcher/Switcher';
12
12
  import Calendar from '../../RangeCalendar/RangeCalendar';
13
13
 
14
- const padTime = time => {
15
- return `${time.toString().padStart(2, '0')}:00`;
14
+ const padTime = (time) => {
15
+ return `${time.toString().padStart(2, '0')}:00`;
16
16
  };
17
17
 
18
- const handleDateInputOnChange = value => {
19
- const replace = val => val.replace(/[^0-9\/]/g, '');
18
+ const handleDateInputOnChange = (value) => {
19
+ const replace = (val) => val.replace(/[^0-9\/]/g, '');
20
20
 
21
- const input = replace(value);
22
- const lastSymbol = input ? input.slice(-1) : '';
23
- const previousValue = input ? input.slice(0, input.length - 1) : '';
21
+ const input = replace(value);
22
+ const lastSymbol = input ? input.slice(-1) : '';
23
+ const previousValue = input ? input.slice(0, input.length - 1) : '';
24
24
 
25
- if (value.length > 10 || lastSymbol === '/') return previousValue;
26
- return previousValue.length === 2 || previousValue.length === 5 ? previousValue + '/' + lastSymbol : input;
25
+ if (value.length > 10 || lastSymbol === '/') return previousValue;
26
+ return previousValue.length === 2 || previousValue.length === 5 ? previousValue + '/' + lastSymbol : input;
27
27
  };
28
28
 
29
- const Datepicker = props => {
30
- const {
31
- txt,
32
- className,
33
- buttonsTypes = {},
34
- values = {},
35
- onChange,
36
- onChangeCompare,
37
- onCancel,
38
- getSelectedMode,
39
- onChangeInterval,
40
- isCompareHidden,
41
- limitRange,
42
- handleItemClick,
43
- setActiveInterval,
44
- isShortWeekNames,
45
- minDate = null,
46
- maxDate = null
47
- } = props;
48
- const { start = null, end = null, compare = false } = values;
49
- const startDateInputRef = useRef(null);
50
- const endDateInputRef = useRef(null);
51
-
52
- const [startDate, setStartDate] = useState(start);
53
- const [endDate, setEndDate] = useState(end);
54
- const dateInterval = getSelectedMode({ start: startDate, end: endDate });
55
-
56
- const [startDateInput, setStartDateInput] = useState(start);
57
- const [endDateInput, setEndDateInput] = useState(end);
58
- const [startHour, setStartHour] = useState(start ? moment(start).hour() : 0);
59
- const [endHour, setEndHour] = useState(end ? moment(end).hour() : 0);
60
- // eslint-disable-next-line no-unused-vars
61
- const [isCompare, setIsCompare] = useState(compare);
62
- const [date1, setDate1] = useState(start ? moment(start).toDate() : moment().subtract(1, 'month').toDate());
63
- const [date2, setDate2] = useState(end ? moment(end).toDate() : moment().toDate());
64
- const [isStartFocused, setIsStartFocused] = useState(false);
65
- const [isEndFocused, setIsEndFocused] = useState(false);
66
- const [hoverStatus, setHoverStatus] = useState(null);
67
-
68
- const isNearby = useMemo(() => moment(date2).subtract(1, 'month').isSame(moment(date1), 'month'), [date1, date2]);
69
-
70
- const isPreviousPeriodShowed = useMemo(
71
- () => isCompare && !isCompareHidden && startDate && endDate,
72
- [startDate, endDate, isCompare],
73
- );
74
-
75
- const setInterval = () => {
76
- setActiveInterval(getActualDateRange({ start: startDate, end: endDate }).intervalKey)
77
- };
78
-
79
- const prevEndHour = useRef(endHour);
80
-
81
- const getStartHourItems = () =>
82
- [...Array(24).keys()].map(hour => ({
83
- label: padTime(hour),
84
- value: hour,
85
- disabled: moment(startDate).isSame(endDate, 'day') && endHour <= hour,
86
- }));
87
- const getEndHourItems = () =>
88
- [...Array(24).keys()].map(hour => ({
89
- label: padTime(hour + 1),
90
- value: hour === 23 ? 0 : hour + 1,
91
- disabled:
92
- (moment(startDate).isSame(endDate, 'day') ||
93
- (moment(startDate).isSame(moment(endDate).subtract(1, 'days'), 'day') && endHour === 0)) &&
94
- hour < startHour,
95
- }));
96
-
97
- const startPrevDate = useMemo(() => {
98
- if (isPreviousPeriodShowed) {
99
- const intervalHoursCount = moment(endDate).diff(startDate, 'hours');
100
- return moment(startDate).subtract(intervalHoursCount, 'hours').toDate();
101
- } else return null;
102
- }, [startDate, endDate, isCompare]);
103
-
104
- const endPrevDate = useMemo(() => {
105
- if (isPreviousPeriodShowed) {
106
- return startDate;
107
- } else return null;
108
- }, [startDate, endDate, isCompare]);
109
-
110
- const title = useMemo(() => {
111
- if (isCompare && !isCompareHidden && startDate && endDate) {
112
- return `${moment(startPrevDate).format('ll')} (${moment(startPrevDate).format('HH:mm')}) - ${moment(
113
- endPrevDate,
114
- ).format('ll')} (${moment(endPrevDate).format('HH:mm')})`;
115
- } else return '';
116
- }, [startDate, endDate, isCompare]);
117
-
118
- const subtractDay = date => (endHour === 0 ? moment(date).subtract(1, 'days') : date);
119
- const addDay = date => (endHour === 0 ? moment(date).add(1, 'days') : date);
120
-
121
- useEffect(() => {
122
- if (moment(startDate).isSameOrAfter(endDate)) {
123
- setStartDate(moment(endDate).subtract(1, 'd').toDate());
124
- setDate1(moment(endDate).subtract(1, 'd'));
125
- }
126
- }, [startDate]);
127
-
128
- useEffect(() => {
129
- if (moment(endDate).isSameOrBefore(startDate)) {
130
- setEndDate(moment(startDate).add(1, 'd').toDate());
131
- setDate2(moment(startDate).add(1, 'd'));
132
- }
133
- }, [endDate]);
134
-
135
- useEffect(() => {
136
- setStartDateInput(startDate);
137
- setEndDateInput(endDate);
138
- if (moment(startDate).isBefore(moment(endDate), 'month')) {
139
- setDate1(moment(startDate));
140
- setDate2(moment(endDate));
141
- }
142
- setInterval();
143
- }, [startDate, endDate]);
144
-
145
- useEffect(() => {
146
- if (moment(date1).isSameOrAfter(moment(date2), 'month')) {
147
- setDate1(moment(date2).subtract(1, 'month'));
148
- }
149
- }, [date1, date2]);
150
-
151
- useEffect(() => {
152
- onChangeInterval(dateInterval);
153
- }, [dateInterval]);
154
-
155
- const handleClick = date => {
156
- prevEndHour.current = 0;
157
- if (
158
- !startDate ||
159
- (startDate && endDate && !(moment(startDate).add(1, 'd').isSame(endDate, 'day') && endHour === 0))
160
- ) {
161
- setStartDate(moment(date).startOf('day').toDate());
162
- setEndDate(moment(date).add(1, 'd').startOf('day').toDate());
163
- setStartHour(0);
164
- setEndHour(0);
165
- } else if (moment(date).isBefore(moment(startDate), 'day')) {
166
- setEndDate(moment(startDate).add(1, 'd').startOf('day').toDate());
167
- setStartDate(moment(date).set('hour', parseInt(startHour, 10)).toDate());
168
- } else if (moment(date).isAfter(moment(startDate), 'day')) {
169
- setEndDate(moment(date).add(1, 'd').startOf('day').toDate());
170
- }
29
+ const Datepicker = (props) => {
30
+ const {
31
+ txt,
32
+ className,
33
+ buttonsTypes = {},
34
+ values = {},
35
+ onChange,
36
+ onChangeCompare,
37
+ onCancel,
38
+ getSelectedMode,
39
+ onChangeInterval,
40
+ isCompareHidden,
41
+ limitRange,
42
+ handleItemClick,
43
+ setActiveInterval,
44
+ isShortWeekNames,
45
+ minDate,
46
+ maxDate,
47
+ momentMinDate,
48
+ momentMaxDate,
49
+ isDontLimitFuture,
50
+ format,
51
+ } = props;
52
+ const { start = null, end = null, compare = false } = values;
53
+ const startDateInputRef = useRef(null);
54
+ const endDateInputRef = useRef(null);
55
+
56
+ const [startDate, setStartDate] = useState(start);
57
+ const [endDate, setEndDate] = useState(end);
58
+ const dateInterval = getSelectedMode({ start: startDate, end: endDate });
59
+
60
+ const [startDateInput, setStartDateInput] = useState(start);
61
+ const [endDateInput, setEndDateInput] = useState(end);
62
+ const [startHour, setStartHour] = useState(start ? moment(start).hour() : 0);
63
+ const [endHour, setEndHour] = useState(end ? moment(end).hour() : 0);
64
+ // eslint-disable-next-line no-unused-vars
65
+ const [isCompare, setIsCompare] = useState(compare);
66
+ const [date1, setDate1] = useState(start ? moment(start).toDate() : moment().subtract(1, 'month').toDate());
67
+ const [date2, setDate2] = useState(end ? moment(end).toDate() : moment().toDate());
68
+ const [isStartFocused, setIsStartFocused] = useState(false);
69
+ const [isEndFocused, setIsEndFocused] = useState(false);
70
+ const [hoverStatus, setHoverStatus] = useState(null);
71
+
72
+ const isNearby = useMemo(() => moment(date2).subtract(1, 'month').isSame(moment(date1), 'month'), [date1, date2]);
73
+
74
+ const isPreviousPeriodShowed = useMemo(() => isCompare && !isCompareHidden && startDate && endDate, [startDate, endDate, isCompare]);
75
+
76
+ const setInterval = () => {
77
+ setActiveInterval(getActualDateRange({ start: startDate, end: endDate }).intervalKey);
78
+ };
79
+
80
+ const prevEndHour = useRef(endHour);
81
+
82
+ const getStartHourItems = () =>
83
+ [...Array(24).keys()].map((hour) => ({
84
+ label: padTime(hour),
85
+ value: hour,
86
+ disabled: moment(startDate).isSame(endDate, 'day') && endHour <= hour,
87
+ }));
88
+ const getEndHourItems = () =>
89
+ [...Array(24).keys()].map((hour) => ({
90
+ label: padTime(hour + 1),
91
+ value: hour === 23 ? 0 : hour + 1,
92
+ disabled:
93
+ (moment(startDate).isSame(endDate, 'day') || (moment(startDate).isSame(moment(endDate).subtract(1, 'days'), 'day') && endHour === 0)) &&
94
+ hour < startHour,
95
+ }));
96
+
97
+ const startPrevDate = useMemo(() => {
98
+ if (isPreviousPeriodShowed) {
99
+ const intervalHoursCount = moment(endDate).diff(startDate, 'hours');
100
+ return moment(startDate).subtract(intervalHoursCount, 'hours').toDate();
101
+ } else return null;
102
+ }, [startDate, endDate, isCompare]);
103
+
104
+ const endPrevDate = useMemo(() => {
105
+ if (isPreviousPeriodShowed) {
106
+ return startDate;
107
+ } else return null;
108
+ }, [startDate, endDate, isCompare]);
109
+
110
+ const title = useMemo(() => {
111
+ if (isCompare && !isCompareHidden && startDate && endDate) {
112
+ return `${moment(startPrevDate).format('ll')} (${moment(startPrevDate).format('HH:mm')}) - ${moment(endPrevDate).format('ll')} (${moment(
113
+ endPrevDate
114
+ ).format('HH:mm')})`;
115
+ } else return '';
116
+ }, [startDate, endDate, isCompare]);
117
+
118
+ const subtractDay = (date) => (endHour === 0 ? moment(date).subtract(1, 'days') : date);
119
+ const addDay = (date) => (endHour === 0 ? moment(date).add(1, 'days') : date);
120
+
121
+ useEffect(() => {
122
+ if (moment(startDate).isSameOrAfter(endDate)) {
123
+ setStartDate(moment(endDate).subtract(1, 'd').toDate());
124
+ setDate1(moment(endDate).subtract(1, 'd'));
125
+ }
126
+ }, [startDate]);
127
+
128
+ useEffect(() => {
129
+ if (moment(endDate).isSameOrBefore(startDate)) {
130
+ setEndDate(moment(startDate).add(1, 'd').toDate());
131
+ setDate2(moment(startDate).add(1, 'd'));
132
+ }
133
+ }, [endDate]);
134
+
135
+ useEffect(() => {
136
+ setStartDateInput(startDate);
137
+ setEndDateInput(endDate);
138
+ if (moment(startDate).isBefore(moment(endDate), 'month')) {
139
+ setDate1(moment(startDate));
140
+ setDate2(moment(endDate));
141
+ }
142
+ setInterval();
143
+ }, [startDate, endDate]);
144
+
145
+ useEffect(() => {
146
+ if (moment(date1).isSameOrAfter(moment(date2), 'month')) {
147
+ setDate1(moment(date2).subtract(1, 'month'));
148
+ }
149
+ }, [date1, date2]);
150
+
151
+ useEffect(() => {
152
+ onChangeInterval(dateInterval);
153
+ }, [dateInterval]);
154
+
155
+ const handleClick = (date) => {
156
+ prevEndHour.current = 0;
157
+ if (!startDate || (startDate && endDate && !(moment(startDate).add(1, 'd').isSame(endDate, 'day') && endHour === 0))) {
158
+ setStartDate(moment(date).startOf('day').toDate());
159
+ setEndDate(moment(date).add(1, 'd').startOf('day').toDate());
160
+ setStartHour(0);
161
+ setEndHour(0);
162
+ } else if (moment(date).isBefore(moment(startDate), 'day')) {
163
+ setEndDate(moment(startDate).add(1, 'd').startOf('day').toDate());
164
+ setStartDate(moment(date).set('hour', parseInt(startHour, 10)).toDate());
165
+ } else if (moment(date).isAfter(moment(startDate), 'day')) {
166
+ setEndDate(moment(date).add(1, 'd').startOf('day').toDate());
167
+ }
168
+ setHoverStatus(null);
169
+ };
170
+
171
+ let timerId;
172
+
173
+ const handleHover = (date) => {
174
+ if (!date) {
175
+ timerId = setTimeout(() => {
171
176
  setHoverStatus(null);
172
- };
173
-
174
- let timerId;
175
-
176
- const handleHover = date => {
177
- if (!date) {
178
- timerId = setTimeout(() => {
179
- setHoverStatus(null);
180
- }, 400);
181
- return;
182
- }
183
- if (timerId) clearTimeout(timerId);
184
- if (moment(startDate).add(1, 'd').isSame(endDate, 'day') && endHour === 0) {
185
- if (moment(date).isAfter(moment(startDate), 'day')) setHoverStatus('end');
186
- else if (moment(date).isBefore(moment(startDate), 'day')) setHoverStatus('start');
187
- else setHoverStatus(null);
188
- } else {
189
- setHoverStatus('start');
190
- }
191
- };
192
-
193
- const handleChangeStartHour = val => {
194
- setStartHour(+val);
195
- setStartDate(
196
- moment(startDate || moment())
197
- .set('hour', +val)
198
- .toDate(),
199
- );
200
- };
201
-
202
- const handleChangeEndHour = val => {
203
- const newHour = +val;
204
- setEndHour(newHour);
205
- let newEndDate = moment();
206
-
207
- if(endDate){
208
- if (prevEndHour.current === 0 && newHour !== 0) {
209
- newEndDate = moment(endDate).subtract(1, 'days');
210
- } else if (prevEndHour.current !== 0 && newHour === 0) {
211
- newEndDate = moment(endDate).add(1, 'days');
212
- }
213
- }
214
-
215
- prevEndHour.current = newHour;
216
- setEndDate(moment(newEndDate).set('hour', newHour).toDate());
217
- };
218
-
219
- const renderButtons = () => (
220
- <>
221
- <Btn className="date-picker__button" onClick={() => onCancel()} variant={buttonsTypes?.cancel}>
222
- {txt?.buttons?.cancel || 'cancel'}
223
- </Btn>
224
- <Btn
225
- className="date-picker__button"
226
- variant={buttonsTypes?.apply}
227
- disabled={!startDate || !endDate}
228
- onClick={() =>
229
- onChange({
230
- start: startDate,
231
- end: endDate,
232
- startPrevDate,
233
- endPrevDate,
234
- compare: isCompare,
235
- })
236
- }
237
- >
238
- {txt?.buttons?.apply || 'apply'}
239
- </Btn>
240
- </>
241
- );
242
-
243
- const renderPreviousPeriod = () => (
244
- <>
245
- {txt.labels.previousPeriod}: <span className="date-picker__previous-period-interval">{title}</span>
246
- </>
177
+ }, 400);
178
+ return;
179
+ }
180
+ if (timerId) clearTimeout(timerId);
181
+ if (moment(startDate).add(1, 'd').isSame(endDate, 'day') && endHour === 0) {
182
+ if (moment(date).isAfter(moment(startDate), 'day')) setHoverStatus('end');
183
+ else if (moment(date).isBefore(moment(startDate), 'day')) setHoverStatus('start');
184
+ else setHoverStatus(null);
185
+ } else {
186
+ setHoverStatus('start');
187
+ }
188
+ };
189
+
190
+ const handleChangeStartHour = (val) => {
191
+ setStartHour(+val);
192
+ setStartDate(
193
+ moment(startDate || moment())
194
+ .set('hour', +val)
195
+ .toDate()
247
196
  );
248
-
249
- const doBlur = (type, e) => {
250
- const executor = type === 'start' ? setIsStartFocused : setIsEndFocused;
251
- e.target.blur();
252
- executor(false);
253
- };
254
-
255
- const handleStartDateFocus = e => {
256
- setIsStartFocused(true);
257
- setStartDateInput(moment(startDate).format('L'));
258
- setTimeout(() => e.target.select(), 0);
259
- };
260
-
261
- const handleStartDateBlur = e => {
262
- let newDate;
263
-
264
- if(!moment(startDateInput).isValid()){
265
- newDate = startDate;
266
- } else {
267
- if(minDate && !moment(startDateInput).isSameOrAfter(minDate)){
268
- newDate = minDate;
269
- } else if(maxDate && !moment(startDateInput).isSameOrBefore(maxDate)){
270
- newDate = maxDate;
271
- } else {
272
- newDate = moment(startDateInput);
273
- }
274
- }
275
-
276
- setStartDateInput(newDate);
277
- setStartDate(newDate.set('hour', parseInt(startHour, 10)).toDate());
278
-
279
- doBlur('start', e);
280
- setDate1(
281
- moment(newDate).isSameOrAfter(moment(date2), 'month') ? moment(date2).subtract(1, 'month') : moment(newDate),
282
- );
283
- };
284
-
285
- const handleEndDateFocus = e => {
286
- setIsEndFocused(true);
287
- setEndDateInput(moment(subtractDay(endDateInput)).format('L'));
288
- setTimeout(() => e.target.select(), 0);
289
- };
290
-
291
- const handleEndDateBlur = e => {
292
- let newDate;
293
-
294
- if(!moment(endDateInput).isValid()){
295
- newDate = endDate;
296
- } else {
297
- if(minDate && !moment(endDateInput).isSameOrAfter(minDate)){
298
- newDate = minDate;
299
- } else if(maxDate && !moment(endDateInput).isSameOrBefore(maxDate)){
300
- newDate = maxDate;
301
- } else {
302
- newDate = moment(endDateInput);
303
- }
197
+ };
198
+
199
+ const handleChangeEndHour = (val) => {
200
+ const newHour = +val;
201
+ setEndHour(newHour);
202
+ let newEndDate = moment();
203
+
204
+ if (endDate) {
205
+ if (prevEndHour.current === 0 && newHour !== 0) {
206
+ newEndDate = moment(endDate).subtract(1, 'days');
207
+ } else if (prevEndHour.current !== 0 && newHour === 0) {
208
+ newEndDate = moment(endDate).add(1, 'days');
209
+ }
210
+ }
211
+
212
+ prevEndHour.current = newHour;
213
+ setEndDate(moment(newEndDate).set('hour', newHour).toDate());
214
+ };
215
+
216
+ const renderButtons = () => (
217
+ <>
218
+ <Btn className="date-picker__button" onClick={() => onCancel()} variant={buttonsTypes?.cancel}>
219
+ {txt?.buttons?.cancel || 'cancel'}
220
+ </Btn>
221
+ <Btn
222
+ className="date-picker__button"
223
+ variant={buttonsTypes?.apply}
224
+ disabled={!startDate || !endDate}
225
+ onClick={() =>
226
+ onChange({
227
+ start: startDate,
228
+ end: endDate,
229
+ startPrevDate,
230
+ endPrevDate,
231
+ compare: isCompare,
232
+ })
304
233
  }
305
-
306
- setEndDate(addDay(newDate.set('hour', parseInt(endHour, 10)).toDate()));
307
- setEndDateInput(newDate);
308
-
309
- doBlur('end', e);
310
- setDate2(newDate);
311
- };
312
-
313
- const handleKeyPressed = (code, e, type) => {
314
- if (code === 13) (type === 'start' ? handleStartDateBlur : handleEndDateBlur)(e);
315
- if (code === 27) doBlur(type, e);
316
- };
317
-
318
- const startDateValue = startDate ? moment(startDate).format('ll') : '';
319
- const endDateValue = endDate ? moment(endDate).subtract(1, 'm').format('ll') : '';
320
-
321
- return (
322
- <div className={cn('date-picker', className)}>
323
- <div className="date-picker__header">
324
- <div className="date-picker__inputs-block">
325
- <TextInput
326
- dataTest="datepicker_start-date-input"
327
- className={cn( { 'date-picker__date-input_active': hoverStatus === 'start' })}
328
- value={isStartFocused ? startDateInput : startDateValue}
329
- onChange={value => setStartDateInput(handleDateInputOnChange(value))}
330
- onFocus={handleStartDateFocus}
331
- disabled={!startDate}
332
- onBlur={handleStartDateBlur}
333
- onKeyUp={(code, e) => handleKeyPressed(code, e, 'start')}
334
- //ref={startDateInputRef}
335
- // mask={moment(startDate).format('L').replace(/[0-9]/g, '9')}
336
- />
337
- <SelectInput
338
- dataTest="datepicker_start-hour-select-input"
339
- className={cn('date-picker__hour-select-input')}
340
- onChange={value => handleChangeStartHour(value)}
341
- value={startHour}
342
- options={getStartHourItems()}
343
- disabled={!startDate}
344
- short
345
- />
346
- <div className="date-picker__inputs-separator date-picker__header--gray">—</div>
347
- <TextInput
348
- dataTest="datepicker_end-date-input"
349
- className={cn({ 'date-picker__date-input_active': hoverStatus === 'end' })}
350
- value={isEndFocused ? endDateInput : endDateValue}
351
- disabled={!endDate}
352
- onChange={value => setEndDateInput(handleDateInputOnChange(value))}
353
- onFocus={handleEndDateFocus}
354
- onBlur={handleEndDateBlur}
355
- onKeyUp={(code, e) => handleKeyPressed(code, e, 'end')}
356
- //ref={endDateInputRef}
357
- />
358
- <SelectInput
359
- dataTest="datepicker_end-hour-select-input"
360
- className={cn('date-picker__hour-select-input')}
361
- onChange={value => handleChangeEndHour(value)}
362
- value={endHour}
363
- options={getEndHourItems()}
364
- disabled={!endDate}
365
- short
366
- />
367
- </div>
368
- {isCompare && !isCompareHidden && startDate && endDate && (
369
- <div className="date-picker__previous-period">
370
- {renderPreviousPeriod()}
371
- </div>
372
- )}
373
- </div>
374
-
375
-
376
- <div className="date-picker__calendars">
377
- <div className="date-picker__calendars-wrapper">
378
- <Calendar
379
- className="date-picker__calendar"
380
- date={date1}
381
- setDate={setDate1}
382
- allowNext={!isNearby}
383
- startDate={startDate}
384
- endDate={endDate}
385
- startPrevDate={startPrevDate}
386
- endPrevDate={endPrevDate}
387
- onClick={handleClick}
388
- onHover={handleHover}
389
- limitRange={limitRange}
390
- isShortWeekNames={isShortWeekNames}
391
- />
392
- <Calendar
393
- className="date-picker__calendar"
394
- date={date2}
395
- setDate={setDate2}
396
- allowPrev={!isNearby}
397
- startDate={startDate}
398
- endDate={endDate}
399
- startPrevDate={startPrevDate}
400
- endPrevDate={endPrevDate}
401
- onClick={handleClick}
402
- onHover={handleHover}
403
- isShortWeekNames={isShortWeekNames}
404
- />
405
- </div>
406
- </div>
407
- <div className={cn('date-picker__footer', {
408
- 'date-picker__footer_once-element': isCompareHidden
409
- })}>
410
- {/* {!isCompareHidden ? (
234
+ >
235
+ {txt?.buttons?.apply || 'apply'}
236
+ </Btn>
237
+ </>
238
+ );
239
+
240
+ const renderPreviousPeriod = () => (
241
+ <>
242
+ {txt.labels.previousPeriod}: <span className="date-picker__previous-period-interval">{title}</span>
243
+ </>
244
+ );
245
+
246
+ const doBlur = (type, e) => {
247
+ const executor = type === 'start' ? setIsStartFocused : setIsEndFocused;
248
+ e.target.blur();
249
+ executor(false);
250
+ };
251
+
252
+ const handleStartDateFocus = (e) => {
253
+ setIsStartFocused(true);
254
+ setStartDateInput(moment(startDate).format('L'));
255
+ setTimeout(() => e.target.select(), 0);
256
+ };
257
+
258
+ const handleStartDateBlur = (e) => {
259
+ let newDate;
260
+
261
+ if (!moment(startDateInput).isValid()) {
262
+ newDate = moment(startDate);
263
+ } else {
264
+ if (minDate && moment(startDateInput).isBefore(minDate)) newDate = momentMinDate;
265
+ else if (!isDontLimitFuture) {
266
+ const edge = maxDate ? momentMaxDate : moment().add(1, 'day').startOf('day');
267
+ if (moment(startDateInput).isAfter(edge)) newDate = edge;
268
+ else newDate = moment(startDateInput);
269
+ } else newDate = moment(startDateInput);
270
+ }
271
+
272
+ setStartDateInput(newDate.format(format));
273
+ setStartDate(newDate.set('hour', parseInt(startHour, 10)).toDate());
274
+
275
+ doBlur('start', e);
276
+ setDate1(moment(newDate).isSameOrAfter(moment(date2), 'month') ? moment(date2).subtract(1, 'month') : moment(newDate));
277
+ };
278
+
279
+ const handleEndDateFocus = (e) => {
280
+ setIsEndFocused(true);
281
+ setEndDateInput(moment(subtractDay(endDateInput)).format('L'));
282
+ setTimeout(() => e.target.select(), 0);
283
+ };
284
+
285
+ const handleEndDateBlur = (e) => {
286
+ let newDate;
287
+
288
+ if (!moment(endDateInput).isValid()) {
289
+ newDate = moment(endDate);
290
+ } else {
291
+ if (minDate && moment(endDateInput).isBefore(minDate)) newDate = momentMinDate;
292
+ else if (!isDontLimitFuture) {
293
+ const edge = maxDate ? momentMaxDate : moment().endOf('day');
294
+ if (moment(endDateInput).isAfter(edge)) newDate = maxDate ? edge : edge.startOf('day');
295
+ else newDate = moment(startDateInput);
296
+ } else newDate = moment(startDateInput);
297
+ }
298
+
299
+ setEndDate(addDay(newDate.set('hour', parseInt(endHour, 10)).toDate()));
300
+ setEndDateInput(newDate.format(format));
301
+
302
+ doBlur('end', e);
303
+ setDate2(newDate);
304
+ };
305
+
306
+ const handleKeyPressed = (code, e, type) => {
307
+ if (code === 13) (type === 'start' ? handleStartDateBlur : handleEndDateBlur)(e);
308
+ if (code === 27) doBlur(type, e);
309
+ };
310
+
311
+ const startDateValue = startDate ? moment(startDate).format('ll') : '';
312
+ const endDateValue = endDate ? moment(endDate).subtract(1, 'm').format('ll') : '';
313
+
314
+ return (
315
+ <div className={cn('date-picker', className)}>
316
+ <div className="date-picker__header">
317
+ <div className="date-picker__inputs-block">
318
+ <TextInput
319
+ dataTest="datepicker_start-date-input"
320
+ className={cn({ 'date-picker__date-input_active': hoverStatus === 'start' })}
321
+ value={isStartFocused ? startDateInput : startDateValue}
322
+ onChange={(value) => setStartDateInput(handleDateInputOnChange(value))}
323
+ onFocus={handleStartDateFocus}
324
+ disabled={!startDate}
325
+ onBlur={handleStartDateBlur}
326
+ onKeyUp={(code, e) => handleKeyPressed(code, e, 'start')}
327
+ //ref={startDateInputRef}
328
+ // mask={moment(startDate).format('L').replace(/[0-9]/g, '9')}
329
+ />
330
+ <SelectInput
331
+ dataTest="datepicker_start-hour-select-input"
332
+ className={cn('date-picker__hour-select-input')}
333
+ onChange={(value) => handleChangeStartHour(value)}
334
+ value={startHour}
335
+ options={getStartHourItems()}
336
+ disabled={!startDate}
337
+ short
338
+ />
339
+ <div className="date-picker__inputs-separator date-picker__header--gray">—</div>
340
+ <TextInput
341
+ dataTest="datepicker_end-date-input"
342
+ className={cn({ 'date-picker__date-input_active': hoverStatus === 'end' })}
343
+ value={isEndFocused ? endDateInput : endDateValue}
344
+ disabled={!endDate}
345
+ onChange={(value) => setEndDateInput(handleDateInputOnChange(value))}
346
+ onFocus={handleEndDateFocus}
347
+ onBlur={handleEndDateBlur}
348
+ onKeyUp={(code, e) => handleKeyPressed(code, e, 'end')}
349
+ //ref={endDateInputRef}
350
+ />
351
+ <SelectInput
352
+ dataTest="datepicker_end-hour-select-input"
353
+ className={cn('date-picker__hour-select-input')}
354
+ onChange={(value) => handleChangeEndHour(value)}
355
+ value={endHour}
356
+ options={getEndHourItems()}
357
+ disabled={!endDate}
358
+ short
359
+ />
360
+ </div>
361
+ {isCompare && !isCompareHidden && startDate && endDate && <div className="date-picker__previous-period">{renderPreviousPeriod()}</div>}
362
+ </div>
363
+
364
+ <div className="date-picker__calendars">
365
+ <div className="date-picker__calendars-wrapper">
366
+ <Calendar
367
+ className="date-picker__calendar"
368
+ date={date1}
369
+ setDate={setDate1}
370
+ allowNext={!isNearby}
371
+ startDate={startDate}
372
+ endDate={endDate}
373
+ startPrevDate={startPrevDate}
374
+ endPrevDate={endPrevDate}
375
+ onClick={handleClick}
376
+ onHover={handleHover}
377
+ limitRange={limitRange}
378
+ isShortWeekNames={isShortWeekNames}
379
+ minDate={minDate}
380
+ maxDate={maxDate}
381
+ momentMinDate={momentMinDate}
382
+ momentMaxDate={momentMaxDate}
383
+ />
384
+ <Calendar
385
+ className="date-picker__calendar"
386
+ date={date2}
387
+ setDate={setDate2}
388
+ allowPrev={!isNearby}
389
+ startDate={startDate}
390
+ endDate={endDate}
391
+ startPrevDate={startPrevDate}
392
+ endPrevDate={endPrevDate}
393
+ onClick={handleClick}
394
+ onHover={handleHover}
395
+ isShortWeekNames={isShortWeekNames}
396
+ minDate={minDate}
397
+ maxDate={maxDate}
398
+ momentMinDate={momentMinDate}
399
+ momentMaxDate={momentMaxDate}
400
+ isDontLimitFuture={isDontLimitFuture}
401
+ />
402
+ </div>
403
+ </div>
404
+ <div
405
+ className={cn('date-picker__footer', {
406
+ 'date-picker__footer_once-element': isCompareHidden,
407
+ })}
408
+ >
409
+ {/* {!isCompareHidden ? (
411
410
  <div className="date-picker__compare-block">
412
411
  <div className="mr5">
413
412
  <Switcher
@@ -424,10 +423,10 @@ const Datepicker = props => {
424
423
  ) : (
425
424
  <div />
426
425
  )} */}
427
- <div className="date-picker__buttons-block">{renderButtons()}</div>
428
- </div>
429
- </div>
430
- );
426
+ <div className="date-picker__buttons-block">{renderButtons()}</div>
427
+ </div>
428
+ </div>
429
+ );
431
430
  };
432
431
 
433
432
  export default Datepicker;