intelicoreact 0.0.2 → 0.0.6

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 (208) hide show
  1. package/.eslintignore +10 -0
  2. package/.eslintrc.json +93 -0
  3. package/dist/Atomic/FormElements/Calendar/Calendar.js +145 -0
  4. package/dist/Atomic/FormElements/Calendar/Calendar.scss +543 -0
  5. package/dist/Atomic/FormElements/Calendar/Calendar.stories.js +33 -0
  6. package/dist/Atomic/FormElements/CheckboxInput/CheckboxInput.scss +3 -5
  7. package/dist/Atomic/FormElements/CheckboxInput/CheckboxInput.stories.js +2 -5
  8. package/dist/Atomic/FormElements/DateTime/DateTime.stories.js +1 -3
  9. package/dist/Atomic/FormElements/DoubleString/DoubleString.stories.js +0 -2
  10. package/dist/Atomic/FormElements/Dropdown/Dropdown.js +19 -19
  11. package/dist/Atomic/FormElements/Dropdown/Dropdown.scss +8 -3
  12. package/dist/Atomic/FormElements/Dropdown/Dropdown.stories.js +20 -7
  13. package/dist/Atomic/FormElements/Header/Header.js +9 -11
  14. package/dist/Atomic/FormElements/Header/Header.scss +16 -5
  15. package/dist/Atomic/FormElements/Header/Header.stories.js +0 -2
  16. package/dist/Atomic/FormElements/Input/Input.js +94 -102
  17. package/dist/Atomic/FormElements/Input/Input.scss +26 -19
  18. package/dist/Atomic/FormElements/Input/Input.stories.js +42 -27
  19. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.js +89 -0
  20. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +46 -0
  21. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +238 -0
  22. package/dist/Atomic/FormElements/InputDateRange/components/Datepicker.js +468 -0
  23. package/dist/Atomic/FormElements/InputDateRange/components/InputDateRange.js +248 -0
  24. package/dist/Atomic/FormElements/InputDateRange/components/InputDateRange.scss +598 -0
  25. package/dist/Atomic/FormElements/InputDateRange/components/OpenedPart.js +147 -0
  26. package/dist/Atomic/FormElements/InputDateRange/components/SelectItem.js +38 -0
  27. package/dist/Atomic/FormElements/InputDateRange/index.js +248 -0
  28. package/dist/Atomic/FormElements/InputsRow/InputsRow.js +30 -7
  29. package/dist/Atomic/FormElements/InputsRow/InputsRow.scss +1 -3
  30. package/dist/Atomic/FormElements/InputsRow/InputsRow.stories.js +0 -2
  31. package/dist/Atomic/FormElements/Label/Label.js +5 -14
  32. package/dist/Atomic/FormElements/Label/Label.scss +3 -3
  33. package/dist/Atomic/FormElements/Label/Label.stories.js +5 -6
  34. package/dist/Atomic/FormElements/Modal/Modal.js +5 -7
  35. package/dist/Atomic/FormElements/Modal/Modal.scss +61 -7
  36. package/dist/Atomic/FormElements/Modal/Modal.stories.js +64 -18
  37. package/dist/Atomic/FormElements/MultiSelect/MultiSelect.js +3 -5
  38. package/dist/Atomic/FormElements/MultiSelect/MultiSelect.scss +1 -3
  39. package/dist/Atomic/FormElements/MultiSelect/MultiSelect.stories.js +0 -2
  40. package/dist/Atomic/FormElements/NavLine/NavLine.js +2 -2
  41. package/dist/Atomic/FormElements/NavLine/NavLine.scss +4 -6
  42. package/dist/Atomic/FormElements/NavLine/NavLine.stories.js +21 -13
  43. package/dist/Atomic/FormElements/RadioInput/RadioInput.scss +1 -1
  44. package/dist/Atomic/FormElements/RadioInput/RadioInput.stories.js +0 -2
  45. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.js +162 -0
  46. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +101 -0
  47. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.stories.js +81 -0
  48. package/dist/Atomic/FormElements/RangeInputs/RangeInputs.stories.js +0 -2
  49. package/dist/Atomic/FormElements/Switcher/Switcher.js +1 -1
  50. package/dist/Atomic/FormElements/Switcher/Switcher.scss +1 -1
  51. package/dist/Atomic/FormElements/Switcher/Switcher.stories.js +0 -2
  52. package/dist/Atomic/FormElements/Table/Partials/TdCell.js +1 -1
  53. package/dist/Atomic/FormElements/Table/Partials/TdHeader.js +2 -2
  54. package/dist/Atomic/FormElements/Table/TdTypes/TdActions.js +5 -5
  55. package/dist/Atomic/FormElements/Table/TdTypes/TdPriority.js +3 -3
  56. package/dist/Atomic/FormElements/Table/TdTypes/TdTypes.scss +4 -6
  57. package/dist/Atomic/FormElements/Table/TdTypes/TdWeight.js +2 -2
  58. package/dist/Atomic/FormElements/Tag/Tag.js +2 -2
  59. package/dist/Atomic/FormElements/Tag/Tag.scss +1 -1
  60. package/dist/Atomic/FormElements/Tag/Tag.stories.js +0 -2
  61. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.js +3 -3
  62. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.scss +1 -1
  63. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.stories.js +0 -2
  64. package/dist/Atomic/FormElements/TextSwitcher/TextSwitcher.scss +1 -1
  65. package/dist/Atomic/FormElements/TextSwitcher/TextSwitcher.stories.js +0 -2
  66. package/dist/Atomic/FormElements/Textarea/Textarea.scss +1 -1
  67. package/dist/Atomic/FormElements/Textarea/Textarea.stories.js +0 -2
  68. package/dist/Atomic/FormElements/TimeRange/TimeRange.js +1 -1
  69. package/dist/Atomic/FormElements/TimeRange/TimeRange.stories.js +0 -2
  70. package/dist/Atomic/{FormElements/MainMenu → MainMenu}/MainMenu.js +5 -5
  71. package/dist/Atomic/{FormElements/MainMenu → MainMenu}/MainMenu.scss +2 -2
  72. package/dist/Atomic/{FormElements/MainMenu → MainMenu}/MainMenu.stories.js +11 -11
  73. package/dist/Atomic/UI/Accordion/Accordion.js +2 -2
  74. package/dist/Atomic/UI/Accordion/Accordion.stories.js +4 -4
  75. package/dist/Atomic/UI/Accordion/AccordionItem.js +3 -3
  76. package/dist/Atomic/UI/AdvancedTag/AdvTag.js +3 -3
  77. package/dist/Atomic/UI/AdvancedTag/AdvancedTags.js +4 -3
  78. package/dist/Atomic/UI/AdvancedTag/AdvancedTags.scss +3 -5
  79. package/dist/Atomic/UI/AdvancedTag/AdvancedTags.stories.js +1 -3
  80. package/dist/Atomic/UI/Alert/Alert.js +7 -4
  81. package/dist/Atomic/UI/Alert/Alert.scss +7 -0
  82. package/dist/Atomic/UI/Alert/Alert.stories.js +1 -3
  83. package/dist/Atomic/UI/Arrow/Arrow.js +80 -0
  84. package/dist/Atomic/UI/Arrow/Arrow.scss +22 -0
  85. package/dist/Atomic/UI/Arrow/Arrow.stories.js +46 -0
  86. package/dist/Atomic/UI/Button/Button.js +10 -19
  87. package/dist/Atomic/UI/Button/Button.scss +69 -41
  88. package/dist/Atomic/UI/Button/Button.stories.js +9 -25
  89. package/dist/Atomic/UI/Calendar/Calendar.js +145 -0
  90. package/dist/Atomic/UI/Calendar/Calendar.scss +544 -0
  91. package/dist/Atomic/UI/Calendar/Calendar.stories.js +37 -0
  92. package/dist/Atomic/UI/Header/partials/default_ava.png +0 -0
  93. package/dist/Atomic/{FormElements → UI}/Hint/Hint.js +8 -13
  94. package/{src/Atomic/FormElements → dist/Atomic/UI}/Hint/Hint.scss +8 -12
  95. package/dist/Atomic/{FormElements → UI}/Hint/Hint.stories.js +3 -4
  96. package/dist/Atomic/UI/Price/Price.js +33 -0
  97. package/dist/Atomic/UI/Price/Price.stories.js +42 -0
  98. package/dist/Atomic/{FormElements → UI}/Status/Status.js +4 -6
  99. package/dist/Atomic/{FormElements → UI}/Status/Status.scss +0 -0
  100. package/dist/Atomic/{FormElements → UI}/Status/Status.stories.js +4 -3
  101. package/dist/Functions/useClickOutside.js +25 -0
  102. package/dist/Functions/utils.js +10 -2
  103. package/dist/Molecular/FormElements/FormElement.js +40 -0
  104. package/dist/Molecular/FormElements/FormElement.scss +8 -0
  105. package/dist/Molecular/FormElements/FormElement.stories.js +73 -0
  106. package/dist/scss/main.scss +2 -2
  107. package/package.json +10 -6
  108. package/src/Atomic/FormElements/CheckboxInput/CheckboxInput.scss +3 -5
  109. package/src/Atomic/FormElements/CheckboxInput/CheckboxInput.stories.js +3 -5
  110. package/src/Atomic/FormElements/DateTime/DateTime.stories.js +1 -3
  111. package/src/Atomic/FormElements/DoubleString/DoubleString.stories.js +0 -2
  112. package/src/Atomic/FormElements/Dropdown/Dropdown.js +12 -8
  113. package/src/Atomic/FormElements/Dropdown/Dropdown.scss +8 -3
  114. package/src/Atomic/FormElements/Dropdown/Dropdown.stories.js +15 -7
  115. package/src/Atomic/FormElements/Header/Header.js +9 -10
  116. package/src/Atomic/FormElements/Header/Header.scss +16 -5
  117. package/src/Atomic/FormElements/Header/Header.stories.js +0 -2
  118. package/src/Atomic/FormElements/Input/Input.js +79 -73
  119. package/src/Atomic/FormElements/Input/Input.scss +26 -19
  120. package/src/Atomic/FormElements/Input/Input.stories.js +28 -29
  121. package/src/Atomic/FormElements/InputCalendar/InputCalendar.js +43 -0
  122. package/src/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +27 -0
  123. package/src/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +142 -0
  124. package/src/Atomic/FormElements/InputDateRange/components/Datepicker.js +394 -0
  125. package/src/Atomic/FormElements/InputDateRange/components/InputDateRange.js +230 -0
  126. package/src/Atomic/FormElements/InputDateRange/components/InputDateRange.scss +598 -0
  127. package/src/Atomic/FormElements/InputDateRange/components/OpenedPart.js +109 -0
  128. package/src/Atomic/FormElements/InputDateRange/components/SelectItem.js +22 -0
  129. package/src/Atomic/FormElements/InputDateRange/index.js +157 -0
  130. package/src/Atomic/FormElements/InputsRow/InputsRow.js +28 -5
  131. package/src/Atomic/FormElements/InputsRow/InputsRow.scss +1 -3
  132. package/src/Atomic/FormElements/InputsRow/InputsRow.stories.js +0 -2
  133. package/src/Atomic/FormElements/Label/Label.js +4 -9
  134. package/src/Atomic/FormElements/Label/Label.scss +3 -3
  135. package/src/Atomic/FormElements/Label/Label.stories.js +6 -6
  136. package/src/Atomic/FormElements/Modal/Modal.js +5 -8
  137. package/src/Atomic/FormElements/Modal/Modal.scss +61 -7
  138. package/src/Atomic/FormElements/Modal/Modal.stories.js +60 -15
  139. package/src/Atomic/FormElements/MultiSelect/MultiSelect.js +3 -5
  140. package/src/Atomic/FormElements/MultiSelect/MultiSelect.scss +1 -3
  141. package/src/Atomic/FormElements/MultiSelect/MultiSelect.stories.js +1 -2
  142. package/src/Atomic/FormElements/NavLine/NavLine.js +4 -4
  143. package/src/Atomic/FormElements/NavLine/NavLine.scss +4 -6
  144. package/src/Atomic/FormElements/NavLine/NavLine.stories.js +24 -14
  145. package/src/Atomic/FormElements/RadioInput/RadioInput.scss +1 -1
  146. package/src/Atomic/FormElements/RadioInput/RadioInput.stories.js +0 -2
  147. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.js +143 -0
  148. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +101 -0
  149. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.stories.js +54 -0
  150. package/src/Atomic/FormElements/RangeInputs/RangeInputs.stories.js +0 -1
  151. package/src/Atomic/FormElements/Switcher/Switcher.js +1 -1
  152. package/src/Atomic/FormElements/Switcher/Switcher.scss +1 -1
  153. package/src/Atomic/FormElements/Switcher/Switcher.stories.js +0 -2
  154. package/src/Atomic/FormElements/Table/Partials/TdCell.js +1 -1
  155. package/src/Atomic/FormElements/Table/Partials/TdHeader.js +1 -1
  156. package/src/Atomic/FormElements/Table/TdTypes/TdActions.js +5 -5
  157. package/src/Atomic/FormElements/Table/TdTypes/TdPriority.js +3 -3
  158. package/src/Atomic/FormElements/Table/TdTypes/TdTypes.scss +4 -6
  159. package/src/Atomic/FormElements/Table/TdTypes/TdWeight.js +2 -2
  160. package/src/Atomic/FormElements/Tag/Tag.js +2 -2
  161. package/src/Atomic/FormElements/Tag/Tag.scss +1 -1
  162. package/src/Atomic/FormElements/Tag/Tag.stories.js +0 -2
  163. package/src/Atomic/FormElements/TagsDropdown/TagsDropdown.js +3 -3
  164. package/src/Atomic/FormElements/TagsDropdown/TagsDropdown.scss +1 -1
  165. package/src/Atomic/FormElements/TagsDropdown/TagsDropdown.stories.js +0 -2
  166. package/src/Atomic/FormElements/TextSwitcher/TextSwitcher.scss +1 -1
  167. package/src/Atomic/FormElements/TextSwitcher/TextSwitcher.stories.js +0 -2
  168. package/src/Atomic/FormElements/Textarea/Textarea.scss +1 -1
  169. package/src/Atomic/FormElements/Textarea/Textarea.stories.js +0 -2
  170. package/src/Atomic/FormElements/TimeRange/TimeRange.js +1 -1
  171. package/src/Atomic/FormElements/TimeRange/TimeRange.stories.js +0 -2
  172. package/src/Atomic/{FormElements/MainMenu → MainMenu}/MainMenu.js +5 -5
  173. package/src/Atomic/{FormElements/MainMenu → MainMenu}/MainMenu.scss +2 -2
  174. package/src/Atomic/{FormElements/MainMenu → MainMenu}/MainMenu.stories.js +11 -11
  175. package/src/Atomic/UI/Accordion/Accordion.js +2 -2
  176. package/src/Atomic/UI/Accordion/Accordion.stories.js +4 -4
  177. package/src/Atomic/UI/Accordion/AccordionItem.js +3 -3
  178. package/src/Atomic/UI/AdvancedTag/AdvTag.js +3 -3
  179. package/src/Atomic/UI/AdvancedTag/AdvancedTags.js +3 -3
  180. package/src/Atomic/UI/AdvancedTag/AdvancedTags.scss +3 -5
  181. package/src/Atomic/UI/AdvancedTag/AdvancedTags.stories.js +1 -3
  182. package/src/Atomic/UI/Alert/Alert.js +9 -6
  183. package/src/Atomic/UI/Alert/Alert.scss +7 -0
  184. package/src/Atomic/UI/Alert/Alert.stories.js +1 -3
  185. package/src/Atomic/UI/Arrow/Arrow.js +41 -0
  186. package/src/Atomic/UI/Arrow/Arrow.scss +22 -0
  187. package/src/Atomic/UI/Arrow/Arrow.stories.js +32 -0
  188. package/src/Atomic/UI/Button/Button.js +6 -10
  189. package/src/Atomic/UI/Button/Button.scss +69 -41
  190. package/src/Atomic/UI/Button/Button.stories.js +9 -25
  191. package/src/Atomic/UI/Calendar/Calendar.js +109 -0
  192. package/src/Atomic/UI/Calendar/Calendar.scss +544 -0
  193. package/src/Atomic/UI/Calendar/Calendar.stories.js +23 -0
  194. package/src/Atomic/UI/Header/partials/default_ava.png +0 -0
  195. package/src/Atomic/{FormElements → UI}/Hint/Hint.js +6 -9
  196. package/{dist/Atomic/FormElements → src/Atomic/UI}/Hint/Hint.scss +8 -12
  197. package/src/Atomic/{FormElements → UI}/Hint/Hint.stories.js +3 -3
  198. package/src/Atomic/UI/Price/Price.js +20 -0
  199. package/src/Atomic/UI/Price/Price.stories.js +30 -0
  200. package/src/Atomic/{FormElements → UI}/Status/Status.js +2 -4
  201. package/src/Atomic/{FormElements → UI}/Status/Status.scss +0 -0
  202. package/src/Atomic/{FormElements → UI}/Status/Status.stories.js +4 -3
  203. package/src/Functions/useClickOutside.js +15 -0
  204. package/src/Functions/utils.js +6 -0
  205. package/src/Molecular/FormElements/FormElement.js +18 -0
  206. package/src/Molecular/FormElements/FormElement.scss +8 -0
  207. package/src/Molecular/FormElements/FormElement.stories.js +59 -0
  208. package/src/scss/main.scss +2 -2
@@ -0,0 +1,142 @@
1
+ import React, { useState } from 'react';
2
+ import InputDateRange from '.';
3
+ import Table from '../Table/Table';
4
+
5
+ global.lng = 'en';
6
+
7
+ export default {
8
+ title: 'Form Elements/InputDateRange',
9
+ component: InputDateRange,
10
+ argTypes: {
11
+ // status: {
12
+ // control: {
13
+ // type: 'select',
14
+ // options: ['admin', 'user']
15
+ // }
16
+ // }
17
+ }
18
+ };
19
+
20
+ const tableData = {
21
+ header: [
22
+ { id: 1, label: 'state' },
23
+ { id: 2, label: 'Tags' },
24
+ { id: 3, label: 'status' },
25
+ { id: 4, label: 'loanAmountApproved' },
26
+ { id: 5, label: 'loanAmountRejected' },
27
+ { id: 6, label: 'approveRate' },
28
+ { id: 7, label: 'actions', type: 'actions' }
29
+ ],
30
+ rows: [
31
+ {
32
+ id: 1,
33
+ link: { label: 'CA', link: '#s' },
34
+ tags: [{ label: 'Label 1' }],
35
+ status: { value: '90', status: 'active' },
36
+ loanAmountApproved: { value: '$70,000' },
37
+ loanAmountRejected: { value: '$30,000' },
38
+ approveRate: { value: '70%' }
39
+ },
40
+ {
41
+ id: 2,
42
+ link: { label: 'NY', link: '#s' },
43
+ advancedTags: [
44
+ {
45
+ labelLeft: 'home',
46
+ labelRight: 'hoods',
47
+ active: 3,
48
+ pause: 1,
49
+ merchants: 5
50
+ },
51
+ {
52
+ labelRight: 'jewelry',
53
+ active: 3,
54
+ pause: 1,
55
+ merchants: 5
56
+ },
57
+ {
58
+ labelLeft: 'home',
59
+ labelRight: 'improvement',
60
+ active: 0,
61
+ pause: 0,
62
+ warnLeft: true,
63
+ warnLeftMsg: 'landerNotIncluded',
64
+ warnRightMsg: 'noMerchants'
65
+ },
66
+ {
67
+ labelLeft: 'home',
68
+ labelRight: 'hoods',
69
+ active: 3,
70
+ pause: 1,
71
+ merchants: 5
72
+ },
73
+ {
74
+ labelRight: 'jewelry',
75
+ active: 3,
76
+ pause: 1,
77
+ merchants: 5
78
+ }
79
+ ],
80
+ status: { label: 'Active', className: 'color--green-haze' },
81
+ loanAmountApproved: { value: '$3,000' },
82
+ loanAmountRejected: { value: '$7,000' },
83
+ approveRate: { value: '30%' }
84
+ },
85
+ {
86
+ id: 3,
87
+ link: { label: 'NH', link: '#s' },
88
+ tags: [{ label: 'Label 1' }, { label: 'Label 2' }, { label: 'Label 3' }],
89
+ status: { status: 'error' },
90
+ loanAmountApproved: { value: '$70,000' },
91
+ loanAmountRejected: { value: '$30,000' },
92
+ approveRate: { value: '70%' }
93
+ }
94
+ ]
95
+ };
96
+
97
+ const Template = args => {
98
+ const { dateRange, ...restOfProps } = args;
99
+ const [value, setValue] = useState(dateRange);
100
+
101
+ const [state, setState] = useState(tableData);
102
+
103
+ const rowsWithActions = state?.rows?.map(row => ({
104
+ ...row,
105
+ actions: row.isDeleted ? [{ type: 'undo' }] : [{ type: 'download' }, { type: 'edit' }, { type: 'delete' }]
106
+ }));
107
+
108
+ // return <InputDateRange {...restOfProps} value={value} onChange={setValue} />;
109
+ return (
110
+ <div>
111
+ <div className="mb20">
112
+ <InputDateRange {...restOfProps} value={value} onChange={setValue} />
113
+ </div>
114
+ <div>
115
+ <Table header={state.header} rows={rowsWithActions} onChange={setState} />
116
+ </div>
117
+ </div>
118
+ );
119
+ };
120
+
121
+ export const InputDateRangeTemplate = Template.bind({});
122
+
123
+ InputDateRangeTemplate.args = {
124
+ txt: {},
125
+ label: 'Date Range',
126
+ dateRange: { intervalKey: 'today'},
127
+ id: 'anyToggleButtonId',
128
+ className: 'anyExternalContainerClassName',
129
+ error: false,
130
+ disabled: false,
131
+ isHoverable: false,
132
+ // short: true,
133
+ isCompact: false,
134
+ // isFocused: true,
135
+ isIntervalsHidden: false,
136
+ isCompareHidden: true,
137
+ hideArrows: false,
138
+ isOptionsRight: false,
139
+ // limitRange,
140
+ // isUseAbs,
141
+ // absTooltip
142
+ };
@@ -0,0 +1,394 @@
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 SelectInput from '../../Dropdown/Dropdown';
7
+ import TextInput from '../../Input/Input';
8
+ import Btn from '../../../UI/Button/Button';
9
+ // import Switcher from '../../Switcher/Switcher';
10
+ import Calendar from '../../RangeCalendar/RangeCalendar';
11
+
12
+ const padTime = time => {
13
+ return `${time.toString().padStart(2, '0')}:00`;
14
+ };
15
+
16
+ const handleDateInputOnChange = value => {
17
+ const replace = val => val.replace(/[^0-9\/]/g, '');
18
+
19
+ const input = replace(value);
20
+ const lastSymbol = input ? input.slice(-1) : '';
21
+ const previousValue = input ? input.slice(0, input.length - 1) : '';
22
+
23
+ if (value.length > 10 || lastSymbol === '/') return previousValue;
24
+ return previousValue.length === 2 || previousValue.length === 5 ? previousValue + '/' + lastSymbol : input;
25
+ };
26
+
27
+ const Datepicker = props => {
28
+ const {
29
+ txt,
30
+ className,
31
+ values = {},
32
+ onChange,
33
+ onChangeCompare,
34
+ onCancel,
35
+ getSelectedMode,
36
+ onChangeInterval,
37
+ isCompareHidden,
38
+ limitRange,
39
+ } = props;
40
+ const { start = null, end = null, compare = false } = values;
41
+ const startDateInputRef = useRef(null);
42
+ const endDateInputRef = useRef(null);
43
+
44
+ const [startDate, setStartDate] = useState(start);
45
+ const [endDate, setEndDate] = useState(end);
46
+ const dateInterval = getSelectedMode({ start: startDate, end: endDate });
47
+
48
+ const [startDateInput, setStartDateInput] = useState(start);
49
+ const [endDateInput, setEndDateInput] = useState(end);
50
+ const [startHour, setStartHour] = useState(start ? moment(start).hour() : 0);
51
+ const [endHour, setEndHour] = useState(end ? moment(end).hour() : 0);
52
+ // eslint-disable-next-line no-unused-vars
53
+ const [isCompare, setIsCompare] = useState(compare);
54
+ const [date1, setDate1] = useState(start ? moment(start).toDate() : moment().subtract(1, 'month').toDate());
55
+ const [date2, setDate2] = useState(end ? moment(end).toDate() : moment().toDate());
56
+ const [isStartFocused, setIsStartFocused] = useState(false);
57
+ const [isEndFocused, setIsEndFocused] = useState(false);
58
+ const [hoverStatus, setHoverStatus] = useState(null);
59
+
60
+ const isNearby = useMemo(() => moment(date2).subtract(1, 'month').isSame(moment(date1), 'month'), [date1, date2]);
61
+
62
+ const isPreviousPeriodShowed = useMemo(
63
+ () => isCompare && !isCompareHidden && startDate && endDate,
64
+ [startDate, endDate, isCompare],
65
+ );
66
+
67
+ const prevEndHour = useRef(endHour);
68
+
69
+ const getStartHourItems = () =>
70
+ [...Array(24).keys()].map(hour => ({
71
+ label: padTime(hour),
72
+ value: hour,
73
+ disabled: moment(startDate).isSame(endDate, 'day') && endHour <= hour,
74
+ }));
75
+ const getEndHourItems = () =>
76
+ [...Array(24).keys()].map(hour => ({
77
+ label: padTime(hour + 1),
78
+ value: hour === 23 ? 0 : hour + 1,
79
+ disabled:
80
+ (moment(startDate).isSame(endDate, 'day') ||
81
+ (moment(startDate).isSame(moment(endDate).subtract(1, 'days'), 'day') && endHour === 0)) &&
82
+ hour < startHour,
83
+ }));
84
+
85
+ const startPrevDate = useMemo(() => {
86
+ if (isPreviousPeriodShowed) {
87
+ const intervalHoursCount = moment(endDate).diff(startDate, 'hours');
88
+ return moment(startDate).subtract(intervalHoursCount, 'hours').toDate();
89
+ } else return null;
90
+ }, [startDate, endDate, isCompare]);
91
+
92
+ const endPrevDate = useMemo(() => {
93
+ if (isPreviousPeriodShowed) {
94
+ return startDate;
95
+ } else return null;
96
+ }, [startDate, endDate, isCompare]);
97
+
98
+ const title = useMemo(() => {
99
+ if (isCompare && !isCompareHidden && startDate && endDate) {
100
+ return `${moment(startPrevDate).format('ll')} (${moment(startPrevDate).format('HH:mm')}) - ${moment(
101
+ endPrevDate,
102
+ ).format('ll')} (${moment(endPrevDate).format('HH:mm')})`;
103
+ } else return '';
104
+ }, [startDate, endDate, isCompare]);
105
+
106
+ const subtractDay = date => (endHour === 0 ? moment(date).subtract(1, 'days') : date);
107
+ const addDay = date => (endHour === 0 ? moment(date).add(1, 'days') : date);
108
+
109
+ useEffect(() => {
110
+ if (moment(startDate).isSameOrAfter(endDate)) {
111
+ setStartDate(moment(endDate).subtract(1, 'd').toDate());
112
+ setDate1(moment(endDate).subtract(1, 'd'));
113
+ }
114
+ }, [startDate]);
115
+
116
+ useEffect(() => {
117
+ if (moment(endDate).isSameOrBefore(startDate)) {
118
+ setEndDate(moment(startDate).add(1, 'd').toDate());
119
+ setDate2(moment(startDate).add(1, 'd'));
120
+ }
121
+ }, [endDate]);
122
+
123
+ useEffect(() => {
124
+ setStartDateInput(startDate);
125
+ setEndDateInput(endDate);
126
+ if (moment(startDate).isBefore(moment(endDate), 'month')) {
127
+ setDate1(moment(startDate));
128
+ setDate2(moment(endDate));
129
+ }
130
+ }, [startDate, endDate]);
131
+
132
+ useEffect(() => {
133
+ if (moment(date1).isSameOrAfter(moment(date2), 'month')) {
134
+ setDate1(moment(date2).subtract(1, 'month'));
135
+ }
136
+ }, [date1, date2]);
137
+
138
+ useEffect(() => {
139
+ onChangeInterval(dateInterval);
140
+ }, [dateInterval]);
141
+
142
+ const handleClick = date => {
143
+ prevEndHour.current = 0;
144
+ if (
145
+ !startDate ||
146
+ (startDate && endDate && !(moment(startDate).add(1, 'd').isSame(endDate, 'day') && endHour === 0))
147
+ ) {
148
+ setStartDate(moment(date).startOf('day').toDate());
149
+ setEndDate(moment(date).add(1, 'd').startOf('day').toDate());
150
+ setStartHour(0);
151
+ setEndHour(0);
152
+ } else if (moment(date).isBefore(moment(startDate), 'day')) {
153
+ setEndDate(moment(startDate).add(1, 'd').startOf('day').toDate());
154
+ setStartDate(moment(date).set('hour', parseInt(startHour, 10)).toDate());
155
+ } else if (moment(date).isAfter(moment(startDate), 'day')) {
156
+ setEndDate(moment(date).add(1, 'd').startOf('day').toDate());
157
+ }
158
+ setHoverStatus(null);
159
+ };
160
+
161
+ let timerId;
162
+
163
+ const handleHover = date => {
164
+ if (!date) {
165
+ timerId = setTimeout(() => {
166
+ setHoverStatus(null);
167
+ }, 400);
168
+ return;
169
+ }
170
+ if (timerId) clearTimeout(timerId);
171
+ if (moment(startDate).add(1, 'd').isSame(endDate, 'day') && endHour === 0) {
172
+ if (moment(date).isAfter(moment(startDate), 'day')) setHoverStatus('end');
173
+ else if (moment(date).isBefore(moment(startDate), 'day')) setHoverStatus('start');
174
+ else setHoverStatus(null);
175
+ } else {
176
+ setHoverStatus('start');
177
+ }
178
+ };
179
+
180
+ const handleChangeStartHour = val => {
181
+ setStartHour(+val);
182
+ setStartDate(
183
+ moment(startDate)
184
+ .set('hour', +val)
185
+ .toDate(),
186
+ );
187
+ };
188
+
189
+ const handleChangeEndHour = val => {
190
+ const newHour = +val;
191
+ setEndHour(newHour);
192
+ let newEndDate;
193
+ if (prevEndHour.current === 0 && newHour !== 0) {
194
+ newEndDate = moment(endDate).subtract(1, 'days');
195
+ } else if (prevEndHour.current !== 0 && newHour === 0) {
196
+ newEndDate = moment(endDate).add(1, 'days');
197
+ } else {
198
+ newEndDate = endDate;
199
+ }
200
+ prevEndHour.current = newHour;
201
+ setEndDate(moment(newEndDate).set('hour', newHour).toDate());
202
+ };
203
+
204
+ const renderButtons = () => (
205
+ <>
206
+ <Btn className="date-picker__button" onClick={() => onCancel()} variant="ellipse-cancel">
207
+ {txt?.buttons?.cancel || 'cancel'}
208
+ </Btn>
209
+ <Btn
210
+ className="date-picker__button"
211
+ variant="ellipse-apply"
212
+ disabled={!startDate || !endDate}
213
+ onClick={() =>
214
+ onChange({
215
+ start: startDate,
216
+ end: endDate,
217
+ startPrevDate,
218
+ endPrevDate,
219
+ compare: isCompare,
220
+ })
221
+ }
222
+ >
223
+ {txt?.buttons?.apply || 'apply'}
224
+ </Btn>
225
+ </>
226
+ );
227
+
228
+ const renderPreviousPeriod = () => (
229
+ <>
230
+ {txt.labels.previousPeriod}: <span className="date-picker__previous-period-interval">{title}</span>
231
+ </>
232
+ );
233
+
234
+ const doBlur = (type, e) => {
235
+ const executor = type === 'start' ? setIsStartFocused : setIsEndFocused;
236
+ e.target.blur();
237
+ executor(false);
238
+ };
239
+
240
+ const handleStartDateFocus = e => {
241
+ setIsStartFocused(true);
242
+ setStartDateInput(moment(startDate).format('L'));
243
+ setTimeout(() => e.target.select(), 0);
244
+ };
245
+
246
+ const handleStartDateBlur = e => {
247
+ let newDate;
248
+ if (moment(startDateInput).isValid()) {
249
+ newDate = moment(startDateInput).set('hour', parseInt(startHour, 10)).toDate();
250
+ setStartDate(newDate);
251
+ } else {
252
+ newDate = startDate;
253
+ setStartDateInput(newDate);
254
+ }
255
+ doBlur('start', e);
256
+ setDate1(
257
+ moment(newDate).isSameOrAfter(moment(date2), 'month') ? moment(date2).subtract(1, 'month') : moment(newDate),
258
+ );
259
+ };
260
+
261
+ const handleEndDateFocus = e => {
262
+ setIsEndFocused(true);
263
+ setEndDateInput(moment(subtractDay(endDateInput)).format('L'));
264
+ setTimeout(() => e.target.select(), 0);
265
+ };
266
+
267
+ const handleEndDateBlur = e => {
268
+ let newDate;
269
+ if (moment(endDateInput).isValid()) {
270
+ newDate = moment(endDateInput).set('hour', parseInt(endHour, 10)).toDate();
271
+ setEndDate(addDay(newDate));
272
+ } else {
273
+ newDate = endDate;
274
+ setEndDateInput(newDate);
275
+ }
276
+ doBlur('end', e);
277
+ setDate2(newDate);
278
+ setEndDateInput();
279
+ };
280
+
281
+ const handleKeyPressed = (code, e, type) => {
282
+ if (code === 13) (type === 'start' ? handleStartDateBlur : handleEndDateBlur)(e);
283
+ if (code === 27) doBlur(type, e);
284
+ };
285
+
286
+ return (
287
+ <div className={cn('date-picker', className)}>
288
+ <div className="date-picker__header">
289
+ <div className="date-picker__inputs-block">
290
+ <TextInput
291
+ dataTest="datepicker_start-date-input"
292
+ className={cn('date-picker__date-input', { 'date-picker__date-input_active': hoverStatus === 'start' })}
293
+ value={isStartFocused ? startDateInput : moment(startDate).format('ll')}
294
+ disabled={!startDate}
295
+ onChange={value => setStartDateInput(handleDateInputOnChange(value))}
296
+ onFocus={handleStartDateFocus}
297
+ onBlur={handleStartDateBlur}
298
+ onKeyUp={(code, e) => handleKeyPressed(code, e, 'start')}
299
+ ref={startDateInputRef}
300
+ // mask={moment(startDate).format('L').replace(/[0-9]/g, '9')}
301
+ />
302
+ <SelectInput
303
+ dataTest="datepicker_start-hour-select-input"
304
+ className={cn('date-picker__hour-select-input')}
305
+ onChange={value => handleChangeStartHour(value)}
306
+ value={startHour}
307
+ options={getStartHourItems()}
308
+ disabled={!startDate}
309
+ short
310
+ />
311
+ <div className="date-picker__inputs-separator date-picker__header--gray">—</div>
312
+ <TextInput
313
+ dataTest="datepicker_end-date-input"
314
+ className={cn('date-picker__date-input', { 'date-picker__date-input_active': hoverStatus === 'end' })}
315
+ value={isEndFocused ? endDateInput : moment(subtractDay(endDate)).format('ll')}
316
+ disabled={!endDate}
317
+ onChange={value => setEndDateInput(handleDateInputOnChange(value))}
318
+ onFocus={handleEndDateFocus}
319
+ onBlur={handleEndDateBlur}
320
+ onKeyUp={(code, e) => handleKeyPressed(code, e, 'end')}
321
+ ref={endDateInputRef}
322
+ />
323
+ <SelectInput
324
+ dataTest="datepicker_end-hour-select-input"
325
+ className={cn('date-picker__hour-select-input')}
326
+ onChange={value => handleChangeEndHour(value)}
327
+ value={endHour}
328
+ options={getEndHourItems()}
329
+ disabled={!endDate}
330
+ short
331
+ />
332
+ </div>
333
+ {isCompare && !isCompareHidden && startDate && endDate && (
334
+ <div className="date-picker__previous-period">
335
+ {renderPreviousPeriod()}
336
+ </div>
337
+ )}
338
+ </div>
339
+
340
+
341
+ <div className="date-picker__calendars">
342
+ <Calendar
343
+ className="date-picker__calendar"
344
+ date={date1}
345
+ setDate={setDate1}
346
+ allowNext={!isNearby}
347
+ startDate={startDate}
348
+ endDate={endDate}
349
+ startPrevDate={startPrevDate}
350
+ endPrevDate={endPrevDate}
351
+ onClick={handleClick}
352
+ onHover={handleHover}
353
+ limitRange={limitRange}
354
+ />
355
+ <Calendar
356
+ className="date-picker__calendar"
357
+ date={date2}
358
+ setDate={setDate2}
359
+ allowPrev={!isNearby}
360
+ startDate={startDate}
361
+ endDate={endDate}
362
+ startPrevDate={startPrevDate}
363
+ endPrevDate={endPrevDate}
364
+ onClick={handleClick}
365
+ onHover={handleHover}
366
+ />
367
+ </div>
368
+ <div className={cn('date-picker__footer', {
369
+ 'date-picker__footer_once-element': isCompareHidden
370
+ })}>
371
+ {/* {!isCompareHidden ? (
372
+ <div className="date-picker__compare-block">
373
+ <div className="mr5">
374
+ <Switcher
375
+ dataTest="datepicker_compare"
376
+ label={txt.labels.compare}
377
+ isSwitchOn={isCompare}
378
+ onChange={() => {
379
+ onChangeCompare(!isCompare);
380
+ setIsCompare(state => !state);
381
+ }}
382
+ />
383
+ </div>
384
+ </div>
385
+ ) : (
386
+ <div />
387
+ )} */}
388
+ <div className="date-picker__buttons-block">{renderButtons()}</div>
389
+ </div>
390
+ </div>
391
+ );
392
+ };
393
+
394
+ export default Datepicker;