groovinads-ui 1.2.19 → 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.
@@ -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;
@@ -0,0 +1,351 @@
1
+ import React, { useRef } from 'react';
2
+
3
+ const PeriodAndDetailDropdowns = ({
4
+ DDPeriod1,
5
+ setDDPeriod1,
6
+ DDDetailLevel1,
7
+ setDDDetailLevel1,
8
+ DDPeriod2,
9
+ setDDPeriod2,
10
+ DDDetailLevel2,
11
+ setDDDetailLevel2,
12
+ }) => {
13
+ const DDPeriod1Btn = useRef(null);
14
+ const DDPeriod1Dropwdown = useRef(null);
15
+ const DDDetailLevel1Btn = useRef(null);
16
+ const DDDetailLevel1Dropwdown = useRef(null);
17
+
18
+ const DDPeriod2Btn = useRef(null);
19
+ const DDPeriod2Dropwdown = useRef(null);
20
+ const DDDetailLevel2Btn = useRef(null);
21
+ const DDDetailLevel2Dropwdown = useRef(null);
22
+
23
+ const closeDropwdown = (DDRef, btnRef) => {
24
+ if (DDRef?.current?.className) {
25
+ DDRef.current.className = 'dropdown-menu dropdown-submenu shadow-2';
26
+ }
27
+ if (btnRef?.current?.className) {
28
+ btnRef.current.className = 'btn btn-input grey dropdown-toggle';
29
+ }
30
+ };
31
+
32
+ const updateDDPeriod1 = (value, dropdown) => {
33
+ setDDPeriod1(value);
34
+ closeDropwdown(dropdown, DDPeriod1Btn);
35
+ };
36
+
37
+ const updateDDDetailLevel1 = (value, dropdown) => {
38
+ setDDDetailLevel1(value);
39
+ closeDropwdown(dropdown, DDDetailLevel1Btn);
40
+ };
41
+
42
+ const updateDDPeriod2 = (value, dropdown) => {
43
+ setDDPeriod2(value);
44
+ closeDropwdown(dropdown, DDPeriod2Btn);
45
+ };
46
+
47
+ const updateDDDetailLevel2 = (value, dropdown) => {
48
+ setDDDetailLevel2(value);
49
+ closeDropwdown(dropdown, DDDetailLevel2Btn);
50
+ };
51
+
52
+ return (
53
+ <div className='tab-content' id='dateComparisonTabsContent'>
54
+ {/* DROPDOWNS FOR DATE 1 */}
55
+ <div
56
+ className='tab-pane fade show active'
57
+ id='date1ComparisonTabPane'
58
+ role='tabpanel'
59
+ aria-labelledby='date1ComparisonTab'
60
+ tabIndex={0}
61
+ >
62
+ <div className='d-flex gap-3 flex-column flex-md-row'>
63
+ <div className='dropdown dropdown-pills'>
64
+ <label className='dropdown-label' htmlFor='periodDate1'>
65
+ Period
66
+ </label>
67
+ <button
68
+ className='btn btn-input grey dropdown-toggle'
69
+ type='button'
70
+ data-bs-toggle='dropdown'
71
+ aria-expanded='false'
72
+ id='periodDate1'
73
+ ref={DDPeriod1Btn}
74
+ >
75
+ <span>{DDPeriod1}</span>
76
+ <i className='fa-solid fa-angle-down icon caret'></i>
77
+ </button>
78
+
79
+ <ul
80
+ className='dropdown-menu dropdown-submenu shadow-2'
81
+ ref={DDPeriod1Dropwdown}
82
+ >
83
+ <li>
84
+ <button
85
+ className='dropdown-item'
86
+ onClick={() =>
87
+ updateDDPeriod1('Custom range', DDPeriod1Dropwdown)
88
+ }
89
+ >
90
+ Custom range
91
+ </button>
92
+ </li>
93
+
94
+ <li>
95
+ <button
96
+ className='dropdown-item'
97
+ onClick={() => updateDDPeriod1('Today', DDPeriod1Dropwdown)}
98
+ >
99
+ Today
100
+ </button>
101
+ </li>
102
+
103
+ <li>
104
+ <button
105
+ className='dropdown-item'
106
+ onClick={() =>
107
+ updateDDPeriod1('Yesterday', DDPeriod1Dropwdown)
108
+ }
109
+ >
110
+ Yesterday
111
+ </button>
112
+ </li>
113
+
114
+ <li>
115
+ <button
116
+ className='dropdown-item'
117
+ onClick={() =>
118
+ updateDDPeriod1('Yesterday and today', DDPeriod1Dropwdown)
119
+ }
120
+ >
121
+ Yesterday and today
122
+ </button>
123
+ </li>
124
+
125
+ <li>
126
+ <button
127
+ className='dropdown-item'
128
+ onClick={() =>
129
+ updateDDPeriod1('This week', DDPeriod1Dropwdown)
130
+ }
131
+ >
132
+ This week
133
+ </button>
134
+ </li>
135
+ </ul>
136
+ </div>
137
+
138
+ <div className='dropdown dropdown-pills'>
139
+ <label className='dropdown-label' htmlFor='detailLevelDate1'>
140
+ Detail level
141
+ </label>
142
+ <button
143
+ className='btn btn-input grey dropdown-toggle'
144
+ type='button'
145
+ data-bs-toggle='dropdown'
146
+ aria-expanded='false'
147
+ id='detailLevelDate1'
148
+ ref={DDDetailLevel1Btn}
149
+ >
150
+ <span>{DDDetailLevel1}</span>
151
+ <i className='fa-solid fa-angle-down icon caret'></i>
152
+ </button>
153
+
154
+ <ul
155
+ className='dropdown-menu dropdown-submenu shadow-2'
156
+ ref={DDDetailLevel1Dropwdown}
157
+ >
158
+ <li>
159
+ <button
160
+ className='dropdown-item'
161
+ onClick={() =>
162
+ updateDDDetailLevel1('Hourly', DDDetailLevel1Dropwdown)
163
+ }
164
+ >
165
+ Hourly
166
+ </button>
167
+ </li>
168
+ <li>
169
+ <button
170
+ className='dropdown-item'
171
+ onClick={() =>
172
+ updateDDDetailLevel1('Daily', DDDetailLevel1Dropwdown)
173
+ }
174
+ >
175
+ Daily
176
+ </button>
177
+ </li>
178
+ <li>
179
+ <button
180
+ className='dropdown-item'
181
+ onClick={() =>
182
+ updateDDDetailLevel1('Monthly', DDDetailLevel1Dropwdown)
183
+ }
184
+ >
185
+ Monthly
186
+ </button>
187
+ </li>
188
+ <li>
189
+ <button
190
+ className='dropdown-item'
191
+ onClick={() =>
192
+ updateDDDetailLevel1('Total', DDDetailLevel1Dropwdown)
193
+ }
194
+ >
195
+ Total
196
+ </button>
197
+ </li>
198
+ </ul>
199
+ </div>
200
+ </div>
201
+ </div>
202
+
203
+ {/* DROPDOWNS FOR DATE 2 */}
204
+ <div
205
+ className='tab-pane fade show'
206
+ id='date2ComparisonTabPane'
207
+ role='tabpanel'
208
+ aria-labelledby='date2ComparisonTab'
209
+ tabIndex={0}
210
+ >
211
+ <div className='d-flex gap-3 flex-column flex-md-row'>
212
+ <div className='dropdown dropdown-pills'>
213
+ <label className='dropdown-label' htmlFor='periodDate2'>
214
+ Period
215
+ </label>
216
+ <button
217
+ className='btn btn-input grey dropdown-toggle'
218
+ type='button'
219
+ data-bs-toggle='dropdown'
220
+ aria-expanded='false'
221
+ id='periodDate2'
222
+ ref={DDPeriod2Btn}
223
+ >
224
+ <span>{DDPeriod2}</span>
225
+ <i className='fa-solid fa-angle-down icon caret'></i>
226
+ </button>
227
+
228
+ <ul
229
+ className='dropdown-menu dropdown-submenu shadow-2'
230
+ ref={DDPeriod2Dropwdown}
231
+ >
232
+ <li>
233
+ <button
234
+ className='dropdown-item'
235
+ onClick={() =>
236
+ updateDDPeriod2('Custom range', DDPeriod2Dropwdown)
237
+ }
238
+ >
239
+ Custom range
240
+ </button>
241
+ </li>
242
+ <li>
243
+ <button
244
+ className='dropdown-item'
245
+ onClick={() => updateDDPeriod2('Today', DDPeriod2Dropwdown)}
246
+ >
247
+ Today
248
+ </button>
249
+ </li>
250
+ <li>
251
+ <button
252
+ className='dropdown-item'
253
+ onClick={() =>
254
+ updateDDPeriod2('Yesterday', DDPeriod2Dropwdown)
255
+ }
256
+ >
257
+ Yesterday
258
+ </button>
259
+ </li>
260
+ <li>
261
+ <button
262
+ className='dropdown-item'
263
+ onClick={() =>
264
+ updateDDPeriod2('Yesterday and today', DDPeriod2Dropwdown)
265
+ }
266
+ >
267
+ Yesterday and today
268
+ </button>
269
+ </li>
270
+ <li>
271
+ <button
272
+ className='dropdown-item'
273
+ onClick={() =>
274
+ updateDDPeriod2('This week', DDPeriod2Dropwdown)
275
+ }
276
+ >
277
+ This week
278
+ </button>
279
+ </li>
280
+ </ul>
281
+ </div>
282
+
283
+ <div className='dropdown dropdown-pills'>
284
+ <label className='dropdown-label' htmlFor='detailLevelDate2'>
285
+ Detail level
286
+ </label>
287
+ <button
288
+ className='btn btn-input grey dropdown-toggle'
289
+ type='button'
290
+ data-bs-toggle='dropdown'
291
+ aria-expanded='false'
292
+ id='detailLevelDate2'
293
+ ref={DDDetailLevel2Btn}
294
+ >
295
+ <span>{DDDetailLevel2}</span>
296
+ <i className='fa-solid fa-angle-down icon caret'></i>
297
+ </button>
298
+
299
+ <ul
300
+ className='dropdown-menu dropdown-submenu shadow-2'
301
+ ref={DDDetailLevel2Dropwdown}
302
+ >
303
+ <li>
304
+ <button
305
+ className='dropdown-item'
306
+ onClick={() =>
307
+ updateDDDetailLevel2('Hourly', DDDetailLevel2Dropwdown)
308
+ }
309
+ >
310
+ Hourly
311
+ </button>
312
+ </li>
313
+ <li>
314
+ <button
315
+ className='dropdown-item'
316
+ onClick={() =>
317
+ updateDDDetailLevel2('Daily', DDDetailLevel2Dropwdown)
318
+ }
319
+ >
320
+ Daily
321
+ </button>
322
+ </li>
323
+ <li>
324
+ <button
325
+ className='dropdown-item'
326
+ onClick={() =>
327
+ updateDDDetailLevel2('Monthly', DDDetailLevel2Dropwdown)
328
+ }
329
+ >
330
+ Monthly
331
+ </button>
332
+ </li>
333
+ <li>
334
+ <button
335
+ className='dropdown-item'
336
+ onClick={() =>
337
+ updateDDDetailLevel2('Total', DDDetailLevel2Dropwdown)
338
+ }
339
+ >
340
+ Total
341
+ </button>
342
+ </li>
343
+ </ul>
344
+ </div>
345
+ </div>
346
+ </div>
347
+ </div>
348
+ );
349
+ };
350
+
351
+ export default PeriodAndDetailDropdowns;
@@ -0,0 +1,3 @@
1
+ import DropdownDatePicker from "./DropdownDatePicker";
2
+
3
+ export { DropdownDatePicker };
@@ -1,5 +1,6 @@
1
1
  import DropdownComponent from './DropdownComponent';
2
2
  import DropdownFilter from './DropdownFilter';
3
- import DropdownInput from './DropdownInput';
3
+ import DropdownMultiSelect from './DropdownMultiSelect';
4
+ import { DropdownDatePicker } from './DropdownsDatePicker/index';
4
5
 
5
- export { DropdownComponent, DropdownFilter, DropdownInput }
6
+ export { DropdownComponent, DropdownFilter, DropdownMultiSelect, DropdownDatePicker }