@quillsql/react 2.12.27 → 2.12.29

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 (155) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +40 -21
  3. package/dist/cjs/ChartBuilder.d.ts +38 -4
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +66 -25
  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 +1 -19
  9. package/dist/cjs/Context.d.ts.map +1 -1
  10. package/dist/cjs/Context.js +32 -83
  11. package/dist/cjs/Dashboard.d.ts +6 -1
  12. package/dist/cjs/Dashboard.d.ts.map +1 -1
  13. package/dist/cjs/Dashboard.js +79 -50
  14. package/dist/cjs/ReportBuilder.d.ts +10 -1
  15. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  16. package/dist/cjs/ReportBuilder.js +331 -99
  17. package/dist/cjs/SQLEditor.d.ts +10 -1
  18. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  19. package/dist/cjs/SQLEditor.js +122 -29
  20. package/dist/cjs/Table.d.ts.map +1 -1
  21. package/dist/cjs/Table.js +21 -11
  22. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  23. package/dist/cjs/components/Chart/ChartTooltip.js +5 -4
  24. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  25. package/dist/cjs/components/Dashboard/DataLoader.js +61 -20
  26. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  27. package/dist/cjs/components/Dashboard/MetricComponent.js +7 -1
  28. package/dist/cjs/components/Dashboard/TableComponent.d.ts +16 -2
  29. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  30. package/dist/cjs/components/Dashboard/TableComponent.js +2 -14
  31. package/dist/cjs/components/QuillTable.d.ts +2 -2
  32. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  33. package/dist/cjs/components/QuillTable.js +7 -5
  34. package/dist/cjs/components/UiComponents.d.ts +3 -3
  35. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  36. package/dist/cjs/components/UiComponents.js +4 -4
  37. package/dist/cjs/hooks/useDashboard.d.ts +1 -1
  38. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  39. package/dist/cjs/hooks/useDashboard.js +18 -4
  40. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +16 -1
  41. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  42. package/dist/cjs/internals/ReportBuilder/PivotModal.js +179 -105
  43. package/dist/cjs/utils/columnProcessing.d.ts +1 -0
  44. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
  45. package/dist/cjs/utils/columnProcessing.js +8 -1
  46. package/dist/cjs/utils/constants.d.ts +2 -0
  47. package/dist/cjs/utils/constants.d.ts.map +1 -0
  48. package/dist/cjs/utils/constants.js +4 -0
  49. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  50. package/dist/cjs/utils/dashboard.js +26 -96
  51. package/dist/cjs/utils/dataFetcher.d.ts +1 -1
  52. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  53. package/dist/cjs/utils/dataFetcher.js +63 -15
  54. package/dist/cjs/utils/dates.d.ts +9 -0
  55. package/dist/cjs/utils/dates.d.ts.map +1 -1
  56. package/dist/cjs/utils/dates.js +43 -1
  57. package/dist/cjs/utils/logging.d.ts +2 -0
  58. package/dist/cjs/utils/logging.d.ts.map +1 -0
  59. package/dist/cjs/utils/logging.js +10 -0
  60. package/dist/cjs/utils/monacoAutocomplete.d.ts +20 -0
  61. package/dist/cjs/utils/monacoAutocomplete.d.ts.map +1 -0
  62. package/dist/cjs/utils/monacoAutocomplete.js +145 -0
  63. package/dist/cjs/utils/pivotConstructor.d.ts +6 -0
  64. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -0
  65. package/dist/cjs/utils/pivotConstructor.js +140 -0
  66. package/dist/cjs/utils/queryConstructor.d.ts +5 -2
  67. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  68. package/dist/cjs/utils/queryConstructor.js +149 -53
  69. package/dist/cjs/utils/queryConstructor.uspec.d.ts +2 -0
  70. package/dist/cjs/utils/queryConstructor.uspec.d.ts.map +1 -0
  71. package/dist/cjs/utils/queryConstructor.uspec.js +225 -0
  72. package/dist/cjs/utils/tableProcessing.d.ts +23 -0
  73. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  74. package/dist/cjs/utils/tableProcessing.js +125 -2
  75. package/dist/esm/Chart.d.ts.map +1 -1
  76. package/dist/esm/Chart.js +40 -21
  77. package/dist/esm/ChartBuilder.d.ts +38 -4
  78. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  79. package/dist/esm/ChartBuilder.js +64 -24
  80. package/dist/esm/ChartEditor.d.ts.map +1 -1
  81. package/dist/esm/ChartEditor.js +66 -26
  82. package/dist/esm/Context.d.ts +1 -19
  83. package/dist/esm/Context.d.ts.map +1 -1
  84. package/dist/esm/Context.js +32 -82
  85. package/dist/esm/Dashboard.d.ts +6 -1
  86. package/dist/esm/Dashboard.d.ts.map +1 -1
  87. package/dist/esm/Dashboard.js +80 -51
  88. package/dist/esm/ReportBuilder.d.ts +10 -1
  89. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  90. package/dist/esm/ReportBuilder.js +333 -101
  91. package/dist/esm/SQLEditor.d.ts +10 -1
  92. package/dist/esm/SQLEditor.d.ts.map +1 -1
  93. package/dist/esm/SQLEditor.js +123 -30
  94. package/dist/esm/Table.d.ts.map +1 -1
  95. package/dist/esm/Table.js +21 -11
  96. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  97. package/dist/esm/components/Chart/ChartTooltip.js +5 -4
  98. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  99. package/dist/esm/components/Dashboard/DataLoader.js +61 -20
  100. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  101. package/dist/esm/components/Dashboard/MetricComponent.js +7 -1
  102. package/dist/esm/components/Dashboard/TableComponent.d.ts +16 -2
  103. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  104. package/dist/esm/components/Dashboard/TableComponent.js +2 -14
  105. package/dist/esm/components/QuillTable.d.ts +2 -2
  106. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  107. package/dist/esm/components/QuillTable.js +7 -5
  108. package/dist/esm/components/UiComponents.d.ts +3 -3
  109. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  110. package/dist/esm/components/UiComponents.js +4 -4
  111. package/dist/esm/hooks/useDashboard.d.ts +1 -1
  112. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  113. package/dist/esm/hooks/useDashboard.js +19 -5
  114. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +16 -1
  115. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  116. package/dist/esm/internals/ReportBuilder/PivotModal.js +177 -105
  117. package/dist/esm/utils/columnProcessing.d.ts +1 -0
  118. package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
  119. package/dist/esm/utils/columnProcessing.js +6 -0
  120. package/dist/esm/utils/constants.d.ts +2 -0
  121. package/dist/esm/utils/constants.d.ts.map +1 -0
  122. package/dist/esm/utils/constants.js +1 -0
  123. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  124. package/dist/esm/utils/dashboard.js +27 -97
  125. package/dist/esm/utils/dataFetcher.d.ts +1 -1
  126. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  127. package/dist/esm/utils/dataFetcher.js +63 -15
  128. package/dist/esm/utils/dates.d.ts +9 -0
  129. package/dist/esm/utils/dates.d.ts.map +1 -1
  130. package/dist/esm/utils/dates.js +39 -0
  131. package/dist/esm/utils/logging.d.ts +2 -0
  132. package/dist/esm/utils/logging.d.ts.map +1 -0
  133. package/dist/esm/utils/logging.js +6 -0
  134. package/dist/esm/utils/monacoAutocomplete.d.ts +20 -0
  135. package/dist/esm/utils/monacoAutocomplete.d.ts.map +1 -0
  136. package/dist/esm/utils/monacoAutocomplete.js +140 -0
  137. package/dist/esm/utils/pivotConstructor.d.ts +6 -0
  138. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -0
  139. package/dist/esm/utils/pivotConstructor.js +136 -0
  140. package/dist/esm/utils/queryConstructor.d.ts +5 -2
  141. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  142. package/dist/esm/utils/queryConstructor.js +145 -52
  143. package/dist/esm/utils/queryConstructor.uspec.d.ts +2 -0
  144. package/dist/esm/utils/queryConstructor.uspec.d.ts.map +1 -0
  145. package/dist/esm/utils/queryConstructor.uspec.js +223 -0
  146. package/dist/esm/utils/tableProcessing.d.ts +23 -0
  147. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  148. package/dist/esm/utils/tableProcessing.js +122 -2
  149. package/package.json +1 -1
  150. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
  151. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
  152. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.js +0 -213
  153. package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
  154. package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
  155. package/dist/esm/internals/ReportBuilder/PivotModal.spec.js +0 -211
@@ -8,7 +8,7 @@ import { CSS as DND_CSS } from '@dnd-kit/utilities';
8
8
  import { getQuarter } from 'date-fns';
9
9
  import { ClientContext, CustomFieldContext, SchemaContext, ThemeContext, } from './Context';
10
10
  import { getTableAliases, getTableNames, isBoolColumnType, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
11
- import { ChartBuilderWithModal } from './ChartBuilder';
11
+ import { ChartBuilderWithModal, createInitialFormData } from './ChartBuilder';
12
12
  import { QuillTextInput } from './components/UiComponents';
13
13
  import { QuillSidebar, CustomContainer, QuillSelectColumn, QuillDraggableColumn, QuillSidebarHeading, QuillFilterPopover, QuillSortPopover, TagWrapper, EditPopover, AddFilterPopover, QuillLimitPopover, } from './components/ReportBuilder/ui';
14
14
  import { generateCurrentPeriodPostgres, generateEqualsPostgres, generateLastNPeriodsPostgres, generatePreviousPeriodPostgres, } from './components/ReportBuilder/postgres';
@@ -28,13 +28,15 @@ import { QuillCard } from './components/QuillCard';
28
28
  import { getData } from './utils/dataFetcher';
29
29
  import { DATE_FORMAT_TYPES, quillFormat } from './utils/valueFormatter';
30
30
  import { getPossiblePivotFieldOptions, pivotToSql, } from './utils/pivotProcessing';
31
- import { getUniqueValuesByColumns } from './utils/tableProcessing';
31
+ import { getUniqueValuesByColumns, getDateRangeByColumns, getCountsByColumns, } from './utils/tableProcessing';
32
32
  import { useQuill } from './hooks/useQuill';
33
33
  import { getDataFromCloud } from './utils/dataFetcher';
34
34
  import { convertColumnInfoToColumnInternal, convertPostgresColumn, } from './utils/columnProcessing';
35
35
  import { getSelectFromAST, processApostrophe, processStarColumn, } from './utils/astProcessing';
36
36
  import PivotForm from './internals/ReportBuilder/PivotForm';
37
37
  import { getSchemaInfoWithCustomFields } from './utils/schema';
38
+ import { MAX_COLUMN_ROWS_LIMIT } from './utils/constants';
39
+ import { getDateBucketFromRange } from './utils/dates';
38
40
  export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SERVER_HOST) ||
39
41
  'https://quill-344421.uc.r.appspot.com';
40
42
  /**
@@ -68,7 +70,7 @@ export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUI
68
70
  * ### Report Builder API
69
71
  * @see https://docs.quillsql.com/components/report-builder
70
72
  */
71
- export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void null, onSubmitCreateReport = (_) => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, ModalComponent = MemoizedModal, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, TableComponent = QuillTableSQLEditorComponent, PopoverComponent = MemoizedPopover, TabsComponent = QuillTabs, CheckboxComponent = MemoizedCheckbox, SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectColumnComponent = QuillSelectColumn, DraggableColumnComponent = QuillDraggableColumn, SidebarHeadingComponent = QuillSidebarHeading, FilterPopoverComponent = QuillFilterPopover, SortPopoverComponent = QuillSortPopover, LimitPopoverComponent = QuillLimitPopover, CardComponent = QuillCard, LabelComponent = MemoizedLabel, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, TextComponent = MemoizedText, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, ColumnSearchEmptyState = QuillColumnSearchEmptyState, ChartBuilderFormContainer = QuillChartBuilderFormContainer, ChartBuilderModalComponent = MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement }) {
73
+ export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void null, onSubmitCreateReport = (_) => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, ModalComponent = MemoizedModal, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, TableComponent = QuillTableSQLEditorComponent, PopoverComponent = MemoizedPopover, TabsComponent = QuillTabs, CheckboxComponent = MemoizedCheckbox, SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectColumnComponent = QuillSelectColumn, DraggableColumnComponent = QuillDraggableColumn, SidebarHeadingComponent = QuillSidebarHeading, FilterPopoverComponent = QuillFilterPopover, SortPopoverComponent = QuillSortPopover, LimitPopoverComponent = QuillLimitPopover, CardComponent = QuillCard, LabelComponent = MemoizedLabel, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, TextComponent = MemoizedText, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, ColumnSearchEmptyState = QuillColumnSearchEmptyState, ChartBuilderFormContainer = QuillChartBuilderFormContainer, ChartBuilderModalComponent = MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement, }) {
72
74
  const { data: report } = useQuill(reportId || '');
73
75
  const [aiPrompt, setAiPrompt] = useState('');
74
76
  const [errorMessage, setErrorMessage] = useState('');
@@ -91,6 +93,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
91
93
  const [rows, setRows] = useState([]);
92
94
  const [formattedRows, setFormattedRows] = useState([]);
93
95
  const [columns, setColumns] = useState([]);
96
+ const [tempReport, setTempReport] = useState({});
94
97
  const [topLevelBinaryOperator, setTopLevelBinaryOperator] = useState('AND');
95
98
  const [editPopoverKey, setEditPopoverKey] = useState(null);
96
99
  const [uniqueValues, setUniqueValues] = useState({});
@@ -116,19 +119,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
116
119
  const [pivotColumnField, setPivotColumnField] = useState(undefined);
117
120
  const [pivotValueField, setPivotValueField] = useState(undefined);
118
121
  const [pivotAggregation, setPivotAggregation] = useState(undefined);
122
+ const [dateRanges, setDateRanges] = useState(null);
119
123
  // eslint-disable-next-line no-unused-vars
120
124
  const [client, _setClient] = useContext(ClientContext);
121
125
  // JANK: This is temp and stupid
122
126
  const [overrideRecommendations, setOverrideRecommendations] = useState(true);
123
127
  const [customFields, setCustomFields] = useContext(CustomFieldContext);
124
128
  useEffect(() => {
129
+ if (!client) {
130
+ return;
131
+ }
125
132
  if (client.publicKey === '663416663aa9bc716e59a89d') {
126
133
  setOverrideRecommendations(false);
127
134
  }
128
135
  if (!loadingSchema) {
129
136
  fetchSchema();
130
137
  }
131
- }, [client.publicKey, client.customerId]);
138
+ }, [client]);
132
139
  useEffect(() => {
133
140
  updateFirstChildWidth(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
134
141
  updateFirstChildWidth(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
@@ -146,8 +153,9 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
146
153
  window.removeEventListener('resize', handleResize);
147
154
  };
148
155
  }, []);
149
- const updatePivot = (changeField, fieldKey) => {
156
+ const updatePivot = async (changeField, fieldKey) => {
150
157
  const newPivot = pivot;
158
+ setTableLoading(true);
151
159
  // @ts-ignore
152
160
  newPivot[fieldKey] = changeField;
153
161
  if (fieldKey === 'rowField') {
@@ -165,11 +173,17 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
165
173
  newPivot.sort = undefined;
166
174
  }
167
175
  }
168
- setPivot(newPivot);
169
- const pivotedData = generatePivotTable(newPivot, rows, undefined, false);
176
+ let dateBucket = undefined;
177
+ const tempDateRange = dateRanges && dateRanges[newPivot.rowField];
178
+ if (tempDateRange) {
179
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
180
+ }
181
+ const pivotedData = await generatePivotTable(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
170
182
  setPivotData(pivotedData || []);
171
183
  const formattedRows = formatRows(pivotedData.rows, columns, true, newPivot.aggregationType);
184
+ setPivot(newPivot);
172
185
  setFormattedRows(formattedRows);
186
+ setTableLoading(false);
173
187
  };
174
188
  const enforceOrderOnColumns = (columnNames) => {
175
189
  if (pivot) {
@@ -214,10 +228,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
214
228
  }, 0);
215
229
  };
216
230
  useEffect(() => {
231
+ if (!client) {
232
+ return;
233
+ }
217
234
  if (!initialLoad && client.publicKey) {
218
235
  clearAllState();
219
236
  }
220
- }, [client.publicKey, client.customerId]);
237
+ }, [client]);
221
238
  useEffect(() => {
222
239
  if (activePath !== null) {
223
240
  // update the modal with the new subtree
@@ -354,6 +371,34 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
354
371
  console.error(error);
355
372
  }
356
373
  };
374
+ const getUniqueStringValues = async (columns, tableName) => {
375
+ const convertedStringColumns = columns
376
+ .filter((column) => {
377
+ return isTextColumnType(column.fieldType);
378
+ })
379
+ .map((column) => convertColumnInfoToColumnInternal(column));
380
+ const stringNames = convertedStringColumns.map((column) => column.field);
381
+ const smallStringColumns = await getCountsByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, client, customFields);
382
+ const smallStringNames = smallStringColumns.map((column) => column.field);
383
+ const newUniqueValues = await getUniqueValuesByColumns(smallStringColumns, `Select ${smallStringNames.join(', ')} from ${tableName}`, [], client, customFields);
384
+ const joinedUniqueValues = deepCopy(uniqueValues);
385
+ joinedUniqueValues[tableName] = newUniqueValues;
386
+ return joinedUniqueValues;
387
+ };
388
+ const getDateRanges = async (columns, tableName) => {
389
+ const dateColumns = columns.filter((column) => {
390
+ return column.fieldType === 'date';
391
+ });
392
+ if (dateColumns.length === 0) {
393
+ return {};
394
+ }
395
+ const dateColumnNames = dateColumns.map((column) => {
396
+ //@ts-ignore
397
+ return column.field || column.name;
398
+ });
399
+ const dateRanges = await getDateRangeByColumns(dateColumns, `Select ${dateColumnNames.join(', ')} from ${tableName}`, client, customFields);
400
+ return dateRanges;
401
+ };
357
402
  // It's just like getColumnsInPivot but we expand the columnField
358
403
  // if there is one to include all the variants just like it would
359
404
  // show up in the table. (eg. category -> ...[Fuel, Food, Other])
@@ -380,18 +425,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
380
425
  setLoading(true);
381
426
  const tableInfo = tables.find((tableInfo) => tableInfo.name === initialTableName);
382
427
  if (tableInfo) {
383
- const convertedStringColumns = tableInfo.columns
384
- .filter((column) => {
385
- return isTextColumnType(column.fieldType);
386
- })
387
- .map((column) => convertColumnInfoToColumnInternal(column));
388
- const stringNames = convertedStringColumns.map((column) => column.field);
389
- const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${initialTableName}`, [], client, customFields);
390
- const joinedUniqueValues = deepCopy(uniqueValues);
391
- joinedUniqueValues[initialTableName] = newUniqueValues;
392
- if (hashCode(uniqueValues) !== hashCode(joinedUniqueValues)) {
393
- setUniqueValues(joinedUniqueValues);
428
+ const newUniqueValues = await getUniqueStringValues(tableInfo.columns, initialTableName);
429
+ if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
430
+ setUniqueValues(newUniqueValues);
394
431
  }
432
+ const dateRangesTemp = await getDateRanges(tableInfo.columns, initialTableName);
433
+ setDateRanges(dateRangesTemp);
395
434
  }
396
435
  const columnsForTable = tables
397
436
  .find((t) => t.name === initialTableName)
@@ -483,17 +522,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
483
522
  setBaseAst(newAst);
484
523
  const initialRows = await fetchUponChange(newAst, undefined);
485
524
  const tableInfo = schemaInfo.find((table) => table.name === tableName);
486
- const stringColumns = tableInfo.columns
487
- .filter((column) => {
488
- return column.fieldType === 'varchar' || column.fieldType === 'text';
489
- })
490
- .map((column) => convertColumnInfoToColumnInternal(column));
491
- if (stringColumns.length !== 0 && tableName) {
492
- const stringNames = stringColumns.map((column) => column.field);
493
- const newUniqueValues = await getUniqueValuesByColumns(stringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, [], client, customFields);
494
- const joinedUniqueValues = deepCopy(uniqueValues);
495
- joinedUniqueValues[tableName] = newUniqueValues;
496
- setUniqueValues(joinedUniqueValues);
525
+ let newUniqueValues = undefined;
526
+ let dateRangesTemp = undefined;
527
+ if (tableName) {
528
+ newUniqueValues = await getUniqueStringValues(tableInfo.columns, tableName);
529
+ setUniqueValues(newUniqueValues);
530
+ dateRangesTemp = await getDateRanges(tableInfo.columns, tableName);
531
+ setDateRanges(dateRangesTemp);
497
532
  }
498
533
  if (groupByPivot) {
499
534
  // @ts-ignore
@@ -505,9 +540,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
505
540
  // @ts-ignore
506
541
  setPivotValueField(groupByPivot.valueField);
507
542
  setPivot(groupByPivot);
508
- const pivotedData = generatePivotTable(
543
+ let dateBucket = undefined;
544
+ const tempDateRange = dateRangesTemp &&
545
+ groupByPivot.rowField &&
546
+ dateRangesTemp[groupByPivot.rowField];
547
+ if (tempDateRange) {
548
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
549
+ }
550
+ const pivotedData = await generatePivotTable(
509
551
  // @ts-ignore
510
- groupByPivot, initialRows, undefined, false);
552
+ groupByPivot, initialRows, tempDateRange, false, -1, undefined, dateBucket, report, client, newUniqueValues[tableName]);
511
553
  setPivotData(pivotedData || []);
512
554
  const formattedRows = formatRows(pivotedData.rows, report.columns, true,
513
555
  // @ts-ignore
@@ -915,6 +957,89 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
915
957
  return [{ label: snakeAndCamelCaseToTitleCase(pivot.valueField) }];
916
958
  }
917
959
  };
960
+ const [previousPage, setPreviousPage] = useState(0);
961
+ const [currentProcessing, setCurrentProcessing] = useState({
962
+ page: { currentPage: 0, rowsPerPage: 20 },
963
+ });
964
+ const [numberOfRows, setNumberOfRows] = useState(0);
965
+ const [tableLoading, setTableLoading] = useState(false);
966
+ const onPageChange = (page) => {
967
+ if (pivot) {
968
+ return;
969
+ }
970
+ if ((previousPage < page.currentPage &&
971
+ (page.currentPage * page.rowsPerPage) % MAX_COLUMN_ROWS_LIMIT === 0) ||
972
+ (previousPage > page.currentPage &&
973
+ (previousPage * page.rowsPerPage) % MAX_COLUMN_ROWS_LIMIT === 0)) {
974
+ handleRunQuery({ ...currentProcessing, page });
975
+ }
976
+ setPreviousPage(page.currentPage);
977
+ };
978
+ const onSortChange = (sort) => {
979
+ if (pivot) {
980
+ return;
981
+ }
982
+ handleRunQuery({ sort, page: { currentPage: 0, rowsPerPage: 20 } });
983
+ setPreviousPage(0);
984
+ };
985
+ const handleRunQuery = async (processing) => {
986
+ try {
987
+ setErrorMessage('');
988
+ setTableLoading(true);
989
+ const hostedBody = {
990
+ metadata: {
991
+ query: activeQuery,
992
+ task: 'query',
993
+ orgId: client.customerId || '*',
994
+ clientId: client.publicKey,
995
+ databaseType: client?.databaseType,
996
+ getCustomFields: !client.customerId || client.customerId === '*' ? false : true,
997
+ customFieldsByTable: customFields,
998
+ additionalProcessing: processing,
999
+ useUpdatedDataGathering: true,
1000
+ },
1001
+ };
1002
+ const cloudBody = { activeQuery };
1003
+ const resp = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
1004
+ if (resp && resp.errorMessage) {
1005
+ setTableLoading(false);
1006
+ setErrorMessage('Failed to run SQL query: ' + resp.errorMessage);
1007
+ setRows([]);
1008
+ setColumns([]);
1009
+ return;
1010
+ }
1011
+ if (resp.rowCount) {
1012
+ setNumberOfRows(resp.rowCount);
1013
+ }
1014
+ setErrorMessage('');
1015
+ setCurrentProcessing(processing);
1016
+ if (resp.rows.length === 0) {
1017
+ setErrorMessage('No data found');
1018
+ }
1019
+ const temp_rows = resp.rows && resp.rows.length ? resp.rows : [];
1020
+ const processedFields = resp.fields.map((elem) => convertPostgresColumn(elem));
1021
+ setRows(temp_rows);
1022
+ // setNumberOfRows(resp.compareRows[0]?.count || temp_rows.length);
1023
+ setFormattedRows(temp_rows.map((row) => {
1024
+ return processedFields.reduce((formattedRow, column) => {
1025
+ // Apply the format function to each field in the row
1026
+ const formattedValue = quillFormat({
1027
+ value: row[column.field],
1028
+ format: column.format,
1029
+ });
1030
+ formattedRow[column.field] = formattedValue;
1031
+ return formattedRow;
1032
+ }, {});
1033
+ }));
1034
+ setColumns(processedFields);
1035
+ setTableLoading(false);
1036
+ }
1037
+ catch (e) {
1038
+ setTableLoading(false);
1039
+ console.log('ERROR: ', e);
1040
+ return;
1041
+ }
1042
+ };
918
1043
  /**
919
1044
  * Render form fields based on the type of the node
920
1045
  * @param node the AST or subtree to render recursively
@@ -1780,6 +1905,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1780
1905
  task: 'patterns',
1781
1906
  getCustomFields: false,
1782
1907
  customFields,
1908
+ additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
1909
+ useUpdatedDataGathering: true,
1783
1910
  },
1784
1911
  };
1785
1912
  const cloudBody = {};
@@ -1788,23 +1915,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1788
1915
  throw new Error(data2.errorMessage);
1789
1916
  }
1790
1917
  rows = data2.rows;
1918
+ if (data2.rowCount) {
1919
+ setNumberOfRows(data2.rowCount);
1920
+ }
1791
1921
  const tables = getTableNames(baseAst);
1792
1922
  const table = tables.length >= 1 ? tables[0] : initialTableName;
1923
+ let newUniqueValues = uniqueValues;
1924
+ let dateRangesTemp = dateRanges;
1925
+ let curReport = undefined;
1793
1926
  if (table !== currentTable) {
1794
1927
  const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
1795
1928
  if (tableInfo) {
1796
- const convertedStringColumns = tableInfo.columns
1797
- .filter((column) => {
1798
- return isTextColumnType(column.fieldType);
1799
- })
1800
- .map((column) => convertColumnInfoToColumnInternal(column));
1801
- const stringNames = convertedStringColumns.map((column) => column.field);
1802
- const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
1803
- const joinedUniqueValues = deepCopy(uniqueValues);
1804
- joinedUniqueValues[table] = newUniqueValues;
1805
- if (hashCode(uniqueValues) !== hashCode(joinedUniqueValues)) {
1806
- setUniqueValues(joinedUniqueValues);
1929
+ newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
1930
+ if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
1931
+ setUniqueValues(newUniqueValues);
1807
1932
  }
1933
+ dateRangesTemp = await getDateRanges(tableInfo.columns, table);
1934
+ setDateRanges(dateRangesTemp || {});
1808
1935
  }
1809
1936
  setCurrentTable(table);
1810
1937
  }
@@ -1817,6 +1944,22 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1817
1944
  setPivotData(null);
1818
1945
  setRows(data2.rows);
1819
1946
  setColumns(processedFields);
1947
+ if (data2.rowCount) {
1948
+ const processedFormData = report
1949
+ ? report
1950
+ : createInitialFormData(processedFields);
1951
+ setNumberOfRows(data2.rowCount);
1952
+ curReport = {
1953
+ ...formData,
1954
+ ...processedFormData,
1955
+ itemQuery: data2.itemQuery,
1956
+ rowCount: data2.rowCount,
1957
+ filtersApplied: [],
1958
+ rows: data2.rows,
1959
+ columns: processedFields,
1960
+ };
1961
+ setTempReport(curReport);
1962
+ }
1820
1963
  const formattedRows = formatRows(data2.rows, processedFields, false);
1821
1964
  setFormattedRows(formattedRows);
1822
1965
  return;
@@ -1828,12 +1971,36 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1828
1971
  return acc;
1829
1972
  }, {});
1830
1973
  uniqueFormatted[pivot.columnField] = uniqueRecords;
1831
- const pivotedData = generatePivotTable(pivot, data2.rows, undefined, false);
1974
+ let dateBucket = undefined;
1975
+ const tempDateRange = dateRangesTemp &&
1976
+ pivot.rowField &&
1977
+ dateRangesTemp[pivot.rowField];
1978
+ if (tempDateRange) {
1979
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
1980
+ }
1981
+ const pivotedData = await generatePivotTable(
1982
+ // @ts-ignore
1983
+ pivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, uniqueFormatted[pivot.columnField]);
1832
1984
  console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
1833
1985
  const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
1834
1986
  setPivotData(pivotedData);
1835
1987
  setRows(data2.rows);
1836
1988
  setColumns(processedFields);
1989
+ if (data2.rowCount) {
1990
+ const processedFormData = report
1991
+ ? report
1992
+ : createInitialFormData(processedFields);
1993
+ setNumberOfRows(data2.rowCount);
1994
+ setTempReport({
1995
+ ...formData,
1996
+ ...processedFormData,
1997
+ itemQuery: data2.itemQuery,
1998
+ rowCount: data2.rowCount,
1999
+ filtersApplied: [],
2000
+ rows: data2.rows,
2001
+ columns: processedFields,
2002
+ });
2003
+ }
1837
2004
  const formattedRows = formatRows(pivotedData.rows, processedFields, true, pivot.aggregationType);
1838
2005
  setSelectedColumns(processedFields.map((column) => {
1839
2006
  return `${table}.${column.field}`;
@@ -1844,6 +2011,21 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1844
2011
  const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
1845
2012
  setRows(data2.rows);
1846
2013
  setColumns(processedFields);
2014
+ if (data2.rowCount) {
2015
+ const processedFormData = report
2016
+ ? report
2017
+ : createInitialFormData(processedFields);
2018
+ setNumberOfRows(data2.rowCount);
2019
+ setTempReport({
2020
+ ...formData,
2021
+ ...processedFormData,
2022
+ itemQuery: data2.itemQuery,
2023
+ rowCount: data2.rowCount,
2024
+ filtersApplied: [],
2025
+ rows: data2.rows,
2026
+ columns: processedFields,
2027
+ });
2028
+ }
1847
2029
  setSelectedColumns(processedFields.map((column) => {
1848
2030
  return `${table}.${column.field}`;
1849
2031
  }));
@@ -2078,6 +2260,9 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2078
2260
  publicKey: client.publicKey,
2079
2261
  orgId: client.customerId,
2080
2262
  task: 'patterns',
2263
+ additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
2264
+ useUpdatedDataGathering: true,
2265
+ pivot: groupByPivot,
2081
2266
  },
2082
2267
  };
2083
2268
  const cloudBody = {};
@@ -2086,20 +2271,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2086
2271
  throw new Error('Error querying data from patterns');
2087
2272
  }
2088
2273
  let currentUniqueValues = uniqueValues;
2274
+ let dateRangesTemp = dateRanges;
2089
2275
  if (table !== currentTable) {
2090
2276
  const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
2091
2277
  if (tableInfo) {
2092
- const convertedStringColumns = tableInfo.columns
2093
- .filter((column) => {
2094
- return isTextColumnType(column.fieldType);
2095
- })
2096
- .map((column) => convertColumnInfoToColumnInternal(column));
2097
- const stringNames = convertedStringColumns.map((column) => column.field);
2098
- const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
2099
- currentUniqueValues[table] = newUniqueValues;
2100
- if (hashCode(uniqueValues) !== hashCode(currentUniqueValues)) {
2101
- setUniqueValues(currentUniqueValues);
2278
+ const newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
2279
+ if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
2280
+ setUniqueValues(newUniqueValues);
2102
2281
  }
2282
+ dateRangesTemp = await getDateRanges(tableInfo.columns, table);
2283
+ setDateRanges(dateRangesTemp);
2103
2284
  }
2104
2285
  setCurrentTable(table);
2105
2286
  }
@@ -2142,15 +2323,43 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2142
2323
  errored = true;
2143
2324
  }
2144
2325
  if (groupByPivot && possiblePivot) {
2145
- setPivotRowField(groupByPivot?.rowField);
2146
- setPivotColumnField(groupByPivot?.columnField);
2147
- setPivotValueField(groupByPivot?.valueField);
2148
- setPivotAggregation(groupByPivot?.aggregationType);
2149
- const pivotedData = generatePivotTable(groupByPivot, data2.rows, undefined, false);
2326
+ let curReport = report ? report : undefined;
2327
+ if (data2.rowCount) {
2328
+ const processedFormData = report
2329
+ ? report
2330
+ : createInitialFormData(processedFields);
2331
+ setNumberOfRows(data2.rowCount);
2332
+ curReport = {
2333
+ ...formData,
2334
+ ...processedFormData,
2335
+ itemQuery: data2.itemQuery,
2336
+ rowCount: data2.rowCount,
2337
+ filtersApplied: [],
2338
+ rows: data2.rows,
2339
+ columns: processedFields,
2340
+ };
2341
+ setTempReport(curReport || null);
2342
+ }
2343
+ let dateBucket = undefined;
2344
+ const tempDateRange = dateRangesTemp &&
2345
+ groupByPivot.rowField &&
2346
+ dateRangesTemp[groupByPivot.rowField];
2347
+ if (tempDateRange) {
2348
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
2349
+ }
2350
+ const pivotedData = await generatePivotTable(
2351
+ // @ts-ignore
2352
+ groupByPivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, groupByPivot.columnField
2353
+ ? currentUniqueValues[groupByPivot.columnField]
2354
+ : undefined);
2150
2355
  console.info(`%c[Pivot]: ${JSON.stringify(groupByPivot)}`, 'color: dimgray');
2151
2356
  setPivotData(pivotedData);
2152
2357
  setPivot(groupByPivot);
2153
2358
  setRows(data2.rows);
2359
+ setPivotRowField(groupByPivot?.rowField);
2360
+ setPivotColumnField(groupByPivot?.columnField);
2361
+ setPivotValueField(groupByPivot?.valueField);
2362
+ setPivotAggregation(groupByPivot?.aggregationType);
2154
2363
  setColumns(processedFields);
2155
2364
  const formattedRows = formatRows(pivotedData.rows, processedFields, true, groupByPivot.aggregationType);
2156
2365
  setFormattedRows(formattedRows);
@@ -2159,6 +2368,17 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2159
2368
  const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
2160
2369
  setRows(data2.rows);
2161
2370
  setColumns(processedFields);
2371
+ if (data2.rowCount) {
2372
+ setNumberOfRows(data2.rowCount);
2373
+ setTempReport({
2374
+ ...formData,
2375
+ itemQuery: data2.itemQuery,
2376
+ rowCount: data2.rowCount,
2377
+ filtersApplied: [],
2378
+ rows: data2.rows,
2379
+ columns: processedFields,
2380
+ });
2381
+ }
2162
2382
  const formattedRows = formatRows(data2.rows, processedFields, false);
2163
2383
  setFormattedRows(formattedRows);
2164
2384
  }
@@ -2433,17 +2653,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2433
2653
  },
2434
2654
  // TODOs
2435
2655
  selectPivot: (pivot) => {
2436
- if (!pivot)
2437
- return;
2438
- const newAst = { ...baseAst };
2439
- newAst.orderby = null;
2440
- setBaseAst(newAst); // trigger refetch
2441
- setPivot(pivot);
2442
- const pivotedData = generatePivotTable(pivot, rows, undefined, false);
2443
- setPivotData(pivotedData || []);
2444
- const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
2445
- setFormattedRows(formattedRows);
2446
- }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !loading && (!baseAst || !dataDisplayed), pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
2656
+ return;
2657
+ }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !loading && (!baseAst || !dataDisplayed), pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, report: tempReport ?? report }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
2447
2658
  setPivotRowField(value);
2448
2659
  }, setPivotColumnField: setPivotColumnField, setPivotValueField: setPivotValueField, setPivotAggregation: setPivotAggregation, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotValueField: pivotValueField, pivotAggregation: pivotAggregation, onDelete: () => {
2449
2660
  setPivot(null);
@@ -2737,7 +2948,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2737
2948
  setPivotData(null);
2738
2949
  const formattedRows = formatRows(rows, columns, false);
2739
2950
  setFormattedRows(formattedRows);
2740
- }, selectPivot: (pivot) => {
2951
+ }, selectPivot: async (pivot, uniqueValues, dateRange, pivotTable) => {
2741
2952
  if (!pivot)
2742
2953
  return;
2743
2954
  const newAst = { ...baseAst };
@@ -2747,13 +2958,19 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2747
2958
  pivot['sortDirection'] = 'ASC';
2748
2959
  }
2749
2960
  setBaseAst(newAst); // trigger refetch
2961
+ let dateBucket = undefined;
2962
+ if (dateRange) {
2963
+ dateBucket = getDateBucketFromRange(dateRange);
2964
+ }
2965
+ if (!pivotTable) {
2966
+ pivotTable = await generatePivotTable(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues);
2967
+ }
2968
+ setPivotData(pivotTable || []);
2750
2969
  setPivot(pivot);
2751
- const pivotedData = generatePivotTable(pivot, rows, undefined, false);
2752
- setPivotData(pivotedData || []);
2753
- const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
2970
+ const formattedRows = formatRows(pivotTable.rows, columns, true, pivot.aggregationType);
2754
2971
  setFormattedRows(formattedRows);
2755
2972
  setErrorMessage('');
2756
- }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !baseAst || !dataDisplayed, pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
2973
+ }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !baseAst || !dataDisplayed, pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, report: tempReport }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
2757
2974
  setPivotRowField(value);
2758
2975
  updatePivot(value, 'rowField');
2759
2976
  }, setPivotColumnField: (value) => {
@@ -2785,10 +3002,18 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2785
3002
  `.${pivot.rowField}`,
2786
3003
  `.${pivot.valueField || 'count'}`,
2787
3004
  ]
2788
- : selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
3005
+ : selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: async () => {
2789
3006
  if (pivot) {
2790
- setPivot({ ...pivot, sort: false });
2791
- const pivotedData = generatePivotTable({ ...pivot, sort: false }, rows, undefined, false);
3007
+ const tempPivot = { ...pivot, sort: false };
3008
+ let dateBucket = undefined;
3009
+ const tempDateRange = dateRanges &&
3010
+ pivot.rowField &&
3011
+ dateRanges[pivot.rowField];
3012
+ if (tempDateRange) {
3013
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
3014
+ }
3015
+ setPivot(tempPivot);
3016
+ const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
2792
3017
  setPivotData(pivotedData || []);
2793
3018
  const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
2794
3019
  setFormattedRows(formattedRows);
@@ -2797,25 +3022,27 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2797
3022
  }
2798
3023
  setBaseAst(deepCopy(baseAst));
2799
3024
  fetchSqlQuery(deepCopy(baseAst));
2800
- }, onSave: (column, direction) => {
3025
+ }, onSave: async (column, direction) => {
2801
3026
  if (pivot) {
2802
3027
  const sortFieldType = column === (pivot.valueField || 'count')
2803
3028
  ? 'number'
2804
3029
  : pivot.rowFieldType;
2805
- setPivot({
2806
- ...pivot,
2807
- sort: true,
2808
- sortDirection: direction,
2809
- sortField: column,
2810
- sortFieldType: sortFieldType,
2811
- });
2812
- const pivotedData = generatePivotTable({
3030
+ const tempPivot = {
2813
3031
  ...pivot,
2814
3032
  sort: true,
2815
3033
  sortDirection: direction,
2816
3034
  sortField: column,
2817
3035
  sortFieldType: sortFieldType,
2818
- }, rows, undefined, false);
3036
+ };
3037
+ setPivot(tempPivot);
3038
+ let dateBucket = undefined;
3039
+ const tempDateRange = dateRanges &&
3040
+ pivot.rowField &&
3041
+ dateRanges[pivot.rowField];
3042
+ if (tempDateRange) {
3043
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
3044
+ }
3045
+ const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
2819
3046
  setPivotData(pivotedData || []);
2820
3047
  const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
2821
3048
  setFormattedRows(formattedRows);
@@ -2896,27 +3123,29 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2896
3123
  `.${pivot.rowField}`,
2897
3124
  `.${pivot.valueField || 'count'}`,
2898
3125
  ]
2899
- : selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (column, direction) => {
3126
+ : selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: async (column, direction) => {
2900
3127
  if (column === '')
2901
3128
  return;
2902
3129
  if (pivot) {
2903
3130
  const sortFieldType = column === (pivot.valueField || 'count')
2904
3131
  ? 'number'
2905
3132
  : pivot.rowFieldType;
2906
- setPivot({
3133
+ const tempPivot = {
2907
3134
  ...pivot,
2908
3135
  sort: true,
2909
3136
  sortDirection: direction,
2910
3137
  sortField: column,
2911
3138
  sortFieldType: sortFieldType,
2912
- });
2913
- const pivotedData = generatePivotTable({
2914
- ...pivot,
2915
- sort: true,
2916
- sortDirection: direction,
2917
- sortField: column,
2918
- sortFieldType: sortFieldType,
2919
- }, rows, undefined, false);
3139
+ };
3140
+ setPivot(tempPivot);
3141
+ let dateBucket = undefined;
3142
+ const tempDateRange = dateRanges &&
3143
+ pivot.rowField &&
3144
+ dateRanges[pivot.rowField];
3145
+ if (tempDateRange) {
3146
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
3147
+ }
3148
+ const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
2920
3149
  setErrorMessage('');
2921
3150
  setPivotData(pivotedData || []);
2922
3151
  const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
@@ -3009,14 +3238,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3009
3238
  ? askAIInputWidth
3010
3239
  : askAILoadingContainerWidth, onChange: (e) => setAiPrompt(e.target.value), placeholder: askedAQuestion
3011
3240
  ? 'Ask a follow-up question...'
3012
- : 'Ask a question...' }), _jsx(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && (_jsx(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && (_jsx(TableComponent, { isLoading: (loading && errorMessage.length === 0) || initalChartLoad, rows: formattedRows, columns: pivot
3241
+ : 'Ask a question...' }), _jsx(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && (_jsx(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && (_jsx(TableComponent, { isLoading: tableLoading ||
3242
+ (loading && errorMessage.length === 0) ||
3243
+ initalChartLoad, rows: formattedRows, rowCount: pivot ? undefined : numberOfRows, columns: pivot
3013
3244
  ? pivotData?.columns || emptyPivotColumns()
3014
3245
  : enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
3015
3246
  return {
3016
3247
  label: snakeAndCamelCaseToTitleCase(c),
3017
3248
  field: c,
3018
3249
  };
3019
- }) })), _jsxs("div", { style: {
3250
+ }), onPageChange: onPageChange, onSortChange: onSortChange })), _jsxs("div", { style: {
3020
3251
  display: 'flex',
3021
3252
  flexDirection: 'row',
3022
3253
  gap: '12px',
@@ -3032,6 +3263,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3032
3263
  }, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: report
3033
3264
  ? {
3034
3265
  ...report,
3266
+ ...tempReport,
3035
3267
  pivot: pivot,
3036
3268
  yAxisFields: report.pivot && !pivot ? [] : report.yAxisFields,
3037
3269
  columns: report.columns.filter((col) => {
@@ -3042,5 +3274,5 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3042
3274
  queryString: activeQuery,
3043
3275
  rows: rows,
3044
3276
  }
3045
- : undefined, rows: rows, columns: columns, pivot: pivot, query: activeQuery, showTableFormatOptions: showChartBuilderTableFormatOptions, showDateFieldOptions: isAdminEnabled, showAccessControlOptions: isAdminEnabled, title: report ? 'Save changes' : 'Add to dashboard', isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: report ? onSubmitEditReport : onSubmitCreateReport, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, initialUniqueValues: uniqueValues[currentTable], pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent, ModalComponent: ChartBuilderModalComponent, PopoverComponent: PopoverComponent, TableComponent: TableComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, FormContainer: ChartBuilderFormContainer, hideDateRangeFilter: true, buttonLabel: report ? 'Save changes' : 'Add to dashboard', onClickChartElement: onClickChartElement }))] }));
3277
+ : tempReport, rows: rows, columns: columns, pivot: pivot, query: activeQuery, showTableFormatOptions: showChartBuilderTableFormatOptions, showDateFieldOptions: isAdminEnabled, showAccessControlOptions: isAdminEnabled, title: report ? 'Save changes' : 'Add to dashboard', isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: report ? onSubmitEditReport : onSubmitCreateReport, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, initialUniqueValues: uniqueValues[currentTable], pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent, ModalComponent: ChartBuilderModalComponent, PopoverComponent: PopoverComponent, TableComponent: TableComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, FormContainer: ChartBuilderFormContainer, hideDateRangeFilter: true, buttonLabel: report ? 'Save changes' : 'Add to dashboard', onClickChartElement: onClickChartElement }))] }));
3046
3278
  }