@quillsql/react 2.13.5 → 2.13.7

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 (131) hide show
  1. package/dist/cjs/Chart.js +1 -1
  2. package/dist/cjs/ChartBuilder.d.ts +1 -1
  3. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  4. package/dist/cjs/ChartBuilder.js +6 -22
  5. package/dist/cjs/ChartEditor.d.ts +1 -1
  6. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  7. package/dist/cjs/Context.d.ts +21 -6
  8. package/dist/cjs/Context.d.ts.map +1 -1
  9. package/dist/cjs/Context.js +196 -18
  10. package/dist/cjs/Dashboard.js +7 -7
  11. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  12. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +7 -7
  13. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +0 -1
  14. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  15. package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +0 -22
  16. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  17. package/dist/cjs/QuillProvider.js +2 -1
  18. package/dist/cjs/ReportBuilder.d.ts +0 -1
  19. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  20. package/dist/cjs/ReportBuilder.js +4 -182
  21. package/dist/cjs/SQLEditor.d.ts +1 -1
  22. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  23. package/dist/cjs/SQLEditor.js +12 -8
  24. package/dist/cjs/components/Dashboard/DashboardTemplate.js +2 -2
  25. package/dist/cjs/components/QuillMultiSelect.js +3 -3
  26. package/dist/cjs/components/QuillMultiSelectWithCombo.js +3 -3
  27. package/dist/cjs/components/QuillSelect.js +3 -3
  28. package/dist/cjs/components/QuillSelectWithCombo.js +4 -4
  29. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  30. package/dist/cjs/components/QuillTable.js +46 -44
  31. package/dist/cjs/components/ReportBuilder/FilterModal.js +10 -10
  32. package/dist/cjs/components/ReportBuilder/FilterStack.js +2 -2
  33. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  34. package/dist/cjs/components/ReportBuilder/convert.js +4 -3
  35. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  36. package/dist/cjs/components/UiComponents.js +19 -5
  37. package/dist/cjs/hooks/useDashboard.d.ts +22 -3
  38. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  39. package/dist/cjs/hooks/useDashboard.js +201 -127
  40. package/dist/cjs/hooks/useExport.d.ts +8 -0
  41. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  42. package/dist/cjs/hooks/useExport.js +20 -11
  43. package/dist/cjs/hooks/useOnClickOutside.d.ts +1 -1
  44. package/dist/cjs/hooks/useOnClickOutside.d.ts.map +1 -1
  45. package/dist/cjs/hooks/useOnClickOutside.js +10 -6
  46. package/dist/cjs/index.d.ts +1 -1
  47. package/dist/cjs/index.d.ts.map +1 -1
  48. package/dist/cjs/index.js +2 -1
  49. package/dist/cjs/internals/ReportBuilder/PivotModal.js +3 -3
  50. package/dist/cjs/lib/utils.d.ts +1 -0
  51. package/dist/cjs/lib/utils.d.ts.map +1 -1
  52. package/dist/cjs/lib/utils.js +9 -1
  53. package/dist/cjs/models/Dashboard.d.ts +6 -1
  54. package/dist/cjs/models/Dashboard.d.ts.map +1 -1
  55. package/dist/cjs/utils/astFilterProcessing.js +3 -3
  56. package/dist/cjs/utils/columnProcessing.js +4 -4
  57. package/dist/cjs/utils/constants.d.ts +2 -1
  58. package/dist/cjs/utils/constants.d.ts.map +1 -1
  59. package/dist/cjs/utils/constants.js +3 -2
  60. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  61. package/dist/cjs/utils/dataFetcher.js +1 -2
  62. package/dist/cjs/utils/pivotConstructor.js +1 -1
  63. package/dist/esm/Chart.js +1 -1
  64. package/dist/esm/ChartBuilder.d.ts +1 -1
  65. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  66. package/dist/esm/ChartBuilder.js +6 -22
  67. package/dist/esm/ChartEditor.d.ts +1 -1
  68. package/dist/esm/ChartEditor.d.ts.map +1 -1
  69. package/dist/esm/Context.d.ts +21 -6
  70. package/dist/esm/Context.d.ts.map +1 -1
  71. package/dist/esm/Context.js +193 -18
  72. package/dist/esm/Dashboard.js +7 -7
  73. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  74. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +7 -7
  75. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +0 -1
  76. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  77. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +0 -22
  78. package/dist/esm/QuillProvider.d.ts.map +1 -1
  79. package/dist/esm/QuillProvider.js +2 -1
  80. package/dist/esm/ReportBuilder.d.ts +0 -1
  81. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  82. package/dist/esm/ReportBuilder.js +3 -180
  83. package/dist/esm/SQLEditor.d.ts +1 -1
  84. package/dist/esm/SQLEditor.d.ts.map +1 -1
  85. package/dist/esm/SQLEditor.js +13 -9
  86. package/dist/esm/components/Dashboard/DashboardTemplate.js +2 -2
  87. package/dist/esm/components/QuillMultiSelect.js +3 -3
  88. package/dist/esm/components/QuillMultiSelectWithCombo.js +3 -3
  89. package/dist/esm/components/QuillSelect.js +3 -3
  90. package/dist/esm/components/QuillSelectWithCombo.js +4 -4
  91. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  92. package/dist/esm/components/QuillTable.js +46 -44
  93. package/dist/esm/components/ReportBuilder/FilterModal.js +10 -10
  94. package/dist/esm/components/ReportBuilder/FilterStack.js +1 -1
  95. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  96. package/dist/esm/components/ReportBuilder/convert.js +4 -3
  97. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  98. package/dist/esm/components/UiComponents.js +19 -5
  99. package/dist/esm/hooks/useDashboard.d.ts +22 -3
  100. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  101. package/dist/esm/hooks/useDashboard.js +200 -124
  102. package/dist/esm/hooks/useExport.d.ts +8 -0
  103. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  104. package/dist/esm/hooks/useExport.js +20 -11
  105. package/dist/esm/hooks/useOnClickOutside.d.ts +1 -1
  106. package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -1
  107. package/dist/esm/hooks/useOnClickOutside.js +10 -6
  108. package/dist/esm/index.d.ts +1 -1
  109. package/dist/esm/index.d.ts.map +1 -1
  110. package/dist/esm/index.js +1 -1
  111. package/dist/esm/internals/ReportBuilder/PivotModal.js +3 -3
  112. package/dist/esm/lib/utils.d.ts +1 -0
  113. package/dist/esm/lib/utils.d.ts.map +1 -1
  114. package/dist/esm/lib/utils.js +7 -0
  115. package/dist/esm/models/Dashboard.d.ts +6 -1
  116. package/dist/esm/models/Dashboard.d.ts.map +1 -1
  117. package/dist/esm/utils/astFilterProcessing.js +3 -3
  118. package/dist/esm/utils/columnProcessing.js +4 -4
  119. package/dist/esm/utils/constants.d.ts +2 -1
  120. package/dist/esm/utils/constants.d.ts.map +1 -1
  121. package/dist/esm/utils/constants.js +2 -1
  122. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  123. package/dist/esm/utils/dataFetcher.js +1 -2
  124. package/dist/esm/utils/pivotConstructor.js +1 -1
  125. package/package.json +20 -7
  126. package/dist/cjs/components/BigModal/BigModal.d.ts +0 -15
  127. package/dist/cjs/components/BigModal/BigModal.d.ts.map +0 -1
  128. package/dist/cjs/components/BigModal/BigModal.js +0 -81
  129. package/dist/esm/components/BigModal/BigModal.d.ts +0 -15
  130. package/dist/esm/components/BigModal/BigModal.d.ts.map +0 -1
  131. package/dist/esm/components/BigModal/BigModal.js +0 -56
@@ -1,8 +1,7 @@
1
- import { useContext, useMemo, useState } from 'react';
1
+ import { useContext, useMemo } from 'react';
2
2
  import { ClientContext, DashboardConfigContext, DashboardContext, DashboardFiltersContext, } from '../Context';
3
- import { getDashboard } from '../utils/dashboard';
4
3
  import { COMPARISON_RANGE, PRIMARY_RANGE, } from '../DateRangePicker/dateRangePickerUtils';
5
- import equal from 'fast-deep-equal';
4
+ import { DashboardFilterType } from '../models/Filter';
6
5
  export const useReports = () => {
7
6
  const [dashboard, dispatch] = useContext(DashboardContext);
8
7
  const reloadReport = (id) => {
@@ -24,17 +23,19 @@ export const useReports = () => {
24
23
  };
25
24
  };
26
25
  export const useDashboard = (dashboardName) => {
27
- const [dashboardConfig, dashboardConfigContext] = useContext(DashboardConfigContext);
26
+ const { dashboardConfig, loadDashboard } = useContext(DashboardConfigContext);
28
27
  const { dashboardFilters, loadFiltersForDashboard } = useContext(DashboardFiltersContext);
29
- const [dashboard] = useContext(DashboardContext);
30
- const [isLoading, setIsLoading] = useState(true);
31
- const [error, setError] = useState(null);
32
- const [client, isClientLoading] = useContext(ClientContext);
33
- const loading = useMemo(() => isLoading ||
28
+ //TODO: handle error states
29
+ // const [error, setError] = useState<any>(null);
30
+ const [, isClientLoading] = useContext(ClientContext);
31
+ const loading = useMemo(() => !dashboardName ||
34
32
  isClientLoading ||
33
+ dashboardConfig[dashboardName]?.loading ||
35
34
  (dashboardConfig[dashboardName] &&
36
- !dashboardConfig[dashboardName]?.sections), [isLoading, isClientLoading, dashboardConfig, dashboardName]);
35
+ !dashboardConfig[dashboardName]?.config.sections), [isClientLoading, dashboardConfig, dashboardName]);
37
36
  const handleReload = async (overrideDashboardName, fetchFromServer = false, reportAction, overrideFilters) => {
37
+ if (!dashboardName)
38
+ return;
38
39
  if (overrideFilters) {
39
40
  // Pull the date filter out of the override filters, process it, and append it to the filters
40
41
  const dateFilter = overrideFilters.filters.find((f) => f.filterType === 'date_range');
@@ -45,7 +46,7 @@ export const useDashboard = (dashboardName) => {
45
46
  ...dateFilter,
46
47
  dateField: [
47
48
  ...new Map(Object.values(dashboardConfig[overrideDashboardName ?? dashboardName]
48
- ?.sections ?? {})
49
+ ?.config.sections ?? {})
49
50
  .flat()
50
51
  .map((report) => {
51
52
  const key = JSON.stringify(report.dateField);
@@ -59,16 +60,29 @@ export const useDashboard = (dashboardName) => {
59
60
  ], overrideFilters.editedFilterLabel);
60
61
  return;
61
62
  }
62
- const dashboard = await getDashboards(overrideDashboardName ?? dashboardName, fetchFromServer, reportAction);
63
+ const dashboard = await loadDashboard(overrideDashboardName ?? dashboardName, fetchFromServer, reportAction);
63
64
  if (!fetchFromServer &&
64
- Object.keys(dashboardFilters[dashboardName] ?? {}).length)
65
+ Object.keys(dashboardFilters[dashboardName] ?? {}).length) {
65
66
  return;
67
+ }
68
+ const comparisonRangeStart = dashboard?.dateFilter?.comparisonRange?.startDate ??
69
+ COMPARISON_RANGE[dashboard?.dateFilter?.defaultComparisonRange ??
70
+ 'NO_COMPARISON']({
71
+ start: PRIMARY_RANGE[dashboard?.dateFilter?.primaryRange?.value ?? 'LAST_30_DAYS']?.start,
72
+ end: PRIMARY_RANGE[dashboard?.dateFilter?.primaryRange?.value ?? 'LAST_30_DAYS']?.end,
73
+ })?.start;
74
+ const comparisonRangeEnd = dashboard?.dateFilter?.comparisonRange?.endDate ??
75
+ COMPARISON_RANGE[dashboard?.dateFilter?.defaultComparisonRange ??
76
+ 'NO_COMPARISON']({
77
+ start: PRIMARY_RANGE[dashboard?.dateFilter?.primaryRange?.value ?? 'LAST_30_DAYS']?.start,
78
+ end: PRIMARY_RANGE[dashboard?.dateFilter?.primaryRange?.value ?? 'LAST_30_DAYS']?.end,
79
+ })?.end;
66
80
  const dateFilter = dashboard?.dateFilter
67
81
  ? {
68
82
  ...dashboard?.dateFilter,
69
- startDate: PRIMARY_RANGE[dashboard?.dateFilter.primaryRange?.value ?? 'LAST_30_DAYS']?.start,
70
- endDate: PRIMARY_RANGE[dashboard?.dateFilter.primaryRange?.value ?? 'LAST_30_DAYS']?.end,
71
- filterType: 'date_range',
83
+ startDate: PRIMARY_RANGE[dashboard?.dateFilter.primaryRange?.value ?? 'LAST_30_DAYS'].start,
84
+ endDate: PRIMARY_RANGE[dashboard?.dateFilter.primaryRange?.value ?? 'LAST_30_DAYS'].end,
85
+ filterType: DashboardFilterType.Date,
72
86
  dateField: [
73
87
  ...new Map(Object.values(dashboard?.sections ?? {})
74
88
  .flat()
@@ -79,28 +93,15 @@ export const useDashboard = (dashboardName) => {
79
93
  ],
80
94
  preset: dashboard?.dateFilter.primaryRange,
81
95
  dashboardName: overrideDashboardName ?? dashboardName,
82
- comparisonRange: dashboard?.dateFilter.comparison
96
+ comparisonRange: dashboard?.dateFilter.comparison &&
97
+ comparisonRangeStart &&
98
+ comparisonRangeEnd
83
99
  ? {
84
- startDate: dashboard?.dateFilter.comparsionRange?.startDate ??
85
- COMPARISON_RANGE[dashboard?.dateFilter
86
- .defaultComparisonRange ??
87
- 'NO_COMPARISON']({
88
- start: PRIMARY_RANGE[dashboard?.dateFilter.primaryRange?.value ??
89
- 'LAST_30_DAYS']?.start,
90
- end: PRIMARY_RANGE[dashboard?.dateFilter.primaryRange?.value ??
91
- 'LAST_30_DAYS']?.end,
92
- })?.start,
93
- endDate: dashboard?.dateFilter.comparsionRange?.endDate ??
94
- COMPARISON_RANGE[dashboard?.dateFilter
95
- .defaultComparisonRange ??
96
- 'NO_COMPARISON']({
97
- start: PRIMARY_RANGE[dashboard?.dateFilter.primaryRange?.value ??
98
- 'LAST_30_DAYS']?.start,
99
- end: PRIMARY_RANGE[dashboard?.dateFilter.primaryRange?.value ??
100
- 'LAST_30_DAYS']?.end,
101
- })?.end,
102
- value: dashboard?.dateFilter.comparsionRange?.value ??
103
- dashboard.dateFilter?.defaultComparisonRange,
100
+ startDate: comparisonRangeStart,
101
+ endDate: comparisonRangeEnd,
102
+ value: dashboard?.dateFilter.comparisonRange?.value ??
103
+ dashboard.dateFilter?.defaultComparisonRange ??
104
+ 'NO_COMPARISON',
104
105
  }
105
106
  : undefined,
106
107
  }
@@ -111,101 +112,176 @@ export const useDashboard = (dashboardName) => {
111
112
  ...(dashboard?.filters ?? []),
112
113
  ]);
113
114
  };
114
- async function getDashboards(dashboardName, fetchFromServer = false, reportAction) {
115
- let curDashboardConfig = dashboardConfig[dashboardName];
116
- if (!fetchFromServer && curDashboardConfig?.sections) {
117
- if (reportAction?.action === 'delete') {
118
- curDashboardConfig = {
119
- ...curDashboardConfig,
120
- sections: Object.fromEntries(Object.entries(curDashboardConfig?.sections ?? {}).map(([sectionKey, reports]) => [
121
- sectionKey,
122
- reports.filter((report) => report.id !== reportAction.report.id),
123
- ])),
124
- };
125
- }
126
- else if (reportAction?.action === 'upsert') {
127
- const containsReport = Object.values(curDashboardConfig?.sections ?? {})
128
- .flat()
129
- .some((report) => report.id === reportAction?.report.id);
130
- curDashboardConfig = {
131
- ...curDashboardConfig,
132
- sections: Object.fromEntries(Object.entries(curDashboardConfig?.sections ?? {}).map(([sectionKey, reports]) => [
133
- sectionKey,
134
- containsReport
135
- ? reports.map((report) => {
136
- return {
137
- report,
138
- ...(reportAction?.report.id === report.id
139
- ? reportAction?.report
140
- : dashboard[report.id]),
141
- _id: report.id,
142
- id: report.id,
143
- };
144
- })
145
- : [
146
- ...(reports ?? []),
147
- {
148
- report: reportAction?.report,
149
- ...dashboard[reportAction?.report.id],
150
- id: reportAction?.report.id,
151
- _id: reportAction?.report.id,
152
- },
153
- ],
154
- ])),
155
- };
156
- }
157
- dashboardConfigContext({
158
- type: 'UPDATE_DASHBOARD',
159
- id: dashboardName,
160
- data: curDashboardConfig,
161
- });
162
- setIsLoading(false);
163
- return curDashboardConfig;
164
- }
165
- if (!fetchFromServer &&
166
- curDashboardConfig &&
167
- curDashboardConfig.newQueries) {
168
- setIsLoading(false);
169
- return curDashboardConfig;
170
- }
171
- if (!client || !client.publicKey || !client.organizationId) {
172
- return curDashboardConfig;
173
- }
174
- if (dashboardName === null || dashboardName === undefined)
175
- return curDashboardConfig;
176
- try {
177
- setIsLoading(true);
178
- const resp = await getDashboard(dashboardName, client);
179
- // if dashboard has changed
180
- if (!equal(resp, curDashboardConfig)) {
181
- dashboardConfigContext({
182
- type: 'ADD_DASHBOARD',
183
- id: dashboardName,
184
- data: { ...resp },
185
- });
186
- }
187
- setError(null);
188
- return resp;
189
- }
190
- catch (error) {
191
- setError(error);
192
- console.error('Error fetching data:', error);
193
- }
194
- finally {
195
- setIsLoading(false);
196
- }
197
- }
198
115
  function isDashboardFilterLoading(filterName) {
116
+ if (!dashboardName)
117
+ return true;
199
118
  return dashboardFilters[dashboardName]?.[filterName]?.loading;
200
119
  }
201
120
  return {
202
- data: loading ? null : dashboardConfig[dashboardName],
203
- dashboardFilters: dashboardFilters[dashboardName] !== undefined
121
+ data: loading || !dashboardName
122
+ ? null
123
+ : (dashboardConfig[dashboardName]?.config ?? null),
124
+ dashboardFilters: dashboardName && dashboardFilters[dashboardName] !== undefined
204
125
  ? Object.values(dashboardFilters[dashboardName] ?? {}).map((f) => f.filter)
205
126
  : null,
206
127
  isLoading: loading,
207
128
  isDashboardFilterLoading,
208
- error,
209
129
  reload: handleReload,
210
130
  };
211
131
  };
132
+ export const useDashboards = () => {
133
+ const { dashboardConfig, dashboardConfigDispatch } = useContext(DashboardConfigContext);
134
+ const { loadFiltersForDashboard, dispatch: dashboardFiltersDispatch } = useContext(DashboardFiltersContext);
135
+ const [client, isLoading] = useContext(ClientContext);
136
+ const dashboards = useMemo(() => {
137
+ return Object.values(dashboardConfig).map((dashboard) => {
138
+ return {
139
+ name: dashboard.config.name,
140
+ id: dashboard.config.dashboardId,
141
+ reports: Object.values(dashboard.config.sections ?? {}).flat(),
142
+ };
143
+ });
144
+ }, [dashboardConfig]);
145
+ const createDashboard = async ({ name, filters, dateFilter, }) => {
146
+ if (!client)
147
+ return;
148
+ dashboardConfigDispatch({
149
+ type: 'UPDATE_DASHBOARD',
150
+ id: name,
151
+ data: {
152
+ config: {
153
+ dashboardId: name,
154
+ name,
155
+ filters,
156
+ dateFilter,
157
+ },
158
+ loading: true,
159
+ },
160
+ });
161
+ const body = {
162
+ newDashboardName: name.trim(),
163
+ filters,
164
+ dateFilter,
165
+ name: name.trim(),
166
+ task: 'edit-dashboard',
167
+ clientId: client.clientId,
168
+ };
169
+ try {
170
+ const response = await fetch(client.queryEndpoint, {
171
+ method: 'POST',
172
+ headers: {
173
+ ...client.queryHeaders,
174
+ 'Content-Type': 'application/json',
175
+ },
176
+ body: JSON.stringify({ metadata: body }),
177
+ });
178
+ const updated = await response.json();
179
+ dashboardConfigDispatch({
180
+ type: 'UPDATE_DASHBOARD',
181
+ id: name,
182
+ data: { config: updated.data.dashboard, loading: false },
183
+ });
184
+ }
185
+ catch (e) {
186
+ console.error(e);
187
+ }
188
+ };
189
+ const updateDashboard = async (name, { newName, filters, dateFilter, }) => {
190
+ if (!client)
191
+ return;
192
+ const dashboard = dashboardConfig[name]?.config;
193
+ dashboardConfigDispatch({
194
+ type: 'DELETE_DASHBOARD',
195
+ id: name,
196
+ });
197
+ dashboardFiltersDispatch({
198
+ type: 'DELETE_DASHBOARD_FILTERS',
199
+ dashboardName: name,
200
+ });
201
+ const body = {
202
+ newDashboardName: newName.trim(),
203
+ filters,
204
+ dateFilter,
205
+ name: name.trim(),
206
+ task: 'edit-dashboard',
207
+ clientId: client.clientId,
208
+ };
209
+ try {
210
+ const response = await fetch(client.queryEndpoint, {
211
+ method: 'POST',
212
+ headers: {
213
+ ...client.queryHeaders,
214
+ 'Content-Type': 'application/json',
215
+ },
216
+ body: JSON.stringify({ metadata: body }),
217
+ });
218
+ const updated = await response.json();
219
+ dashboardConfigDispatch({
220
+ type: 'ADD_DASHBOARD',
221
+ id: updated.data.dashboard.name,
222
+ data: {
223
+ ...dashboard,
224
+ ...updated.data.dashboard,
225
+ },
226
+ });
227
+ const updatedDateFilter = updated.data.dashboard.dateFilter
228
+ ? {
229
+ ...updated.data.dashboard.dateFilter,
230
+ dashboardName: updated.data.dashboard.name,
231
+ preset: updated.data.dashboard.dateFilter.primaryRange,
232
+ filterType: DashboardFilterType.Date,
233
+ dateField: [
234
+ ...new Map(Object.values(dashboardConfig[updated.data.dashboard.name]?.config
235
+ .sections ?? {})
236
+ .flat()
237
+ .map((report) => {
238
+ const key = JSON.stringify(report.dateField);
239
+ return [key, report.dateField];
240
+ })).values(),
241
+ ],
242
+ startDate: PRIMARY_RANGE[updated.data.dashboard.dateFilter.primaryRange?.value ??
243
+ 'LAST_30_DAYS'].start,
244
+ endDate: PRIMARY_RANGE[updated.data.dashboard.dateFilter.primaryRange?.value ??
245
+ 'LAST_30_DAYS'].end,
246
+ }
247
+ : undefined;
248
+ loadFiltersForDashboard(updated.data.dashboard.name, [
249
+ ...(updatedDateFilter ? [updatedDateFilter] : []),
250
+ ...(updated.data.dashboard.filters ?? []),
251
+ ]);
252
+ }
253
+ catch (e) {
254
+ console.error(e);
255
+ }
256
+ };
257
+ const deleteDashboard = async (name) => {
258
+ if (!client)
259
+ return;
260
+ await fetch(client.queryEndpoint, {
261
+ method: 'POST',
262
+ headers: {
263
+ ...client.queryHeaders,
264
+ 'Content-Type': 'application/json',
265
+ },
266
+ body: JSON.stringify({
267
+ metadata: {
268
+ task: 'delete-dashboard',
269
+ clientId: client.clientId,
270
+ databaseType: client.databaseType,
271
+ name,
272
+ },
273
+ }),
274
+ });
275
+ dashboardConfigDispatch({
276
+ type: 'DELETE_DASHBOARD',
277
+ id: name,
278
+ });
279
+ };
280
+ return {
281
+ dashboards: isLoading ? null : dashboards,
282
+ isLoading,
283
+ createDashboard,
284
+ updateDashboard,
285
+ deleteDashboard,
286
+ };
287
+ };
@@ -8,6 +8,14 @@ export declare const useExport: (reportId?: string, { CustomDocumentComponent, m
8
8
  downloadCSV: () => void;
9
9
  downloadPDF: () => void;
10
10
  isLoading: boolean;
11
+ isCSVLoading?: undefined;
12
+ isPDFLoading?: undefined;
13
+ } | {
14
+ downloadCSV: () => Promise<void>;
15
+ downloadPDF: () => Promise<void>;
16
+ isCSVLoading: boolean;
17
+ isPDFLoading: boolean;
18
+ isLoading?: undefined;
11
19
  };
12
20
  interface QuillPDFProps {
13
21
  report: QuillReport;
@@ -1 +1 @@
1
- {"version":3,"file":"useExport.d.ts","sourceRoot":"","sources":["../../../src/hooks/useExport.tsx"],"names":[],"mappings":";AASA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAwD/C,eAAO,MAAM,SAAS,cACT,MAAM;uCAOmB,aAAa,KAAK,WAAW;;;;;;;CA2LlE,CAAC;AAEF,UAAU,aAAa;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B"}
1
+ {"version":3,"file":"useExport.d.ts","sourceRoot":"","sources":["../../../src/hooks/useExport.tsx"],"names":[],"mappings":";AASA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAwD/C,eAAO,MAAM,SAAS,cACT,MAAM;uCAOmB,aAAa,KAAK,WAAW;;;;;;;;;;;;;;;CAuMlE,CAAC;AAEF,UAAU,aAAa;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B"}
@@ -51,14 +51,22 @@ sectionField, } = {}) => {
51
51
  const { dashboardFilters } = useContext(DashboardFiltersContext);
52
52
  const [dashboard] = useContext(DashboardContext);
53
53
  const specificDashboardFilters = useMemo(() => {
54
- //FIXME: Pretty sure this won't work with multiple dashboards
55
- Object.values(dashboardFilters).map((dashboardFilter) => {
54
+ if (!reportId) {
55
+ return [];
56
+ }
57
+ const dashboardName = dashboard[reportId]?.dashboardName;
58
+ if (!dashboardName || !dashboardFilters[dashboardName]) {
59
+ return [];
60
+ }
61
+ // @ts-ignore
62
+ return Object.values(dashboardFilters[dashboardName]).map((dashboardFilter) => {
56
63
  return dashboardFilter.filter;
57
64
  });
58
- }, [dashboardFilters]);
65
+ }, [dashboardFilters, dashboard, reportId]);
59
66
  // const [theme] = useContext(ThemeContext);
60
67
  const [client] = useContext(ClientContext);
61
- const [isLoading, setIsLoading] = useState(false);
68
+ const [isCSVLoading, setIsCSVLoading] = useState(false);
69
+ const [isPDFLoading, setIsPDFLoading] = useState(false);
62
70
  if (!reportId || !client) {
63
71
  return { downloadCSV: () => { }, downloadPDF: () => { }, isLoading: false };
64
72
  }
@@ -67,17 +75,17 @@ sectionField, } = {}) => {
67
75
  if (!client) {
68
76
  return;
69
77
  }
70
- setIsLoading(true);
78
+ setIsCSVLoading(true);
71
79
  const resp = await getExportData(client, specificDashboardFilters, reportId);
72
80
  downloadCSV({
73
- rows: resp.rows,
74
- fields: resp.columns,
81
+ rows: resp.pivot && resp.pivotRows ? resp.pivotRows : resp.rows,
82
+ fields: resp.pivot && resp.pivotColumns ? resp.pivotColumns : resp.columns,
75
83
  name: resp.name,
76
84
  });
77
- setIsLoading(false);
85
+ setIsCSVLoading(false);
78
86
  },
79
87
  downloadPDF: async () => {
80
- setIsLoading(true);
88
+ setIsPDFLoading(true);
81
89
  // @ts-ignore
82
90
  let report;
83
91
  if (reportId &&
@@ -179,11 +187,12 @@ sectionField, } = {}) => {
179
187
  callback: function (doc) {
180
188
  // @ts-ignore
181
189
  doc.save(`${report.name}.pdf`);
182
- setIsLoading(false);
190
+ setIsPDFLoading(false);
183
191
  },
184
192
  });
185
193
  },
186
- isLoading,
194
+ isCSVLoading,
195
+ isPDFLoading,
187
196
  };
188
197
  };
189
198
  function QuillCustomDocumentComponent({ report }) {
@@ -1,3 +1,3 @@
1
- declare const useOnClickOutside: (ref: React.RefObject<HTMLDivElement>, handler: (event: any) => void) => void;
1
+ declare const useOnClickOutside: (ref: React.RefObject<HTMLDivElement>, handler: (event: any) => void, listening?: boolean) => void;
2
2
  export default useOnClickOutside;
3
3
  //# sourceMappingURL=useOnClickOutside.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useOnClickOutside.d.ts","sourceRoot":"","sources":["../../../src/hooks/useOnClickOutside.tsx"],"names":[],"mappings":"AAEA,QAAA,MAAM,iBAAiB,QAChB,MAAM,SAAS,CAAC,cAAc,CAAC,mBACjB,GAAG,KAAG,IAAI,SAkB9B,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"useOnClickOutside.d.ts","sourceRoot":"","sources":["../../../src/hooks/useOnClickOutside.tsx"],"names":[],"mappings":"AAEA,QAAA,MAAM,iBAAiB,QAChB,MAAM,SAAS,CAAC,cAAc,CAAC,mBACjB,GAAG,KAAG,IAAI,cACjB,OAAO,SAqBpB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { useEffect } from 'react';
2
- const useOnClickOutside = (ref, handler) => {
2
+ const useOnClickOutside = (ref, handler, listening) => {
3
3
  useEffect(() => {
4
4
  const listener = (event) => {
5
5
  if (!ref.current || ref.current.contains(event.target)) {
@@ -7,14 +7,18 @@ const useOnClickOutside = (ref, handler) => {
7
7
  }
8
8
  handler(event);
9
9
  };
10
- // document.addEventListener('click', listener);
11
- document.addEventListener('mousedown', listener);
12
- document.addEventListener('touchstart', listener);
10
+ if (listening !== false) {
11
+ document.addEventListener('mousedown', listener);
12
+ document.addEventListener('touchstart', listener);
13
+ }
14
+ else {
15
+ document.removeEventListener('mousedown', listener);
16
+ document.removeEventListener('touchstart', listener);
17
+ }
13
18
  return () => {
14
- // document.removeEventListener('click', listener);
15
19
  document.removeEventListener('mousedown', listener);
16
20
  document.removeEventListener('touchstart', listener);
17
21
  };
18
- }, [ref, handler]);
22
+ }, [ref, handler, listening]);
19
23
  };
20
24
  export default useOnClickOutside;
@@ -14,7 +14,7 @@ export type { ReportBuilderProps } from './ReportBuilder';
14
14
  export { default as ChartEditor } from './ChartEditor';
15
15
  export type { ChartEditorProps } from './ChartEditor';
16
16
  export { quillFormat as format } from './utils/valueFormatter';
17
- export { useDashboard, useReports } from './hooks/useDashboard';
17
+ export { useDashboard, useReports, useDashboards } from './hooks/useDashboard';
18
18
  export { useQuill, usePivot } from './hooks/useQuill';
19
19
  export { useExport } from './hooks/useExport';
20
20
  export { useMemoizedRows } from './hooks/useFormat';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,WAAW,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EACV,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,MAAM,EACN,mBAAmB,EACnB,WAAW,GACZ,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,0BAA0B,EAC1B,6BAA6B,EAC7B,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,YAAY,EACV,6BAA6B,EAC7B,qBAAqB,EACrB,SAAS,GACV,MAAM,wCAAwC,CAAC;AAChD,YAAY,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,WAAW,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EACV,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,MAAM,EACN,mBAAmB,EACnB,WAAW,GACZ,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,0BAA0B,EAC1B,6BAA6B,EAC7B,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,YAAY,EACV,6BAA6B,EAC7B,qBAAqB,EACrB,SAAS,GACV,MAAM,wCAAwC,CAAC;AAChD,YAAY,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/esm/index.js CHANGED
@@ -7,7 +7,7 @@ export { default as SQLEditor, SchemaListComponent } from './SQLEditor';
7
7
  export { default as ReportBuilder } from './ReportBuilder';
8
8
  export { default as ChartEditor } from './ChartEditor';
9
9
  export { quillFormat as format } from './utils/valueFormatter';
10
- export { useDashboard, useReports } from './hooks/useDashboard';
10
+ export { useDashboard, useReports, useDashboards } from './hooks/useDashboard';
11
11
  export { useQuill, usePivot } from './hooks/useQuill';
12
12
  export { useExport } from './hooks/useExport';
13
13
  export { useMemoizedRows } from './hooks/useFormat';
@@ -914,11 +914,11 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
914
914
  let value;
915
915
  const nextRowValue = isDateField(pivot.rowFieldType || '')
916
916
  ? // @ts-ignore
917
- uniqueRows[rowIndex + 1] ?? endOfDay(rowDateRange.end)
917
+ (uniqueRows[rowIndex + 1] ?? endOfDay(rowDateRange.end))
918
918
  : null;
919
919
  const compRowValue = compUniqueRows[rowIndex];
920
920
  const compNextRowValue = isDateField(pivot.rowFieldType || '')
921
- ? compUniqueRows[rowIndex + 1] ?? endOfDay(compRowDateRange.end)
921
+ ? (compUniqueRows[rowIndex + 1] ?? endOfDay(compRowDateRange.end))
922
922
  : null;
923
923
  if (pivot.columnField) {
924
924
  const columnDateRange = getDateRange(dateRange, pivot.columnField, data);
@@ -1136,7 +1136,7 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
1136
1136
  index === 1
1137
1137
  ? `comparison Count`
1138
1138
  : isDateField(pivot.columnFieldType || '')
1139
- ? COL_DATE_MAP[getDateString(column, dateRange, dateBucket)] ?? 'comparison'
1139
+ ? (COL_DATE_MAP[getDateString(column, dateRange, dateBucket)] ?? 'comparison')
1140
1140
  : `comparison ${snakeAndCamelCaseToTitleCase(columnName)}`,
1141
1141
  field: `comparison_${columnName}`,
1142
1142
  };
@@ -7,4 +7,5 @@ export declare const isValueInArray: (value: any, array: any[]) => boolean;
7
7
  export declare const stringIsNumeric: (str: string | undefined) => boolean;
8
8
  export declare const stringEndsWithNumber: (str: string) => boolean;
9
9
  export declare function mergeRefs<T = any>(refs: Array<React.MutableRefObject<T> | React.LegacyRef<T>>): React.RefCallback<T>;
10
+ export declare const createDebounce: (func: any, delay: number) => (...args: any) => void;
10
11
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,eAAO,MAAM,qBAAqB,EAAE,cAClB,CAAC;AAEnB,eAAO,MAAM,eAAe,QAAS,MAAM,EAAE,WACO,CAAC;AAErD,eAAO,MAAM,oBAAoB,UAAW,GAAG,SAAS,GAAG,EAAE,KAAG,GAAG,EAMlE,CAAC;AAEF,eAAO,MAAM,cAAc,UAAW,GAAG,SAAS,GAAG,EAAE,KAAG,OAOzD,CAAC;AAEF,eAAO,MAAM,eAAe,QAAS,MAAM,GAAG,SAAS,KAAG,OAEzD,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAS,MAAM,KAAG,OAElD,CAAC;AAEF,wBAAgB,SAAS,CAAC,CAAC,GAAG,GAAG,EAC/B,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAC1D,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAUtB"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,eAAO,MAAM,qBAAqB,EAAE,cAClB,CAAC;AAEnB,eAAO,MAAM,eAAe,QAAS,MAAM,EAAE,WACO,CAAC;AAErD,eAAO,MAAM,oBAAoB,UAAW,GAAG,SAAS,GAAG,EAAE,KAAG,GAAG,EAMlE,CAAC;AAEF,eAAO,MAAM,cAAc,UAAW,GAAG,SAAS,GAAG,EAAE,KAAG,OAOzD,CAAC;AAEF,eAAO,MAAM,eAAe,QAAS,MAAM,GAAG,SAAS,KAAG,OAEzD,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAS,MAAM,KAAG,OAElD,CAAC;AAEF,wBAAgB,SAAS,CAAC,CAAC,GAAG,GAAG,EAC/B,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAC1D,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAUtB;AAED,eAAO,MAAM,cAAc,SAAU,GAAG,SAAS,MAAM,eAEpC,GAAG,SAIrB,CAAC"}
@@ -33,3 +33,10 @@ export function mergeRefs(refs) {
33
33
  });
34
34
  };
35
35
  }
36
+ export const createDebounce = (func, delay) => {
37
+ let timeoutId;
38
+ return (...args) => {
39
+ clearTimeout(timeoutId);
40
+ timeoutId = setTimeout(() => func(...args), delay);
41
+ };
42
+ };
@@ -4,11 +4,16 @@ export type DashboardConfig = {
4
4
  dashboardId: string;
5
5
  name: string;
6
6
  filters: DashboardStringFilter[];
7
- dateFilter: DashboardDateFilter;
7
+ dateFilter?: DashboardDateFilter;
8
8
  customFiltersEnabled?: boolean;
9
9
  sections?: {
10
10
  [key: string]: QuillReport[];
11
11
  };
12
12
  newQueries?: QuillReport[];
13
13
  };
14
+ export type Dashboard = {
15
+ id: string;
16
+ name: string;
17
+ reports: QuillReport[];
18
+ };
14
19
  //# sourceMappingURL=Dashboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dashboard.d.ts","sourceRoot":"","sources":["../../../src/models/Dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,UAAU,EAAE,mBAAmB,CAAC;IAChC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;KAC9B,CAAC;IACF,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;CAC5B,CAAC"}
1
+ {"version":3,"file":"Dashboard.d.ts","sourceRoot":"","sources":["../../../src/models/Dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;KAC9B,CAAC;IACF,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC"}
@@ -281,7 +281,7 @@ const queryPatterns = [
281
281
  WHERE transaction_date >= DATEADD(day, -90, GETDATE())
282
282
  `,
283
283
  value: function (astWhere) {
284
- return -astWhere.right?.args?.value[1]?.value ?? null;
284
+ return -astWhere.right?.args?.value[1]?.value;
285
285
  },
286
286
  unit: function (astWhere) {
287
287
  return astWhere.right?.args?.value[0]?.column?.expr?.value ?? null;
@@ -390,7 +390,7 @@ const queryPatterns = [
390
390
  WHERE transaction_date >= DATEADD(day, -90, CURRENT_DATE)
391
391
  `,
392
392
  value: function (astWhere) {
393
- return -astWhere.right?.args?.value[1]?.value ?? null;
393
+ return -astWhere.right?.args?.value[1]?.value;
394
394
  },
395
395
  unit: function (astWhere) {
396
396
  return astWhere.right?.args?.value[0]?.column?.expr?.value ?? null;
@@ -597,7 +597,7 @@ const queryPatterns = [
597
597
  WHERE transaction_date >= DATEADD(DAY, -90, CURRENT_DATE())
598
598
  `,
599
599
  value: function (astWhere) {
600
- return -astWhere.right?.args?.value[1]?.value ?? null;
600
+ return -astWhere.right?.args?.value[1]?.value;
601
601
  },
602
602
  unit: function (astWhere) {
603
603
  return astWhere.right?.args?.value[0]?.column.toLowerCase() ?? null;