intelicoreact 0.0.51 → 0.0.62

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 (53) hide show
  1. package/dist/Atomic/FormElements/DateTime/DateTime.stories.js +1 -1
  2. package/dist/Atomic/FormElements/Input/Input.js +8 -7
  3. package/dist/Atomic/FormElements/Input/Input.stories.js +5 -1
  4. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.js +4 -4
  5. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.js +249 -0
  6. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.scss +569 -0
  7. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +87 -0
  8. package/dist/Atomic/FormElements/InputDateRange/components/Datepicker.js +486 -0
  9. package/dist/Atomic/FormElements/InputDateRange/components/OpenedPart.js +154 -0
  10. package/dist/Atomic/FormElements/InputDateRange/components/SelectItem.js +48 -0
  11. package/dist/Atomic/FormElements/InputDateRange/dependencies.js +241 -0
  12. package/dist/Atomic/FormElements/Modal/Modal.stories.js +64 -18
  13. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.js +162 -0
  14. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +101 -0
  15. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.stories.js +81 -0
  16. package/dist/Atomic/{FormElements/Calendar/Calendar.stories.js → UI/Arrow/Arrow.js} +52 -47
  17. package/dist/Atomic/UI/Arrow/Arrow.scss +19 -0
  18. package/dist/Atomic/UI/Arrow/Arrow.stories.js +46 -0
  19. package/dist/Atomic/UI/Button/Button.js +4 -2
  20. package/dist/Atomic/UI/Button/Button.scss +26 -0
  21. package/dist/Atomic/UI/Button/Button.stories.js +2 -2
  22. package/dist/Atomic/{FormElements → UI}/Calendar/Calendar.js +13 -9
  23. package/dist/Atomic/UI/Calendar/Calendar.scss +544 -0
  24. package/dist/Atomic/UI/Calendar/Calendar.stories.js +37 -0
  25. package/dist/Functions/utils.js +10 -2
  26. package/package.json +7 -5
  27. package/src/Atomic/FormElements/DateTime/DateTime.stories.js +1 -1
  28. package/src/Atomic/FormElements/Input/Input.js +8 -7
  29. package/src/Atomic/FormElements/Input/Input.stories.js +3 -1
  30. package/src/Atomic/FormElements/InputCalendar/InputCalendar.js +6 -6
  31. package/src/Atomic/FormElements/InputDateRange/InputDateRange.js +234 -0
  32. package/src/Atomic/FormElements/InputDateRange/InputDateRange.scss +569 -0
  33. package/src/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +58 -0
  34. package/src/Atomic/FormElements/InputDateRange/components/Datepicker.js +406 -0
  35. package/src/Atomic/FormElements/InputDateRange/components/OpenedPart.js +112 -0
  36. package/src/Atomic/FormElements/InputDateRange/components/SelectItem.js +26 -0
  37. package/src/Atomic/FormElements/InputDateRange/dependencies.js +153 -0
  38. package/src/Atomic/FormElements/Modal/Modal.stories.js +60 -15
  39. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.js +143 -0
  40. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +101 -0
  41. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.stories.js +54 -0
  42. package/src/Atomic/UI/Arrow/Arrow.js +41 -0
  43. package/src/Atomic/UI/Arrow/Arrow.scss +19 -0
  44. package/src/Atomic/UI/Arrow/Arrow.stories.js +32 -0
  45. package/src/Atomic/UI/Button/Button.js +3 -3
  46. package/src/Atomic/UI/Button/Button.scss +26 -0
  47. package/src/Atomic/UI/Button/Button.stories.js +4 -3
  48. package/src/Atomic/{FormElements → UI}/Calendar/Calendar.js +8 -9
  49. package/src/Atomic/UI/Calendar/Calendar.scss +544 -0
  50. package/src/Atomic/UI/Calendar/Calendar.stories.js +23 -0
  51. package/src/Functions/utils.js +6 -0
  52. package/dist/Atomic/FormElements/Calendar/Calendar.scss +0 -543
  53. package/src/Atomic/FormElements/Calendar/Calendar.scss +0 -543
@@ -1,8 +1,8 @@
1
1
  import React, { useState, useRef } from 'react';
2
- import { useClickOutside } from '../../../Functions/useClickOutside';
3
- import Calendar from '../Calendar/Calendar';
4
- import InputMask from 'react-input-mask';
5
2
  import moment from 'moment';
3
+ import InputMask from 'react-input-mask';
4
+ import Calendar from '../../UI/Calendar/Calendar';
5
+ import { useClickOutside } from '../../../Functions/useClickOutside';
6
6
 
7
7
  const InputCalendar = ({ data, params }) => {
8
8
  const [date, setDate] = useState(data);
@@ -12,7 +12,7 @@ const InputCalendar = ({ data, params }) => {
12
12
 
13
13
  useClickOutside(calendarRef, () => setIsOpened(false));
14
14
 
15
- const changeInputValue = (value) => {
15
+ const changeInputValue = value => {
16
16
  if (!value.includes('_') && value) {
17
17
  setDate(moment(value).format('L'));
18
18
  setInputValue(moment(value).format('L'));
@@ -21,7 +21,7 @@ const InputCalendar = ({ data, params }) => {
21
21
  }
22
22
  };
23
23
 
24
- const changeCalendarDay = (value) => {
24
+ const changeCalendarDay = value => {
25
25
  setDate(value);
26
26
  setInputValue(value);
27
27
  };
@@ -31,7 +31,7 @@ const InputCalendar = ({ data, params }) => {
31
31
  <InputMask
32
32
  mask="99/99/9999"
33
33
  value={inputValue}
34
- onChange={(e) => changeInputValue(e.target.value)}
34
+ onChange={e => changeInputValue(e.target.value)}
35
35
  className="calendar-dropdown"
36
36
  onFocus={() => setIsOpened(!isOpened)}
37
37
  />
@@ -0,0 +1,234 @@
1
+ import React, { useState, useEffect, useRef, useMemo } from 'react';
2
+ import cn from 'classnames';
3
+ import moment from 'moment-timezone';
4
+
5
+ import { useClickOutside, useToggle, getActualDateRange, INTERVALS, ALL_TIME_KEY, CUSTOM_INTERVAL_KEY_TEXT } from './dependencies';
6
+
7
+ import OpenedPart from './components/OpenedPart';
8
+ import Arrow from '../../UI/Arrow/Arrow';
9
+
10
+ import './InputDateRange.scss';
11
+
12
+ const InputDateRange = props => {
13
+ const {
14
+ txt,
15
+ id,
16
+ label,
17
+ className,
18
+ buttonsTypes,
19
+ value,
20
+ onChange = () => {},
21
+ error,
22
+ disabled,
23
+ isHoverable,
24
+ short,
25
+ isCompact = false,
26
+ // isFocused = false,
27
+ isIntervalsHidden = false,
28
+ isCompareHidden = false,
29
+ hideArrows = false,
30
+ isOptionsRight,
31
+ limitRange,
32
+ isUseAbs,
33
+ absTooltip
34
+ } = props;
35
+
36
+ const actualValues = getActualDateRange(value);
37
+ const { isToggled, toggle, toggleOn, toggleOff } = useToggle(false);
38
+ const [current, setCurrent] = useState(actualValues?.intervalKey);
39
+ const [isCompare, setIsCompare] = useState(actualValues?.compare);
40
+
41
+ const ref = !isUseAbs ? useClickOutside(toggleOff) : useRef(null);
42
+ const internalContainerRef = useRef(null);
43
+ const isEndDateNearFuture = moment(actualValues?.end).isSameOrAfter(moment());
44
+
45
+ const Range = () => {
46
+ const SYMBOLS_QUANTITY_IF_TIME_ADDED = 13;
47
+ const { start, end } = actualValues;
48
+ if (!start || !end) return null;
49
+
50
+ const startTime = moment(start).format('HH:mm');
51
+ const endTime = moment(end).format('HH:mm');
52
+
53
+ const firstPart = `${moment(start).format('ll')} ${startTime !== '00:00' ? `(${startTime})` : ''}`;
54
+ const secondPart = `${(endTime !== '00:00' ? moment(end) : moment(end).subtract(1, 'days')).format('ll')} ${
55
+ endTime !== '00:00' ? `(${endTime})` : ''
56
+ }`;
57
+
58
+ const getClasses = base =>
59
+ cn('date-range-input__range-text', {
60
+ 'date-range-input__range-text_little': base.length > SYMBOLS_QUANTITY_IF_TIME_ADDED
61
+ });
62
+
63
+ return (
64
+ <>
65
+ <span className={getClasses(firstPart)}>
66
+ {firstPart}
67
+ {endTime === '00:00' && moment(end).isSame(moment(start).add(1, 'days'), 'day') ? '' : ` - `}
68
+ </span>
69
+ {endTime === '00:00' && moment(end).isSame(moment(start).add(1, 'days'), 'day') ? null : (
70
+ <span className={getClasses(secondPart)}>{secondPart}</span>
71
+ )}
72
+ </>
73
+ );
74
+ };
75
+
76
+ const slideInterval = (direction = 'forward') => {
77
+ const { start, end } = actualValues;
78
+ const intervalHoursCount = moment(end).diff(start, 'hours');
79
+ let newEnd;
80
+ let newStart;
81
+ const endHours = moment(end).hours();
82
+ const startHours = moment(start).hours();
83
+ if (direction === 'forward') {
84
+ newStart = moment(end)
85
+ .add(endHours === 0 ? 0 : 1, 'day')
86
+ .hours(startHours)
87
+ .toDate();
88
+ newEnd = moment(newStart).add(intervalHoursCount, 'hours');
89
+ } else {
90
+ newEnd = moment(start)
91
+ .subtract(endHours === 0 ? 0 : 1, 'day')
92
+ .hours(endHours)
93
+ .toDate();
94
+ newStart = moment(newEnd).subtract(intervalHoursCount, 'hours');
95
+ }
96
+ const startPrevDate = moment(newStart).subtract(intervalHoursCount, 'hours').subtract(1, 'seconds');
97
+ const endPrevDate = moment(newEnd).subtract(1, 'seconds');
98
+ onChange({
99
+ ...value,
100
+ intervalKey: getActualDateRange({
101
+ start: newStart,
102
+ end: newEnd
103
+ })?.intervalKey,
104
+ start: newStart,
105
+ end: newEnd,
106
+ startPrevDate,
107
+ endPrevDate
108
+ });
109
+ };
110
+
111
+ const handleArrowClick = type => {
112
+ slideInterval(type === 'right' ? 'forward' : 'back');
113
+ toggleOff();
114
+ };
115
+
116
+ const absData = useMemo(
117
+ () => ({
118
+ body: OpenedPart,
119
+ props: {
120
+ ...props,
121
+ key: `${actualValues.start}-${actualValues.end}-${actualValues.intervalKey}-${current}-${isCompare}`,
122
+ actualValues,
123
+ current,
124
+ setCurrent,
125
+ isCompare,
126
+ setIsCompare,
127
+ toggleOff,
128
+ onChange
129
+ },
130
+ clickOutsideCallback: () => toggleOff(),
131
+ top: internalContainerRef.current?.getBoundingClientRect()?.bottom || 0,
132
+ left: internalContainerRef.current?.getBoundingClientRect()?.left || 0
133
+ }),
134
+ [isToggled, value, actualValues, current, isCompare]
135
+ );
136
+
137
+ useEffect(() => {
138
+ if (current && isUseAbs && absTooltip) onChange(current, 'absTooltip/props/current');
139
+ }, [current]);
140
+
141
+ useEffect(() => {
142
+ if (isUseAbs) onChange(isToggled ? absData : null, 'absTooltip');
143
+ }, [isToggled]);
144
+
145
+ return (
146
+ <div
147
+ ref={internalContainerRef}
148
+ className={cn('date-range-input', className, {
149
+ 'date-range-input_compact': isCompact,
150
+ 'date-range-input_hide-arrows': hideArrows,
151
+ 'date-range-input_focused': isToggled,
152
+ 'date-range-input_error': error,
153
+ 'date-range-input_disabled': disabled
154
+ })}
155
+ >
156
+ <span className="date-range-input__label">{label}</span>
157
+ <div className="date-range-input__wraper" ref={ref} onMouseEnter={isHoverable && toggleOn} onMouseLeave={isHoverable && toggleOff}>
158
+ <div
159
+ className={cn('date-range-input__absolut-wraper', {
160
+ 'date-range-input__absolut-wraper_right-position': isOptionsRight
161
+ })}
162
+ >
163
+ <div className={cn('date-range-input__static-part')}>
164
+ <button
165
+ id={id}
166
+ className={cn('date-range-input__toggle-button')}
167
+ // className={cn(
168
+ // 'date-range-input__toggle-button',
169
+ // { 'form-select__input--disabled': disabled },
170
+ // { 'form-select__input--opened': isToggled },
171
+ // { 'form-select__input--focused': isToggled },
172
+ // className,
173
+ // )}
174
+ disabled={disabled}
175
+ onClick={!disabled && !isHoverable ? toggle : undefined}
176
+ >
177
+ <div className="date-range-input__interval-key">
178
+ <span>
179
+ {(txt?.labels && txt.labels[actualValues?.intervalKey]) ??
180
+ (INTERVALS[actualValues?.intervalKey]?.label || CUSTOM_INTERVAL_KEY_TEXT)}
181
+ </span>
182
+ {current !== ALL_TIME_KEY && <span>:</span>}
183
+ </div>
184
+ {!isCompact && (
185
+ <div className={cn('date-range-input__range', {})}>
186
+ <Range />
187
+ </div>
188
+ )}
189
+ </button>
190
+ {!isCompact && !hideArrows && (
191
+ <div className={cn('date-range-input__arrows-block')}>
192
+ <Arrow
193
+ type="left"
194
+ className="date-range-input__arrow"
195
+ onClick={() => handleArrowClick('left')}
196
+ disabled={disabled || actualValues?.intervalKey === ALL_TIME_KEY}
197
+ />
198
+ <Arrow
199
+ type="right"
200
+ className="date-range-input__arrow"
201
+ onClick={() => handleArrowClick('right')}
202
+ disabled={
203
+ disabled ||
204
+ actualValues?.intervalKey === ALL_TIME_KEY ||
205
+ actualValues?.intervalKey === 'today' ||
206
+ moment(actualValues?.end)
207
+ .add(moment(actualValues?.end).diff(actualValues?.start, 'hours'), 'hours')
208
+ .isAfter(moment().add(1, 'day').startOf('day'))
209
+ }
210
+ />
211
+ </div>
212
+ )}
213
+ </div>
214
+ {isToggled && !isUseAbs && (
215
+ <OpenedPart
216
+ {...props}
217
+ ref={internalContainerRef}
218
+ actualValues={actualValues}
219
+ current={current}
220
+ setCurrent={setCurrent}
221
+ isCompare={isCompare}
222
+ setIsCompare={setIsCompare}
223
+ toggleOff={toggleOff}
224
+ onChange={onChange}
225
+ />
226
+ )}
227
+ </div>
228
+ </div>
229
+ {error && <span className="date-range-input__error-block">{error}</span>}
230
+ </div>
231
+ );
232
+ };
233
+
234
+ export default React.memo(InputDateRange);