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