@quillsql/react 2.12.27 → 2.12.28

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 (119) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +34 -17
  3. package/dist/cjs/ChartBuilder.d.ts +3 -3
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +30 -23
  6. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  7. package/dist/cjs/ChartEditor.js +66 -26
  8. package/dist/cjs/Context.d.ts.map +1 -1
  9. package/dist/cjs/Dashboard.d.ts +6 -1
  10. package/dist/cjs/Dashboard.d.ts.map +1 -1
  11. package/dist/cjs/Dashboard.js +3 -1
  12. package/dist/cjs/ReportBuilder.d.ts +1 -1
  13. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  14. package/dist/cjs/ReportBuilder.js +12 -10
  15. package/dist/cjs/SQLEditor.d.ts +10 -1
  16. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  17. package/dist/cjs/SQLEditor.js +27 -3
  18. package/dist/cjs/Table.d.ts.map +1 -1
  19. package/dist/cjs/Table.js +17 -7
  20. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  21. package/dist/cjs/components/Chart/ChartTooltip.js +5 -4
  22. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  23. package/dist/cjs/components/Dashboard/DataLoader.js +52 -15
  24. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  25. package/dist/cjs/components/Dashboard/MetricComponent.js +7 -1
  26. package/dist/cjs/components/Dashboard/TableComponent.d.ts +16 -2
  27. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  28. package/dist/cjs/components/Dashboard/TableComponent.js +2 -14
  29. package/dist/cjs/components/QuillTable.d.ts +2 -2
  30. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  31. package/dist/cjs/components/QuillTable.js +7 -5
  32. package/dist/cjs/components/UiComponents.d.ts +3 -3
  33. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  34. package/dist/cjs/components/UiComponents.js +4 -4
  35. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +16 -1
  36. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  37. package/dist/cjs/internals/ReportBuilder/PivotModal.js +155 -80
  38. package/dist/cjs/utils/constants.d.ts +2 -0
  39. package/dist/cjs/utils/constants.d.ts.map +1 -0
  40. package/dist/cjs/utils/constants.js +4 -0
  41. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  42. package/dist/cjs/utils/dashboard.js +26 -96
  43. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  44. package/dist/cjs/utils/dataFetcher.js +56 -13
  45. package/dist/cjs/utils/dates.d.ts +8 -0
  46. package/dist/cjs/utils/dates.d.ts.map +1 -1
  47. package/dist/cjs/utils/dates.js +34 -1
  48. package/dist/cjs/utils/logging.d.ts +2 -0
  49. package/dist/cjs/utils/logging.d.ts.map +1 -0
  50. package/dist/cjs/utils/logging.js +10 -0
  51. package/dist/cjs/utils/pivotConstructor.d.ts +6 -0
  52. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -0
  53. package/dist/cjs/utils/pivotConstructor.js +87 -0
  54. package/dist/cjs/utils/queryConstructor.d.ts +2 -1
  55. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  56. package/dist/cjs/utils/queryConstructor.js +46 -11
  57. package/dist/cjs/utils/tableProcessing.d.ts +22 -0
  58. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  59. package/dist/cjs/utils/tableProcessing.js +87 -1
  60. package/dist/esm/Chart.d.ts.map +1 -1
  61. package/dist/esm/Chart.js +34 -17
  62. package/dist/esm/ChartBuilder.d.ts +3 -3
  63. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  64. package/dist/esm/ChartBuilder.js +30 -23
  65. package/dist/esm/ChartEditor.d.ts.map +1 -1
  66. package/dist/esm/ChartEditor.js +66 -26
  67. package/dist/esm/Context.d.ts.map +1 -1
  68. package/dist/esm/Dashboard.d.ts +6 -1
  69. package/dist/esm/Dashboard.d.ts.map +1 -1
  70. package/dist/esm/Dashboard.js +3 -1
  71. package/dist/esm/ReportBuilder.d.ts +1 -1
  72. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  73. package/dist/esm/ReportBuilder.js +13 -11
  74. package/dist/esm/SQLEditor.d.ts +10 -1
  75. package/dist/esm/SQLEditor.d.ts.map +1 -1
  76. package/dist/esm/SQLEditor.js +27 -3
  77. package/dist/esm/Table.d.ts.map +1 -1
  78. package/dist/esm/Table.js +17 -7
  79. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  80. package/dist/esm/components/Chart/ChartTooltip.js +5 -4
  81. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  82. package/dist/esm/components/Dashboard/DataLoader.js +52 -15
  83. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  84. package/dist/esm/components/Dashboard/MetricComponent.js +7 -1
  85. package/dist/esm/components/Dashboard/TableComponent.d.ts +16 -2
  86. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  87. package/dist/esm/components/Dashboard/TableComponent.js +2 -14
  88. package/dist/esm/components/QuillTable.d.ts +2 -2
  89. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  90. package/dist/esm/components/QuillTable.js +7 -5
  91. package/dist/esm/components/UiComponents.d.ts +3 -3
  92. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  93. package/dist/esm/components/UiComponents.js +4 -4
  94. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +16 -1
  95. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  96. package/dist/esm/internals/ReportBuilder/PivotModal.js +153 -80
  97. package/dist/esm/utils/constants.d.ts +2 -0
  98. package/dist/esm/utils/constants.d.ts.map +1 -0
  99. package/dist/esm/utils/constants.js +1 -0
  100. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  101. package/dist/esm/utils/dashboard.js +27 -97
  102. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  103. package/dist/esm/utils/dataFetcher.js +56 -13
  104. package/dist/esm/utils/dates.d.ts +8 -0
  105. package/dist/esm/utils/dates.d.ts.map +1 -1
  106. package/dist/esm/utils/dates.js +31 -0
  107. package/dist/esm/utils/logging.d.ts +2 -0
  108. package/dist/esm/utils/logging.d.ts.map +1 -0
  109. package/dist/esm/utils/logging.js +6 -0
  110. package/dist/esm/utils/pivotConstructor.d.ts +6 -0
  111. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -0
  112. package/dist/esm/utils/pivotConstructor.js +83 -0
  113. package/dist/esm/utils/queryConstructor.d.ts +2 -1
  114. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  115. package/dist/esm/utils/queryConstructor.js +44 -10
  116. package/dist/esm/utils/tableProcessing.d.ts +22 -0
  117. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  118. package/dist/esm/utils/tableProcessing.js +85 -1
  119. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generatePivotTable = exports.isDateField = exports.getDateString = exports.getDateRange = exports.generatePivotTitle = exports.generatePivotTableYAxis = exports.PivotModal = void 0;
3
+ exports.generatePivotTableInMemory = exports.generatePivotTable = exports.isDateField = exports.getDateString = exports.getDateBuckets = exports.getDateRange = exports.generatePivotTitle = exports.generatePivotTableYAxis = exports.PivotModal = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const Context_1 = require("../../Context");
@@ -16,6 +16,8 @@ const QuillCard_1 = require("../../components/QuillCard");
16
16
  const pivotProcessing_1 = require("../../utils/pivotProcessing");
17
17
  const crypto_1 = require("../../utils/crypto");
18
18
  const tableProcessing_1 = require("../../utils/tableProcessing");
19
+ const pivotConstructor_1 = require("../../utils/pivotConstructor");
20
+ const dates_1 = require("../../utils/dates");
19
21
  const QuillHover = () => {
20
22
  return ((0, jsx_runtime_1.jsx)("style", { children: `
21
23
  .quill-hover {
@@ -29,7 +31,7 @@ const QuillHover = () => {
29
31
  }
30
32
  ` }));
31
33
  };
32
- const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, LoadingComponent = UiComponents_1.QuillLoadingComponent, CardComponent = QuillCard_1.QuillCard, HeaderComponent, LabelComponent, TextComponent, selectedPivotIndex, setSelectedPivotIndex, removePivot, selectPivot, showUpdatePivot, setShowUpdatePivot, data, columns, theme, isOpen, setIsOpen, dateRange, createdPivots, setCreatedPivots, recommendedPivots, setRecommendedPivots, triggerButtonText = 'Pivot', showPivotEditButton = false, showEditOnPivotClick = true, selectPivotOnEdit = false, showTrigger = true, rightAlign = false, parentRef, pivotCountRequest = 6, query, initialUniqueValues, initialSelectedPivotTable, disabled = false, pivotRecommendationsEnabled = true, }) => {
34
+ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, LoadingComponent = UiComponents_1.QuillLoadingComponent, CardComponent = QuillCard_1.QuillCard, HeaderComponent, LabelComponent, TextComponent, selectedPivotIndex, setSelectedPivotIndex, removePivot, selectPivot, showUpdatePivot, setShowUpdatePivot, data, columns, theme, isOpen, setIsOpen, dateRange, createdPivots, setCreatedPivots, recommendedPivots, setRecommendedPivots, triggerButtonText = 'Pivot', showPivotEditButton = false, showEditOnPivotClick = true, selectPivotOnEdit = false, showTrigger = true, rightAlign = false, parentRef, pivotCountRequest = 6, query, initialUniqueValues, initialSelectedPivotTable, disabled = false, pivotRecommendationsEnabled = true, report, }) => {
33
35
  const [isLoading, setIsLoading] = (0, react_1.useState)(false);
34
36
  const [selectedPivotType, setSelectedPivotType] = (0, react_1.useState)('recommended');
35
37
  const [errors, setErrors] = (0, react_1.useState)([]);
@@ -44,6 +46,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
44
46
  const [allowedRowFields, setAllowedRowFields] = (0, react_1.useState)([]);
45
47
  const [allowedValueFields, setAllowedValueFields] = (0, react_1.useState)([]);
46
48
  const [uniqueValues, setUniqueValues] = (0, react_1.useState)(initialUniqueValues);
49
+ const [dateRanges, setDateRanges] = (0, react_1.useState)({});
47
50
  const getDistinctValues = async () => {
48
51
  if (columns) {
49
52
  const stringColumns = columns.filter((column) => {
@@ -69,6 +72,23 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
69
72
  }
70
73
  return { rowFields: [], columnFields: [], valueFields: [] };
71
74
  };
75
+ const getAllDateRangesByColumn = async () => {
76
+ // Don't reprocess dateRanges if they are already gathered
77
+ if (Object.keys(dateRanges).length > 0 ||
78
+ (client && client.databaseType !== 'postgresql')) {
79
+ return;
80
+ }
81
+ if (columns) {
82
+ const dateColumns = columns.filter((column) => {
83
+ return column.jsType === 'date';
84
+ });
85
+ if (dateColumns.length === 0) {
86
+ return [];
87
+ }
88
+ const dateRangeByColumn = await (0, tableProcessing_1.getDateRangeByColumns)(dateColumns, query || '', client, customFields);
89
+ setDateRanges(dateRangeByColumn || {});
90
+ }
91
+ };
72
92
  (0, react_1.useEffect)(() => {
73
93
  const calculatePivotCardSize = () => {
74
94
  // The pivot card should be the same width as the row of inputs
@@ -93,30 +113,65 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
93
113
  }, 500);
94
114
  }
95
115
  }, [showUpdatePivot, isOpen]);
116
+ (0, react_1.useEffect)(() => {
117
+ const fetchPivotData = async () => {
118
+ if (pivotRowField && data && columns) {
119
+ const pivot = {
120
+ rowField: pivotRowField || '',
121
+ rowFieldType: columnsToShow[pivotRowField || ''],
122
+ columnField: pivotColumnField,
123
+ columnFieldType: columnsToShow[pivotColumnField || ''],
124
+ valueField: pivotValueField || '',
125
+ aggregationType: pivotAggregation || '',
126
+ };
127
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
128
+ setSamplePivotTable({ pivot: pivot, rows, columns });
129
+ }
130
+ if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
131
+ getDistinctValues();
132
+ }
133
+ if (initialUniqueValues) {
134
+ const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(columns, initialUniqueValues);
135
+ setAllowedRowFields(possibleColumns.rowFields);
136
+ setAllowedColumnFields(possibleColumns.columnFields);
137
+ setAllowedValueFields(possibleColumns.valueFields);
138
+ setUniqueValues(initialUniqueValues);
139
+ }
140
+ if (pivotRowField && data && columns) {
141
+ const pivot = {
142
+ rowField: pivotRowField || '',
143
+ rowFieldType: columnsToShow[pivotRowField || ''],
144
+ columnField: pivotColumnField,
145
+ columnFieldType: columnsToShow[pivotColumnField || ''],
146
+ valueField: pivotValueField || '',
147
+ aggregationType: pivotAggregation || '',
148
+ };
149
+ if (initialSelectedPivotTable) {
150
+ setSamplePivotTable({
151
+ pivot: pivot,
152
+ rows: initialSelectedPivotTable.rows,
153
+ columns: initialSelectedPivotTable.columns,
154
+ });
155
+ }
156
+ else {
157
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
158
+ setSamplePivotTable({ pivot: pivot, rows, columns });
159
+ }
160
+ }
161
+ };
162
+ fetchPivotData();
163
+ }, []);
96
164
  (0, react_1.useEffect)(() => {
97
165
  if (pivotRowField && data && columns) {
98
- const pivot = {
99
- rowField: pivotRowField || '',
100
- rowFieldType: columnsToShow[pivotRowField || ''],
101
- columnField: pivotColumnField,
102
- columnFieldType: columnsToShow[pivotColumnField || ''],
103
- valueField: pivotValueField || '',
104
- aggregationType: pivotAggregation || '',
105
- };
106
- const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
107
- setSamplePivotTable({ pivot: pivot, rows, columns });
108
- }
109
- if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
110
166
  getDistinctValues();
167
+ getAllDateRangesByColumn();
111
168
  }
112
- if (initialUniqueValues) {
113
- const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(columns, initialUniqueValues);
114
- setAllowedRowFields(possibleColumns.rowFields);
115
- setAllowedColumnFields(possibleColumns.columnFields);
116
- setAllowedValueFields(possibleColumns.valueFields);
117
- setUniqueValues(initialUniqueValues);
169
+ else if (initialSelectedPivotTable) {
170
+ getDistinctValues();
118
171
  }
119
- if (pivotRowField && data && columns) {
172
+ }, [initialSelectedPivotTable, columns, data, pivotRowField]);
173
+ (0, react_1.useEffect)(() => {
174
+ const fetchPivotTables = async () => {
120
175
  const pivot = {
121
176
  rowField: pivotRowField || '',
122
177
  rowFieldType: columnsToShow[pivotRowField || ''],
@@ -125,37 +180,12 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
125
180
  valueField: pivotValueField || '',
126
181
  aggregationType: pivotAggregation || '',
127
182
  };
128
- if (initialSelectedPivotTable) {
129
- setSamplePivotTable({
130
- pivot: pivot,
131
- rows: initialSelectedPivotTable.rows,
132
- columns: initialSelectedPivotTable.columns,
133
- });
134
- }
135
- else {
136
- const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
183
+ if ((0, pivotProcessing_1.isValidPivot)(pivot) && data && columns) {
184
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
137
185
  setSamplePivotTable({ pivot: pivot, rows, columns });
138
186
  }
139
- }
140
- }, []);
141
- (0, react_1.useEffect)(() => {
142
- if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
143
- getDistinctValues();
144
- }
145
- }, [initialSelectedPivotTable, columns, data, pivotRowField]);
146
- (0, react_1.useEffect)(() => {
147
- const pivot = {
148
- rowField: pivotRowField || '',
149
- rowFieldType: columnsToShow[pivotRowField || ''],
150
- columnField: pivotColumnField,
151
- columnFieldType: columnsToShow[pivotColumnField || ''],
152
- valueField: pivotValueField || '',
153
- aggregationType: pivotAggregation || '',
154
187
  };
155
- if ((0, pivotProcessing_1.isValidPivot)(pivot) && data && columns) {
156
- const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
157
- setSamplePivotTable({ pivot: pivot, rows, columns });
158
- }
188
+ fetchPivotTables();
159
189
  }, [
160
190
  data,
161
191
  columns,
@@ -184,17 +214,21 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
184
214
  return map;
185
215
  }, {});
186
216
  }, [columns]);
187
- const selectedPivotTable = (0, react_1.useMemo)(() => {
188
- if (selectedPivotIndex === -1) {
189
- return null;
190
- }
191
- const pivot = createdPivots[selectedPivotIndex];
192
- const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
193
- return {
194
- pivot: pivot,
195
- rows: rows,
196
- columns: columns,
217
+ const [selectedPivotTable, setSelectedPivotTable] = (0, react_1.useState)(null);
218
+ (0, react_1.useEffect)(() => {
219
+ const fetchPivotTables = async () => {
220
+ if (selectedPivotIndex === -1) {
221
+ return null;
222
+ }
223
+ const pivot = createdPivots[selectedPivotIndex];
224
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false);
225
+ setSelectedPivotTable({
226
+ pivot: pivot,
227
+ rows: rows,
228
+ columns: columns,
229
+ });
197
230
  };
231
+ fetchPivotTables();
198
232
  }, [selectedPivotIndex, data, dateRange, createdPivots]);
199
233
  const onSelectRecommendedPivot = (pivot, index) => {
200
234
  if (showEditOnPivotClick) {
@@ -211,12 +245,12 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
211
245
  setIsOpen(false);
212
246
  };
213
247
  const onSelectCreatedPivot = (pivot, index) => {
214
- selectPivot(pivot);
248
+ selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField]?.dateRange);
215
249
  setSelectedPivotType('created');
216
250
  setIsOpen(false);
217
251
  setPopUpTitle('Add pivot');
218
252
  };
219
- const onEditPivot = (pivot, index) => {
253
+ const onEditPivot = async (pivot, index) => {
220
254
  setIsLoading(false);
221
255
  setPivotRowField(pivot.rowField);
222
256
  setPivotColumnField(pivot.columnField);
@@ -224,7 +258,11 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
224
258
  setPivotAggregation(pivot.aggregationType);
225
259
  setShowUpdatePivot(true);
226
260
  if ((0, pivotProcessing_1.isValidPivot)(pivot)) {
227
- const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
261
+ let dateBucket = undefined;
262
+ if (pivotRowField && dateRanges[pivotRowField]) {
263
+ dateBucket = (0, dates_1.getDateBucketFromRange)(dateRanges[pivotRowField].dateRange);
264
+ }
265
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, dateBucket, report, client, uniqueValues);
228
266
  setSamplePivotTable({ pivot, rows, columns });
229
267
  return;
230
268
  }
@@ -326,26 +364,38 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
326
364
  setSamplePivotTable(null);
327
365
  return;
328
366
  }
329
- setTimeout(() => {
330
- const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
367
+ let dateBucket = undefined;
368
+ if (pivotRowField && dateRanges[pivotRowField]) {
369
+ dateBucket = (0, dates_1.getDateBucketFromRange)(dateRanges[pivotRowField].dateRange);
370
+ }
371
+ setTimeout(async () => {
372
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, dateBucket, report, client, uniqueValues);
331
373
  setSamplePivotTable({ pivot, rows, columns });
332
374
  setIsLoading(false);
333
375
  }, 500);
334
376
  };
335
- const recommendedPivotTables = (0, react_1.useMemo)(() => {
336
- const pts = recommendedPivots.map((p) => {
337
- const { rows, columns } = generatePivotTable(p, data, dateRange, false, 6);
338
- return { pivot: p, rows, columns };
339
- });
340
- return pts;
341
- }, [recommendedPivots, data]);
342
- const createdPivotTables = (0, react_1.useMemo)(() => {
343
- const pts = createdPivots.map((p) => {
344
- const { rows, columns } = generatePivotTable(p, data, dateRange, false, 6);
345
- return { pivot: p, rows, columns };
346
- });
347
- return pts;
348
- }, [createdPivots, data]);
377
+ const [recommendedPivotTables, setRecommendedPivotTables] = (0, react_1.useState)([]);
378
+ (0, react_1.useEffect)(() => {
379
+ const fetchPivotTables = async () => {
380
+ const pts = await Promise.all(recommendedPivots.map(async (p) => {
381
+ const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6);
382
+ return { pivot: p, rows, columns };
383
+ }));
384
+ setRecommendedPivotTables(pts);
385
+ };
386
+ fetchPivotTables();
387
+ }, [recommendedPivots, dateRange]);
388
+ const [createdPivotTables, setCreatedPivotTables] = (0, react_1.useState)([]);
389
+ (0, react_1.useEffect)(() => {
390
+ const fetchPivotTables = async () => {
391
+ const pts = await Promise.all(createdPivots.map(async (p) => {
392
+ const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6);
393
+ return { pivot: p, rows, columns };
394
+ }));
395
+ setCreatedPivotTables(pts);
396
+ };
397
+ fetchPivotTables();
398
+ }, [createdPivots, dateRange]);
349
399
  return ((0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsxs)("div", { style: {
350
400
  position: 'relative',
351
401
  display: 'inline-block',
@@ -639,6 +689,7 @@ function getDateBuckets(dateRange, column, data, dateBucket) {
639
689
  const dayDifference = (0, date_fns_1.differenceInDays)(dateRange.end, dateRange.start);
640
690
  return dayDifferenceToInterval(dayDifference, dateRange);
641
691
  }
692
+ exports.getDateBuckets = getDateBuckets;
642
693
  function getCompDateBuckets(dateRange, compDateRange, column, data) {
643
694
  if (!dateRange) {
644
695
  return (0, date_fns_1.eachMonthOfInterval)(getDateRange(undefined, column, data));
@@ -745,7 +796,31 @@ const fixBigQueryData = (data = []) => {
745
796
  }
746
797
  return newData;
747
798
  };
748
- function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket) {
799
+ async function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket, report, client, uniqueValues) {
800
+ try {
801
+ if (report &&
802
+ report.rowCount &&
803
+ report.rowCount !== data.length &&
804
+ client &&
805
+ client.databaseType.toLowerCase() === 'postgresql') {
806
+ let dateFilter = report
807
+ ? report.filtersApplied.find((f) => f.filterType === 'date_range')
808
+ : undefined;
809
+ const pivotTable = await (0, pivotConstructor_1.generatePivotWithSQL)(pivot, report, client, dateBucket, dateFilter, pivot.columnField && uniqueValues
810
+ ? Object.keys(uniqueValues[pivot.columnField])
811
+ : undefined);
812
+ if (pivotTable) {
813
+ return pivotTable;
814
+ }
815
+ }
816
+ }
817
+ catch (e) {
818
+ console.error('Error generating pivot table with SQL, using in memory process', e);
819
+ }
820
+ return generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit, compRange);
821
+ }
822
+ exports.generatePivotTable = generatePivotTable;
823
+ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket) {
749
824
  // If there is no rowField, aggregate on the valueField
750
825
  if (!pivot.rowField) {
751
826
  return valueFieldAggregation(data, pivot.valueField, pivot.aggregationType, isComparison);
@@ -1095,7 +1170,7 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
1095
1170
  }
1096
1171
  return { rows: pivotRows, columns };
1097
1172
  }
1098
- exports.generatePivotTable = generatePivotTable;
1173
+ exports.generatePivotTableInMemory = generatePivotTableInMemory;
1099
1174
  function valueFieldAggregation(data, valueField, aggregationType, isComparison) {
1100
1175
  if (!data || data.length === 0) {
1101
1176
  return {
@@ -0,0 +1,2 @@
1
+ export declare const MAX_COLUMN_ROWS_LIMIT = 500;
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,MAAM,CAAC"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_COLUMN_ROWS_LIMIT = void 0;
4
+ exports.MAX_COLUMN_ROWS_LIMIT = 500;
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAkC5E;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,CAAC,EAAE,GAAG,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CA+C9B;AAwQD,wBAAsB,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAI,OAAO,CAAC,GAAG,CAAC,CA0BpF"}
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAoC5E;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,CAAC,EAAE,GAAG,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAiD9B;AA0KD,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,GAAG,CAAC,CA0Bd"}
@@ -4,9 +4,9 @@ exports.getDashboard = exports.cleanDashboardItem = void 0;
4
4
  const valueFormatter_1 = require("./valueFormatter");
5
5
  const PivotModal_1 = require("../internals/ReportBuilder/PivotModal");
6
6
  const textProcessing_1 = require("./textProcessing");
7
- const queryConstructor_1 = require("./queryConstructor");
8
7
  const dataFetcher_1 = require("./dataFetcher");
9
- const date_fns_1 = require("date-fns");
8
+ const dates_1 = require("./dates");
9
+ const pivotConstructor_1 = require("./pivotConstructor");
10
10
  const defaultDashboardItem = {
11
11
  id: '',
12
12
  name: '',
@@ -70,8 +70,10 @@ async function cleanDashboardItem(item, dashboardFilters, client, dateBucket) {
70
70
  xAxisFormat: item.xAxisFormat,
71
71
  order: item.order,
72
72
  filtersApplied: item.filtersApplied,
73
+ rowCount: parseInt(item.rowCount),
73
74
  sort: item.sort,
74
75
  page: item.page,
76
+ itemQuery: item.itemQuery,
75
77
  };
76
78
  }
77
79
  exports.cleanDashboardItem = cleanDashboardItem;
@@ -122,106 +124,34 @@ async function getPivotTable(report, dashboardFilters, client, dateBucketInitial
122
124
  }
123
125
  const pivot = report?.pivot;
124
126
  const data = report || {};
125
- if (client && client.databaseType.toLowerCase() === 'postgresql') {
127
+ if (pivot && client && client.databaseType.toLowerCase() === 'postgresql') {
128
+ if (report.rowCount === 0) {
129
+ return { rows: [], columns: [] };
130
+ }
126
131
  try {
127
- let dateRange = undefined;
128
- let comparisonInterval = undefined;
129
132
  let dateBucket = dateBucketInitial;
130
- if (!dateBucket && pivot.rowFieldType !== 'string' && pivot.rowField) {
131
- let filterDateRange = undefined;
132
- if (dateFilter) {
133
- filterDateRange = {
134
- start: dateFilter.startDate,
135
- end: dateFilter.endDate,
136
- };
137
- }
138
- dateRange = (0, PivotModal_1.getDateRange)(filterDateRange, pivot.rowField, data.rows);
139
- const difference = (0, date_fns_1.differenceInDays)(dateRange.end, dateRange.start);
140
- if (difference < 14) {
141
- dateBucket = 'day';
142
- }
143
- else if (difference < 60) {
144
- dateBucket = 'week';
145
- }
146
- else if (difference < 365 * 3) {
147
- dateBucket = 'month';
148
- }
149
- else {
150
- dateBucket = 'year';
151
- }
133
+ let filterDateRange = undefined;
134
+ if (dateFilter) {
135
+ filterDateRange = {
136
+ start: dateFilter.startDate,
137
+ end: dateFilter.endDate,
138
+ };
152
139
  }
153
- if (dateFilter && dateFilter && dateFilter.comparisonRange) {
154
- const comparisonRange = (0, date_fns_1.differenceInDays)(dateFilter?.comparisonRange.endDate, dateFilter?.comparisonRange.startDate);
155
- if (!isNaN(comparisonRange)) {
156
- if (dateBucket === 'month') {
157
- comparisonInterval = comparisonRange / 30 + ' month';
158
- }
159
- else if (dateBucket === 'year') {
160
- comparisonInterval = comparisonRange / 365 + ' year';
161
- }
162
- else {
163
- comparisonInterval = comparisonRange + ' day';
164
- }
165
- }
140
+ else if (report.dateRange) {
141
+ filterDateRange = report.dateRange;
166
142
  }
167
- const sqlQuery = (0, queryConstructor_1.generatePivotQuery)(pivot, report.itemQuery, report.rows, dateBucket, comparisonInterval);
168
- if (sqlQuery && report.rows.length > 0) {
169
- const hostedBody = {
170
- metadata: {
171
- preQueries: [sqlQuery],
172
- task: 'query',
173
- orgId: client.customerId || '*',
174
- clientId: client.publicKey,
175
- databaseType: client?.databaseType,
176
- getCustomFields: false,
177
- runQueryConfig: {
178
- overridePost: true,
179
- convertDatatypes: true,
180
- },
181
- },
182
- };
183
- const cloudBody = { ...hostedBody };
184
- const resp = await (0, dataFetcher_1.getData)(client, 'query', 'same-origin', hostedBody, cloudBody);
185
- // With our current design we have to remove the second row field but leave the first for comparison purposes.
186
- const rows = resp.queryResults[0].rows;
187
- const columns = resp.queryResults[0].fields
188
- .map((field) => ({
189
- field: field.name,
190
- label: field.name.replace('comparison_', 'comparison '),
191
- }))
192
- .filter((field, index) => field.field !== 'comparison_' + pivot.rowField || index === 0);
193
- if (pivot.rowFieldType !== 'string') {
194
- rows.forEach((row) => {
195
- row[pivot.rowField] = (0, PivotModal_1.getDateString)(row[pivot.rowField], undefined, dateBucket);
196
- });
197
- // add a row for each date in the range that doesn't have a value
198
- if (pivot.rowFieldType !== 'string') {
199
- const dateSet = new Set(rows.map((row) => row[pivot.rowField]));
200
- // create a loop that will go through each formatted date and add a row if it doesn't exist going to the current date
201
- for (let date = dateFilter.startDate; date <= dateFilter.endDate; date = new Date(date.getTime() + 24 * 60 * 60 * 1000)) {
202
- const formattedDate = (0, PivotModal_1.getDateString)(date.toDateString(), undefined, dateBucket);
203
- if (!dateSet.has(formattedDate)) {
204
- const newRow = {};
205
- newRow[pivot.rowField] = formattedDate;
206
- rows.push(newRow);
207
- dateSet.add(formattedDate);
208
- }
209
- // order the rows by the date field
210
- rows.sort((a, b) => {
211
- return new Date(a[pivot.rowField]) < new Date(b[pivot.rowField])
212
- ? -1
213
- : 1;
214
- });
215
- }
216
- }
217
- }
218
- return {
219
- rows: rows,
220
- columns: columns,
221
- };
143
+ if (!dateBucket && filterDateRange) {
144
+ dateBucket = (0, dates_1.getDateBucketFromRange)(filterDateRange);
145
+ }
146
+ const pivotTable = await (0, pivotConstructor_1.generatePivotWithSQL)(pivot, report, client, dateBucket, dateFilter, report.distinctStrings);
147
+ if (pivotTable) {
148
+ return pivotTable;
222
149
  }
150
+ throw new Error('Error generating pivot table');
151
+ }
152
+ catch (e) {
153
+ throw new Error('Error generating pivot table: ' + e);
223
154
  }
224
- catch (e) { }
225
155
  }
226
156
  return pivot && data.rows
227
157
  ? (0, PivotModal_1.generatePivotTable)(pivot, JSON.parse(JSON.stringify(data.rows)), // deep copy
@@ -1 +1 @@
1
- {"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"AAEA,wBAAsB,OAAO,CAC3B,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,GAAG,EACtB,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBAgEhB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBAgChB"}
1
+ {"version":3,"file":"dataFetcher.d.ts","sourceRoot":"","sources":["../../../src/utils/dataFetcher.tsx"],"names":[],"mappings":"AAqBA,wBAAsB,OAAO,CAC3B,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,GAAG,EACtB,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBAmGhB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,GAAG,EACX,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,GAAG,EACrB,MAAM,SAAS,gBAgChB"}
@@ -1,6 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getDataFromCloud = exports.getData = void 0;
4
+ function parseData(rows, queryType) {
5
+ if (!rows || rows.length === 0)
6
+ return [];
7
+ switch (queryType) {
8
+ case 'dateRange':
9
+ return {
10
+ start: new Date(rows[0]?.min_date),
11
+ end: new Date(rows[0]?.max_date),
12
+ };
13
+ case 'rowCount':
14
+ return parseInt(rows[0]?.count);
15
+ case 'distinctStrings':
16
+ return rows.map((row) => {
17
+ return row['column_field'];
18
+ });
19
+ default:
20
+ return rows;
21
+ }
22
+ }
4
23
  // this function gets the data either from the self hosted endpoint or
5
24
  // our cloud server
6
25
  async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cloudRequestBody, method = 'POST') {
@@ -21,21 +40,45 @@ async function getData(client, cloudQueryEndpoint, noCred, hostedRequestBody, cl
21
40
  return { success: false, errorMessage: responseJson.error };
22
41
  }
23
42
  let result;
24
- if (responseJson.data?.data) {
25
- result = {
26
- fields: responseJson?.data.queries?.queryResults[0]?.fields,
27
- ...responseJson.data.data,
28
- rows: responseJson?.data.queries?.queryResults[0]?.rows,
29
- compareRows: responseJson?.data.queries?.queryResults[1]?.rows,
30
- };
43
+ if (hostedRequestBody &&
44
+ hostedRequestBody.metadata &&
45
+ hostedRequestBody.metadata.task === 'report') {
46
+ if (responseJson.data?.data) {
47
+ result = {
48
+ fields: responseJson?.data.queries?.queryResults[0]?.fields,
49
+ ...responseJson.data.data,
50
+ };
51
+ responseJson.data.data.queryOrder.forEach((queryKey, index) => {
52
+ result[queryKey] = parseData(responseJson.queries.queryResults[index].rows, queryKey);
53
+ });
54
+ }
55
+ else {
56
+ result = {
57
+ fields: responseJson?.queries?.queryResults[0]?.fields,
58
+ ...responseJson.data,
59
+ };
60
+ responseJson.data.queryOrder.forEach((queryKey, index) => {
61
+ result[queryKey] = parseData(responseJson.queries.queryResults[index].rows, queryKey);
62
+ });
63
+ }
31
64
  }
32
65
  else {
33
- result = {
34
- fields: responseJson?.queries?.queryResults[0]?.fields,
35
- ...responseJson.data,
36
- rows: responseJson?.queries?.queryResults[0]?.rows,
37
- compareRows: responseJson?.queries?.queryResults[1]?.rows,
38
- };
66
+ if (responseJson.data?.data) {
67
+ result = {
68
+ fields: responseJson?.data.queries?.queryResults[0]?.fields,
69
+ ...responseJson.data.data,
70
+ rows: responseJson?.data.queries?.queryResults[0]?.rows,
71
+ compareRows: responseJson?.data.queries?.queryResults[1]?.rows,
72
+ };
73
+ }
74
+ else {
75
+ result = {
76
+ fields: responseJson?.queries?.queryResults[0]?.fields,
77
+ ...responseJson.data,
78
+ rows: responseJson?.queries?.queryResults[0]?.rows,
79
+ compareRows: responseJson?.queries?.queryResults[1]?.rows,
80
+ };
81
+ }
39
82
  }
40
83
  if (responseJson.data.columns &&
41
84
  responseJson.data.fields &&
@@ -7,4 +7,12 @@ export declare function convertComparisonRange(primaryRange: string, comparisonR
7
7
  * Returns whether the xAxisFormat is a date format.
8
8
  */
9
9
  export declare function isDateFormat(xAxisFormat: string): boolean;
10
+ export declare function getComparisonInterval(comparisonRange: {
11
+ startDate: Date;
12
+ endDate: Date;
13
+ }, dateBucket?: string): string | undefined;
14
+ export declare function getDateBucketFromRange(dateRange: {
15
+ start: Date;
16
+ end: Date;
17
+ }): "month" | "week" | "day" | "year";
10
18
  //# sourceMappingURL=dates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../../src/utils/dates.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,UAYxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,WAY/C"}
1
+ {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../../src/utils/dates.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,UAYxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,WAa/C;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;CACf,EACD,UAAU,CAAC,EAAE,MAAM,sBAepB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,qCAW3E"}