groovinads-ui 1.2.20 → 1.2.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.yarn/install-state.gz +0 -0
- package/README.md +82 -0
- package/dist/index.es.js +8 -3
- package/dist/index.js +8 -3
- package/package.json +4 -1
- package/src/components/Dropdowns/DropdownComponent.jsx +10 -7
- package/src/components/Dropdowns/DropdownFilter.jsx +1 -1
- package/src/components/Dropdowns/DropdownsDatePicker/DropdownDatePicker copy.jsx +306 -0
- package/src/components/Dropdowns/DropdownsDatePicker/DropdownDatePicker.jsx +320 -0
- package/src/components/Dropdowns/DropdownsDatePicker/PeriodAndDetailDropdowns.tsx +351 -0
- package/src/components/Dropdowns/DropdownsDatePicker/index.js +3 -0
- package/src/components/Dropdowns/index.js +2 -1
- package/src/components/Navigation/Tabnav.jsx +45 -32
- package/src/hooks/useTextFormatter.jsx +3 -1
- package/src/index.js +30 -1
- package/src/stories/DropdownDatePicker.stories.jsx +67 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "groovinads-ui",
|
|
3
3
|
"description": "Groovinads UI is a React component library designed exclusively for Groovinads applications. It provides ready-to-use UI elements styled according to Groovinads design guidelines to facilitate rapid development.",
|
|
4
|
-
"version": "1.2.
|
|
4
|
+
"version": "1.2.21",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"css",
|
|
7
7
|
"sass",
|
|
@@ -72,5 +72,8 @@
|
|
|
72
72
|
"sb": "storybook dev -p 6006",
|
|
73
73
|
"build-storybook": "storybook build",
|
|
74
74
|
"build-lib": "rollup -c"
|
|
75
|
+
},
|
|
76
|
+
"dependencies": {
|
|
77
|
+
"react-datepicker": "^7.3.0"
|
|
75
78
|
}
|
|
76
79
|
}
|
|
@@ -16,10 +16,9 @@ const DropdownComponent = ({
|
|
|
16
16
|
align = 'start',
|
|
17
17
|
show,
|
|
18
18
|
}) => {
|
|
19
|
-
|
|
20
19
|
const [Toggle, Menu] = children;
|
|
21
20
|
|
|
22
|
-
const modifiedToggle = {...Toggle, align}; // Al toggle le agrega el align
|
|
21
|
+
const modifiedToggle = { ...Toggle, align }; // Al toggle le agrega el align
|
|
23
22
|
|
|
24
23
|
const modifiedMenu = React.cloneElement(Menu, {
|
|
25
24
|
as: 'ul',
|
|
@@ -27,12 +26,16 @@ const DropdownComponent = ({
|
|
|
27
26
|
className: fullWidth ? 'w-100' : '',
|
|
28
27
|
popperConfig: overflow
|
|
29
28
|
? {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
strategy: 'fixed',
|
|
30
|
+
onFirstUpdate: () => window.dispatchEvent(new CustomEvent('scroll')),
|
|
31
|
+
}
|
|
33
32
|
: undefined,
|
|
34
|
-
children: Menu.props.children.
|
|
35
|
-
|
|
33
|
+
children: Menu.props.children.length
|
|
34
|
+
? Menu.props.children.map((child) =>
|
|
35
|
+
React.cloneElement(child, { as: 'li' }),
|
|
36
|
+
)
|
|
37
|
+
: React.cloneElement(Menu.props.children, { as: 'li' }),
|
|
38
|
+
});
|
|
36
39
|
|
|
37
40
|
return (
|
|
38
41
|
<Dropdown
|
|
@@ -86,7 +86,7 @@ const DropdownFilter = ({
|
|
|
86
86
|
/>
|
|
87
87
|
</div>
|
|
88
88
|
<div className='filter-values'>
|
|
89
|
-
{ valuesSelected.length
|
|
89
|
+
{ valuesSelected.length === values.length ? 'All selected' : valuesSelected.length ? valuesSelected.join('; ') : 'None'}
|
|
90
90
|
</div>
|
|
91
91
|
</Dropdown.Toggle>
|
|
92
92
|
{!locked && (
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import DatePicker from 'react-datepicker'; // https://reactdatepicker.com
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
|
|
5
|
+
// COMPONENTS
|
|
6
|
+
import { Icon } from '../../Labels';
|
|
7
|
+
import DropdownComponent from '../DropdownComponent'
|
|
8
|
+
import PeriodAndDetailDropdowns from './PeriodAndDetailDropdowns';
|
|
9
|
+
|
|
10
|
+
const DropdownDatePicker = ({
|
|
11
|
+
datePicker1StartDate,
|
|
12
|
+
setDatePicker1StartDate,
|
|
13
|
+
datePicker1EndDate,
|
|
14
|
+
setDatePicker1EndDate,
|
|
15
|
+
datePicker2StartDate,
|
|
16
|
+
setDatePicker2StartDate,
|
|
17
|
+
datePicker2EndDate,
|
|
18
|
+
setDatePicker2EndDate,
|
|
19
|
+
tableQueryObj,
|
|
20
|
+
setTableQueryObj,
|
|
21
|
+
fetchData,
|
|
22
|
+
variant = 'input',
|
|
23
|
+
locked = false,
|
|
24
|
+
}) => {
|
|
25
|
+
// eslint-disable-next-line no-unused-vars
|
|
26
|
+
const [compareDates, setCompareDates] = useState(false);
|
|
27
|
+
const [activeTab, setActiveTab] = useState(1);
|
|
28
|
+
|
|
29
|
+
/* We have a 'local' state for datepickers inside the dropdown, so the user can cancel the dropdown and go back to previous values. */
|
|
30
|
+
/* When user confirms selected values, the 'local' state replaces the values previously stored in the DateFilters component. */
|
|
31
|
+
/* ========== STATE FOR DATEPCIKER 1 ========== */
|
|
32
|
+
const [DDStartDate1, setDDStartDate1] = useState(datePicker1StartDate);
|
|
33
|
+
const [DDEndDate1, setDDEndDate1] = useState(datePicker1EndDate);
|
|
34
|
+
const [DDStartDate2, setDDStartDate2] = useState(datePicker2StartDate);
|
|
35
|
+
const [DDEndDate2, setDDEndDate2] = useState(datePicker2EndDate);
|
|
36
|
+
|
|
37
|
+
const onChangeDDDate1 = (dates) => {
|
|
38
|
+
const [start, end] = dates;
|
|
39
|
+
setDDStartDate1(start);
|
|
40
|
+
setDDEndDate1(end);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/* State for dropdowns only visible when selecting 'compare dates' option */
|
|
44
|
+
const [DDPeriod1, setDDPeriod1] = useState('Custom range');
|
|
45
|
+
const [DDDetailLevel1, setDDDetailLevel1] = useState('Daily');
|
|
46
|
+
|
|
47
|
+
/* ========== STATE FOR DATEPICKER 2 ========== - DatePicker 2 is only visible when selecting 'compare dates' option */
|
|
48
|
+
const [DDStartDate2, setDDStartDate2] = useState(datePicker2StartDate);
|
|
49
|
+
const [DDEndDate2, setDDEndDate2] = useState(datePicker2EndDate);
|
|
50
|
+
|
|
51
|
+
const onChangeDDDate2 = (dates) => {
|
|
52
|
+
const [start, end] = dates;
|
|
53
|
+
setDDStartDate2(start);
|
|
54
|
+
setDDEndDate2(end);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/* State for dropdowns only visible when selecting 'compare dates' option */
|
|
58
|
+
const [DDPeriod2, setDDPeriod2] = useState('Custom range');
|
|
59
|
+
const [DDDetailLevel2, setDDDetailLevel2] = useState('Daily');
|
|
60
|
+
|
|
61
|
+
const dropdown = useRef(null);
|
|
62
|
+
|
|
63
|
+
const closeDropwdown = () => {
|
|
64
|
+
if (dropdown?.current?.className)
|
|
65
|
+
dropdown.current.className = 'dropdown-menu p-3 shadow-2';
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const formatDate = (date) => {
|
|
69
|
+
if (!date) return undefined;
|
|
70
|
+
return date.toLocaleString('en-US', {
|
|
71
|
+
month: 'short',
|
|
72
|
+
day: '2-digit',
|
|
73
|
+
year: 'numeric',
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const formatDateForQueryObj = (date) => {
|
|
78
|
+
if (!date) return undefined;
|
|
79
|
+
|
|
80
|
+
const year = date?.getFullYear();
|
|
81
|
+
const month = (1 + date?.getMonth())?.toString()?.padStart(2, '0');
|
|
82
|
+
const day = date?.getDate()?.toString()?.padStart(2, '0');
|
|
83
|
+
|
|
84
|
+
return `${year}-${month}-${day} 00:00:00`;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const updateDateFilters = () => {
|
|
88
|
+
const newQueryObj = { ...tableQueryObj };
|
|
89
|
+
|
|
90
|
+
// Update state stored in the DateFilters component
|
|
91
|
+
setDatePicker1StartDate(DDStartDate1);
|
|
92
|
+
if (DDEndDate1 === null) {
|
|
93
|
+
setDatePicker1EndDate(DDStartDate1);
|
|
94
|
+
newQueryObj.report_request.date_to = formatDateForQueryObj(DDStartDate1);
|
|
95
|
+
} else {
|
|
96
|
+
setDatePicker1EndDate(DDEndDate1);
|
|
97
|
+
newQueryObj.report_request.date_to = formatDateForQueryObj(DDEndDate1);
|
|
98
|
+
}
|
|
99
|
+
setDatePicker2StartDate(DDStartDate2);
|
|
100
|
+
setDatePicker2EndDate(DDEndDate2);
|
|
101
|
+
|
|
102
|
+
// Update tableDateFilterQuery object
|
|
103
|
+
if (DDStartDate1)
|
|
104
|
+
newQueryObj.report_request.date_from =
|
|
105
|
+
formatDateForQueryObj(DDStartDate1);
|
|
106
|
+
|
|
107
|
+
newQueryObj.report_request.id_period = 0;
|
|
108
|
+
|
|
109
|
+
setTableQueryObj(newQueryObj);
|
|
110
|
+
|
|
111
|
+
fetchData(newQueryObj);
|
|
112
|
+
|
|
113
|
+
closeDropwdown();
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const isMobile = window?.innerWidth < 500;
|
|
117
|
+
|
|
118
|
+
// ========== HACK ========== - Remove unnecesary div generated by the library
|
|
119
|
+
const removeBugDiv = () =>
|
|
120
|
+
document?.querySelector('.react-datepicker__aria-live')?.remove();
|
|
121
|
+
|
|
122
|
+
useEffect(() => removeBugDiv(), []);
|
|
123
|
+
|
|
124
|
+
return (
|
|
125
|
+
<div className='dropdown dropdown-pills'>
|
|
126
|
+
{/* INPUT */}
|
|
127
|
+
<label className='dropdown-label' htmlFor='reportDatePicker'>
|
|
128
|
+
Period
|
|
129
|
+
</label>
|
|
130
|
+
|
|
131
|
+
{variant === 'input' ? (
|
|
132
|
+
<button
|
|
133
|
+
className='btn btn-input dropdown-toggle'
|
|
134
|
+
id='reportDatePicker'
|
|
135
|
+
type='button'
|
|
136
|
+
data-bs-toggle='dropdown'
|
|
137
|
+
aria-expanded='false'
|
|
138
|
+
>
|
|
139
|
+
{/* Start date */}
|
|
140
|
+
<span className='fw-bold highlighted'>
|
|
141
|
+
{formatDate(datePicker1StartDate)}
|
|
142
|
+
</span>
|
|
143
|
+
<span>to</span>
|
|
144
|
+
{/* End date */}
|
|
145
|
+
<span className='fw-bold highlighted'>
|
|
146
|
+
{formatDate(datePicker1EndDate)}
|
|
147
|
+
</span>
|
|
148
|
+
<i className='fa-solid fa-calendar-day'></i>
|
|
149
|
+
</button>
|
|
150
|
+
) : (
|
|
151
|
+
<DropdownComponent>
|
|
152
|
+
<div className='filter-heading'>
|
|
153
|
+
<div className='filter-title'>
|
|
154
|
+
<span>Date</span>
|
|
155
|
+
{locked && (
|
|
156
|
+
<Icon style={'solid'} iconName={'lock-keyhole'} scale={0.7} />
|
|
157
|
+
)}
|
|
158
|
+
</div>
|
|
159
|
+
<Icon
|
|
160
|
+
style={'solid'}
|
|
161
|
+
iconName={'angle-down'}
|
|
162
|
+
scale={1}
|
|
163
|
+
className='caret'
|
|
164
|
+
/>
|
|
165
|
+
</div>
|
|
166
|
+
<div className='filter-values'>
|
|
167
|
+
<span className='fw-bold highlighted'>
|
|
168
|
+
{formatDate(datePicker1StartDate)}
|
|
169
|
+
</span>
|
|
170
|
+
<span>to</span>
|
|
171
|
+
{/* End date */}
|
|
172
|
+
<span className='fw-bold highlighted'>
|
|
173
|
+
{formatDate(datePicker1EndDate)}
|
|
174
|
+
</span>
|
|
175
|
+
</div>
|
|
176
|
+
</DropdownComponent>
|
|
177
|
+
)}
|
|
178
|
+
|
|
179
|
+
{/* DROPDOWN */}
|
|
180
|
+
<div
|
|
181
|
+
className='dropdown-menu p-3 shadow-2'
|
|
182
|
+
onClick={(e) => e.stopPropagation()} // Prevent Dropdown from closing when clicking inside of it
|
|
183
|
+
ref={dropdown}
|
|
184
|
+
>
|
|
185
|
+
{compareDates && (
|
|
186
|
+
<>
|
|
187
|
+
{/* DATE TABS */}
|
|
188
|
+
<ul className='nav nav-tabs' id='dateComparisonTabs' role='tablist'>
|
|
189
|
+
<li
|
|
190
|
+
className='nav-item'
|
|
191
|
+
role='presentation'
|
|
192
|
+
onClick={() => setActiveTab(1)}
|
|
193
|
+
>
|
|
194
|
+
<button
|
|
195
|
+
className='nav-link active'
|
|
196
|
+
id='date1ComparisonTab'
|
|
197
|
+
data-bs-toggle='tab'
|
|
198
|
+
data-bs-target='#date1ComparisonTabPane'
|
|
199
|
+
type='button'
|
|
200
|
+
role='tab'
|
|
201
|
+
aria-controls='date1ComparisonTabPane'
|
|
202
|
+
aria-selected='true'
|
|
203
|
+
>
|
|
204
|
+
Date 1
|
|
205
|
+
</button>
|
|
206
|
+
</li>
|
|
207
|
+
|
|
208
|
+
<li
|
|
209
|
+
className='nav-item'
|
|
210
|
+
role='presentation'
|
|
211
|
+
onClick={() => setActiveTab(2)}
|
|
212
|
+
>
|
|
213
|
+
<button
|
|
214
|
+
className='nav-link'
|
|
215
|
+
id='date2ComparisonTab'
|
|
216
|
+
data-bs-toggle='tab'
|
|
217
|
+
data-bs-target='#date2ComparisonTabPane'
|
|
218
|
+
type='button'
|
|
219
|
+
role='tab'
|
|
220
|
+
aria-controls='date2ComparisonTabPane'
|
|
221
|
+
aria-selected='false'
|
|
222
|
+
>
|
|
223
|
+
Date 2
|
|
224
|
+
</button>
|
|
225
|
+
</li>
|
|
226
|
+
</ul>
|
|
227
|
+
|
|
228
|
+
{/* PERIOD AND DETAIL LEVEL DROPDOWNS */}
|
|
229
|
+
<PeriodAndDetailDropdowns
|
|
230
|
+
DDPeriod1={DDPeriod1}
|
|
231
|
+
setDDPeriod1={setDDPeriod1}
|
|
232
|
+
DDDetailLevel1={DDDetailLevel1}
|
|
233
|
+
setDDDetailLevel1={setDDDetailLevel1}
|
|
234
|
+
DDPeriod2={DDPeriod2}
|
|
235
|
+
setDDPeriod2={setDDPeriod2}
|
|
236
|
+
DDDetailLevel2={DDDetailLevel2}
|
|
237
|
+
setDDDetailLevel2={setDDDetailLevel2}
|
|
238
|
+
/>
|
|
239
|
+
</>
|
|
240
|
+
)}
|
|
241
|
+
|
|
242
|
+
{/* DATE PICKERS */}
|
|
243
|
+
{activeTab === 1 ? (
|
|
244
|
+
<DatePicker
|
|
245
|
+
className='form-control form-search'
|
|
246
|
+
selected={DDStartDate1}
|
|
247
|
+
onChange={onChangeDDDate1}
|
|
248
|
+
startDate={DDStartDate1}
|
|
249
|
+
endDate={DDEndDate1}
|
|
250
|
+
monthsShown={isMobile ? 1 : 2}
|
|
251
|
+
selectsRange
|
|
252
|
+
inline
|
|
253
|
+
/>
|
|
254
|
+
) : (
|
|
255
|
+
<DatePicker
|
|
256
|
+
className='form-control form-search'
|
|
257
|
+
selected={DDStartDate2}
|
|
258
|
+
onChange={onChangeDDDate2}
|
|
259
|
+
startDate={DDStartDate2}
|
|
260
|
+
endDate={DDEndDate2}
|
|
261
|
+
monthsShown={isMobile ? 1 : 2}
|
|
262
|
+
selectsRange
|
|
263
|
+
inline
|
|
264
|
+
/>
|
|
265
|
+
)}
|
|
266
|
+
|
|
267
|
+
<div className='d-flex flex-nowrap flex-column flex-md-row'>
|
|
268
|
+
<div className='d-flex justify-content-end gap-3 flex-column-reverse flex-md-row w-100'>
|
|
269
|
+
<button
|
|
270
|
+
className='btn btn-small btn-terciary'
|
|
271
|
+
onClick={() => closeDropwdown()}
|
|
272
|
+
>
|
|
273
|
+
Cancel
|
|
274
|
+
</button>
|
|
275
|
+
|
|
276
|
+
<button
|
|
277
|
+
className='btn btn-small'
|
|
278
|
+
// disabled={!DDStartDate1 || !DDEndDate1} // Start and end dates must be selected
|
|
279
|
+
onClick={() => updateDateFilters()}
|
|
280
|
+
>
|
|
281
|
+
Set date
|
|
282
|
+
</button>
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
</div>
|
|
286
|
+
</div>
|
|
287
|
+
);
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
DropdownDatePicker.propTypes = {
|
|
291
|
+
datePicker1StartDate: PropTypes.instanceOf(Date),
|
|
292
|
+
setDatePicker1StartDate: PropTypes.func,
|
|
293
|
+
datePicker1EndDate: PropTypes.instanceOf(Date),
|
|
294
|
+
setDatePicker1EndDate: PropTypes.func,
|
|
295
|
+
datePicker2StartDate: PropTypes.instanceOf(Date),
|
|
296
|
+
setDatePicker2StartDate: PropTypes.func,
|
|
297
|
+
datePicker2EndDate: PropTypes.instanceOf(Date),
|
|
298
|
+
setDatePicker2EndDate: PropTypes.func,
|
|
299
|
+
tableQueryObj: PropTypes.object,
|
|
300
|
+
setTableQueryObj: PropTypes.func,
|
|
301
|
+
fetchData: PropTypes.func,
|
|
302
|
+
variant: PropTypes.oneOf(['input', 'filter']),
|
|
303
|
+
locked: PropTypes.bool,
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
export default DropdownDatePicker;
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import React, { Children, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import DatePicker from 'react-datepicker'; // https://reactdatepicker.com
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
import Dropdown from 'react-bootstrap/Dropdown';
|
|
5
|
+
|
|
6
|
+
// COMPONENTS
|
|
7
|
+
import { Icon } from '../../Labels';
|
|
8
|
+
import { Button } from '../../Button';
|
|
9
|
+
// import { Switch } from '../../Inputs';
|
|
10
|
+
// import { Tabnav } from '../../Navigation';
|
|
11
|
+
// import PeriodAndDetailDropdowns from './PeriodAndDetailDropdowns';
|
|
12
|
+
|
|
13
|
+
// HOOKS
|
|
14
|
+
import { useTextFormatter } from '../../../hooks';
|
|
15
|
+
|
|
16
|
+
const DropdownDatePicker = ({
|
|
17
|
+
className = '',
|
|
18
|
+
variant = 'input',
|
|
19
|
+
show,
|
|
20
|
+
setShow,
|
|
21
|
+
onToggle,
|
|
22
|
+
inputLabel = 'period',
|
|
23
|
+
dateFrom,
|
|
24
|
+
setDateFrom,
|
|
25
|
+
dateTo,
|
|
26
|
+
setDateTo,
|
|
27
|
+
locked = false,
|
|
28
|
+
overflow = false,
|
|
29
|
+
onRemoveFilter,
|
|
30
|
+
fromDate1,
|
|
31
|
+
setFromDate1,
|
|
32
|
+
toDate1,
|
|
33
|
+
setToDate1,
|
|
34
|
+
fromDate2,
|
|
35
|
+
setFromDate2,
|
|
36
|
+
toDate2,
|
|
37
|
+
setToDate2,
|
|
38
|
+
}) => {
|
|
39
|
+
const [activeTab, setActiveTab] = useState(1);
|
|
40
|
+
|
|
41
|
+
const [compareDates, setCompareDates] = useState(true);
|
|
42
|
+
|
|
43
|
+
/* State for dropdowns only visible when selecting 'compare dates' option */
|
|
44
|
+
const [period1, setPeriod1] = useState('Custom range');
|
|
45
|
+
const [detailLevel1, setDetailLevel1] = useState('Daily');
|
|
46
|
+
|
|
47
|
+
const [period2, setPeriod2] = useState('Custom range');
|
|
48
|
+
const [detailLevel2, setDetailLevel2] = useState('Daily');
|
|
49
|
+
|
|
50
|
+
/* We have a 'local' state for datepickers inside the dropdown, so the user can cancel the dropdown and go back to previous values. */
|
|
51
|
+
/* When user confirms selected values, the 'local' state replaces the values previously stored in the DateFilters component. */
|
|
52
|
+
/* ========== STATE FOR DATEPCIKER 1 ========== */
|
|
53
|
+
const [editingFromDate1, setEditingFromDate1] = useState(fromDate1);
|
|
54
|
+
const [editingToDate1, setEditingToDate1] = useState(toDate1);
|
|
55
|
+
|
|
56
|
+
const [editingFromDate2, setEditingFromDate2] = useState(fromDate2);
|
|
57
|
+
const [editingToDate2, setEditingToDate2] = useState(toDate2);
|
|
58
|
+
|
|
59
|
+
const [internalShow, setInternalShow] = useState(!!show);
|
|
60
|
+
|
|
61
|
+
const { capitalice } = useTextFormatter();
|
|
62
|
+
|
|
63
|
+
const dropdown = useRef(null);
|
|
64
|
+
|
|
65
|
+
const isMobile = window?.innerWidth < 500;
|
|
66
|
+
|
|
67
|
+
const onChangeDDDate1 = (dates) => {
|
|
68
|
+
const [start, end] = dates;
|
|
69
|
+
setEditingFromDate1(start);
|
|
70
|
+
setEditingToDate1(end);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const onChangeDDDate2 = (dates) => {
|
|
74
|
+
const [start, end] = dates;
|
|
75
|
+
setEditingFromDate2(start);
|
|
76
|
+
setEditingToDate2(end);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const internalToggle = () => {
|
|
80
|
+
setInternalShow((prevShow) => !prevShow);
|
|
81
|
+
try {
|
|
82
|
+
onToggle();
|
|
83
|
+
} catch (error) {}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const closeDropdown = () => {
|
|
87
|
+
setInternalShow(false);
|
|
88
|
+
try {
|
|
89
|
+
setShow(false);
|
|
90
|
+
} catch (error) {}
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const updateDateFilters = () => {
|
|
94
|
+
setFromDate1(editingFromDate1);
|
|
95
|
+
|
|
96
|
+
if (editingToDate1 === null) {
|
|
97
|
+
setToDate1(editingFromDate1);
|
|
98
|
+
} else {
|
|
99
|
+
setToDate1(editingToDate1);
|
|
100
|
+
}
|
|
101
|
+
setFromDate2(fromDate2);
|
|
102
|
+
setToDate2(toDate2);
|
|
103
|
+
|
|
104
|
+
closeDropdown();
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
setInternalShow(!!show);
|
|
109
|
+
}, [show]);
|
|
110
|
+
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
console.log('internalShow', internalShow);
|
|
113
|
+
}, []);
|
|
114
|
+
|
|
115
|
+
return (
|
|
116
|
+
<Dropdown
|
|
117
|
+
show={internalShow}
|
|
118
|
+
className={`${variant === 'filter' ? 'dropdown-filter' : ''}`}
|
|
119
|
+
>
|
|
120
|
+
<Dropdown.Toggle
|
|
121
|
+
variant='toggle-filter'
|
|
122
|
+
onClick={internalToggle}
|
|
123
|
+
className={`${variant === 'input' ? 'btn btn-input' : ''}`}
|
|
124
|
+
>
|
|
125
|
+
{variant === 'input' ? (
|
|
126
|
+
<>
|
|
127
|
+
{(dateFrom || dateTo) && (
|
|
128
|
+
<span className={'wrapper'}>
|
|
129
|
+
<strong>{dateFrom}</strong> to <strong>{dateTo}</strong>
|
|
130
|
+
</span>
|
|
131
|
+
)}
|
|
132
|
+
<span className='label'>{capitalice(inputLabel)}</span>
|
|
133
|
+
<Icon iconName='calendar-day' />
|
|
134
|
+
</>
|
|
135
|
+
) : (
|
|
136
|
+
<>
|
|
137
|
+
<div className='filter-heading'>
|
|
138
|
+
<div className='filter-title'>
|
|
139
|
+
<span>{capitalice(inputLabel)}</span>
|
|
140
|
+
{locked && (
|
|
141
|
+
<Icon style={'solid'} iconName={'lock-keyhole'} scale={0.7} />
|
|
142
|
+
)}
|
|
143
|
+
</div>
|
|
144
|
+
<Icon
|
|
145
|
+
style={'solid'}
|
|
146
|
+
iconName={'angle-down'}
|
|
147
|
+
scale={1}
|
|
148
|
+
className='caret'
|
|
149
|
+
/>
|
|
150
|
+
</div>
|
|
151
|
+
<div className='filter-values'>
|
|
152
|
+
{dateFrom || dateTo ? (
|
|
153
|
+
<>
|
|
154
|
+
<strong>{dateFrom}</strong> to <strong>{dateTo}</strong>
|
|
155
|
+
</>
|
|
156
|
+
) : (
|
|
157
|
+
<>None</>
|
|
158
|
+
)}
|
|
159
|
+
</div>
|
|
160
|
+
</>
|
|
161
|
+
)}
|
|
162
|
+
</Dropdown.Toggle>
|
|
163
|
+
{variant === 'filter' && !locked && (
|
|
164
|
+
<Button
|
|
165
|
+
variant='terciary'
|
|
166
|
+
icon='xmark-circle'
|
|
167
|
+
size='md'
|
|
168
|
+
className='remove-filter'
|
|
169
|
+
onClick={onRemoveFilter}
|
|
170
|
+
/>
|
|
171
|
+
)}
|
|
172
|
+
|
|
173
|
+
<Dropdown.Menu
|
|
174
|
+
popperConfig={
|
|
175
|
+
overflow
|
|
176
|
+
? {
|
|
177
|
+
strategy: 'fixed',
|
|
178
|
+
onFirstUpdate: () =>
|
|
179
|
+
window.dispatchEvent(new CustomEvent('scroll')),
|
|
180
|
+
}
|
|
181
|
+
: undefined
|
|
182
|
+
}
|
|
183
|
+
>
|
|
184
|
+
<Dropdown.Item as={'div'}>
|
|
185
|
+
{compareDates && (
|
|
186
|
+
<>
|
|
187
|
+
{/* DATE TABS */}
|
|
188
|
+
{/* <ul
|
|
189
|
+
className='nav nav-tabs'
|
|
190
|
+
id='dateComparisonTabs'
|
|
191
|
+
role='tablist'
|
|
192
|
+
>
|
|
193
|
+
<li
|
|
194
|
+
className='nav-item'
|
|
195
|
+
role='presentation'
|
|
196
|
+
onClick={() => setActiveTab(1)}
|
|
197
|
+
>
|
|
198
|
+
|
|
199
|
+
<button
|
|
200
|
+
className='nav-link active'
|
|
201
|
+
id='date1ComparisonTab'
|
|
202
|
+
data-bs-toggle='tab'
|
|
203
|
+
data-bs-target='#date1ComparisonTabPane'
|
|
204
|
+
type='button'
|
|
205
|
+
role='tab'
|
|
206
|
+
aria-controls='date1ComparisonTabPane'
|
|
207
|
+
aria-selected='true'
|
|
208
|
+
>
|
|
209
|
+
Date 1
|
|
210
|
+
</button>
|
|
211
|
+
</li>
|
|
212
|
+
|
|
213
|
+
<li
|
|
214
|
+
className='nav-item'
|
|
215
|
+
role='presentation'
|
|
216
|
+
onClick={() => setActiveTab(2)}
|
|
217
|
+
>
|
|
218
|
+
<button
|
|
219
|
+
id='date2ComparisonTab'
|
|
220
|
+
data-bs-toggle='tab'
|
|
221
|
+
data-bs-target='#date2ComparisonTabPane'
|
|
222
|
+
type='button'
|
|
223
|
+
role='tab'
|
|
224
|
+
aria-controls='date2ComparisonTabPane'
|
|
225
|
+
aria-selected='false'
|
|
226
|
+
>
|
|
227
|
+
|
|
228
|
+
</button>
|
|
229
|
+
</li>
|
|
230
|
+
</ul> */}
|
|
231
|
+
|
|
232
|
+
{/* <Tabnav
|
|
233
|
+
tabs={[{ tab: 'Date 1' }, { tab: 'Date 2' }]}
|
|
234
|
+
activeTab={1}
|
|
235
|
+
customFunction={true}
|
|
236
|
+
/> */}
|
|
237
|
+
{/* TO DO: permitir que TabNav maneje interna y externamente el estado de AtiveTab */}
|
|
238
|
+
|
|
239
|
+
{/* PERIOD AND DETAIL LEVEL DROPDOWNS */}
|
|
240
|
+
{/* <PeriodAndDetailDropdowns
|
|
241
|
+
DDPeriod1={DDPeriod1}
|
|
242
|
+
setDDPeriod1={setDDPeriod1}
|
|
243
|
+
DDDetailLevel1={DDDetailLevel1}
|
|
244
|
+
setDDDetailLevel1={setDDDetailLevel1}
|
|
245
|
+
DDPeriod2={DDPeriod2}
|
|
246
|
+
setDDPeriod2={setDDPeriod2}
|
|
247
|
+
DDDetailLevel2={DDDetailLevel2}
|
|
248
|
+
setDDDetailLevel2={setDDDetailLevel2}
|
|
249
|
+
/> */}
|
|
250
|
+
</>
|
|
251
|
+
)}
|
|
252
|
+
|
|
253
|
+
<DatePicker
|
|
254
|
+
className='form-control form-search'
|
|
255
|
+
selected={editingFromDate1}
|
|
256
|
+
onChange={onChangeDDDate1}
|
|
257
|
+
startDate={editingFromDate1}
|
|
258
|
+
endDate={editingToDate1}
|
|
259
|
+
monthsShown={isMobile ? 1 : 2}
|
|
260
|
+
selectsRange
|
|
261
|
+
inline
|
|
262
|
+
/>
|
|
263
|
+
|
|
264
|
+
<div className='datepicker-footer'>
|
|
265
|
+
{/* <Switch
|
|
266
|
+
status={compareDates}
|
|
267
|
+
setStatus={() => {
|
|
268
|
+
setCompareDates(!compareDates);
|
|
269
|
+
}}
|
|
270
|
+
>
|
|
271
|
+
Compare dates
|
|
272
|
+
</Switch> */}
|
|
273
|
+
<div className='datepicker-buttons-wrapper'>
|
|
274
|
+
<Button
|
|
275
|
+
onClick={() => closeDropdown()}
|
|
276
|
+
size='xs'
|
|
277
|
+
variant='terciary'
|
|
278
|
+
>
|
|
279
|
+
Cancel
|
|
280
|
+
</Button>
|
|
281
|
+
|
|
282
|
+
<Button
|
|
283
|
+
size='xs'
|
|
284
|
+
// disabled={!DDStartDate1 || !DDEndDate1} // Start and end dates must be selected
|
|
285
|
+
onClick={() => updateDateFilters()}
|
|
286
|
+
>
|
|
287
|
+
Set date
|
|
288
|
+
</Button>
|
|
289
|
+
</div>
|
|
290
|
+
</div>
|
|
291
|
+
</Dropdown.Item>
|
|
292
|
+
</Dropdown.Menu>
|
|
293
|
+
</Dropdown>
|
|
294
|
+
);
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
DropdownDatePicker.propTypes = {
|
|
298
|
+
className: PropTypes.string,
|
|
299
|
+
variant: PropTypes.oneOf(['input', 'filter']),
|
|
300
|
+
show: PropTypes.bool,
|
|
301
|
+
setShow: PropTypes.func,
|
|
302
|
+
onToggle: PropTypes.func,
|
|
303
|
+
dateFrom: PropTypes.string,
|
|
304
|
+
setDateFrom: PropTypes.func,
|
|
305
|
+
dateTo: PropTypes.string,
|
|
306
|
+
setDateTo: PropTypes.func,
|
|
307
|
+
locked: PropTypes.bool,
|
|
308
|
+
overflow: PropTypes.bool,
|
|
309
|
+
onRemoveFilter: PropTypes.func,
|
|
310
|
+
editingFromDate1: PropTypes.string,
|
|
311
|
+
setEditingFromDate1: PropTypes.string,
|
|
312
|
+
editingToDate1: PropTypes.string,
|
|
313
|
+
setEditingToDate1: PropTypes.string,
|
|
314
|
+
EditingFromDate2: PropTypes.string,
|
|
315
|
+
setEditingFromDate2: PropTypes.string,
|
|
316
|
+
EditingFoDate2: PropTypes.string,
|
|
317
|
+
setEditingToDate2: PropTypes.string,
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
export default DropdownDatePicker;
|