@quillsql/react 2.10.17 → 2.10.18
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/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/Dashboard.d.ts +24 -16
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +86 -478
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +3 -0
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -0
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +260 -0
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +20 -1
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +93 -4
- package/dist/cjs/QuillProvider.d.ts +1 -0
- package/dist/cjs/QuillProvider.d.ts.map +1 -1
- package/dist/cjs/QuillProvider.js +1 -0
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +1 -2
- package/dist/cjs/components/QuillSelect.d.ts +3 -0
- package/dist/cjs/components/QuillSelect.d.ts.map +1 -0
- package/dist/cjs/components/QuillSelect.js +109 -0
- package/dist/cjs/components/UiComponents.d.ts +1 -0
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/index.d.ts +0 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -3
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +9 -0
- package/dist/cjs/utils/aggregate.js +2 -2
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/Dashboard.d.ts +24 -16
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +84 -475
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +3 -0
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -0
- package/dist/esm/DateRangePicker/QuillDateRangePicker.js +256 -0
- package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +20 -1
- package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/dateRangePickerUtils.js +91 -3
- package/dist/esm/QuillProvider.d.ts +1 -0
- package/dist/esm/QuillProvider.d.ts.map +1 -1
- package/dist/esm/QuillProvider.js +1 -0
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +0 -1
- package/dist/esm/components/QuillSelect.d.ts +3 -0
- package/dist/esm/components/QuillSelect.d.ts.map +1 -0
- package/dist/esm/components/QuillSelect.js +105 -0
- package/dist/esm/components/UiComponents.d.ts +1 -0
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/index.d.ts +0 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +0 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +10 -1
- package/dist/esm/utils/aggregate.js +1 -1
- package/package.json +1 -1
- package/dist/cjs/AddToDashboardModal.d.ts +0 -82
- package/dist/cjs/AddToDashboardModal.d.ts.map +0 -1
- package/dist/cjs/AddToDashboardModal.js +0 -1469
- package/dist/esm/AddToDashboardModal.d.ts +0 -82
- package/dist/esm/AddToDashboardModal.d.ts.map +0 -1
- package/dist/esm/AddToDashboardModal.js +0 -1435
package/dist/esm/Dashboard.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useContext, useEffect, useState,
|
|
2
|
+
import { useContext, useEffect, useState, useCallback, memo, } from 'react';
|
|
3
3
|
import Chart from './Chart';
|
|
4
|
-
import {
|
|
4
|
+
import { defaultOptions, PRIMARY_RANGE, COMPARISON_RANGE, defaultOptionsV2, COMPARISON_OPTIONS, getRangeFromPresetOptions, } from './DateRangePicker/dateRangePickerUtils';
|
|
5
5
|
import { ClientContext, DashboardContext, ThemeContext, DashboardFiltersContext, DateFilterContext, useComparisonRange, useDateFilter, } from './Context';
|
|
6
|
-
import {
|
|
7
|
-
import { ArrowDownHeadIcon, ArrowLeftHeadIcon, ArrowRightHeadIcon, CalendarNormalIcon, } from './assets';
|
|
8
|
-
import { useOnClickOutside } from './hooks';
|
|
9
|
-
import { enUS } from 'date-fns/locale';
|
|
6
|
+
import { ArrowDownHeadIcon } from './assets';
|
|
10
7
|
import { useDashboard } from './hooks/useDashboard';
|
|
11
8
|
import { hashCode } from './utils/crypto';
|
|
12
9
|
import DashboardSectionContainer from './components/Dashboard/DashboardSectionContainer';
|
|
@@ -16,69 +13,19 @@ import QuillChartComponent from './components/Dashboard/ChartComponent';
|
|
|
16
13
|
import DashboardSection from './components/Dashboard/DashboardSection';
|
|
17
14
|
import { styleToProps } from './utils/styles';
|
|
18
15
|
import { cleanDashboardItem } from './utils/dashboard';
|
|
16
|
+
import { QuillDateRangePicker } from './DateRangePicker/QuillDateRangePicker';
|
|
19
17
|
import DataLoader from './components/Dashboard/DataLoader';
|
|
20
|
-
|
|
21
|
-
{
|
|
22
|
-
value: 'PREV_PERIOD',
|
|
23
|
-
text: 'Previous Period',
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
value: 'PREV_7_DAYS',
|
|
27
|
-
text: 'Previous 7 days',
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
value: 'PREV_30_DAYS',
|
|
31
|
-
text: 'Previous 30 days',
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
value: 'PREV_90_DAYS',
|
|
35
|
-
text: 'Previous 90 days',
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
value: 'NO_COMPARISON',
|
|
39
|
-
text: 'No comparison',
|
|
40
|
-
},
|
|
41
|
-
];
|
|
42
|
-
export const PRIMARY_OPTIONS = [
|
|
43
|
-
{ value: 'THIS_WEEK', text: 'This Week' },
|
|
44
|
-
{ value: 'THIS_MONTH', text: 'This Month' },
|
|
45
|
-
{ value: 'THIS_YEAR', text: 'This year' },
|
|
46
|
-
{ value: 'LAST_7_DAYS', text: 'Last 7 days' },
|
|
47
|
-
{ value: 'LAST_30_DAYS', text: 'Last 30 days' },
|
|
48
|
-
{ value: 'LAST_90_DAYS', text: 'Last 90 days' },
|
|
49
|
-
{ value: 'LAST_6_MONTHS', text: 'Last 6 months' },
|
|
50
|
-
{ value: 'ALL_TIME', text: 'All time' },
|
|
51
|
-
];
|
|
52
|
-
const FILTER_CODE_MAP = {
|
|
53
|
-
wk: 'This week',
|
|
54
|
-
m: 'This month',
|
|
55
|
-
y: 'This year',
|
|
56
|
-
w: 'Last 7 days',
|
|
57
|
-
t: 'Last 30 days',
|
|
58
|
-
'90d': 'Last 90 days',
|
|
59
|
-
'6m': 'Last 6 months',
|
|
60
|
-
at: 'All time',
|
|
61
|
-
};
|
|
18
|
+
import { QuillSelectComponent } from './components/QuillSelect';
|
|
62
19
|
export function DashboardFilter({ filter, onChangeFilter, SelectComponent, DateRangePickerComponent, theme, }) {
|
|
63
20
|
const { comparisonRange, setComparisonRange } = useComparisonRange();
|
|
64
21
|
const { setDateFilter } = useDateFilter();
|
|
65
22
|
const [filterValue, setFilterValue] = useState(null);
|
|
66
23
|
useEffect(() => {
|
|
67
|
-
if (filter.filterType === '
|
|
68
|
-
!filter.selectedValue &&
|
|
69
|
-
!filterValue) {
|
|
70
|
-
setFilterValue([filter.startDate, filter.endDate, null]);
|
|
71
|
-
}
|
|
72
|
-
else if (filter.filterType === 'date_range' && !filterValue) {
|
|
73
|
-
setFilterValue(filter.selectedValue);
|
|
74
|
-
}
|
|
75
|
-
else if (filter.filterType === 'string') {
|
|
24
|
+
if (filter.filterType === 'string') {
|
|
76
25
|
setFilterValue(filter.selectedValue);
|
|
77
26
|
}
|
|
78
27
|
if (filter.filterType == 'date_range') {
|
|
79
|
-
setDateFilter(filter.
|
|
80
|
-
? FILTER_CODE_MAP[filter.selectedValue[2]]
|
|
81
|
-
: null);
|
|
28
|
+
setDateFilter(filter.preset.label);
|
|
82
29
|
if (filter?.comparisonRange?.value) {
|
|
83
30
|
const newComparisonRange = COMPARISON_OPTIONS.find((option) => {
|
|
84
31
|
return option.value === filter.comparisonRange.value;
|
|
@@ -91,7 +38,7 @@ export function DashboardFilter({ filter, onChangeFilter, SelectComponent, DateR
|
|
|
91
38
|
}
|
|
92
39
|
}, [filter]);
|
|
93
40
|
if (filter.filterType === 'string') {
|
|
94
|
-
return (_jsx(
|
|
41
|
+
return (_jsx(QuillSelectComponent, { theme: theme, label: filter.label, value: filterValue, onChange: (e) => {
|
|
95
42
|
onChangeFilter(filter, e);
|
|
96
43
|
}, options: [
|
|
97
44
|
...filter.options.map((elem) => {
|
|
@@ -107,31 +54,14 @@ export function DashboardFilter({ filter, onChangeFilter, SelectComponent, DateR
|
|
|
107
54
|
display: 'flex',
|
|
108
55
|
flexDirection: 'row',
|
|
109
56
|
alignItems: 'flex-end',
|
|
110
|
-
}, children: [_jsx(DateRangePickerComponent, { dateRange:
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
},
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
if (typeof preset === 'string') {
|
|
119
|
-
const fullPreset = getRangeFromPreset(preset);
|
|
120
|
-
onChangeFilter(filter, fullPreset);
|
|
121
|
-
setFilterValue(fullPreset);
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
onChangeFilter(filter, [
|
|
125
|
-
preset?.startDate || null,
|
|
126
|
-
new Date(),
|
|
127
|
-
preset?.value || '',
|
|
128
|
-
]);
|
|
129
|
-
setFilterValue([
|
|
130
|
-
preset?.startDate || null,
|
|
131
|
-
new Date(),
|
|
132
|
-
preset?.value || '',
|
|
133
|
-
]);
|
|
134
|
-
}, presetOptions: defaultOptions }), comparisonRange && (_jsx("div", { children: _jsxs("div", { style: {
|
|
57
|
+
}, children: [_jsx(DateRangePickerComponent, { label: filter.label, dateRange: { startDate: filter.startDate, endDate: filter.endDate }, preset: filter.preset.label, onChangeDateRange: (value) => {
|
|
58
|
+
onChangeFilter(filter, {
|
|
59
|
+
startDate: value.startDate,
|
|
60
|
+
endDate: value.endDate,
|
|
61
|
+
});
|
|
62
|
+
}, onChangePreset: (value) => {
|
|
63
|
+
onChangeFilter(filter, { preset: value });
|
|
64
|
+
}, presetOptions: filter.options || defaultOptions }), comparisonRange && (_jsx("div", { children: _jsxs("div", { style: {
|
|
135
65
|
display: 'flex',
|
|
136
66
|
flexDirection: 'row',
|
|
137
67
|
alignItems: 'center',
|
|
@@ -140,7 +70,8 @@ export function DashboardFilter({ filter, onChangeFilter, SelectComponent, DateR
|
|
|
140
70
|
paddingRight: 12,
|
|
141
71
|
color: theme?.secondaryTextColor,
|
|
142
72
|
fontFamily: theme?.fontFamily,
|
|
143
|
-
|
|
73
|
+
fontSize: 14,
|
|
74
|
+
}, children: "compared to" }), _jsx(QuillSelectComponent, { theme: theme, value: comparisonRange.value, onChange: (e) => {
|
|
144
75
|
onChangeFilter(filter, null, COMPARISON_OPTIONS.find((option) => {
|
|
145
76
|
return option.value === e;
|
|
146
77
|
}));
|
|
@@ -153,32 +84,6 @@ export function DashboardFilter({ filter, onChangeFilter, SelectComponent, DateR
|
|
|
153
84
|
}
|
|
154
85
|
return null;
|
|
155
86
|
}
|
|
156
|
-
const options = [
|
|
157
|
-
{
|
|
158
|
-
date_range: [startOfWeek(startOfToday()), startOfToday(), 'wk'],
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
date_range: [sub(startOfToday(), { days: 90 }), startOfToday(), '90d'],
|
|
162
|
-
},
|
|
163
|
-
{
|
|
164
|
-
date_range: [sub(startOfToday(), { days: 30 }), startOfToday(), 't'],
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
date_range: [sub(startOfToday(), { years: 100 }), startOfToday(), 'at'],
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
date_range: [startOfYear(startOfToday()), startOfToday(), 'y'],
|
|
171
|
-
},
|
|
172
|
-
{
|
|
173
|
-
date_range: [startOfMonth(startOfToday()), startOfToday(), 'm'],
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
date_range: [sub(startOfToday(), { days: 7 }), startOfToday(), 'w'],
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
date_range: [sub(startOfToday(), { months: 6 }), startOfToday(), '6m'],
|
|
180
|
-
},
|
|
181
|
-
];
|
|
182
87
|
const QuillDropdownComponent = ({ onChange, value, label, options, }) => {
|
|
183
88
|
const [theme] = useContext(ThemeContext);
|
|
184
89
|
const handleOnChange = useCallback((event) => {
|
|
@@ -224,317 +129,12 @@ const QuillDropdownComponent = ({ onChange, value, label, options, }) => {
|
|
|
224
129
|
color: theme?.secondaryTextColor,
|
|
225
130
|
}, "aria-hidden": "true" })] })] }));
|
|
226
131
|
};
|
|
227
|
-
const isBetween = (date, startDate, endDate) => {
|
|
228
|
-
return isAfter(date, startDate) && isBefore(date, endDate);
|
|
229
|
-
};
|
|
230
|
-
function Calendar({ anchorDate, onClickDate, theme, localStartDate, localEndDate, }) {
|
|
231
|
-
const firstDayOfDisplayedMonth = startOfMonth(anchorDate);
|
|
232
|
-
const lastDayOfDisplayedMonth = endOfMonth(anchorDate);
|
|
233
|
-
const weekdays = getWeekdays(enUS).map((dayName) => capitalize(dayName, enUS));
|
|
234
|
-
const displayedDates = eachDayOfInterval({
|
|
235
|
-
start: isSunday(firstDayOfDisplayedMonth)
|
|
236
|
-
? firstDayOfDisplayedMonth
|
|
237
|
-
: previousSunday(firstDayOfDisplayedMonth),
|
|
238
|
-
end: isSaturday(lastDayOfDisplayedMonth)
|
|
239
|
-
? lastDayOfDisplayedMonth
|
|
240
|
-
: nextSaturday(lastDayOfDisplayedMonth),
|
|
241
|
-
});
|
|
242
|
-
const displayedTitle = capitalize(format(firstDayOfDisplayedMonth, 'MMMM yyyy', { locale: enUS }), enUS);
|
|
243
|
-
return (_jsxs("div", { style: {
|
|
244
|
-
display: 'flex',
|
|
245
|
-
flexDirection: 'column',
|
|
246
|
-
flex: 1,
|
|
247
|
-
// alignItems: 'center',
|
|
248
|
-
}, children: [_jsx("h2", { style: {
|
|
249
|
-
color: theme?.textColor || '#364153',
|
|
250
|
-
fontSize: '13px',
|
|
251
|
-
fontFamily: theme?.fontFamily,
|
|
252
|
-
fontWeight: '700',
|
|
253
|
-
width: '100%',
|
|
254
|
-
textAlign: 'center',
|
|
255
|
-
height: 36,
|
|
256
|
-
display: 'flex',
|
|
257
|
-
flexDirection: 'row',
|
|
258
|
-
alignItems: 'center',
|
|
259
|
-
justifyContent: 'center',
|
|
260
|
-
marginBottom: 3,
|
|
261
|
-
marginTop: 6,
|
|
262
|
-
}, children: displayedTitle }), _jsx("div", { style: {
|
|
263
|
-
color: theme?.primaryTextColor || '#364153',
|
|
264
|
-
textAlign: 'center',
|
|
265
|
-
fontSize: 12,
|
|
266
|
-
fontWeight: '500',
|
|
267
|
-
display: 'grid',
|
|
268
|
-
gridTemplateColumns: 'repeat(7, minmax(0, 1fr))',
|
|
269
|
-
paddingTop: 6,
|
|
270
|
-
}, children: weekdays.map((dayName) => (_jsx("div", { style: { width: '100%', display: 'flex', justifyContent: 'center' }, children: _jsx("div", { style: {
|
|
271
|
-
display: 'flex',
|
|
272
|
-
alignItems: 'center',
|
|
273
|
-
justifyContent: 'center',
|
|
274
|
-
width: '100%',
|
|
275
|
-
// height: '2.25rem',
|
|
276
|
-
fontFamily: theme?.fontFamily,
|
|
277
|
-
color: theme.secondaryTextColor,
|
|
278
|
-
paddingBottom: 4,
|
|
279
|
-
}, children: dayName }) }, dayName))) }), _jsx("div", { style: {
|
|
280
|
-
display: 'grid',
|
|
281
|
-
gridTemplateColumns: 'repeat(7, minmax(0, 1fr))',
|
|
282
|
-
borderRadius: 3,
|
|
283
|
-
overflow: 'hidden',
|
|
284
|
-
rowGap: 6,
|
|
285
|
-
}, children: displayedDates.map((date, index) => {
|
|
286
|
-
return (_jsx("div", { style: { width: '100%' }, children: _jsx("button", { style: {
|
|
287
|
-
border: 'none',
|
|
288
|
-
height: '34px',
|
|
289
|
-
display: 'flex',
|
|
290
|
-
width: '100%',
|
|
291
|
-
alignItems: 'center',
|
|
292
|
-
justifyContent: 'center',
|
|
293
|
-
fontFamily: theme?.fontFamily,
|
|
294
|
-
fontSize: 13,
|
|
295
|
-
background: isEqual(localStartDate, date) || isEqual(localEndDate, date)
|
|
296
|
-
? theme.primaryTextColor
|
|
297
|
-
: isBetween(date, localStartDate, localEndDate)
|
|
298
|
-
? '#F4F4F5'
|
|
299
|
-
: 'transparent',
|
|
300
|
-
color: isEqual(localStartDate, date) || isEqual(localEndDate, date)
|
|
301
|
-
? theme.backgroundColor
|
|
302
|
-
: theme.primaryTextColor,
|
|
303
|
-
borderRadius: isEqual(localStartDate, date) || isEqual(localEndDate, date)
|
|
304
|
-
? 3
|
|
305
|
-
: 0,
|
|
306
|
-
...isBeginningOrEndOfWeek(index),
|
|
307
|
-
}, type: "button", onClick: () => {
|
|
308
|
-
onClickDate(date);
|
|
309
|
-
}, children: _jsx("time", { dateTime: format(date, 'yyyy-MM-dd', { locale: enUS }), children: format(date, 'd', { locale: enUS }) }) }) }, date.toString()));
|
|
310
|
-
}) }), _jsx("div", { style: { height: 8 } })] }));
|
|
311
|
-
}
|
|
312
|
-
function isBeginningOrEndOfWeek(num) {
|
|
313
|
-
// Check if the number is 0
|
|
314
|
-
if (num === 0)
|
|
315
|
-
return { borderTopLeftRadius: 3, borderBottomLeftRadius: 3 };
|
|
316
|
-
// Check if the number is divisible by 7
|
|
317
|
-
if (num % 7 === 0)
|
|
318
|
-
return { borderTopLeftRadius: 3, borderBottomLeftRadius: 3 };
|
|
319
|
-
// Check if the number is one less than a multiple of 7
|
|
320
|
-
if ((num + 1) % 7 === 0)
|
|
321
|
-
return { borderTopRightRadius: 3, borderBottomRightRadius: 3 };
|
|
322
|
-
// If none of the conditions are met, return false
|
|
323
|
-
return {};
|
|
324
|
-
}
|
|
325
|
-
const formatDateText = (dateRange, localStartDate, localEndDate) => {
|
|
326
|
-
if (dateRange.length && dateRange[0] && dateRange[1]) {
|
|
327
|
-
return (format(dateRange[0], 'MMM dd, yyyy') +
|
|
328
|
-
' - ' +
|
|
329
|
-
format(dateRange[1], 'MMM dd, yyyy'));
|
|
330
|
-
}
|
|
331
|
-
if (localStartDate && localEndDate) {
|
|
332
|
-
return (format(localStartDate, 'MMM dd, yyyy') +
|
|
333
|
-
' - ' +
|
|
334
|
-
format(localEndDate, 'MMM dd, yyyy'));
|
|
335
|
-
}
|
|
336
|
-
return '';
|
|
337
|
-
};
|
|
338
|
-
function CalendarDropdown({ onChangeDateRange, dateRange }) {
|
|
339
|
-
const [theme] = useContext(ThemeContext);
|
|
340
|
-
const [showModal, setShowModal] = useState(false);
|
|
341
|
-
const modalRef = useRef(null);
|
|
342
|
-
const parentRef = useRef(null);
|
|
343
|
-
const [anchorDate, setAnchorDate] = useState(null);
|
|
344
|
-
const [localStartDate, setLocalStartDate] = useState(null);
|
|
345
|
-
const [localEndDate, setLocalEndDate] = useState(null);
|
|
346
|
-
const prevMonthAnchor = subDays(startOfMonth(anchorDate), 1);
|
|
347
|
-
const onClickDate = (date) => {
|
|
348
|
-
if (localStartDate && isBefore(date, localStartDate)) {
|
|
349
|
-
setLocalStartDate(date);
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
if (localEndDate && isAfter(date, localEndDate)) {
|
|
353
|
-
setLocalEndDate(date);
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
if (localEndDate && isBefore(date, localEndDate)) {
|
|
357
|
-
setLocalEndDate(date);
|
|
358
|
-
return;
|
|
359
|
-
}
|
|
360
|
-
if (isEqual(localStartDate, date) || isEqual(localEndDate, date)) {
|
|
361
|
-
setLocalStartDate(null);
|
|
362
|
-
setLocalEndDate(null);
|
|
363
|
-
}
|
|
364
|
-
if (!localStartDate) {
|
|
365
|
-
setLocalStartDate(date);
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
if (!localEndDate) {
|
|
369
|
-
setLocalEndDate(date);
|
|
370
|
-
return;
|
|
371
|
-
}
|
|
372
|
-
};
|
|
373
|
-
useEffect(() => {
|
|
374
|
-
if (localEndDate &&
|
|
375
|
-
localStartDate &&
|
|
376
|
-
isBefore(localStartDate, localEndDate)) {
|
|
377
|
-
onChangeDateRange([localStartDate, localEndDate]);
|
|
378
|
-
}
|
|
379
|
-
}, [localEndDate, localStartDate]);
|
|
380
|
-
useEffect(() => {
|
|
381
|
-
if (dateRange.length && !anchorDate) {
|
|
382
|
-
setAnchorDate(dateRange[1]);
|
|
383
|
-
}
|
|
384
|
-
}, [dateRange, anchorDate]);
|
|
385
|
-
useOnClickOutside(modalRef, (e) => {
|
|
386
|
-
// Exclude click on trigger button (e.g. Dropdown Button) from outside click handler
|
|
387
|
-
const isTriggerElem = parentRef
|
|
388
|
-
? parentRef.current?.contains(e.target)
|
|
389
|
-
: false;
|
|
390
|
-
if (!isTriggerElem) {
|
|
391
|
-
setShowModal(false);
|
|
392
|
-
}
|
|
393
|
-
});
|
|
394
|
-
return (_jsxs("div", { ref: parentRef, style: { position: 'relative', height: 38 }, children: [_jsx("button", {
|
|
395
|
-
// onChange={handleOnChange}
|
|
396
|
-
// value={value}
|
|
397
|
-
onClick: () => setShowModal((showModal) => !showModal), id: 'reportbuilderdropdown', defaultValue: "Select", style: {
|
|
398
|
-
width: '100%',
|
|
399
|
-
WebkitAppearance: 'none',
|
|
400
|
-
minWidth: 275,
|
|
401
|
-
maxWidth: 275,
|
|
402
|
-
outline: 'none',
|
|
403
|
-
textAlign: 'left',
|
|
404
|
-
whiteSpace: 'nowrap',
|
|
405
|
-
overflow: 'hidden',
|
|
406
|
-
textOverflow: 'ellipsis',
|
|
407
|
-
borderRadius: 6,
|
|
408
|
-
// paddingLeft: 12,
|
|
409
|
-
paddingRight: 12,
|
|
410
|
-
height: 38,
|
|
411
|
-
borderStyle: 'solid',
|
|
412
|
-
borderWidth: theme.borderWidth,
|
|
413
|
-
borderColor: theme.borderColor,
|
|
414
|
-
background: theme.backgroundColor,
|
|
415
|
-
color: theme.primaryTextColor,
|
|
416
|
-
boxShadow: '0 1px 2px 0 rgba(0,0,0,.05)',
|
|
417
|
-
fontFamily: theme.fontFamily,
|
|
418
|
-
fontSize: 14,
|
|
419
|
-
fontWeight: 500,
|
|
420
|
-
minHeight: 38,
|
|
421
|
-
marginBottom: 0,
|
|
422
|
-
paddingLeft: 14 + 15 + 3,
|
|
423
|
-
}, children: formatDateText(dateRange, localStartDate, localEndDate) }), _jsx(CalendarNormalIcon, { style: {
|
|
424
|
-
height: '15px',
|
|
425
|
-
width: '15px',
|
|
426
|
-
flex: 'none',
|
|
427
|
-
position: 'absolute',
|
|
428
|
-
left: 12,
|
|
429
|
-
top: 11,
|
|
430
|
-
color: theme?.primaryTextColor,
|
|
431
|
-
} }), showModal && (_jsxs("div", { ref: modalRef, style: {
|
|
432
|
-
position: 'absolute',
|
|
433
|
-
zIndex: 1,
|
|
434
|
-
overflowY: 'auto',
|
|
435
|
-
top: 38 + 8,
|
|
436
|
-
width: 230 + 245 + 12,
|
|
437
|
-
// left: getAbsoluteSpacing(),
|
|
438
|
-
// right: getAbsoluteSpacing(),
|
|
439
|
-
// height: 230 + 10,
|
|
440
|
-
backgroundColor: theme?.backgroundColor || 'white',
|
|
441
|
-
borderColor: theme?.borderColor || '#E5E7EB',
|
|
442
|
-
borderTopStyle: 'solid',
|
|
443
|
-
borderBottomStyle: 'solid',
|
|
444
|
-
borderLeftStyle: 'solid',
|
|
445
|
-
borderRightStyle: 'solid',
|
|
446
|
-
borderTopWidth: 1,
|
|
447
|
-
borderBottomWidth: 1,
|
|
448
|
-
borderLeftWidth: 1,
|
|
449
|
-
borderRightWidth: 1,
|
|
450
|
-
marginTop: 0,
|
|
451
|
-
// marginTop: '6px',
|
|
452
|
-
borderRadius: 5,
|
|
453
|
-
display: 'flex',
|
|
454
|
-
flexDirection: 'row',
|
|
455
|
-
alignItems: 'flex-start',
|
|
456
|
-
boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',
|
|
457
|
-
gap: 12,
|
|
458
|
-
paddingLeft: 8,
|
|
459
|
-
paddingRight: 8,
|
|
460
|
-
paddingBottom: 1,
|
|
461
|
-
}, children: [_jsx("button", { style: {
|
|
462
|
-
height: 32,
|
|
463
|
-
width: 32,
|
|
464
|
-
position: 'absolute',
|
|
465
|
-
borderColor: theme?.borderColor || '#E5E7EB',
|
|
466
|
-
borderTopStyle: 'solid',
|
|
467
|
-
borderBottomStyle: 'solid',
|
|
468
|
-
borderLeftStyle: 'solid',
|
|
469
|
-
borderRightStyle: 'solid',
|
|
470
|
-
borderTopWidth: 1,
|
|
471
|
-
borderBottomWidth: 1,
|
|
472
|
-
borderLeftWidth: 1,
|
|
473
|
-
borderRightWidth: 1,
|
|
474
|
-
top: 8,
|
|
475
|
-
left: 8,
|
|
476
|
-
borderRadius: 3,
|
|
477
|
-
display: 'flex',
|
|
478
|
-
alignItems: 'center',
|
|
479
|
-
justifyContent: 'center',
|
|
480
|
-
background: 'transparent',
|
|
481
|
-
}, onClick: () => setAnchorDate((date) => subDays(startOfMonth(date), 1)), children: _jsx(ArrowLeftHeadIcon, { style: {
|
|
482
|
-
height: '20px',
|
|
483
|
-
width: '20px',
|
|
484
|
-
color: theme?.secondaryTextColor,
|
|
485
|
-
}, "aria-hidden": "true" }) }), _jsx("button", { style: {
|
|
486
|
-
height: 32,
|
|
487
|
-
width: 32,
|
|
488
|
-
borderColor: theme?.borderColor || '#E5E7EB',
|
|
489
|
-
borderTopStyle: 'solid',
|
|
490
|
-
borderBottomStyle: 'solid',
|
|
491
|
-
borderLeftStyle: 'solid',
|
|
492
|
-
borderRightStyle: 'solid',
|
|
493
|
-
borderTopWidth: 1,
|
|
494
|
-
borderBottomWidth: 1,
|
|
495
|
-
borderLeftWidth: 1,
|
|
496
|
-
borderRightWidth: 1,
|
|
497
|
-
position: 'absolute',
|
|
498
|
-
top: 8,
|
|
499
|
-
right: 8,
|
|
500
|
-
borderRadius: 3,
|
|
501
|
-
display: 'flex',
|
|
502
|
-
alignItems: 'center',
|
|
503
|
-
justifyContent: 'center',
|
|
504
|
-
background: 'transparent',
|
|
505
|
-
}, onClick: () => setAnchorDate((date) => addDays(endOfMonth(date), 1)), children: _jsx(ArrowRightHeadIcon, { style: {
|
|
506
|
-
height: '20px',
|
|
507
|
-
width: '20px',
|
|
508
|
-
color: theme?.secondaryTextColor,
|
|
509
|
-
}, "aria-hidden": "true" }) }), anchorDate && (_jsx(Calendar, { anchorDate: prevMonthAnchor, dateRange: dateRange, theme: theme, onClickDate: onClickDate, localStartDate: localStartDate, localEndDate: localEndDate })), anchorDate && (_jsx(Calendar, { anchorDate: anchorDate, dateRange: dateRange, theme: theme, onClickDate: onClickDate, localStartDate: localStartDate, localEndDate: localEndDate }))] }))] }));
|
|
510
|
-
}
|
|
511
|
-
export const QuillDateRangePicker = ({ label, dateRange, onChangeDateRange, presetOptions, preset, onChangePreset, }) => {
|
|
512
|
-
const [theme] = useContext(ThemeContext);
|
|
513
|
-
return (_jsxs("div", { children: [label !== '' && (_jsx("div", { style: {
|
|
514
|
-
marginBottom: 6,
|
|
515
|
-
fontWeight: theme.labelFontWeight || '600',
|
|
516
|
-
color: theme.secondaryTextColor,
|
|
517
|
-
fontFamily: theme.fontFamily,
|
|
518
|
-
fontSize: 14,
|
|
519
|
-
}, children: label })), _jsxs("div", { style: {
|
|
520
|
-
display: 'flex',
|
|
521
|
-
flexDirection: 'row',
|
|
522
|
-
alignItems: 'center',
|
|
523
|
-
gap: 12,
|
|
524
|
-
}, children: [_jsx(MemoizedCalendarDropdown, { dateRange: dateRange, onChangeDateRange: onChangeDateRange, theme: theme }), _jsx(MemoizedDropdown, { options: presetOptions.map((option) => ({
|
|
525
|
-
label: option.text,
|
|
526
|
-
value: option.value,
|
|
527
|
-
})), onChange: onChangePreset, value: preset })] })] }));
|
|
528
|
-
};
|
|
529
|
-
const MemoizedCalendarDropdown = memo(CalendarDropdown);
|
|
530
132
|
const MemoizedDropdown = memo(QuillDropdownComponent);
|
|
531
133
|
const areEqual = (prevProps, nextProps) => {
|
|
532
134
|
// This function returns true if passing nextProps to render would return
|
|
533
135
|
// the same result as passing prevProps to render, otherwise it returns false
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
prevProps.dateRange[0] === nextProps.dateRange[0] &&
|
|
537
|
-
prevProps.dateRange[1] === nextProps.dateRange[1]);
|
|
136
|
+
return (prevProps.dateRange.startDate === nextProps.dateRange.startDate &&
|
|
137
|
+
prevProps.dateRange.endDate === nextProps.dateRange.endDate);
|
|
538
138
|
};
|
|
539
139
|
const MemoizedDateRangePicker = memo(QuillDateRangePicker, areEqual);
|
|
540
140
|
const QuillEmptyDashboardComponent = () => _jsx("div", {});
|
|
@@ -552,6 +152,7 @@ export default function Dashboard({ name, containerStyle, chartContainerStyle =
|
|
|
552
152
|
const { dispatch } = useContext(DashboardContext);
|
|
553
153
|
const { isLoading: isDataLoading, data, reload, } = useDashboard(name);
|
|
554
154
|
const [dashboardSections, setDashboardSections] = useState(null);
|
|
155
|
+
const [presetFilters, setPresetFilters] = useState(null);
|
|
555
156
|
const { dashboard } = useContext(DashboardContext);
|
|
556
157
|
const [client] = useContext(ClientContext);
|
|
557
158
|
const [isLoading, setIsLoading] = useState(isDataLoading);
|
|
@@ -573,19 +174,45 @@ export default function Dashboard({ name, containerStyle, chartContainerStyle =
|
|
|
573
174
|
setDashboardSections(resp.sections);
|
|
574
175
|
const bigFilterObj = {};
|
|
575
176
|
if (resp.dateFilter && Object.keys(resp.dateFilter).length) {
|
|
576
|
-
|
|
177
|
+
let presetsOptions = defaultOptionsV2;
|
|
178
|
+
if (resp.dateFilter.presetRanges) {
|
|
179
|
+
presetsOptions = resp.dateFilter.presetRanges.map((elem) => {
|
|
180
|
+
if (!elem.isStatic) {
|
|
181
|
+
return {
|
|
182
|
+
label: elem.label,
|
|
183
|
+
value: elem.value,
|
|
184
|
+
startDate: PRIMARY_RANGE[elem.value].start,
|
|
185
|
+
endDate: PRIMARY_RANGE[elem.value].end,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
label: elem.label,
|
|
190
|
+
value: elem.value,
|
|
191
|
+
startDate: new Date(elem.startDate),
|
|
192
|
+
endDate: new Date(elem.endDate),
|
|
193
|
+
};
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
setPresetFilters(presetsOptions);
|
|
197
|
+
const key = resp.dateFilter?.primaryRange?.value || 'LAST_6_MONTHS';
|
|
198
|
+
const primaryPreset = presetsOptions.find((option) => {
|
|
199
|
+
return option.value === key;
|
|
200
|
+
});
|
|
577
201
|
const filter = {
|
|
578
|
-
startDate:
|
|
579
|
-
endDate:
|
|
202
|
+
startDate: primaryPreset.startDate,
|
|
203
|
+
endDate: primaryPreset.endDate,
|
|
580
204
|
filterType: 'date_range',
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
205
|
+
options: presetsOptions.map((elem) => {
|
|
206
|
+
return {
|
|
207
|
+
label: elem.label,
|
|
208
|
+
value: elem.value,
|
|
209
|
+
};
|
|
210
|
+
}),
|
|
587
211
|
field: 'date_range',
|
|
588
212
|
label: 'Date',
|
|
213
|
+
preset: {
|
|
214
|
+
label: primaryPreset.label,
|
|
215
|
+
},
|
|
589
216
|
};
|
|
590
217
|
if (resp.dateFilter.comparison) {
|
|
591
218
|
filter.comparison = true;
|
|
@@ -609,13 +236,12 @@ export default function Dashboard({ name, containerStyle, chartContainerStyle =
|
|
|
609
236
|
});
|
|
610
237
|
}
|
|
611
238
|
bigFilterObj[filter.field] = filter;
|
|
612
|
-
setDateFilter(
|
|
239
|
+
setDateFilter(presetsOptions.find((opt) => opt.value === resp.dateFilter.defaultPrimaryRange)?.label ?? null);
|
|
613
240
|
}
|
|
614
241
|
if (resp.filters && resp.filters.length) {
|
|
615
242
|
Object.values(resp.filters)
|
|
616
243
|
.filter((filter) => filter.filterType !== 'date')
|
|
617
244
|
.forEach((filter) => {
|
|
618
|
-
// processFilter(filter);
|
|
619
245
|
bigFilterObj[filter.field] = processFilter(filter);
|
|
620
246
|
});
|
|
621
247
|
}
|
|
@@ -647,18 +273,6 @@ export default function Dashboard({ name, containerStyle, chartContainerStyle =
|
|
|
647
273
|
});
|
|
648
274
|
}
|
|
649
275
|
};
|
|
650
|
-
const onChangeDateFilter = (dateFilter) => {
|
|
651
|
-
// setGlobalDateFilter(dateFilter[0], dateFilter[1]);
|
|
652
|
-
dashboardFiltersDispatch({
|
|
653
|
-
type: 'ADD_DASHBOARD_FILTER',
|
|
654
|
-
id: 'date_range',
|
|
655
|
-
data: {
|
|
656
|
-
startDate: dateFilter[0],
|
|
657
|
-
endDate: dateFilter[1],
|
|
658
|
-
filterType: 'date_range',
|
|
659
|
-
},
|
|
660
|
-
});
|
|
661
|
-
};
|
|
662
276
|
function removeQuotes(str) {
|
|
663
277
|
if (str.startsWith('"') && str.endsWith('"')) {
|
|
664
278
|
return str.slice(1, -1);
|
|
@@ -683,22 +297,13 @@ export default function Dashboard({ name, containerStyle, chartContainerStyle =
|
|
|
683
297
|
};
|
|
684
298
|
}
|
|
685
299
|
if (filter.filterType === 'date' || filter.filterType === 'date_range') {
|
|
686
|
-
if (value[2]) {
|
|
687
|
-
selectedElem = filter.options.find((elem) => {
|
|
688
|
-
return value[2] === elem[removeQuotes(filter.field)][2];
|
|
689
|
-
});
|
|
690
|
-
if (selectedElem) {
|
|
691
|
-
selectedValue = selectedElem[removeQuotes(filter.field)];
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
300
|
return {
|
|
695
301
|
startDate: value ? value[0] : filter.startDate,
|
|
696
302
|
endDate: value ? value[1] : filter.endDate,
|
|
697
303
|
filterType: 'date_range',
|
|
698
304
|
label: 'Date',
|
|
699
|
-
...(selectedValue ? { selectedValue } : {}),
|
|
700
305
|
field: 'date_range',
|
|
701
|
-
options: options,
|
|
306
|
+
options: filter.options,
|
|
702
307
|
};
|
|
703
308
|
}
|
|
704
309
|
};
|
|
@@ -723,35 +328,32 @@ export default function Dashboard({ name, containerStyle, chartContainerStyle =
|
|
|
723
328
|
return;
|
|
724
329
|
}
|
|
725
330
|
if (filter.filterType === 'date' || filter.filterType === 'date_range') {
|
|
726
|
-
if (value && value[2]) {
|
|
727
|
-
selectedElem = filter.options.find((elem) => {
|
|
728
|
-
return value[2] === elem[removeQuotes(filter.field)][2];
|
|
729
|
-
});
|
|
730
|
-
if (selectedElem) {
|
|
731
|
-
selectedValue = selectedElem[removeQuotes(filter.field)];
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
331
|
if (comparison ||
|
|
735
332
|
(filter.comparison && filter.comparisonRange.value !== 'NO_COMPARISON')) {
|
|
333
|
+
let preset = '';
|
|
736
334
|
if (comparison) {
|
|
737
|
-
|
|
335
|
+
preset = filter.preset.label;
|
|
738
336
|
}
|
|
739
337
|
const key = comparison?.value || filter.comparisonRange.value;
|
|
740
|
-
|
|
741
|
-
start: value ? value
|
|
742
|
-
end: value ? value
|
|
338
|
+
let primaryRange = {
|
|
339
|
+
start: value ? value.startDate : filter.startDate,
|
|
340
|
+
end: value ? value.endDate : filter.endDate,
|
|
743
341
|
};
|
|
342
|
+
if (value && value.preset) {
|
|
343
|
+
preset = value.preset;
|
|
344
|
+
primaryRange = getRangeFromPresetOptions(value.preset, presetFilters);
|
|
345
|
+
}
|
|
744
346
|
dashboardFiltersDispatch({
|
|
745
347
|
type: 'ADD_DASHBOARD_FILTER',
|
|
746
348
|
id: 'date_range',
|
|
747
349
|
data: {
|
|
748
|
-
startDate:
|
|
749
|
-
endDate:
|
|
350
|
+
startDate: primaryRange.start,
|
|
351
|
+
endDate: primaryRange.end,
|
|
750
352
|
filterType: 'date_range',
|
|
751
353
|
label: 'Date',
|
|
752
|
-
...(selectedValue ? { selectedValue } : {}),
|
|
753
354
|
field: 'date_range',
|
|
754
|
-
|
|
355
|
+
preset: { label: preset },
|
|
356
|
+
options: filter.options,
|
|
755
357
|
comparison: true,
|
|
756
358
|
comparisonRange: {
|
|
757
359
|
startDate: COMPARISON_RANGE[key](primaryRange)
|
|
@@ -763,17 +365,24 @@ export default function Dashboard({ name, containerStyle, chartContainerStyle =
|
|
|
763
365
|
});
|
|
764
366
|
}
|
|
765
367
|
else {
|
|
368
|
+
const primaryRange = value.preset
|
|
369
|
+
? getRangeFromPresetOptions(value.preset, presetFilters)
|
|
370
|
+
: {
|
|
371
|
+
start: value.startDate || filter.startDate,
|
|
372
|
+
end: value.endDate || filter.endDate,
|
|
373
|
+
};
|
|
374
|
+
const preset = value.preset ? value.preset : '';
|
|
766
375
|
dashboardFiltersDispatch({
|
|
767
376
|
type: 'ADD_DASHBOARD_FILTER',
|
|
768
377
|
id: 'date_range',
|
|
769
378
|
data: {
|
|
770
379
|
...filter,
|
|
771
|
-
|
|
772
|
-
|
|
380
|
+
preset: { label: preset },
|
|
381
|
+
startDate: primaryRange.start,
|
|
382
|
+
endDate: primaryRange.end,
|
|
773
383
|
filterType: 'date_range',
|
|
774
|
-
...(selectedValue ? { selectedValue } : {}),
|
|
775
384
|
field: 'date_range',
|
|
776
|
-
options: options,
|
|
385
|
+
options: filter.options,
|
|
777
386
|
label: 'Date',
|
|
778
387
|
},
|
|
779
388
|
});
|
|
@@ -831,7 +440,7 @@ export default function Dashboard({ name, containerStyle, chartContainerStyle =
|
|
|
831
440
|
flexDirection: 'row',
|
|
832
441
|
alignItems: 'center',
|
|
833
442
|
gap: 12,
|
|
834
|
-
}, children: sortedFilters.map((filter, index) => (_jsx(DashboardFilter, { filter: filter, onChangeFilter: updateFilter, theme: theme,
|
|
443
|
+
}, children: sortedFilters.map((filter, index) => (_jsx(DashboardFilter, { filter: filter, onChangeFilter: updateFilter, theme: theme, SelectComponent: SelectComponent ? SelectComponent : MemoizedDropdown, DateRangePickerComponent: DateRangePickerComponent
|
|
835
444
|
? DateRangePickerComponent
|
|
836
445
|
: MemoizedDateRangePicker }, index))) }) })), Object.keys(dashboardSections)
|
|
837
446
|
.sort(function (a, b) {
|
|
@@ -874,6 +483,6 @@ export default function Dashboard({ name, containerStyle, chartContainerStyle =
|
|
|
874
483
|
height: '400px',
|
|
875
484
|
}, chartId: item._id, colors: theme.chartColors?.length
|
|
876
485
|
? theme.chartColors
|
|
877
|
-
: undefined, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid }) }, `${item.name}${index}`))
|
|
486
|
+
: undefined, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid }) })) }, `${item.name}${index}`))) }))] }, section + '' + sectionIndex));
|
|
878
487
|
})] }));
|
|
879
488
|
}
|