@quillsql/react 2.10.16 → 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.
Files changed (69) hide show
  1. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  2. package/dist/cjs/Dashboard.d.ts +26 -18
  3. package/dist/cjs/Dashboard.d.ts.map +1 -1
  4. package/dist/cjs/Dashboard.js +86 -478
  5. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +3 -0
  6. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -0
  7. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +260 -0
  8. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +20 -1
  9. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  10. package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +93 -4
  11. package/dist/cjs/QuillProvider.d.ts +1 -0
  12. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  13. package/dist/cjs/QuillProvider.js +1 -0
  14. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  15. package/dist/cjs/ReportBuilder.js +1 -2
  16. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  17. package/dist/cjs/components/Dashboard/DataLoader.js +11 -0
  18. package/dist/cjs/components/QuillSelect.d.ts +3 -0
  19. package/dist/cjs/components/QuillSelect.d.ts.map +1 -0
  20. package/dist/cjs/components/QuillSelect.js +109 -0
  21. package/dist/cjs/components/UiComponents.d.ts +1 -0
  22. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  23. package/dist/cjs/index.d.ts +1 -2
  24. package/dist/cjs/index.d.ts.map +1 -1
  25. package/dist/cjs/index.js +1 -3
  26. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  27. package/dist/cjs/internals/ReportBuilder/PivotModal.js +9 -0
  28. package/dist/cjs/utils/aggregate.js +2 -2
  29. package/dist/cjs/utils/dashboard.d.ts +2 -2
  30. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  31. package/dist/cjs/utils/dashboard.js +26 -2
  32. package/dist/esm/ChartEditor.d.ts.map +1 -1
  33. package/dist/esm/Dashboard.d.ts +26 -18
  34. package/dist/esm/Dashboard.d.ts.map +1 -1
  35. package/dist/esm/Dashboard.js +84 -475
  36. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +3 -0
  37. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -0
  38. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +256 -0
  39. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +20 -1
  40. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  41. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +91 -3
  42. package/dist/esm/QuillProvider.d.ts +1 -0
  43. package/dist/esm/QuillProvider.d.ts.map +1 -1
  44. package/dist/esm/QuillProvider.js +1 -0
  45. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  46. package/dist/esm/ReportBuilder.js +0 -1
  47. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  48. package/dist/esm/components/Dashboard/DataLoader.js +11 -0
  49. package/dist/esm/components/QuillSelect.d.ts +3 -0
  50. package/dist/esm/components/QuillSelect.d.ts.map +1 -0
  51. package/dist/esm/components/QuillSelect.js +105 -0
  52. package/dist/esm/components/UiComponents.d.ts +1 -0
  53. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  54. package/dist/esm/index.d.ts +1 -2
  55. package/dist/esm/index.d.ts.map +1 -1
  56. package/dist/esm/index.js +0 -1
  57. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  58. package/dist/esm/internals/ReportBuilder/PivotModal.js +10 -1
  59. package/dist/esm/utils/aggregate.js +1 -1
  60. package/dist/esm/utils/dashboard.d.ts +2 -2
  61. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  62. package/dist/esm/utils/dashboard.js +26 -2
  63. package/package.json +1 -1
  64. package/dist/cjs/AddToDashboardModal.d.ts +0 -82
  65. package/dist/cjs/AddToDashboardModal.d.ts.map +0 -1
  66. package/dist/cjs/AddToDashboardModal.js +0 -1469
  67. package/dist/esm/AddToDashboardModal.d.ts +0 -82
  68. package/dist/esm/AddToDashboardModal.d.ts.map +0 -1
  69. package/dist/esm/AddToDashboardModal.js +0 -1435
@@ -1,12 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useContext, useEffect, useState, useRef, useCallback, memo, } from 'react';
2
+ import { useContext, useEffect, useState, useCallback, memo, } from 'react';
3
3
  import Chart from './Chart';
4
- import { capitalize, defaultOptions, getWeekdays, getRangeFromPreset, PRIMARY_RANGE, COMPARISON_RANGE, PRIMARY_CODES, } from './DateRangePicker/dateRangePickerUtils';
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 { addDays, eachDayOfInterval, endOfMonth, format, isAfter, isBefore, isEqual, isSaturday, isSunday, nextSaturday, previousSunday, startOfMonth, startOfToday, startOfWeek, startOfYear, sub, subDays, } from 'date-fns';
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
- export const COMPARISON_OPTIONS = [
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 === 'date_range' &&
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.selectedValue
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(SelectComponent, { label: filter.label, value: filterValue, onChange: (e) => {
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: filterValue ? [filterValue[0], filterValue[1]] : [null, null], label: filter.label,
111
- // value={filterValue}
112
- onChangeDateRange: (dateRange) => {
113
- onChangeFilter(filter, [dateRange[0], dateRange[1], null]);
114
- setFilterValue([dateRange[0], dateRange[1], null]);
115
- }, preset: filterValue && filterValue.length === 3 && filterValue[2] !== null
116
- ? filterValue[2]
117
- : '', onChangePreset: (preset) => {
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
- }, children: "compared to" }), _jsx(SelectComponent, { value: comparisonRange.value, onChange: (e) => {
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
- // You can replace 'someProperty' with the actual prop you want to compare
535
- return (prevProps.dateRange.length === nextProps.dateRange.length &&
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
- const key = resp.dateFilter.defaultPrimaryRange ?? 'LAST_6_MONTHS';
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: PRIMARY_RANGE[key]?.start,
579
- endDate: PRIMARY_RANGE[key]?.end,
202
+ startDate: primaryPreset.startDate,
203
+ endDate: primaryPreset.endDate,
580
204
  filterType: 'date_range',
581
- selectedValue: [
582
- PRIMARY_RANGE[key]?.start,
583
- PRIMARY_RANGE[key]?.end,
584
- PRIMARY_CODES[key],
585
- ],
586
- options: options,
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(PRIMARY_OPTIONS.find((opt) => opt.value === resp.dateFilter.defaultPrimaryRange)?.text ?? null);
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
- selectedValue = filter.selectedValue;
335
+ preset = filter.preset.label;
738
336
  }
739
337
  const key = comparison?.value || filter.comparisonRange.value;
740
- const primaryRange = {
741
- start: value ? value[0] : filter.startDate,
742
- end: value ? value[1] : filter.endDate,
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: value ? value[0] : filter.startDate,
749
- endDate: value ? value[1] : filter.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
- options: options,
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
- startDate: value ? value[0] : filter.startDate,
772
- endDate: value ? value[1] : filter.endDate,
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, filterValue: dashboardFilters, SelectComponent: SelectComponent ? SelectComponent : MemoizedDropdown, DateRangePickerComponent: DateRangePickerComponent
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}`)) }))) }))] }, section + '' + sectionIndex));
486
+ : undefined, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid }) })) }, `${item.name}${index}`))) }))] }, section + '' + sectionIndex));
878
487
  })] }));
879
488
  }