@quillsql/react 2.14.13 → 2.14.14

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 (241) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +12 -0
  3. package/dist/cjs/ChartBuilder.d.ts +3 -2
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +105 -16
  6. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  7. package/dist/cjs/ChartEditor.js +2 -0
  8. package/dist/cjs/Context.d.ts +6 -2
  9. package/dist/cjs/Context.d.ts.map +1 -1
  10. package/dist/cjs/Context.js +163 -35
  11. package/dist/cjs/Dashboard.d.ts.map +1 -1
  12. package/dist/cjs/Dashboard.js +93 -16
  13. package/dist/cjs/QuillProvider.d.ts +40 -1
  14. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  15. package/dist/cjs/QuillProvider.js +2 -2
  16. package/dist/cjs/ReportBuilder.d.ts +4 -1
  17. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  18. package/dist/cjs/ReportBuilder.js +103 -1262
  19. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  20. package/dist/cjs/SQLEditor.js +50 -6
  21. package/dist/cjs/Table.d.ts.map +1 -1
  22. package/dist/cjs/Table.js +12 -0
  23. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  24. package/dist/cjs/components/Chart/BarChart.js +14 -9
  25. package/dist/cjs/components/Chart/CustomBar.d.ts +18 -0
  26. package/dist/cjs/components/Chart/CustomBar.d.ts.map +1 -0
  27. package/dist/cjs/components/Chart/CustomBar.js +70 -0
  28. package/dist/cjs/components/Chart/InternalChart.d.ts.map +1 -1
  29. package/dist/cjs/components/Chart/InternalChart.js +24 -1
  30. package/dist/cjs/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  31. package/dist/cjs/components/Dashboard/DashboardTemplate.js +2 -1
  32. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  33. package/dist/cjs/components/Dashboard/DataLoader.js +73 -2
  34. package/dist/cjs/components/Dashboard/util.d.ts +2 -1
  35. package/dist/cjs/components/Dashboard/util.d.ts.map +1 -1
  36. package/dist/cjs/components/Dashboard/util.js +12 -1
  37. package/dist/cjs/components/QuillTable.d.ts +2 -1
  38. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  39. package/dist/cjs/components/QuillTable.js +2 -2
  40. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  41. package/dist/cjs/components/ReportBuilder/AddColumnModal.js +7 -1
  42. package/dist/cjs/components/ReportBuilder/ColumnComponent.d.ts +48 -0
  43. package/dist/cjs/components/ReportBuilder/ColumnComponent.d.ts.map +1 -0
  44. package/dist/cjs/components/ReportBuilder/ColumnComponent.js +46 -0
  45. package/dist/cjs/components/ReportBuilder/FilterComponent.d.ts +65 -0
  46. package/dist/cjs/components/ReportBuilder/FilterComponent.d.ts.map +1 -0
  47. package/dist/cjs/components/ReportBuilder/FilterComponent.js +51 -0
  48. package/dist/cjs/components/ReportBuilder/LimitComponent.d.ts +42 -0
  49. package/dist/cjs/components/ReportBuilder/LimitComponent.d.ts.map +1 -0
  50. package/dist/cjs/components/ReportBuilder/LimitComponent.js +50 -0
  51. package/dist/cjs/components/ReportBuilder/PivotComponent.d.ts +66 -0
  52. package/dist/cjs/components/ReportBuilder/PivotComponent.d.ts.map +1 -0
  53. package/dist/cjs/components/ReportBuilder/PivotComponent.js +47 -0
  54. package/dist/cjs/components/ReportBuilder/SaveReport.d.ts +162 -0
  55. package/dist/cjs/components/ReportBuilder/SaveReport.d.ts.map +1 -0
  56. package/dist/cjs/components/ReportBuilder/SaveReport.js +31 -0
  57. package/dist/cjs/components/ReportBuilder/SortComponent.d.ts +42 -0
  58. package/dist/cjs/components/ReportBuilder/SortComponent.d.ts.map +1 -0
  59. package/dist/cjs/components/ReportBuilder/SortComponent.js +50 -0
  60. package/dist/cjs/components/ReportBuilder/TableComponent.d.ts +28 -0
  61. package/dist/cjs/components/ReportBuilder/TableComponent.d.ts.map +1 -0
  62. package/dist/cjs/components/ReportBuilder/TableComponent.js +24 -0
  63. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  64. package/dist/cjs/components/ReportBuilder/ui.js +3 -1
  65. package/dist/cjs/components/UiComponents.d.ts +5 -2
  66. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  67. package/dist/cjs/components/UiComponents.js +6 -5
  68. package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
  69. package/dist/cjs/hooks/useAskQuill.js +38 -0
  70. package/dist/cjs/hooks/useDashboard.d.ts +3 -1
  71. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  72. package/dist/cjs/hooks/useDashboard.js +91 -6
  73. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  74. package/dist/cjs/hooks/useExport.js +17 -9
  75. package/dist/cjs/hooks/useLongLoading.d.ts +13 -0
  76. package/dist/cjs/hooks/useLongLoading.d.ts.map +1 -0
  77. package/dist/cjs/hooks/useLongLoading.js +67 -0
  78. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  79. package/dist/cjs/hooks/useQuill.js +25 -1
  80. package/dist/cjs/hooks/useReportBuilder.d.ts +178 -0
  81. package/dist/cjs/hooks/useReportBuilder.d.ts.map +1 -0
  82. package/dist/cjs/hooks/useReportBuilder.js +1476 -0
  83. package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -1
  84. package/dist/cjs/hooks/useVirtualTables.js +27 -2
  85. package/dist/cjs/index.d.ts +11 -0
  86. package/dist/cjs/index.d.ts.map +1 -1
  87. package/dist/cjs/index.js +17 -1
  88. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +14 -1
  89. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  90. package/dist/cjs/internals/ReportBuilder/PivotForm.js +86 -3
  91. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +19 -2
  92. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  93. package/dist/cjs/internals/ReportBuilder/PivotModal.js +421 -141
  94. package/dist/cjs/models/Client.d.ts +6 -2
  95. package/dist/cjs/models/Client.d.ts.map +1 -1
  96. package/dist/cjs/utils/astProcessing.d.ts +4 -2
  97. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  98. package/dist/cjs/utils/astProcessing.js +25 -2
  99. package/dist/cjs/utils/client.d.ts +2 -1
  100. package/dist/cjs/utils/client.d.ts.map +1 -1
  101. package/dist/cjs/utils/client.js +13 -2
  102. package/dist/cjs/utils/dashboard.d.ts +3 -1
  103. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  104. package/dist/cjs/utils/dashboard.js +44 -3
  105. package/dist/cjs/utils/filterProcessing.d.ts +2 -1
  106. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  107. package/dist/cjs/utils/filterProcessing.js +12 -1
  108. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  109. package/dist/cjs/utils/pivotConstructor.js +11 -9
  110. package/dist/cjs/utils/report.d.ts +11 -5
  111. package/dist/cjs/utils/report.d.ts.map +1 -1
  112. package/dist/cjs/utils/report.js +55 -8
  113. package/dist/cjs/utils/reportBuilder.d.ts.map +1 -1
  114. package/dist/cjs/utils/reportBuilder.js +5 -2
  115. package/dist/cjs/utils/schema.d.ts +5 -2
  116. package/dist/cjs/utils/schema.d.ts.map +1 -1
  117. package/dist/cjs/utils/schema.js +14 -2
  118. package/dist/cjs/utils/tableProcessing.d.ts +17 -10
  119. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  120. package/dist/cjs/utils/tableProcessing.js +99 -17
  121. package/dist/esm/Chart.d.ts.map +1 -1
  122. package/dist/esm/Chart.js +13 -1
  123. package/dist/esm/ChartBuilder.d.ts +3 -2
  124. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  125. package/dist/esm/ChartBuilder.js +107 -18
  126. package/dist/esm/ChartEditor.d.ts.map +1 -1
  127. package/dist/esm/ChartEditor.js +3 -1
  128. package/dist/esm/Context.d.ts +6 -2
  129. package/dist/esm/Context.d.ts.map +1 -1
  130. package/dist/esm/Context.js +162 -34
  131. package/dist/esm/Dashboard.d.ts.map +1 -1
  132. package/dist/esm/Dashboard.js +94 -17
  133. package/dist/esm/QuillProvider.d.ts +40 -1
  134. package/dist/esm/QuillProvider.d.ts.map +1 -1
  135. package/dist/esm/QuillProvider.js +2 -2
  136. package/dist/esm/ReportBuilder.d.ts +4 -1
  137. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  138. package/dist/esm/ReportBuilder.js +106 -1262
  139. package/dist/esm/SQLEditor.d.ts.map +1 -1
  140. package/dist/esm/SQLEditor.js +51 -7
  141. package/dist/esm/Table.d.ts.map +1 -1
  142. package/dist/esm/Table.js +13 -1
  143. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  144. package/dist/esm/components/Chart/BarChart.js +15 -10
  145. package/dist/esm/components/Chart/CustomBar.d.ts +18 -0
  146. package/dist/esm/components/Chart/CustomBar.d.ts.map +1 -0
  147. package/dist/esm/components/Chart/CustomBar.js +68 -0
  148. package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -1
  149. package/dist/esm/components/Chart/InternalChart.js +25 -2
  150. package/dist/esm/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  151. package/dist/esm/components/Dashboard/DashboardTemplate.js +3 -2
  152. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  153. package/dist/esm/components/Dashboard/DataLoader.js +74 -3
  154. package/dist/esm/components/Dashboard/util.d.ts +2 -1
  155. package/dist/esm/components/Dashboard/util.d.ts.map +1 -1
  156. package/dist/esm/components/Dashboard/util.js +12 -1
  157. package/dist/esm/components/QuillTable.d.ts +2 -1
  158. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  159. package/dist/esm/components/QuillTable.js +2 -2
  160. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  161. package/dist/esm/components/ReportBuilder/AddColumnModal.js +7 -1
  162. package/dist/esm/components/ReportBuilder/ColumnComponent.d.ts +48 -0
  163. package/dist/esm/components/ReportBuilder/ColumnComponent.d.ts.map +1 -0
  164. package/dist/esm/components/ReportBuilder/ColumnComponent.js +39 -0
  165. package/dist/esm/components/ReportBuilder/FilterComponent.d.ts +65 -0
  166. package/dist/esm/components/ReportBuilder/FilterComponent.d.ts.map +1 -0
  167. package/dist/esm/components/ReportBuilder/FilterComponent.js +44 -0
  168. package/dist/esm/components/ReportBuilder/LimitComponent.d.ts +42 -0
  169. package/dist/esm/components/ReportBuilder/LimitComponent.d.ts.map +1 -0
  170. package/dist/esm/components/ReportBuilder/LimitComponent.js +46 -0
  171. package/dist/esm/components/ReportBuilder/PivotComponent.d.ts +66 -0
  172. package/dist/esm/components/ReportBuilder/PivotComponent.d.ts.map +1 -0
  173. package/dist/esm/components/ReportBuilder/PivotComponent.js +40 -0
  174. package/dist/esm/components/ReportBuilder/SaveReport.d.ts +162 -0
  175. package/dist/esm/components/ReportBuilder/SaveReport.d.ts.map +1 -0
  176. package/dist/esm/components/ReportBuilder/SaveReport.js +31 -0
  177. package/dist/esm/components/ReportBuilder/SortComponent.d.ts +42 -0
  178. package/dist/esm/components/ReportBuilder/SortComponent.d.ts.map +1 -0
  179. package/dist/esm/components/ReportBuilder/SortComponent.js +46 -0
  180. package/dist/esm/components/ReportBuilder/TableComponent.d.ts +28 -0
  181. package/dist/esm/components/ReportBuilder/TableComponent.d.ts.map +1 -0
  182. package/dist/esm/components/ReportBuilder/TableComponent.js +20 -0
  183. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  184. package/dist/esm/components/ReportBuilder/ui.js +4 -2
  185. package/dist/esm/components/UiComponents.d.ts +5 -2
  186. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  187. package/dist/esm/components/UiComponents.js +6 -5
  188. package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
  189. package/dist/esm/hooks/useAskQuill.js +39 -1
  190. package/dist/esm/hooks/useDashboard.d.ts +3 -1
  191. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  192. package/dist/esm/hooks/useDashboard.js +92 -7
  193. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  194. package/dist/esm/hooks/useExport.js +18 -10
  195. package/dist/esm/hooks/useLongLoading.d.ts +13 -0
  196. package/dist/esm/hooks/useLongLoading.d.ts.map +1 -0
  197. package/dist/esm/hooks/useLongLoading.js +64 -0
  198. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  199. package/dist/esm/hooks/useQuill.js +26 -2
  200. package/dist/esm/hooks/useReportBuilder.d.ts +178 -0
  201. package/dist/esm/hooks/useReportBuilder.d.ts.map +1 -0
  202. package/dist/esm/hooks/useReportBuilder.js +1471 -0
  203. package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
  204. package/dist/esm/hooks/useVirtualTables.js +28 -3
  205. package/dist/esm/index.d.ts +11 -0
  206. package/dist/esm/index.d.ts.map +1 -1
  207. package/dist/esm/index.js +8 -0
  208. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +14 -1
  209. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  210. package/dist/esm/internals/ReportBuilder/PivotForm.js +87 -4
  211. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +19 -2
  212. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  213. package/dist/esm/internals/ReportBuilder/PivotModal.js +423 -143
  214. package/dist/esm/models/Client.d.ts +6 -2
  215. package/dist/esm/models/Client.d.ts.map +1 -1
  216. package/dist/esm/utils/astProcessing.d.ts +4 -2
  217. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  218. package/dist/esm/utils/astProcessing.js +25 -2
  219. package/dist/esm/utils/client.d.ts +2 -1
  220. package/dist/esm/utils/client.d.ts.map +1 -1
  221. package/dist/esm/utils/client.js +13 -2
  222. package/dist/esm/utils/dashboard.d.ts +3 -1
  223. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  224. package/dist/esm/utils/dashboard.js +44 -3
  225. package/dist/esm/utils/filterProcessing.d.ts +2 -1
  226. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  227. package/dist/esm/utils/filterProcessing.js +12 -1
  228. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  229. package/dist/esm/utils/pivotConstructor.js +11 -9
  230. package/dist/esm/utils/report.d.ts +11 -5
  231. package/dist/esm/utils/report.d.ts.map +1 -1
  232. package/dist/esm/utils/report.js +55 -8
  233. package/dist/esm/utils/reportBuilder.d.ts.map +1 -1
  234. package/dist/esm/utils/reportBuilder.js +5 -2
  235. package/dist/esm/utils/schema.d.ts +5 -2
  236. package/dist/esm/utils/schema.d.ts.map +1 -1
  237. package/dist/esm/utils/schema.js +14 -2
  238. package/dist/esm/utils/tableProcessing.d.ts +17 -10
  239. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  240. package/dist/esm/utils/tableProcessing.js +99 -17
  241. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useContext, useMemo, useState, useEffect, useRef, } from 'react';
3
- import { ClientContext, FetchContext, SchemaDataContext, TenantContext, } from '../../Context';
3
+ import { ClientContext, EventTrackingContext, FetchContext, SchemaDataContext, TenantContext, } from '../../Context';
4
4
  import { PivotList, PivotCard } from './PivotList';
5
5
  import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval,
6
6
  // endOfDay,
@@ -14,7 +14,7 @@ import {
14
14
  // getValidDate,
15
15
  valueFormatter, } from '../../utils/valueFormatter';
16
16
  import { snakeAndCamelCaseToTitleCase } from '../../utils/textProcessing';
17
- import { MemoizedDeleteButton, MemoizedSubHeader, QuillErrorMessageComponent, QuillLoadingComponent, QuillPivotColumnContainer, QuillPivotRowContainer, } from '../../components/UiComponents';
17
+ import { MemoizedDeleteButton, MemoizedSubHeader, OverflowContainer, QuillErrorMessageComponent, QuillLoadingComponent, QuillPivotColumnContainer, QuillPivotRowContainer, } from '../../components/UiComponents';
18
18
  import { QuillCard } from '../../components/QuillCard';
19
19
  import { cleanPivot, getPossiblePivotFieldOptions, isValidPivot, } from '../../utils/pivotProcessing';
20
20
  import { hashCode } from '../../utils/crypto';
@@ -23,7 +23,7 @@ import { generatePivotWithSQL } from '../../utils/pivotConstructor';
23
23
  import { getDateBucketFromRange } from '../../utils/dates';
24
24
  import equal from 'fast-deep-equal';
25
25
  import { isStringType } from '../../utils/columnProcessing';
26
- export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotAggregations, setPivotAggregations, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = QuillErrorMessageComponent, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, CardComponent = QuillCard, HeaderComponent, SubheaderComponent = MemoizedSubHeader, DeleteButtonComponent = MemoizedDeleteButton, LabelComponent, TextComponent, selectedPivotIndex, setSelectedPivotIndex, removePivot, selectPivot, showUpdatePivot, setShowUpdatePivot, data, columns, theme, isOpen, setIsOpen, dateRange, createdPivots, setCreatedPivots, recommendedPivots, setRecommendedPivots, triggerButtonText = 'Pivot', showPivotEditButton = false, showEditOnPivotClick = true, showTrigger = true, pivotCountRequest = 6, query, initialUniqueValues, uniqueValuesIsLoading, initialSelectedPivotTable, disabled = false, pivotRecommendationsEnabled = true, report, dashboardName, dateFilter, }) => {
26
+ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotAggregations, setPivotAggregations, pivotSort, setPivotSort, pivotLimit, setPivotLimit, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, TextInputComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = QuillErrorMessageComponent, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, CardComponent = QuillCard, HeaderComponent, SubheaderComponent = MemoizedSubHeader, DeleteButtonComponent = MemoizedDeleteButton, LabelComponent, TextComponent, selectedPivotIndex, setSelectedPivotIndex, removePivot, selectPivot, showUpdatePivot, setShowUpdatePivot, data, columns, theme, isOpen, setIsOpen, dateRange, createdPivots, setCreatedPivots, recommendedPivots, setRecommendedPivots, triggerButtonText = 'Pivot', showPivotEditButton = false, showEditOnPivotClick = true, showTrigger = true, pivotCountRequest = 6, query, initialUniqueValues, uniqueValuesIsLoading, initialSelectedPivotTable, disabled = false, pivotRecommendationsEnabled = true, report, dashboardName, dateFilter, parentRef, heightAdjustment = 0, }) => {
27
27
  const { getToken, quillFetchWithToken } = useContext(FetchContext);
28
28
  const [isLoading, setIsLoading] = useState(false);
29
29
  const [previewLoading, setPreviewLoading] = useState(false);
@@ -33,6 +33,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
33
33
  const [client] = useContext(ClientContext);
34
34
  const [schemaData] = useContext(SchemaDataContext);
35
35
  const { tenants } = useContext(TenantContext);
36
+ const { eventTracking } = useContext(EventTrackingContext);
36
37
  const rowFieldRef = useRef(null);
37
38
  const colFieldRef = useRef(null);
38
39
  const [pivotCardWidth, setPivotCardWidth] = useState(420);
@@ -47,6 +48,15 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
47
48
  // const percentageAggButtonRef = useRef<HTMLDivElement>(null);
48
49
  const [dateRanges, setDateRanges] = useState({});
49
50
  const [pivotError, setPivotError] = useState('');
51
+ const [limitInput, setLimitInput] = useState(pivotLimit?.toString() ?? '100');
52
+ const [sortFieldInput, setSortFieldInput] = useState(pivotSort?.sortField ?? '');
53
+ const [sortDirectionInput, setSortDirectionInput] = useState(pivotSort?.sortDirection ?? 'ASC');
54
+ const [showLimitInput, setShowLimitInput] = useState(!!pivotLimit);
55
+ const [showSortInput, setShowSortInput] = useState(!!pivotSort);
56
+ const [availableHeight, setAvailableHeight] = useState(0);
57
+ const [pivotModalTopHeight, setPivotModalTopHeight] = useState(450);
58
+ const [popoverPosition, setPopoverPosition] = useState('bottom');
59
+ const popoverRef = useRef(null);
50
60
  const getDistinctValues = async (fetchDistinct) => {
51
61
  if (!client) {
52
62
  return {
@@ -67,7 +77,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
67
77
  }
68
78
  let newUniqueValues = uniqueValues ?? null;
69
79
  if (fetchDistinct || !uniqueValues) {
70
- const { filteredColumns: smallStringColumns, exceededColumns } = await getCountsByColumns(stringColumns, query || '', client, getToken, tenants, schemaData.customFields ?? {}, dashboardName);
80
+ const { filteredColumns: smallStringColumns, exceededColumns } = await getCountsByColumns(stringColumns, query || '', client, getToken, tenants, schemaData.customFields ?? {}, eventTracking, dashboardName);
71
81
  newUniqueValues = await getUniqueValuesByQuery({
72
82
  columns: smallStringColumns,
73
83
  query: query || '',
@@ -76,6 +86,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
76
86
  tenants,
77
87
  customFields: schemaData.customFields ?? {},
78
88
  dashboardName,
89
+ eventTracking,
79
90
  });
80
91
  exceededColumns?.forEach((column) => {
81
92
  if (newUniqueValues) {
@@ -107,7 +118,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
107
118
  if (dateColumns.length === 0) {
108
119
  return;
109
120
  }
110
- const dateRangeByColumn = await getQueryDateRangeByColumns(dateColumns, query || '', client, getToken, tenants, schemaData.customFields ?? {}, dashboardName);
121
+ const dateRangeByColumn = await getQueryDateRangeByColumns(dateColumns, query || '', client, getToken, tenants, eventTracking, schemaData.customFields ?? {}, dashboardName);
111
122
  setDateRanges(dateRangeByColumn || {});
112
123
  }
113
124
  };
@@ -173,10 +184,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
173
184
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
174
185
  }, // limit preview
175
186
  getToken,
187
+ eventTracking,
176
188
  });
177
189
  setSamplePivotTable({ pivot: pivot, rows, columns });
178
190
  }
179
191
  catch (e) {
192
+ eventTracking?.logError?.({
193
+ type: 'bug', // TODO: determine type
194
+ severity: 'high',
195
+ message: 'Error fetching pivot data',
196
+ errorMessage: e.message,
197
+ errorStack: e.stack,
198
+ errorData: {
199
+ caller: 'PivotModal',
200
+ function: 'fetchPivotData',
201
+ },
202
+ });
180
203
  if (e instanceof Error) {
181
204
  setPivotError(e.message);
182
205
  return;
@@ -234,10 +257,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
234
257
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
235
258
  }, // limit preview
236
259
  getToken,
260
+ eventTracking,
237
261
  });
238
262
  setSamplePivotTable({ pivot: pivot, rows, columns });
239
263
  }
240
264
  catch (e) {
265
+ eventTracking?.logError?.({
266
+ type: 'bug', // TODO: determine type
267
+ severity: 'high',
268
+ message: 'Error fetching pivot data',
269
+ errorMessage: e.message,
270
+ errorStack: e.stack,
271
+ errorData: {
272
+ caller: 'PivotModal',
273
+ function: 'fetchPivotData',
274
+ },
275
+ });
241
276
  if (e instanceof Error) {
242
277
  setPivotError(e.message);
243
278
  return;
@@ -305,6 +340,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
305
340
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
306
341
  }, // limit preview
307
342
  getToken,
343
+ eventTracking,
308
344
  });
309
345
  setSelectedPivotTable({
310
346
  pivot: pivot,
@@ -313,6 +349,17 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
313
349
  });
314
350
  }
315
351
  catch (e) {
352
+ eventTracking?.logError?.({
353
+ type: 'bug', // TODO: determine type
354
+ severity: 'high',
355
+ message: 'Error fetching pivot tables',
356
+ errorMessage: e.message,
357
+ errorStack: e.stack,
358
+ errorData: {
359
+ caller: 'PivotModal',
360
+ function: 'fetchPivotTables',
361
+ },
362
+ });
316
363
  if (e instanceof Error) {
317
364
  setPivotError(e.message);
318
365
  return;
@@ -373,8 +420,15 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
373
420
  if (pivotColumnField && !columnsToShow[pivotColumnField]) {
374
421
  errors.push('Error in column field: undefined type');
375
422
  }
423
+ if (showLimitInput && limitInput && !Number.isInteger(Number(limitInput))) {
424
+ errors.push('Limit must be an integer');
425
+ }
376
426
  if (errors.length === 0 &&
377
427
  pivotAggregations?.every((p) => p.aggregationType && (p.valueField || p.aggregationType === 'count'))) {
428
+ const sort = showSortInput && !!sortFieldInput && !!sortDirectionInput;
429
+ const sortField = sort ? sortFieldInput : undefined;
430
+ const sortDirection = sort ? sortDirectionInput : undefined;
431
+ const rowLimit = showLimitInput && limitInput ? Number(limitInput) : undefined;
378
432
  const pivot = {
379
433
  rowField: pivotRowField,
380
434
  rowFieldType: columnTypes[pivotRowField ?? ''],
@@ -387,6 +441,10 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
387
441
  valueField2Type: columnTypes[p.valueField2 ?? ''],
388
442
  aggregationType: p.aggregationType,
389
443
  })),
444
+ sort,
445
+ sortField,
446
+ sortDirection,
447
+ rowLimit,
390
448
  // For backwards compatibility
391
449
  valueField: pivotAggregations?.[0]?.valueField,
392
450
  valueFieldType: columnTypes[pivotAggregations?.[0]?.valueField ?? ''],
@@ -407,7 +465,16 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
407
465
  }
408
466
  }
409
467
  setErrors(errors);
410
- }, [pivotRowField, pivotColumnField, pivotAggregations]);
468
+ }, [
469
+ pivotRowField,
470
+ pivotColumnField,
471
+ pivotAggregations,
472
+ sortFieldInput,
473
+ sortDirectionInput,
474
+ showSortInput,
475
+ showLimitInput,
476
+ limitInput,
477
+ ]);
411
478
  const onEditPivot = async (pivot, index, pivotType) => {
412
479
  setIsLoading(false);
413
480
  setErrors([]);
@@ -440,11 +507,23 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
440
507
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
441
508
  }, // limit preview
442
509
  getToken,
510
+ eventTracking,
443
511
  });
444
512
  setSamplePivotTable({ pivot, rows, columns });
445
513
  return;
446
514
  }
447
515
  catch (e) {
516
+ eventTracking?.logError?.({
517
+ type: 'bug', // TODO: determine type
518
+ severity: 'high',
519
+ message: 'Error fetching pivot data',
520
+ errorMessage: e.message,
521
+ errorStack: e.stack,
522
+ errorData: {
523
+ caller: 'PivotModal',
524
+ function: 'onEditPivot',
525
+ },
526
+ });
448
527
  if (e instanceof Error) {
449
528
  setPivotError(e.message);
450
529
  setSamplePivotTable(null);
@@ -554,10 +633,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
554
633
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
555
634
  }, // limit preview
556
635
  getToken,
636
+ eventTracking,
557
637
  });
558
638
  return { pivot: p, rows, columns };
559
639
  }
560
640
  catch (e) {
641
+ eventTracking?.logError?.({
642
+ type: 'bug', // TODO: determine type
643
+ severity: 'high',
644
+ message: 'Error fetching pivot data',
645
+ errorMessage: e.message,
646
+ errorStack: e.stack,
647
+ errorData: {
648
+ caller: 'PivotModal',
649
+ function: 'refreshPivots',
650
+ },
651
+ });
561
652
  return undefined;
562
653
  }
563
654
  }));
@@ -581,6 +672,17 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
581
672
  setSelectedPivotIndex(-1);
582
673
  }
583
674
  catch (e) {
675
+ eventTracking?.logError?.({
676
+ type: 'bug', // TODO: determine type
677
+ severity: 'high',
678
+ message: 'Error fetching pivot recommendations',
679
+ errorMessage: e.message,
680
+ errorStack: e.stack,
681
+ errorData: {
682
+ caller: 'PivotModal',
683
+ function: 'refreshPivots',
684
+ },
685
+ });
584
686
  setPivotError('Failed to fetch pivot recommendations');
585
687
  console.error('Failed parsing pivotai response', e);
586
688
  }
@@ -693,10 +795,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
693
795
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
694
796
  }, // limit preview
695
797
  getToken,
798
+ eventTracking,
696
799
  });
697
800
  setSamplePivotTable({ pivot, rows, columns });
698
801
  }
699
802
  catch (e) {
803
+ eventTracking?.logError?.({
804
+ type: 'bug', // TODO: determine type
805
+ severity: 'high',
806
+ message: 'Error fetching pivot data',
807
+ errorMessage: e.message,
808
+ errorStack: e.stack,
809
+ errorData: {
810
+ caller: 'PivotModal',
811
+ function: 'pivotFieldChange',
812
+ },
813
+ });
700
814
  if (e instanceof Error) {
701
815
  console.log('error', e);
702
816
  setPivotError(e.message);
@@ -727,10 +841,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
727
841
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
728
842
  },
729
843
  getToken,
844
+ eventTracking,
730
845
  });
731
846
  return { pivot: p, rows, columns };
732
847
  }
733
848
  catch (e) {
849
+ eventTracking?.logError?.({
850
+ type: 'bug', // TODO: determine type
851
+ severity: 'high',
852
+ message: 'Error fetching pivot data',
853
+ errorMessage: e.message,
854
+ errorStack: e.stack,
855
+ errorData: {
856
+ caller: 'PivotModal',
857
+ function: 'fetchPivotTables',
858
+ },
859
+ });
734
860
  return undefined;
735
861
  }
736
862
  }));
@@ -738,6 +864,58 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
738
864
  };
739
865
  fetchPivotTables();
740
866
  }, [createdPivots, dateRange]);
867
+ const handleResize = () => {
868
+ const parentRefElement = parentRef?.current;
869
+ const popoverRefElement = popoverRef?.current;
870
+ if (parentRefElement && popoverRefElement) {
871
+ const parentRect = parentRefElement.getBoundingClientRect();
872
+ const popoverRect = popoverRefElement.getBoundingClientRect();
873
+ const topOffset = popoverRect.top - parentRect.top;
874
+ const availableHeight = parentRect.height - topOffset;
875
+ setAvailableHeight(availableHeight);
876
+ calculatePopoverPosition();
877
+ }
878
+ };
879
+ const calculatePopoverPosition = () => {
880
+ if (!buttonRef.current)
881
+ return;
882
+ const buttonRect = buttonRef.current.getBoundingClientRect();
883
+ const parentRefElement = parentRef?.current;
884
+ if (!parentRefElement)
885
+ return;
886
+ const parentRect = parentRefElement.getBoundingClientRect();
887
+ // Calculate available space above and below
888
+ const spaceBelow = parentRect.bottom - buttonRect.bottom;
889
+ const spaceAbove = buttonRect.top - parentRect.top;
890
+ const desiredHeight = Math.max(450, spaceAbove - 20);
891
+ setPivotModalTopHeight(desiredHeight);
892
+ // If there's not enough space below but more space above, position above
893
+ if (spaceBelow < desiredHeight && spaceAbove > desiredHeight) {
894
+ setPopoverPosition('top');
895
+ }
896
+ else {
897
+ setPopoverPosition('bottom');
898
+ }
899
+ };
900
+ useEffect(() => {
901
+ handleResize();
902
+ window.addEventListener('resize', handleResize);
903
+ // Add scroll listener to the parent element if it exists
904
+ const parentElement = parentRef?.current;
905
+ if (parentElement) {
906
+ parentElement.addEventListener('scroll', handleResize);
907
+ }
908
+ return () => {
909
+ window.removeEventListener('resize', handleResize);
910
+ if (parentElement) {
911
+ parentElement.removeEventListener('scroll', handleResize);
912
+ }
913
+ };
914
+ }, [
915
+ parentRef?.current,
916
+ popoverRef?.current,
917
+ buttonRef?.current?.getBoundingClientRect().top,
918
+ ]);
741
919
  return (_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsxs("div", { style: {
742
920
  position: 'relative',
743
921
  display: 'inline-block',
@@ -772,9 +950,15 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
772
950
  }
773
951
  setIsOpen(!isOpen);
774
952
  setShowUpdatePivot(false);
775
- }, label: triggerButtonText }) })), _jsx("div", { style: {
776
- position: 'relative',
777
- ...(isOpen && showTrigger && { top: 12 }),
953
+ }, label: triggerButtonText }) })), _jsx("div", { ref: popoverRef, style: {
954
+ position: 'absolute', // Change from 'relative' to 'absolute'
955
+ ...(isOpen &&
956
+ showTrigger && {
957
+ top: popoverPosition === 'bottom' ? '100%' : 'auto',
958
+ bottom: popoverPosition === 'top' ? '100%' : 'auto',
959
+ marginBottom: popoverPosition === 'top' ? pivotModalTopHeight : 0,
960
+ marginTop: popoverPosition === 'bottom' ? 8 : 0,
961
+ }),
778
962
  }, children: _jsx(PopoverComponent, { isOpen: isOpen, setIsOpen: (isOpen) => {
779
963
  if (!isOpen) {
780
964
  setShowUpdatePivot(false);
@@ -783,7 +967,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
783
967
  setIsOpen(isOpen);
784
968
  }, ignoredRefs: [buttonRef], popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
785
969
  ? popUpTitle
786
- : 'Recommended pivots', popoverChildren: _jsx("div", { style: {
970
+ : 'Recommended pivots', horizontalPadding: 0, titlePaddingLeft: 20, popoverChildren: _jsx("div", { style: {
787
971
  paddingTop: showUpdatePivot || !pivotRecommendationsEnabled ? 0 : 20,
788
972
  position: 'relative',
789
973
  }, children: showUpdatePivot || !pivotRecommendationsEnabled ? (_jsxs("div", { style: {
@@ -791,145 +975,223 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
791
975
  display: 'flex',
792
976
  flexDirection: 'column',
793
977
  gap: 20,
794
- }, children: [previewLoading && _jsx(LoadingComponent, {}), samplePivotTable && !previewLoading && (_jsx("div", { style: {
795
- width: pivotCardWidth,
796
- minHeight: 160,
797
- }, children: _jsx(PivotCard, { pivotTable: samplePivotTable, theme: theme, index: 0, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, showEdit: false, clickable: false, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, CardComponent: CardComponent, onSelectPivot: () => { }, onClose: () => {
798
- setPivotAggregations([
799
- {
800
- valueField: undefined,
801
- valueField2: undefined,
802
- aggregationType: undefined,
803
- },
804
- ]);
805
- setPivotRowField(undefined);
806
- setPivotColumnField(undefined);
807
- setSamplePivotTable(undefined);
808
- } }) })), _jsxs(PivotColumnContainer, { children: [_jsxs("div", { style: {
809
- display: 'flex',
810
- flexDirection: 'column',
811
- gap: 4,
812
- }, children: [_jsx(HeaderComponent, { label: "Groupings" }), _jsxs(PivotRowContainer, { children: [_jsx("div", { ref: rowFieldRef, children: _jsx(SelectComponent, { id: "pivot-row-field", label: "Group rows by", value: pivotRowField, onChange: (e) => {
813
- pivotFieldChange('rowField', e.target.value);
814
- setPivotRowField(e.target.value === ''
815
- ? undefined
816
- : e.target.value);
817
- }, options: allowedRowFields
818
- .filter((field) => field !== pivotColumnField)
819
- .map((field) => {
820
- return {
821
- label: snakeAndCamelCaseToTitleCase(field),
822
- value: field,
823
- };
824
- }), isLoading: uniqueValuesIsLoading, width: 200 }) }), _jsx("div", { ref: colFieldRef, children: _jsx(SelectComponent, { id: "pivot-column-field", label: "Group columns by", value: pivotColumnField, onChange: (e) => {
825
- pivotFieldChange('columnField', e.target.value);
826
- setPivotColumnField(e.target.value === ''
827
- ? undefined
828
- : e.target.value);
829
- }, options: allowedColumnFields
830
- .filter((field) => field !== pivotRowField)
831
- .map((field) => {
832
- return {
833
- label: snakeAndCamelCaseToTitleCase(field),
834
- value: field,
835
- };
836
- }), isLoading: uniqueValuesIsLoading, width: 200, disabled: pivotRowField === undefined }) })] })] }), _jsxs("div", { style: {
837
- display: 'flex',
838
- flexDirection: 'column',
839
- gap: 4,
840
- }, children: [_jsx(HeaderComponent, { label: "Aggregations" }), _jsxs(PivotRowContainer, { children: [_jsx("div", { style: { width: 200 }, children: _jsx(SubheaderComponent, { label: "Aggregation Type" }) }), _jsx("div", { style: { width: 200 }, children: _jsx(SubheaderComponent, { label: "Value Field" }) })] }), pivotAggregations?.map((agg, index) => (_jsxs(PivotRowContainer, { children: [_jsx(SelectComponent, { id: "pivot-aggregation-type", value: agg.aggregationType, onChange: (e) => {
841
- // if (
842
- // e.target.value !== 'count' &&
843
- // agg.valueField &&
844
- // !numberFormatOptions.includes(
845
- // columns.find(
846
- // (col: Column) =>
847
- // col.field === agg.valueField,
848
- // )!.format,
849
- // )
850
- // ) {
851
- // setPivotValueField(undefined);
852
- // }
853
- const newAgg = [
854
- ...pivotAggregations.slice(0, index),
855
- {
856
- ...agg,
857
- aggregationType: e.target.value === ''
858
- ? undefined
859
- : e.target.value,
860
- },
861
- ...pivotAggregations.slice(index + 1),
862
- ];
863
- pivotFieldChange('aggregations', newAgg);
864
- setPivotAggregations(newAgg);
865
- }, options: [
866
- ...[
867
- 'sum',
868
- 'average',
869
- 'count',
870
- 'max',
871
- 'min',
872
- 'percentage',
873
- ].map((option) => {
874
- return { label: option, value: option };
875
- }),
876
- ], width: 200 }), _jsx(SelectComponent, { id: "pivot-value-field", value: agg.valueField, onChange: (e) => {
877
- const newAgg = [
878
- ...pivotAggregations.slice(0, index),
879
- {
880
- ...agg,
881
- valueField: e.target.value === ''
882
- ? undefined
883
- : e.target.value,
884
- },
885
- ...pivotAggregations.slice(index + 1),
886
- ];
887
- pivotFieldChange('aggregations', newAgg);
888
- setPivotAggregations(newAgg);
889
- }, options: allowedValueFields.map((field) => {
890
- return {
891
- label: snakeAndCamelCaseToTitleCase(field),
892
- value: field,
893
- };
894
- }), isLoading: uniqueValuesIsLoading, width: 200 }), _jsx("div", { style: {
895
- marginLeft: -16,
896
- marginRight: -16,
897
- visibility: index > 0 ? 'visible' : 'hidden',
898
- }, children: _jsx(DeleteButtonComponent, { onClick: () => {
899
- setPivotAggregations([
900
- ...pivotAggregations.slice(0, index),
901
- ...pivotAggregations.slice(index + 1),
902
- ]);
903
- } }) })] }, index)))] })] }), _jsx("div", { style: {
904
- display: 'flex',
905
- flexDirection: 'row',
906
- marginRight: 'auto',
907
- }, children: _jsx(SecondaryButtonComponent, { label: "Add Aggregation", onClick: () => {
908
- setPivotAggregations([
909
- ...pivotAggregations,
910
- {
911
- aggregationType: undefined,
912
- valueField: undefined,
913
- valueField2: undefined,
914
- },
915
- ]);
916
- } }) }), errors.length > 0 && (_jsx("div", { style: {
917
- display: 'flex',
918
- flexDirection: 'column',
919
- gap: 8,
920
- paddingTop: 8,
921
- width: pivotCardWidth,
922
- maxWidth: pivotCardWidth,
923
- }, children: errors.map((error, index) => (_jsx(ErrorMessageComponent, { errorMessage: error }, `error_message_${index}`))) })), _jsxs("div", { style: {
978
+ position: 'relative',
979
+ height: '100%',
980
+ overflow: 'auto',
981
+ }, children: [_jsx(OverflowContainer, { style: {
982
+ height: popoverPosition === 'bottom'
983
+ ? Math.max(availableHeight - heightAdjustment, 250)
984
+ : pivotModalTopHeight - 140,
985
+ }, children: _jsxs("div", { style: {
986
+ display: 'flex',
987
+ flexDirection: 'column',
988
+ paddingLeft: 20,
989
+ paddingRight: 20,
990
+ }, children: [previewLoading && _jsx(LoadingComponent, {}), samplePivotTable && !previewLoading && (_jsx("div", { style: {
991
+ width: pivotCardWidth,
992
+ // minHeight: 160,
993
+ paddingBottom: 20,
994
+ }, children: _jsx(PivotCard, { pivotTable: samplePivotTable, theme: theme, index: 0, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, showEdit: false, clickable: false, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, CardComponent: CardComponent, onSelectPivot: () => { }, onClose: () => {
995
+ setPivotAggregations([
996
+ {
997
+ valueField: undefined,
998
+ valueField2: undefined,
999
+ aggregationType: undefined,
1000
+ },
1001
+ ]);
1002
+ setPivotRowField(undefined);
1003
+ setPivotColumnField(undefined);
1004
+ setSamplePivotTable(undefined);
1005
+ setPivotSort(undefined);
1006
+ setPivotLimit(undefined);
1007
+ } }) })), _jsxs(PivotColumnContainer, { children: [_jsxs("div", { style: {
1008
+ display: 'flex',
1009
+ flexDirection: 'column',
1010
+ gap: 4,
1011
+ }, children: [_jsx(HeaderComponent, { label: "Groupings" }), _jsxs(PivotRowContainer, { children: [_jsx("div", { ref: rowFieldRef, children: _jsx(SelectComponent, { id: "pivot-row-field", label: "Group rows by", value: pivotRowField, onChange: (e) => {
1012
+ pivotFieldChange('rowField', e.target.value);
1013
+ setPivotRowField(e.target.value === ''
1014
+ ? undefined
1015
+ : e.target.value);
1016
+ }, options: allowedRowFields
1017
+ .filter((field) => field !== pivotColumnField)
1018
+ .map((field) => {
1019
+ return {
1020
+ label: snakeAndCamelCaseToTitleCase(field),
1021
+ value: field,
1022
+ };
1023
+ }), isLoading: uniqueValuesIsLoading, width: 200 }) }), _jsx("div", { ref: colFieldRef, children: _jsx(SelectComponent, { id: "pivot-column-field", label: "Group columns by", value: pivotColumnField, onChange: (e) => {
1024
+ pivotFieldChange('columnField', e.target.value);
1025
+ setPivotColumnField(e.target.value === ''
1026
+ ? undefined
1027
+ : e.target.value);
1028
+ }, options: allowedColumnFields
1029
+ .filter((field) => field !== pivotRowField)
1030
+ .map((field) => {
1031
+ return {
1032
+ label: snakeAndCamelCaseToTitleCase(field),
1033
+ value: field,
1034
+ };
1035
+ }), isLoading: uniqueValuesIsLoading, width: 200, disabled: pivotRowField === undefined }) })] })] }), _jsxs("div", { style: {
1036
+ display: 'flex',
1037
+ flexDirection: 'column',
1038
+ gap: 4,
1039
+ paddingBottom: 20,
1040
+ }, children: [_jsx(HeaderComponent, { label: "Aggregations" }), _jsxs(PivotRowContainer, { children: [_jsx("div", { style: { width: 200 }, children: _jsx(SubheaderComponent, { label: "Aggregation Type" }) }), _jsx("div", { style: { width: 200 }, children: _jsx(SubheaderComponent, { label: "Value Field" }) })] }), pivotAggregations?.map((agg, index) => (_jsxs(PivotRowContainer, { children: [_jsx(SelectComponent, { id: "pivot-aggregation-type", value: agg.aggregationType, onChange: (e) => {
1041
+ const newAgg = [
1042
+ ...pivotAggregations.slice(0, index),
1043
+ {
1044
+ ...agg,
1045
+ aggregationType: e.target.value === ''
1046
+ ? undefined
1047
+ : e.target.value,
1048
+ },
1049
+ ...pivotAggregations.slice(index + 1),
1050
+ ];
1051
+ pivotFieldChange('aggregations', newAgg);
1052
+ setPivotAggregations(newAgg);
1053
+ }, options: [
1054
+ ...[
1055
+ 'sum',
1056
+ 'average',
1057
+ 'count',
1058
+ 'max',
1059
+ 'min',
1060
+ 'percentage',
1061
+ ].map((option) => {
1062
+ return { label: option, value: option };
1063
+ }),
1064
+ ], width: 200 }), _jsx(SelectComponent, { id: "pivot-value-field", value: agg.valueField, onChange: (e) => {
1065
+ const newAgg = [
1066
+ ...pivotAggregations.slice(0, index),
1067
+ {
1068
+ ...agg,
1069
+ valueField: e.target.value === ''
1070
+ ? undefined
1071
+ : e.target.value,
1072
+ },
1073
+ ...pivotAggregations.slice(index + 1),
1074
+ ];
1075
+ pivotFieldChange('aggregations', newAgg);
1076
+ setPivotAggregations(newAgg);
1077
+ }, options: allowedValueFields.map((field) => {
1078
+ return {
1079
+ label: snakeAndCamelCaseToTitleCase(field),
1080
+ value: field,
1081
+ };
1082
+ }), isLoading: uniqueValuesIsLoading, width: 200 }), _jsx("div", { style: {
1083
+ marginLeft: -16,
1084
+ marginRight: -16,
1085
+ visibility: index > 0 ? 'visible' : 'hidden',
1086
+ }, children: _jsx(DeleteButtonComponent, { onClick: () => {
1087
+ setPivotAggregations([
1088
+ ...pivotAggregations.slice(0, index),
1089
+ ...pivotAggregations.slice(index + 1),
1090
+ ]);
1091
+ } }) })] }, index)))] })] }), _jsx("div", { style: {
1092
+ display: 'flex',
1093
+ flexDirection: 'row',
1094
+ marginRight: 'auto',
1095
+ paddingBottom: 20,
1096
+ }, children: _jsx(SecondaryButtonComponent, { label: "Add Aggregation", onClick: () => {
1097
+ setPivotAggregations([
1098
+ ...pivotAggregations,
1099
+ {
1100
+ aggregationType: undefined,
1101
+ valueField: undefined,
1102
+ valueField2: undefined,
1103
+ },
1104
+ ]);
1105
+ } }) }), _jsx(PivotColumnContainer, { children: _jsxs("div", { style: {
1106
+ display: 'flex',
1107
+ flexDirection: 'column',
1108
+ gap: 4,
1109
+ paddingBottom: 20,
1110
+ }, children: [_jsx(HeaderComponent, { label: "Sort" }), !showSortInput ? (_jsx("div", { style: { width: 200 }, children: _jsx(SecondaryButtonComponent, { onClick: () => setShowSortInput(true), disabled: disabled, label: "Add Sort" }) })) : (_jsxs("div", { children: [_jsxs(PivotRowContainer, { children: [_jsx("div", { style: { width: 200 }, children: _jsx(SubheaderComponent, { label: "Sort Field" }) }), _jsx("div", { style: { width: 200 }, children: _jsx(SubheaderComponent, { label: "Sort Direction" }) })] }), _jsxs(PivotRowContainer, { children: [_jsx(SelectComponent, { id: "pivot-sort-field", value: sortFieldInput, onChange: (e) => {
1111
+ setSortFieldInput(e.target.value);
1112
+ if (e.target.value &&
1113
+ sortDirectionInput) {
1114
+ setPivotSort({
1115
+ sortField: e.target.value,
1116
+ sortDirection: sortDirectionInput,
1117
+ });
1118
+ }
1119
+ }, options: (samplePivotTable?.columns ?? []).map((column) => ({
1120
+ label: snakeAndCamelCaseToTitleCase(column.field),
1121
+ value: column.field,
1122
+ })), width: 200 }), _jsx(SelectComponent, { id: "pivot-sort-direction", value: sortDirectionInput, onChange: (e) => {
1123
+ setSortDirectionInput(e.target.value);
1124
+ if (sortFieldInput && e.target.value) {
1125
+ setPivotSort({
1126
+ sortField: sortFieldInput,
1127
+ sortDirection: e.target.value,
1128
+ });
1129
+ }
1130
+ }, options: [
1131
+ { label: 'Ascending', value: 'ASC' },
1132
+ { label: 'Descending', value: 'DESC' },
1133
+ ], hideEmptyOption: true, width: 200 }), _jsx("div", { style: {
1134
+ marginLeft: -16,
1135
+ marginRight: -16,
1136
+ }, children: _jsx(DeleteButtonComponent, { onClick: () => {
1137
+ if (pivotSort !== undefined) {
1138
+ setPivotSort(undefined);
1139
+ }
1140
+ setShowSortInput(false);
1141
+ setSortFieldInput('');
1142
+ setSortDirectionInput('ASC');
1143
+ } }) })] })] }))] }) }), _jsx(PivotColumnContainer, { children: _jsxs("div", { style: {
1144
+ display: 'flex',
1145
+ flexDirection: 'column',
1146
+ gap: 4,
1147
+ paddingBottom: 20,
1148
+ }, children: [_jsx(HeaderComponent, { label: "Limit" }), !showLimitInput ? (_jsx("div", { style: { width: 200 }, children: _jsx(SecondaryButtonComponent, { onClick: () => setShowLimitInput(true), disabled: disabled, label: "Add Limit" }) })) : (_jsxs("div", { children: [_jsx(PivotRowContainer, { children: _jsx("div", { style: { width: 200 }, children: _jsx(SubheaderComponent, { label: "Pivot row limit" }) }) }), _jsxs(PivotRowContainer, { children: [_jsx(TextInputComponent, { id: "pivot-limit", value: limitInput, width: 180, onChange: (e) => {
1149
+ setLimitInput(e.target.value);
1150
+ const limit = parseInt(e.target.value);
1151
+ if (limit) {
1152
+ setPivotLimit(limit);
1153
+ }
1154
+ else {
1155
+ setPivotLimit(undefined);
1156
+ }
1157
+ } }), _jsx("div", { style: {
1158
+ marginLeft: -16,
1159
+ marginRight: -16,
1160
+ }, children: _jsx(DeleteButtonComponent, { onClick: () => {
1161
+ if (pivotLimit !== undefined) {
1162
+ setPivotLimit(undefined);
1163
+ }
1164
+ setShowLimitInput(false);
1165
+ setLimitInput('100');
1166
+ } }) })] })] }))] }) }), errors.length > 0 && (_jsx("div", { style: {
1167
+ display: 'flex',
1168
+ flexDirection: 'column',
1169
+ gap: 8,
1170
+ paddingTop: 8,
1171
+ width: pivotCardWidth,
1172
+ maxWidth: pivotCardWidth,
1173
+ paddingBottom: 20,
1174
+ }, children: errors.map((error, index) => (_jsx(ErrorMessageComponent, { errorMessage: error }, `error_message_${index}`))) }))] }) }), _jsxs("div", { style: {
1175
+ position: 'sticky',
924
1176
  display: 'flex',
925
1177
  flexDirection: 'row',
1178
+ justifyContent: 'flex-end',
926
1179
  marginLeft: 'auto',
927
1180
  gap: 8,
1181
+ bottom: 0,
1182
+ right: 0,
1183
+ backgroundColor: 'white',
1184
+ width: '100%',
1185
+ paddingRight: 20,
928
1186
  }, children: [_jsx(SecondaryButtonComponent, { onClick: () => {
929
1187
  setPivotError('');
930
1188
  setIsOpen(false);
931
1189
  setPopUpTitle('Add pivot');
932
- }, label: "Cancel" }), _jsx(ButtonComponent, { id: "custom-button", onClick: onCommitPivot, label: 'Save', disabled: !(pivotAggregations?.length > 0) ||
1190
+ }, label: "Cancel" }), _jsx(ButtonComponent, { id: "custom-button", onClick: onCommitPivot, label: 'Save', disabled: (showSortInput &&
1191
+ (!sortFieldInput ||
1192
+ !(samplePivotTable?.columns ?? []).some((c) => c.field === sortFieldInput) ||
1193
+ !sortDirectionInput)) ||
1194
+ !(pivotAggregations?.length > 0) ||
933
1195
  pivotAggregations.some((agg) => !agg.aggregationType ||
934
1196
  (!agg.valueField &&
935
1197
  agg.aggregationType !== 'count')) })] })] })) : (_jsx("div", { style: {
@@ -938,8 +1200,13 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
938
1200
  fontFamily: theme?.fontFamily,
939
1201
  color: theme?.primaryTextColor,
940
1202
  width: selectedPivotTable ? 500 : 600,
941
- maxHeight: 600,
1203
+ minHeight: pivotModalTopHeight - 100,
1204
+ maxHeight: popoverPosition === 'bottom'
1205
+ ? 600
1206
+ : pivotModalTopHeight - 100,
942
1207
  overflowY: 'scroll',
1208
+ paddingRight: 20,
1209
+ paddingLeft: 20,
943
1210
  }, children: selectedPivotIndex >= 0 ? (_jsx("div", { children: _jsx("div", { onClick: () => {
944
1211
  setPopUpTitle('Edit pivot');
945
1212
  onEditPivot(createdPivots[0], 0);
@@ -953,6 +1220,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
953
1220
  display: 'flex',
954
1221
  flexDirection: 'row',
955
1222
  gap: 8,
1223
+ paddingRight: 20,
956
1224
  }, children: [_jsx(SecondaryButtonComponent, { label: "Regenerate", onClick: refreshPivots, icon: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", style: { width: 16, height: 16 }, children: _jsx("path", { fillRule: "evenodd", d: "M9 4.5a.75.75 0 0 1 .721.544l.813 2.846a3.75 3.75 0 0 0 2.576 2.576l2.846.813a.75.75 0 0 1 0 1.442l-2.846.813a3.75 3.75 0 0 0-2.576 2.576l-.813 2.846a.75.75 0 0 1-1.442 0l-.813-2.846a3.75 3.75 0 0 0-2.576-2.576l-2.846-.813a.75.75 0 0 1 0-1.442l2.846-.813A3.75 3.75 0 0 0 7.466 7.89l.813-2.846A.75.75 0 0 1 9 4.5ZM18 1.5a.75.75 0 0 1 .728.568l.258 1.036c.236.94.97 1.674 1.91 1.91l1.036.258a.75.75 0 0 1 0 1.456l-1.036.258c-.94.236-1.674.97-1.91 1.91l-.258 1.036a.75.75 0 0 1-1.456 0l-.258-1.036a2.625 2.625 0 0 0-1.91-1.91l-1.036-.258a.75.75 0 0 1 0-1.456l1.036-.258a2.625 2.625 0 0 0 1.91-1.91l.258-1.036A.75.75 0 0 1 18 1.5ZM16.5 15a.75.75 0 0 1 .712.513l.394 1.183c.15.447.5.799.948.948l1.183.395a.75.75 0 0 1 0 1.422l-1.183.395c-.447.15-.799.5-.948.948l-.395 1.183a.75.75 0 0 1-1.422 0l-.395-1.183a1.5 1.5 0 0 0-.948-.948l-1.183-.395a.75.75 0 0 1 0-1.422l1.183-.395c.447-.15.799-.5.948-.948l.395-1.183A.75.75 0 0 1 16.5 15Z", clipRule: "evenodd" }) }) }), _jsx(SecondaryButtonComponent, { label: "Create pivot +", onClick: () => onEditPivot({ aggregations: [{}] }, null) })] }), isLoading || uniqueValuesIsLoading ? (_jsx(LoadingComponent, {})) : pivotError ? (_jsx("div", { style: {
957
1225
  width: '100%',
958
1226
  height: '140px',
@@ -1245,10 +1513,11 @@ export function isDateField(fieldType) {
1245
1513
  // }
1246
1514
  // return newData;
1247
1515
  // };
1248
- export async function generatePivotTable({ pivot, dateBucket, dateFilter, report, client, getToken, uniqueValues, dashboardName, tenants, additionalProcessing, caller, }) {
1516
+ export async function generatePivotTable({ pivot, dateBucket, dateFilter, report, client, getToken, eventTracking, uniqueValues, dashboardName, tenants, additionalProcessing, caller, pivotQuery, }) {
1249
1517
  try {
1250
1518
  if (report && client) {
1251
1519
  const pivotTable = await generatePivotWithSQL({
1520
+ pivotQuery,
1252
1521
  pivot,
1253
1522
  report,
1254
1523
  client,
@@ -1267,6 +1536,17 @@ export async function generatePivotTable({ pivot, dateBucket, dateFilter, report
1267
1536
  }
1268
1537
  }
1269
1538
  catch (e) {
1539
+ eventTracking?.logError?.({
1540
+ type: 'bug', // TODO: determine type
1541
+ severity: 'high',
1542
+ message: 'Error generating pivot table',
1543
+ errorMessage: e.message,
1544
+ errorStack: e.stack,
1545
+ errorData: {
1546
+ caller: 'PivotModal',
1547
+ function: 'generatePivotTable',
1548
+ },
1549
+ });
1270
1550
  throw Error(`Failed to generate pivot table with SQL: ${e}`);
1271
1551
  }
1272
1552
  throw Error('Failed to generate pivot table: invalid report');