intelicoreact 0.0.53 → 0.0.64

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 (51) hide show
  1. package/dist/Atomic/FormElements/DateTime/DateTime.stories.js +1 -1
  2. package/dist/Atomic/FormElements/Input/Input.js +5 -5
  3. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.js +4 -4
  4. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.js +265 -0
  5. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.scss +569 -0
  6. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +243 -0
  7. package/dist/Atomic/FormElements/InputDateRange/components/Datepicker.js +486 -0
  8. package/dist/Atomic/FormElements/InputDateRange/components/OpenedPart.js +154 -0
  9. package/dist/Atomic/FormElements/InputDateRange/components/SelectItem.js +46 -0
  10. package/dist/Atomic/FormElements/InputDateRange/dependencies.js +249 -0
  11. package/dist/Atomic/FormElements/Modal/Modal.stories.js +64 -18
  12. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.js +162 -0
  13. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +101 -0
  14. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.stories.js +81 -0
  15. package/dist/Atomic/UI/Arrow/Arrow.js +80 -0
  16. package/dist/Atomic/UI/Arrow/Arrow.scss +19 -0
  17. package/dist/Atomic/UI/Arrow/Arrow.stories.js +46 -0
  18. package/dist/Atomic/UI/Button/Button.js +4 -2
  19. package/dist/Atomic/UI/Button/Button.scss +26 -0
  20. package/dist/Atomic/UI/Button/Button.stories.js +2 -2
  21. package/dist/Atomic/{FormElements → UI}/Calendar/Calendar.js +0 -0
  22. package/dist/Atomic/UI/Calendar/Calendar.scss +544 -0
  23. package/dist/Atomic/{FormElements → UI}/Calendar/Calendar.stories.js +5 -1
  24. package/dist/Functions/utils.js +10 -2
  25. package/package.json +7 -5
  26. package/src/Atomic/FormElements/DateTime/DateTime.stories.js +1 -1
  27. package/src/Atomic/FormElements/Input/Input.js +5 -5
  28. package/src/Atomic/FormElements/InputCalendar/InputCalendar.js +6 -6
  29. package/src/Atomic/FormElements/InputDateRange/InputDateRange.js +247 -0
  30. package/src/Atomic/FormElements/InputDateRange/InputDateRange.scss +569 -0
  31. package/src/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +148 -0
  32. package/src/Atomic/FormElements/InputDateRange/components/Datepicker.js +406 -0
  33. package/src/Atomic/FormElements/InputDateRange/components/OpenedPart.js +112 -0
  34. package/src/Atomic/FormElements/InputDateRange/components/SelectItem.js +24 -0
  35. package/src/Atomic/FormElements/InputDateRange/dependencies.js +161 -0
  36. package/src/Atomic/FormElements/Modal/Modal.stories.js +60 -15
  37. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.js +143 -0
  38. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +101 -0
  39. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.stories.js +54 -0
  40. package/src/Atomic/UI/Arrow/Arrow.js +41 -0
  41. package/src/Atomic/UI/Arrow/Arrow.scss +19 -0
  42. package/src/Atomic/UI/Arrow/Arrow.stories.js +32 -0
  43. package/src/Atomic/UI/Button/Button.js +3 -3
  44. package/src/Atomic/UI/Button/Button.scss +26 -0
  45. package/src/Atomic/UI/Button/Button.stories.js +4 -3
  46. package/src/Atomic/{FormElements → UI}/Calendar/Calendar.js +0 -0
  47. package/src/Atomic/UI/Calendar/Calendar.scss +544 -0
  48. package/src/Atomic/{FormElements → UI}/Calendar/Calendar.stories.js +5 -1
  49. package/src/Functions/utils.js +6 -0
  50. package/dist/Atomic/FormElements/Calendar/Calendar.scss +0 -543
  51. package/src/Atomic/FormElements/Calendar/Calendar.scss +0 -543
@@ -0,0 +1,406 @@
1
+ // eslint-disable-next-line no-unused-vars
2
+ import React, { useEffect, useMemo, useRef, useState } from 'react';
3
+ import moment from 'moment-timezone';
4
+ import cn from 'classnames';
5
+
6
+ import { getActualDateRange } from '../dependencies';
7
+
8
+ import SelectInput from '../../Dropdown/Dropdown';
9
+ import TextInput from '../../Input/Input';
10
+ import Btn from '../../../UI/Button/Button';
11
+ // import Switcher from '../../Switcher/Switcher';
12
+ import Calendar from '../../RangeCalendar/RangeCalendar';
13
+
14
+ const padTime = time => {
15
+ return `${time.toString().padStart(2, '0')}:00`;
16
+ };
17
+
18
+ const handleDateInputOnChange = value => {
19
+ const replace = val => val.replace(/[^0-9\/]/g, '');
20
+
21
+ const input = replace(value);
22
+ const lastSymbol = input ? input.slice(-1) : '';
23
+ const previousValue = input ? input.slice(0, input.length - 1) : '';
24
+
25
+ if (value.length > 10 || lastSymbol === '/') return previousValue;
26
+ return previousValue.length === 2 || previousValue.length === 5 ? previousValue + '/' + lastSymbol : input;
27
+ };
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
+ } = props;
45
+ const { start = null, end = null, compare = false } = values;
46
+ const startDateInputRef = useRef(null);
47
+ const endDateInputRef = useRef(null);
48
+
49
+ const [startDate, setStartDate] = useState(start);
50
+ const [endDate, setEndDate] = useState(end);
51
+ const dateInterval = getSelectedMode({ start: startDate, end: endDate });
52
+
53
+ const [startDateInput, setStartDateInput] = useState(start);
54
+ const [endDateInput, setEndDateInput] = useState(end);
55
+ const [startHour, setStartHour] = useState(start ? moment(start).hour() : 0);
56
+ const [endHour, setEndHour] = useState(end ? moment(end).hour() : 0);
57
+ // eslint-disable-next-line no-unused-vars
58
+ const [isCompare, setIsCompare] = useState(compare);
59
+ const [date1, setDate1] = useState(start ? moment(start).toDate() : moment().subtract(1, 'month').toDate());
60
+ const [date2, setDate2] = useState(end ? moment(end).toDate() : moment().toDate());
61
+ const [isStartFocused, setIsStartFocused] = useState(false);
62
+ const [isEndFocused, setIsEndFocused] = useState(false);
63
+ const [hoverStatus, setHoverStatus] = useState(null);
64
+
65
+ const isNearby = useMemo(() => moment(date2).subtract(1, 'month').isSame(moment(date1), 'month'), [date1, date2]);
66
+
67
+ const isPreviousPeriodShowed = useMemo(
68
+ () => isCompare && !isCompareHidden && startDate && endDate,
69
+ [startDate, endDate, isCompare],
70
+ );
71
+
72
+ const setInterval = () => {
73
+ setActiveInterval(getActualDateRange({ start: startDate, end: endDate }).intervalKey)
74
+ };
75
+
76
+ const prevEndHour = useRef(endHour);
77
+
78
+ const getStartHourItems = () =>
79
+ [...Array(24).keys()].map(hour => ({
80
+ label: padTime(hour),
81
+ value: hour,
82
+ disabled: moment(startDate).isSame(endDate, 'day') && endHour <= hour,
83
+ }));
84
+ const getEndHourItems = () =>
85
+ [...Array(24).keys()].map(hour => ({
86
+ label: padTime(hour + 1),
87
+ value: hour === 23 ? 0 : hour + 1,
88
+ disabled:
89
+ (moment(startDate).isSame(endDate, 'day') ||
90
+ (moment(startDate).isSame(moment(endDate).subtract(1, 'days'), 'day') && endHour === 0)) &&
91
+ hour < startHour,
92
+ }));
93
+
94
+ const startPrevDate = useMemo(() => {
95
+ if (isPreviousPeriodShowed) {
96
+ const intervalHoursCount = moment(endDate).diff(startDate, 'hours');
97
+ return moment(startDate).subtract(intervalHoursCount, 'hours').toDate();
98
+ } else return null;
99
+ }, [startDate, endDate, isCompare]);
100
+
101
+ const endPrevDate = useMemo(() => {
102
+ if (isPreviousPeriodShowed) {
103
+ return startDate;
104
+ } else return null;
105
+ }, [startDate, endDate, isCompare]);
106
+
107
+ const title = useMemo(() => {
108
+ if (isCompare && !isCompareHidden && startDate && endDate) {
109
+ return `${moment(startPrevDate).format('ll')} (${moment(startPrevDate).format('HH:mm')}) - ${moment(
110
+ endPrevDate,
111
+ ).format('ll')} (${moment(endPrevDate).format('HH:mm')})`;
112
+ } else return '';
113
+ }, [startDate, endDate, isCompare]);
114
+
115
+ const subtractDay = date => (endHour === 0 ? moment(date).subtract(1, 'days') : date);
116
+ const addDay = date => (endHour === 0 ? moment(date).add(1, 'days') : date);
117
+
118
+ useEffect(() => {
119
+ if (moment(startDate).isSameOrAfter(endDate)) {
120
+ setStartDate(moment(endDate).subtract(1, 'd').toDate());
121
+ setDate1(moment(endDate).subtract(1, 'd'));
122
+ }
123
+ }, [startDate]);
124
+
125
+ useEffect(() => {
126
+ if (moment(endDate).isSameOrBefore(startDate)) {
127
+ setEndDate(moment(startDate).add(1, 'd').toDate());
128
+ setDate2(moment(startDate).add(1, 'd'));
129
+ }
130
+ }, [endDate]);
131
+
132
+ useEffect(() => {
133
+ setStartDateInput(startDate);
134
+ setEndDateInput(endDate);
135
+ if (moment(startDate).isBefore(moment(endDate), 'month')) {
136
+ setDate1(moment(startDate));
137
+ setDate2(moment(endDate));
138
+ }
139
+ setInterval();
140
+ }, [startDate, endDate]);
141
+
142
+ useEffect(() => {
143
+ if (moment(date1).isSameOrAfter(moment(date2), 'month')) {
144
+ setDate1(moment(date2).subtract(1, 'month'));
145
+ }
146
+ }, [date1, date2]);
147
+
148
+ useEffect(() => {
149
+ onChangeInterval(dateInterval);
150
+ }, [dateInterval]);
151
+
152
+ const handleClick = date => {
153
+ prevEndHour.current = 0;
154
+ if (
155
+ !startDate ||
156
+ (startDate && endDate && !(moment(startDate).add(1, 'd').isSame(endDate, 'day') && endHour === 0))
157
+ ) {
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(() => {
176
+ setHoverStatus(null);
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)
194
+ .set('hour', +val)
195
+ .toDate(),
196
+ );
197
+ };
198
+
199
+ const handleChangeEndHour = val => {
200
+ const newHour = +val;
201
+ setEndHour(newHour);
202
+ let newEndDate;
203
+ if (prevEndHour.current === 0 && newHour !== 0) {
204
+ newEndDate = moment(endDate).subtract(1, 'days');
205
+ } else if (prevEndHour.current !== 0 && newHour === 0) {
206
+ newEndDate = moment(endDate).add(1, 'days');
207
+ } else {
208
+ newEndDate = endDate;
209
+ }
210
+ prevEndHour.current = newHour;
211
+ setEndDate(moment(newEndDate).set('hour', newHour).toDate());
212
+ };
213
+
214
+ const renderButtons = () => (
215
+ <>
216
+ <Btn className="date-picker__button" onClick={() => onCancel()} variant={buttonsTypes?.cancel}>
217
+ {txt?.buttons?.cancel || 'cancel'}
218
+ </Btn>
219
+ <Btn
220
+ className="date-picker__button"
221
+ variant={buttonsTypes?.apply}
222
+ disabled={!startDate || !endDate}
223
+ onClick={() =>
224
+ onChange({
225
+ start: startDate,
226
+ end: endDate,
227
+ startPrevDate,
228
+ endPrevDate,
229
+ compare: isCompare,
230
+ })
231
+ }
232
+ >
233
+ {txt?.buttons?.apply || 'apply'}
234
+ </Btn>
235
+ </>
236
+ );
237
+
238
+ const renderPreviousPeriod = () => (
239
+ <>
240
+ {txt.labels.previousPeriod}: <span className="date-picker__previous-period-interval">{title}</span>
241
+ </>
242
+ );
243
+
244
+ const doBlur = (type, e) => {
245
+ const executor = type === 'start' ? setIsStartFocused : setIsEndFocused;
246
+ e.target.blur();
247
+ executor(false);
248
+ };
249
+
250
+ const handleStartDateFocus = e => {
251
+ setIsStartFocused(true);
252
+ setStartDateInput(moment(startDate).format('L'));
253
+ setTimeout(() => e.target.select(), 0);
254
+ };
255
+
256
+ const handleStartDateBlur = e => {
257
+ let newDate;
258
+ if (moment(startDateInput).isValid()) {
259
+ newDate = moment(startDateInput).set('hour', parseInt(startHour, 10)).toDate();
260
+ setStartDate(newDate);
261
+ } else {
262
+ newDate = startDate;
263
+ setStartDateInput(newDate);
264
+ }
265
+ doBlur('start', e);
266
+ setDate1(
267
+ moment(newDate).isSameOrAfter(moment(date2), 'month') ? moment(date2).subtract(1, 'month') : moment(newDate),
268
+ );
269
+ };
270
+
271
+ const handleEndDateFocus = e => {
272
+ setIsEndFocused(true);
273
+ setEndDateInput(moment(subtractDay(endDateInput)).format('L'));
274
+ setTimeout(() => e.target.select(), 0);
275
+ };
276
+
277
+ const handleEndDateBlur = e => {
278
+ let newDate;
279
+ if (moment(endDateInput).isValid()) {
280
+ newDate = moment(endDateInput).set('hour', parseInt(endHour, 10)).toDate();
281
+ setEndDate(addDay(newDate));
282
+ } else {
283
+ newDate = endDate;
284
+ setEndDateInput(newDate);
285
+ }
286
+ doBlur('end', e);
287
+ setDate2(newDate);
288
+ setEndDateInput();
289
+ };
290
+
291
+ const handleKeyPressed = (code, e, type) => {
292
+ if (code === 13) (type === 'start' ? handleStartDateBlur : handleEndDateBlur)(e);
293
+ if (code === 27) doBlur(type, e);
294
+ };
295
+
296
+ return (
297
+ <div className={cn('date-picker', className)}>
298
+ <div className="date-picker__header">
299
+ <div className="date-picker__inputs-block">
300
+ <TextInput
301
+ dataTest="datepicker_start-date-input"
302
+ className={cn('date-picker__date-input', { 'date-picker__date-input_active': hoverStatus === 'start' })}
303
+ value={isStartFocused ? startDateInput : moment(startDate).format('ll')}
304
+ disabled={!startDate}
305
+ onChange={value => setStartDateInput(handleDateInputOnChange(value))}
306
+ onFocus={handleStartDateFocus}
307
+ onBlur={handleStartDateBlur}
308
+ onKeyUp={(code, e) => handleKeyPressed(code, e, 'start')}
309
+ ref={startDateInputRef}
310
+ // mask={moment(startDate).format('L').replace(/[0-9]/g, '9')}
311
+ />
312
+ <SelectInput
313
+ dataTest="datepicker_start-hour-select-input"
314
+ className={cn('date-picker__hour-select-input')}
315
+ onChange={value => handleChangeStartHour(value)}
316
+ value={startHour}
317
+ options={getStartHourItems()}
318
+ disabled={!startDate}
319
+ short
320
+ />
321
+ <div className="date-picker__inputs-separator date-picker__header--gray">—</div>
322
+ <TextInput
323
+ dataTest="datepicker_end-date-input"
324
+ className={cn('date-picker__date-input', { 'date-picker__date-input_active': hoverStatus === 'end' })}
325
+ value={isEndFocused ? endDateInput : moment(subtractDay(endDate)).format('ll')}
326
+ disabled={!endDate}
327
+ onChange={value => setEndDateInput(handleDateInputOnChange(value))}
328
+ onFocus={handleEndDateFocus}
329
+ onBlur={handleEndDateBlur}
330
+ onKeyUp={(code, e) => handleKeyPressed(code, e, 'end')}
331
+ ref={endDateInputRef}
332
+ />
333
+ <SelectInput
334
+ dataTest="datepicker_end-hour-select-input"
335
+ className={cn('date-picker__hour-select-input')}
336
+ onChange={value => handleChangeEndHour(value)}
337
+ value={endHour}
338
+ options={getEndHourItems()}
339
+ disabled={!endDate}
340
+ short
341
+ />
342
+ </div>
343
+ {isCompare && !isCompareHidden && startDate && endDate && (
344
+ <div className="date-picker__previous-period">
345
+ {renderPreviousPeriod()}
346
+ </div>
347
+ )}
348
+ </div>
349
+
350
+
351
+ <div className="date-picker__calendars">
352
+ <div className="date-picker__calendars-wrapper">
353
+ <Calendar
354
+ className="date-picker__calendar"
355
+ date={date1}
356
+ setDate={setDate1}
357
+ allowNext={!isNearby}
358
+ startDate={startDate}
359
+ endDate={endDate}
360
+ startPrevDate={startPrevDate}
361
+ endPrevDate={endPrevDate}
362
+ onClick={handleClick}
363
+ onHover={handleHover}
364
+ limitRange={limitRange}
365
+ />
366
+ <Calendar
367
+ className="date-picker__calendar"
368
+ date={date2}
369
+ setDate={setDate2}
370
+ allowPrev={!isNearby}
371
+ startDate={startDate}
372
+ endDate={endDate}
373
+ startPrevDate={startPrevDate}
374
+ endPrevDate={endPrevDate}
375
+ onClick={handleClick}
376
+ onHover={handleHover}
377
+ />
378
+ </div>
379
+ </div>
380
+ <div className={cn('date-picker__footer', {
381
+ 'date-picker__footer_once-element': isCompareHidden
382
+ })}>
383
+ {/* {!isCompareHidden ? (
384
+ <div className="date-picker__compare-block">
385
+ <div className="mr5">
386
+ <Switcher
387
+ dataTest="datepicker_compare"
388
+ label={txt.labels.compare}
389
+ isSwitchOn={isCompare}
390
+ onChange={() => {
391
+ onChangeCompare(!isCompare);
392
+ setIsCompare(state => !state);
393
+ }}
394
+ />
395
+ </div>
396
+ </div>
397
+ ) : (
398
+ <div />
399
+ )} */}
400
+ <div className="date-picker__buttons-block">{renderButtons()}</div>
401
+ </div>
402
+ </div>
403
+ );
404
+ };
405
+
406
+ export default Datepicker;
@@ -0,0 +1,112 @@
1
+ import React, {useEffect, useState} from 'react';
2
+ import moment from 'moment-timezone';
3
+ import cn from 'classnames';
4
+
5
+ import {INTERVALS as intervals, CUSTOM_INTERVAL_KEY as customKey } from '../dependencies';
6
+
7
+ import SelectItem from './SelectItem';
8
+ import Datepicker from './Datepicker';
9
+
10
+ const OpenedPart = React.forwardRef((props, ref) => {
11
+ const {
12
+ txt,
13
+ buttonsTypes,
14
+ actualValues,
15
+ onChange = () => {},
16
+ isHoverable,
17
+ short,
18
+ isCompact = false,
19
+ isIntervalsHidden = false,
20
+ isCompareHidden = false,
21
+ limitRange,
22
+ isOptionsRight,
23
+ current,
24
+ setCurrent,
25
+ isCompare,
26
+ setIsCompare,
27
+ toggleOff,
28
+ } = props;
29
+
30
+ const items = isCompact ? [...Object.keys(intervals)] : [...Object.keys(intervals), customKey];
31
+
32
+ const [activeInterval, setActiveInterval] = useState(actualValues.intervalKey);
33
+
34
+ const handleItemClick = item => {
35
+ if (item !== customKey) {
36
+ onChange({
37
+ intervalKey: item,
38
+ compare: isCompare,
39
+ });
40
+ setTimeout(() => toggleOff(), 0);
41
+ }
42
+ setCurrent(item);
43
+ };
44
+
45
+ const getSelectedMode = newValues => {
46
+ const { start, end } = newValues;
47
+ if (moment(start).get('hour') !== 0 || moment(end).get('hour') !== 0) {
48
+ return customKey;
49
+ }
50
+ for (const [key, interval] of Object.entries(intervals)) {
51
+ if (moment(start).isSame(interval.start()) && moment(end).isSame(interval.end())) {
52
+ return key;
53
+ }
54
+ }
55
+ return customKey;
56
+ };
57
+
58
+ return (
59
+ <div
60
+ className={cn('date-range-input__opened-part', 'opened-part')}
61
+ // style={styles}
62
+ >
63
+ <div className={cn('opened-part__wrapper', {
64
+ 'opened-part__wrapper_right-position-once-element': isOptionsRight && (isCompact || isIntervalsHidden),
65
+ })}>
66
+ {!isIntervalsHidden && (
67
+ <div
68
+ className={cn(
69
+ 'opened-part__intervals-list',
70
+ // 'form-select-options',
71
+ // { 'form-select-options--short': short },
72
+ // { 'form-select-options--hoverable': isHoverable },
73
+ )}
74
+ >
75
+ {items.map((item, index) => (
76
+ <SelectItem
77
+ key={index}
78
+ item={item}
79
+ label={(txt?.labels && txt?.labels[item]) || intervals[item]?.label || item}
80
+ isActive={activeInterval === item}
81
+ onItemClick={() => handleItemClick(item.value || item)}
82
+ disabled={item === customKey}
83
+ />
84
+ ))}
85
+ </div>
86
+ )}
87
+ {!isCompact && (
88
+ <Datepicker
89
+ className={cn('opened-part__date-picker')}
90
+ buttonsTypes={buttonsTypes}
91
+ values={actualValues}
92
+ onChange={data => {
93
+ onChange({
94
+ intervalKey: current,
95
+ ...data,
96
+ });
97
+ toggleOff();
98
+ }}
99
+ getSelectedMode={getSelectedMode}
100
+ onChangeInterval={val => setCurrent(val)}
101
+ onChangeCompare={data => setIsCompare(data)}
102
+ onCancel={toggleOff}
103
+ isCompareHidden={isCompareHidden}
104
+ limitRange={limitRange}
105
+ setActiveInterval={setActiveInterval}
106
+ />
107
+ )}
108
+ </div>
109
+ </div>
110
+ );
111
+ });
112
+ export default OpenedPart;
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import cn from 'classnames';
3
+
4
+ const SelectItem = ({ item, label, isActive, onItemClick, onMouseEnter, disabled }) => (
5
+ <div
6
+ className={cn(
7
+ 'opened-part__intervals-item', {
8
+ 'opened-part__intervals-item_active': isActive,
9
+ 'opened-part__intervals-item_disabled': disabled,
10
+ }
11
+ )}
12
+ onClick={onItemClick}
13
+ onMouseEnter={onMouseEnter}
14
+ data-item={item}
15
+ >
16
+ {isActive && (
17
+ <svg className={cn('opened-part__intervals-item-icon-active')} width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
18
+ <path d="M13.3333 4L5.99999 11.3333L2.66666 8" stroke="black" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
19
+ </svg>
20
+ )}
21
+ {label}
22
+ </div>
23
+ );
24
+ export default SelectItem;