@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
@@ -27,7 +27,7 @@ const pivotConstructor_1 = require("../../utils/pivotConstructor");
27
27
  const dates_1 = require("../../utils/dates");
28
28
  const fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
29
29
  const columnProcessing_1 = require("../../utils/columnProcessing");
30
- const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotAggregations, setPivotAggregations, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, LoadingComponent = UiComponents_1.QuillLoadingComponent, CardComponent = QuillCard_1.QuillCard, HeaderComponent, SubheaderComponent = UiComponents_1.MemoizedSubHeader, DeleteButtonComponent = UiComponents_1.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, }) => {
30
+ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotAggregations, setPivotAggregations, pivotSort, setPivotSort, pivotLimit, setPivotLimit, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, TextInputComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, LoadingComponent = UiComponents_1.QuillLoadingComponent, CardComponent = QuillCard_1.QuillCard, HeaderComponent, SubheaderComponent = UiComponents_1.MemoizedSubHeader, DeleteButtonComponent = UiComponents_1.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, }) => {
31
31
  const { getToken, quillFetchWithToken } = (0, react_1.useContext)(Context_1.FetchContext);
32
32
  const [isLoading, setIsLoading] = (0, react_1.useState)(false);
33
33
  const [previewLoading, setPreviewLoading] = (0, react_1.useState)(false);
@@ -37,6 +37,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
37
37
  const [client] = (0, react_1.useContext)(Context_1.ClientContext);
38
38
  const [schemaData] = (0, react_1.useContext)(Context_1.SchemaDataContext);
39
39
  const { tenants } = (0, react_1.useContext)(Context_1.TenantContext);
40
+ const { eventTracking } = (0, react_1.useContext)(Context_1.EventTrackingContext);
40
41
  const rowFieldRef = (0, react_1.useRef)(null);
41
42
  const colFieldRef = (0, react_1.useRef)(null);
42
43
  const [pivotCardWidth, setPivotCardWidth] = (0, react_1.useState)(420);
@@ -51,6 +52,15 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
51
52
  // const percentageAggButtonRef = useRef<HTMLDivElement>(null);
52
53
  const [dateRanges, setDateRanges] = (0, react_1.useState)({});
53
54
  const [pivotError, setPivotError] = (0, react_1.useState)('');
55
+ const [limitInput, setLimitInput] = (0, react_1.useState)(pivotLimit?.toString() ?? '100');
56
+ const [sortFieldInput, setSortFieldInput] = (0, react_1.useState)(pivotSort?.sortField ?? '');
57
+ const [sortDirectionInput, setSortDirectionInput] = (0, react_1.useState)(pivotSort?.sortDirection ?? 'ASC');
58
+ const [showLimitInput, setShowLimitInput] = (0, react_1.useState)(!!pivotLimit);
59
+ const [showSortInput, setShowSortInput] = (0, react_1.useState)(!!pivotSort);
60
+ const [availableHeight, setAvailableHeight] = (0, react_1.useState)(0);
61
+ const [pivotModalTopHeight, setPivotModalTopHeight] = (0, react_1.useState)(450);
62
+ const [popoverPosition, setPopoverPosition] = (0, react_1.useState)('bottom');
63
+ const popoverRef = (0, react_1.useRef)(null);
54
64
  const getDistinctValues = async (fetchDistinct) => {
55
65
  if (!client) {
56
66
  return {
@@ -71,7 +81,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
71
81
  }
72
82
  let newUniqueValues = uniqueValues ?? null;
73
83
  if (fetchDistinct || !uniqueValues) {
74
- const { filteredColumns: smallStringColumns, exceededColumns } = await (0, tableProcessing_1.getCountsByColumns)(stringColumns, query || '', client, getToken, tenants, schemaData.customFields ?? {}, dashboardName);
84
+ const { filteredColumns: smallStringColumns, exceededColumns } = await (0, tableProcessing_1.getCountsByColumns)(stringColumns, query || '', client, getToken, tenants, schemaData.customFields ?? {}, eventTracking, dashboardName);
75
85
  newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByQuery)({
76
86
  columns: smallStringColumns,
77
87
  query: query || '',
@@ -80,6 +90,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
80
90
  tenants,
81
91
  customFields: schemaData.customFields ?? {},
82
92
  dashboardName,
93
+ eventTracking,
83
94
  });
84
95
  exceededColumns?.forEach((column) => {
85
96
  if (newUniqueValues) {
@@ -111,7 +122,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
111
122
  if (dateColumns.length === 0) {
112
123
  return;
113
124
  }
114
- const dateRangeByColumn = await (0, tableProcessing_1.getQueryDateRangeByColumns)(dateColumns, query || '', client, getToken, tenants, schemaData.customFields ?? {}, dashboardName);
125
+ const dateRangeByColumn = await (0, tableProcessing_1.getQueryDateRangeByColumns)(dateColumns, query || '', client, getToken, tenants, eventTracking, schemaData.customFields ?? {}, dashboardName);
115
126
  setDateRanges(dateRangeByColumn || {});
116
127
  }
117
128
  };
@@ -177,10 +188,22 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
177
188
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
178
189
  }, // limit preview
179
190
  getToken,
191
+ eventTracking,
180
192
  });
181
193
  setSamplePivotTable({ pivot: pivot, rows, columns });
182
194
  }
183
195
  catch (e) {
196
+ eventTracking?.logError?.({
197
+ type: 'bug', // TODO: determine type
198
+ severity: 'high',
199
+ message: 'Error fetching pivot data',
200
+ errorMessage: e.message,
201
+ errorStack: e.stack,
202
+ errorData: {
203
+ caller: 'PivotModal',
204
+ function: 'fetchPivotData',
205
+ },
206
+ });
184
207
  if (e instanceof Error) {
185
208
  setPivotError(e.message);
186
209
  return;
@@ -238,10 +261,22 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
238
261
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
239
262
  }, // limit preview
240
263
  getToken,
264
+ eventTracking,
241
265
  });
242
266
  setSamplePivotTable({ pivot: pivot, rows, columns });
243
267
  }
244
268
  catch (e) {
269
+ eventTracking?.logError?.({
270
+ type: 'bug', // TODO: determine type
271
+ severity: 'high',
272
+ message: 'Error fetching pivot data',
273
+ errorMessage: e.message,
274
+ errorStack: e.stack,
275
+ errorData: {
276
+ caller: 'PivotModal',
277
+ function: 'fetchPivotData',
278
+ },
279
+ });
245
280
  if (e instanceof Error) {
246
281
  setPivotError(e.message);
247
282
  return;
@@ -309,6 +344,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
309
344
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
310
345
  }, // limit preview
311
346
  getToken,
347
+ eventTracking,
312
348
  });
313
349
  setSelectedPivotTable({
314
350
  pivot: pivot,
@@ -317,6 +353,17 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
317
353
  });
318
354
  }
319
355
  catch (e) {
356
+ eventTracking?.logError?.({
357
+ type: 'bug', // TODO: determine type
358
+ severity: 'high',
359
+ message: 'Error fetching pivot tables',
360
+ errorMessage: e.message,
361
+ errorStack: e.stack,
362
+ errorData: {
363
+ caller: 'PivotModal',
364
+ function: 'fetchPivotTables',
365
+ },
366
+ });
320
367
  if (e instanceof Error) {
321
368
  setPivotError(e.message);
322
369
  return;
@@ -377,8 +424,15 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
377
424
  if (pivotColumnField && !columnsToShow[pivotColumnField]) {
378
425
  errors.push('Error in column field: undefined type');
379
426
  }
427
+ if (showLimitInput && limitInput && !Number.isInteger(Number(limitInput))) {
428
+ errors.push('Limit must be an integer');
429
+ }
380
430
  if (errors.length === 0 &&
381
431
  pivotAggregations?.every((p) => p.aggregationType && (p.valueField || p.aggregationType === 'count'))) {
432
+ const sort = showSortInput && !!sortFieldInput && !!sortDirectionInput;
433
+ const sortField = sort ? sortFieldInput : undefined;
434
+ const sortDirection = sort ? sortDirectionInput : undefined;
435
+ const rowLimit = showLimitInput && limitInput ? Number(limitInput) : undefined;
382
436
  const pivot = {
383
437
  rowField: pivotRowField,
384
438
  rowFieldType: columnTypes[pivotRowField ?? ''],
@@ -391,6 +445,10 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
391
445
  valueField2Type: columnTypes[p.valueField2 ?? ''],
392
446
  aggregationType: p.aggregationType,
393
447
  })),
448
+ sort,
449
+ sortField,
450
+ sortDirection,
451
+ rowLimit,
394
452
  // For backwards compatibility
395
453
  valueField: pivotAggregations?.[0]?.valueField,
396
454
  valueFieldType: columnTypes[pivotAggregations?.[0]?.valueField ?? ''],
@@ -411,7 +469,16 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
411
469
  }
412
470
  }
413
471
  setErrors(errors);
414
- }, [pivotRowField, pivotColumnField, pivotAggregations]);
472
+ }, [
473
+ pivotRowField,
474
+ pivotColumnField,
475
+ pivotAggregations,
476
+ sortFieldInput,
477
+ sortDirectionInput,
478
+ showSortInput,
479
+ showLimitInput,
480
+ limitInput,
481
+ ]);
415
482
  const onEditPivot = async (pivot, index, pivotType) => {
416
483
  setIsLoading(false);
417
484
  setErrors([]);
@@ -444,11 +511,23 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
444
511
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
445
512
  }, // limit preview
446
513
  getToken,
514
+ eventTracking,
447
515
  });
448
516
  setSamplePivotTable({ pivot, rows, columns });
449
517
  return;
450
518
  }
451
519
  catch (e) {
520
+ eventTracking?.logError?.({
521
+ type: 'bug', // TODO: determine type
522
+ severity: 'high',
523
+ message: 'Error fetching pivot data',
524
+ errorMessage: e.message,
525
+ errorStack: e.stack,
526
+ errorData: {
527
+ caller: 'PivotModal',
528
+ function: 'onEditPivot',
529
+ },
530
+ });
452
531
  if (e instanceof Error) {
453
532
  setPivotError(e.message);
454
533
  setSamplePivotTable(null);
@@ -558,10 +637,22 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
558
637
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
559
638
  }, // limit preview
560
639
  getToken,
640
+ eventTracking,
561
641
  });
562
642
  return { pivot: p, rows, columns };
563
643
  }
564
644
  catch (e) {
645
+ eventTracking?.logError?.({
646
+ type: 'bug', // TODO: determine type
647
+ severity: 'high',
648
+ message: 'Error fetching pivot data',
649
+ errorMessage: e.message,
650
+ errorStack: e.stack,
651
+ errorData: {
652
+ caller: 'PivotModal',
653
+ function: 'refreshPivots',
654
+ },
655
+ });
565
656
  return undefined;
566
657
  }
567
658
  }));
@@ -585,6 +676,17 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
585
676
  setSelectedPivotIndex(-1);
586
677
  }
587
678
  catch (e) {
679
+ eventTracking?.logError?.({
680
+ type: 'bug', // TODO: determine type
681
+ severity: 'high',
682
+ message: 'Error fetching pivot recommendations',
683
+ errorMessage: e.message,
684
+ errorStack: e.stack,
685
+ errorData: {
686
+ caller: 'PivotModal',
687
+ function: 'refreshPivots',
688
+ },
689
+ });
588
690
  setPivotError('Failed to fetch pivot recommendations');
589
691
  console.error('Failed parsing pivotai response', e);
590
692
  }
@@ -697,10 +799,22 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
697
799
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
698
800
  }, // limit preview
699
801
  getToken,
802
+ eventTracking,
700
803
  });
701
804
  setSamplePivotTable({ pivot, rows, columns });
702
805
  }
703
806
  catch (e) {
807
+ eventTracking?.logError?.({
808
+ type: 'bug', // TODO: determine type
809
+ severity: 'high',
810
+ message: 'Error fetching pivot data',
811
+ errorMessage: e.message,
812
+ errorStack: e.stack,
813
+ errorData: {
814
+ caller: 'PivotModal',
815
+ function: 'pivotFieldChange',
816
+ },
817
+ });
704
818
  if (e instanceof Error) {
705
819
  console.log('error', e);
706
820
  setPivotError(e.message);
@@ -731,10 +845,22 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
731
845
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
732
846
  },
733
847
  getToken,
848
+ eventTracking,
734
849
  });
735
850
  return { pivot: p, rows, columns };
736
851
  }
737
852
  catch (e) {
853
+ eventTracking?.logError?.({
854
+ type: 'bug', // TODO: determine type
855
+ severity: 'high',
856
+ message: 'Error fetching pivot data',
857
+ errorMessage: e.message,
858
+ errorStack: e.stack,
859
+ errorData: {
860
+ caller: 'PivotModal',
861
+ function: 'fetchPivotTables',
862
+ },
863
+ });
738
864
  return undefined;
739
865
  }
740
866
  }));
@@ -742,6 +868,58 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
742
868
  };
743
869
  fetchPivotTables();
744
870
  }, [createdPivots, dateRange]);
871
+ const handleResize = () => {
872
+ const parentRefElement = parentRef?.current;
873
+ const popoverRefElement = popoverRef?.current;
874
+ if (parentRefElement && popoverRefElement) {
875
+ const parentRect = parentRefElement.getBoundingClientRect();
876
+ const popoverRect = popoverRefElement.getBoundingClientRect();
877
+ const topOffset = popoverRect.top - parentRect.top;
878
+ const availableHeight = parentRect.height - topOffset;
879
+ setAvailableHeight(availableHeight);
880
+ calculatePopoverPosition();
881
+ }
882
+ };
883
+ const calculatePopoverPosition = () => {
884
+ if (!buttonRef.current)
885
+ return;
886
+ const buttonRect = buttonRef.current.getBoundingClientRect();
887
+ const parentRefElement = parentRef?.current;
888
+ if (!parentRefElement)
889
+ return;
890
+ const parentRect = parentRefElement.getBoundingClientRect();
891
+ // Calculate available space above and below
892
+ const spaceBelow = parentRect.bottom - buttonRect.bottom;
893
+ const spaceAbove = buttonRect.top - parentRect.top;
894
+ const desiredHeight = Math.max(450, spaceAbove - 20);
895
+ setPivotModalTopHeight(desiredHeight);
896
+ // If there's not enough space below but more space above, position above
897
+ if (spaceBelow < desiredHeight && spaceAbove > desiredHeight) {
898
+ setPopoverPosition('top');
899
+ }
900
+ else {
901
+ setPopoverPosition('bottom');
902
+ }
903
+ };
904
+ (0, react_1.useEffect)(() => {
905
+ handleResize();
906
+ window.addEventListener('resize', handleResize);
907
+ // Add scroll listener to the parent element if it exists
908
+ const parentElement = parentRef?.current;
909
+ if (parentElement) {
910
+ parentElement.addEventListener('scroll', handleResize);
911
+ }
912
+ return () => {
913
+ window.removeEventListener('resize', handleResize);
914
+ if (parentElement) {
915
+ parentElement.removeEventListener('scroll', handleResize);
916
+ }
917
+ };
918
+ }, [
919
+ parentRef?.current,
920
+ popoverRef?.current,
921
+ buttonRef?.current?.getBoundingClientRect().top,
922
+ ]);
745
923
  return ((0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsxs)("div", { style: {
746
924
  position: 'relative',
747
925
  display: 'inline-block',
@@ -776,9 +954,15 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
776
954
  }
777
955
  setIsOpen(!isOpen);
778
956
  setShowUpdatePivot(false);
779
- }, label: triggerButtonText }) })), (0, jsx_runtime_1.jsx)("div", { style: {
780
- position: 'relative',
781
- ...(isOpen && showTrigger && { top: 12 }),
957
+ }, label: triggerButtonText }) })), (0, jsx_runtime_1.jsx)("div", { ref: popoverRef, style: {
958
+ position: 'absolute', // Change from 'relative' to 'absolute'
959
+ ...(isOpen &&
960
+ showTrigger && {
961
+ top: popoverPosition === 'bottom' ? '100%' : 'auto',
962
+ bottom: popoverPosition === 'top' ? '100%' : 'auto',
963
+ marginBottom: popoverPosition === 'top' ? pivotModalTopHeight : 0,
964
+ marginTop: popoverPosition === 'bottom' ? 8 : 0,
965
+ }),
782
966
  }, children: (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: isOpen, setIsOpen: (isOpen) => {
783
967
  if (!isOpen) {
784
968
  setShowUpdatePivot(false);
@@ -787,7 +971,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
787
971
  setIsOpen(isOpen);
788
972
  }, ignoredRefs: [buttonRef], popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
789
973
  ? popUpTitle
790
- : 'Recommended pivots', popoverChildren: (0, jsx_runtime_1.jsx)("div", { style: {
974
+ : 'Recommended pivots', horizontalPadding: 0, titlePaddingLeft: 20, popoverChildren: (0, jsx_runtime_1.jsx)("div", { style: {
791
975
  paddingTop: showUpdatePivot || !pivotRecommendationsEnabled ? 0 : 20,
792
976
  position: 'relative',
793
977
  }, children: showUpdatePivot || !pivotRecommendationsEnabled ? ((0, jsx_runtime_1.jsxs)("div", { style: {
@@ -795,145 +979,223 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
795
979
  display: 'flex',
796
980
  flexDirection: 'column',
797
981
  gap: 20,
798
- }, children: [previewLoading && (0, jsx_runtime_1.jsx)(LoadingComponent, {}), samplePivotTable && !previewLoading && ((0, jsx_runtime_1.jsx)("div", { style: {
799
- width: pivotCardWidth,
800
- minHeight: 160,
801
- }, children: (0, jsx_runtime_1.jsx)(PivotList_1.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: () => {
802
- setPivotAggregations([
803
- {
804
- valueField: undefined,
805
- valueField2: undefined,
806
- aggregationType: undefined,
807
- },
808
- ]);
809
- setPivotRowField(undefined);
810
- setPivotColumnField(undefined);
811
- setSamplePivotTable(undefined);
812
- } }) })), (0, jsx_runtime_1.jsxs)(PivotColumnContainer, { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
813
- display: 'flex',
814
- flexDirection: 'column',
815
- gap: 4,
816
- }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Groupings" }), (0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { ref: rowFieldRef, children: (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Group rows by", value: pivotRowField, onChange: (e) => {
817
- pivotFieldChange('rowField', e.target.value);
818
- setPivotRowField(e.target.value === ''
819
- ? undefined
820
- : e.target.value);
821
- }, options: allowedRowFields
822
- .filter((field) => field !== pivotColumnField)
823
- .map((field) => {
824
- return {
825
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field),
826
- value: field,
827
- };
828
- }), isLoading: uniqueValuesIsLoading, width: 200 }) }), (0, jsx_runtime_1.jsx)("div", { ref: colFieldRef, children: (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-column-field", label: "Group columns by", value: pivotColumnField, onChange: (e) => {
829
- pivotFieldChange('columnField', e.target.value);
830
- setPivotColumnField(e.target.value === ''
831
- ? undefined
832
- : e.target.value);
833
- }, options: allowedColumnFields
834
- .filter((field) => field !== pivotRowField)
835
- .map((field) => {
836
- return {
837
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field),
838
- value: field,
839
- };
840
- }), isLoading: uniqueValuesIsLoading, width: 200, disabled: pivotRowField === undefined }) })] })] }), (0, jsx_runtime_1.jsxs)("div", { style: {
841
- display: 'flex',
842
- flexDirection: 'column',
843
- gap: 4,
844
- }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Aggregations" }), (0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { style: { width: 200 }, children: (0, jsx_runtime_1.jsx)(SubheaderComponent, { label: "Aggregation Type" }) }), (0, jsx_runtime_1.jsx)("div", { style: { width: 200 }, children: (0, jsx_runtime_1.jsx)(SubheaderComponent, { label: "Value Field" }) })] }), pivotAggregations?.map((agg, index) => ((0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-aggregation-type", value: agg.aggregationType, onChange: (e) => {
845
- // if (
846
- // e.target.value !== 'count' &&
847
- // agg.valueField &&
848
- // !numberFormatOptions.includes(
849
- // columns.find(
850
- // (col: Column) =>
851
- // col.field === agg.valueField,
852
- // )!.format,
853
- // )
854
- // ) {
855
- // setPivotValueField(undefined);
856
- // }
857
- const newAgg = [
858
- ...pivotAggregations.slice(0, index),
859
- {
860
- ...agg,
861
- aggregationType: e.target.value === ''
862
- ? undefined
863
- : e.target.value,
864
- },
865
- ...pivotAggregations.slice(index + 1),
866
- ];
867
- pivotFieldChange('aggregations', newAgg);
868
- setPivotAggregations(newAgg);
869
- }, options: [
870
- ...[
871
- 'sum',
872
- 'average',
873
- 'count',
874
- 'max',
875
- 'min',
876
- 'percentage',
877
- ].map((option) => {
878
- return { label: option, value: option };
879
- }),
880
- ], width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-value-field", value: agg.valueField, onChange: (e) => {
881
- const newAgg = [
882
- ...pivotAggregations.slice(0, index),
883
- {
884
- ...agg,
885
- valueField: e.target.value === ''
886
- ? undefined
887
- : e.target.value,
888
- },
889
- ...pivotAggregations.slice(index + 1),
890
- ];
891
- pivotFieldChange('aggregations', newAgg);
892
- setPivotAggregations(newAgg);
893
- }, options: allowedValueFields.map((field) => {
894
- return {
895
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field),
896
- value: field,
897
- };
898
- }), isLoading: uniqueValuesIsLoading, width: 200 }), (0, jsx_runtime_1.jsx)("div", { style: {
899
- marginLeft: -16,
900
- marginRight: -16,
901
- visibility: index > 0 ? 'visible' : 'hidden',
902
- }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => {
903
- setPivotAggregations([
904
- ...pivotAggregations.slice(0, index),
905
- ...pivotAggregations.slice(index + 1),
906
- ]);
907
- } }) })] }, index)))] })] }), (0, jsx_runtime_1.jsx)("div", { style: {
908
- display: 'flex',
909
- flexDirection: 'row',
910
- marginRight: 'auto',
911
- }, children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: "Add Aggregation", onClick: () => {
912
- setPivotAggregations([
913
- ...pivotAggregations,
914
- {
915
- aggregationType: undefined,
916
- valueField: undefined,
917
- valueField2: undefined,
918
- },
919
- ]);
920
- } }) }), errors.length > 0 && ((0, jsx_runtime_1.jsx)("div", { style: {
921
- display: 'flex',
922
- flexDirection: 'column',
923
- gap: 8,
924
- paddingTop: 8,
925
- width: pivotCardWidth,
926
- maxWidth: pivotCardWidth,
927
- }, children: errors.map((error, index) => ((0, jsx_runtime_1.jsx)(ErrorMessageComponent, { errorMessage: error }, `error_message_${index}`))) })), (0, jsx_runtime_1.jsxs)("div", { style: {
982
+ position: 'relative',
983
+ height: '100%',
984
+ overflow: 'auto',
985
+ }, children: [(0, jsx_runtime_1.jsx)(UiComponents_1.OverflowContainer, { style: {
986
+ height: popoverPosition === 'bottom'
987
+ ? Math.max(availableHeight - heightAdjustment, 250)
988
+ : pivotModalTopHeight - 140,
989
+ }, children: (0, jsx_runtime_1.jsxs)("div", { style: {
990
+ display: 'flex',
991
+ flexDirection: 'column',
992
+ paddingLeft: 20,
993
+ paddingRight: 20,
994
+ }, children: [previewLoading && (0, jsx_runtime_1.jsx)(LoadingComponent, {}), samplePivotTable && !previewLoading && ((0, jsx_runtime_1.jsx)("div", { style: {
995
+ width: pivotCardWidth,
996
+ // minHeight: 160,
997
+ paddingBottom: 20,
998
+ }, children: (0, jsx_runtime_1.jsx)(PivotList_1.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: () => {
999
+ setPivotAggregations([
1000
+ {
1001
+ valueField: undefined,
1002
+ valueField2: undefined,
1003
+ aggregationType: undefined,
1004
+ },
1005
+ ]);
1006
+ setPivotRowField(undefined);
1007
+ setPivotColumnField(undefined);
1008
+ setSamplePivotTable(undefined);
1009
+ setPivotSort(undefined);
1010
+ setPivotLimit(undefined);
1011
+ } }) })), (0, jsx_runtime_1.jsxs)(PivotColumnContainer, { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
1012
+ display: 'flex',
1013
+ flexDirection: 'column',
1014
+ gap: 4,
1015
+ }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Groupings" }), (0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { ref: rowFieldRef, children: (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Group rows by", value: pivotRowField, onChange: (e) => {
1016
+ pivotFieldChange('rowField', e.target.value);
1017
+ setPivotRowField(e.target.value === ''
1018
+ ? undefined
1019
+ : e.target.value);
1020
+ }, options: allowedRowFields
1021
+ .filter((field) => field !== pivotColumnField)
1022
+ .map((field) => {
1023
+ return {
1024
+ label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field),
1025
+ value: field,
1026
+ };
1027
+ }), isLoading: uniqueValuesIsLoading, width: 200 }) }), (0, jsx_runtime_1.jsx)("div", { ref: colFieldRef, children: (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-column-field", label: "Group columns by", value: pivotColumnField, onChange: (e) => {
1028
+ pivotFieldChange('columnField', e.target.value);
1029
+ setPivotColumnField(e.target.value === ''
1030
+ ? undefined
1031
+ : e.target.value);
1032
+ }, options: allowedColumnFields
1033
+ .filter((field) => field !== pivotRowField)
1034
+ .map((field) => {
1035
+ return {
1036
+ label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field),
1037
+ value: field,
1038
+ };
1039
+ }), isLoading: uniqueValuesIsLoading, width: 200, disabled: pivotRowField === undefined }) })] })] }), (0, jsx_runtime_1.jsxs)("div", { style: {
1040
+ display: 'flex',
1041
+ flexDirection: 'column',
1042
+ gap: 4,
1043
+ paddingBottom: 20,
1044
+ }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Aggregations" }), (0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { style: { width: 200 }, children: (0, jsx_runtime_1.jsx)(SubheaderComponent, { label: "Aggregation Type" }) }), (0, jsx_runtime_1.jsx)("div", { style: { width: 200 }, children: (0, jsx_runtime_1.jsx)(SubheaderComponent, { label: "Value Field" }) })] }), pivotAggregations?.map((agg, index) => ((0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-aggregation-type", value: agg.aggregationType, onChange: (e) => {
1045
+ const newAgg = [
1046
+ ...pivotAggregations.slice(0, index),
1047
+ {
1048
+ ...agg,
1049
+ aggregationType: e.target.value === ''
1050
+ ? undefined
1051
+ : e.target.value,
1052
+ },
1053
+ ...pivotAggregations.slice(index + 1),
1054
+ ];
1055
+ pivotFieldChange('aggregations', newAgg);
1056
+ setPivotAggregations(newAgg);
1057
+ }, options: [
1058
+ ...[
1059
+ 'sum',
1060
+ 'average',
1061
+ 'count',
1062
+ 'max',
1063
+ 'min',
1064
+ 'percentage',
1065
+ ].map((option) => {
1066
+ return { label: option, value: option };
1067
+ }),
1068
+ ], width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-value-field", value: agg.valueField, onChange: (e) => {
1069
+ const newAgg = [
1070
+ ...pivotAggregations.slice(0, index),
1071
+ {
1072
+ ...agg,
1073
+ valueField: e.target.value === ''
1074
+ ? undefined
1075
+ : e.target.value,
1076
+ },
1077
+ ...pivotAggregations.slice(index + 1),
1078
+ ];
1079
+ pivotFieldChange('aggregations', newAgg);
1080
+ setPivotAggregations(newAgg);
1081
+ }, options: allowedValueFields.map((field) => {
1082
+ return {
1083
+ label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field),
1084
+ value: field,
1085
+ };
1086
+ }), isLoading: uniqueValuesIsLoading, width: 200 }), (0, jsx_runtime_1.jsx)("div", { style: {
1087
+ marginLeft: -16,
1088
+ marginRight: -16,
1089
+ visibility: index > 0 ? 'visible' : 'hidden',
1090
+ }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => {
1091
+ setPivotAggregations([
1092
+ ...pivotAggregations.slice(0, index),
1093
+ ...pivotAggregations.slice(index + 1),
1094
+ ]);
1095
+ } }) })] }, index)))] })] }), (0, jsx_runtime_1.jsx)("div", { style: {
1096
+ display: 'flex',
1097
+ flexDirection: 'row',
1098
+ marginRight: 'auto',
1099
+ paddingBottom: 20,
1100
+ }, children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: "Add Aggregation", onClick: () => {
1101
+ setPivotAggregations([
1102
+ ...pivotAggregations,
1103
+ {
1104
+ aggregationType: undefined,
1105
+ valueField: undefined,
1106
+ valueField2: undefined,
1107
+ },
1108
+ ]);
1109
+ } }) }), (0, jsx_runtime_1.jsx)(PivotColumnContainer, { children: (0, jsx_runtime_1.jsxs)("div", { style: {
1110
+ display: 'flex',
1111
+ flexDirection: 'column',
1112
+ gap: 4,
1113
+ paddingBottom: 20,
1114
+ }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Sort" }), !showSortInput ? ((0, jsx_runtime_1.jsx)("div", { style: { width: 200 }, children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => setShowSortInput(true), disabled: disabled, label: "Add Sort" }) })) : ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { style: { width: 200 }, children: (0, jsx_runtime_1.jsx)(SubheaderComponent, { label: "Sort Field" }) }), (0, jsx_runtime_1.jsx)("div", { style: { width: 200 }, children: (0, jsx_runtime_1.jsx)(SubheaderComponent, { label: "Sort Direction" }) })] }), (0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-sort-field", value: sortFieldInput, onChange: (e) => {
1115
+ setSortFieldInput(e.target.value);
1116
+ if (e.target.value &&
1117
+ sortDirectionInput) {
1118
+ setPivotSort({
1119
+ sortField: e.target.value,
1120
+ sortDirection: sortDirectionInput,
1121
+ });
1122
+ }
1123
+ }, options: (samplePivotTable?.columns ?? []).map((column) => ({
1124
+ label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(column.field),
1125
+ value: column.field,
1126
+ })), width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-sort-direction", value: sortDirectionInput, onChange: (e) => {
1127
+ setSortDirectionInput(e.target.value);
1128
+ if (sortFieldInput && e.target.value) {
1129
+ setPivotSort({
1130
+ sortField: sortFieldInput,
1131
+ sortDirection: e.target.value,
1132
+ });
1133
+ }
1134
+ }, options: [
1135
+ { label: 'Ascending', value: 'ASC' },
1136
+ { label: 'Descending', value: 'DESC' },
1137
+ ], hideEmptyOption: true, width: 200 }), (0, jsx_runtime_1.jsx)("div", { style: {
1138
+ marginLeft: -16,
1139
+ marginRight: -16,
1140
+ }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => {
1141
+ if (pivotSort !== undefined) {
1142
+ setPivotSort(undefined);
1143
+ }
1144
+ setShowSortInput(false);
1145
+ setSortFieldInput('');
1146
+ setSortDirectionInput('ASC');
1147
+ } }) })] })] }))] }) }), (0, jsx_runtime_1.jsx)(PivotColumnContainer, { children: (0, jsx_runtime_1.jsxs)("div", { style: {
1148
+ display: 'flex',
1149
+ flexDirection: 'column',
1150
+ gap: 4,
1151
+ paddingBottom: 20,
1152
+ }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Limit" }), !showLimitInput ? ((0, jsx_runtime_1.jsx)("div", { style: { width: 200 }, children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => setShowLimitInput(true), disabled: disabled, label: "Add Limit" }) })) : ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(PivotRowContainer, { children: (0, jsx_runtime_1.jsx)("div", { style: { width: 200 }, children: (0, jsx_runtime_1.jsx)(SubheaderComponent, { label: "Pivot row limit" }) }) }), (0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)(TextInputComponent, { id: "pivot-limit", value: limitInput, width: 180, onChange: (e) => {
1153
+ setLimitInput(e.target.value);
1154
+ const limit = parseInt(e.target.value);
1155
+ if (limit) {
1156
+ setPivotLimit(limit);
1157
+ }
1158
+ else {
1159
+ setPivotLimit(undefined);
1160
+ }
1161
+ } }), (0, jsx_runtime_1.jsx)("div", { style: {
1162
+ marginLeft: -16,
1163
+ marginRight: -16,
1164
+ }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => {
1165
+ if (pivotLimit !== undefined) {
1166
+ setPivotLimit(undefined);
1167
+ }
1168
+ setShowLimitInput(false);
1169
+ setLimitInput('100');
1170
+ } }) })] })] }))] }) }), errors.length > 0 && ((0, jsx_runtime_1.jsx)("div", { style: {
1171
+ display: 'flex',
1172
+ flexDirection: 'column',
1173
+ gap: 8,
1174
+ paddingTop: 8,
1175
+ width: pivotCardWidth,
1176
+ maxWidth: pivotCardWidth,
1177
+ paddingBottom: 20,
1178
+ }, children: errors.map((error, index) => ((0, jsx_runtime_1.jsx)(ErrorMessageComponent, { errorMessage: error }, `error_message_${index}`))) }))] }) }), (0, jsx_runtime_1.jsxs)("div", { style: {
1179
+ position: 'sticky',
928
1180
  display: 'flex',
929
1181
  flexDirection: 'row',
1182
+ justifyContent: 'flex-end',
930
1183
  marginLeft: 'auto',
931
1184
  gap: 8,
1185
+ bottom: 0,
1186
+ right: 0,
1187
+ backgroundColor: 'white',
1188
+ width: '100%',
1189
+ paddingRight: 20,
932
1190
  }, children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
933
1191
  setPivotError('');
934
1192
  setIsOpen(false);
935
1193
  setPopUpTitle('Add pivot');
936
- }, label: "Cancel" }), (0, jsx_runtime_1.jsx)(ButtonComponent, { id: "custom-button", onClick: onCommitPivot, label: 'Save', disabled: !(pivotAggregations?.length > 0) ||
1194
+ }, label: "Cancel" }), (0, jsx_runtime_1.jsx)(ButtonComponent, { id: "custom-button", onClick: onCommitPivot, label: 'Save', disabled: (showSortInput &&
1195
+ (!sortFieldInput ||
1196
+ !(samplePivotTable?.columns ?? []).some((c) => c.field === sortFieldInput) ||
1197
+ !sortDirectionInput)) ||
1198
+ !(pivotAggregations?.length > 0) ||
937
1199
  pivotAggregations.some((agg) => !agg.aggregationType ||
938
1200
  (!agg.valueField &&
939
1201
  agg.aggregationType !== 'count')) })] })] })) : ((0, jsx_runtime_1.jsx)("div", { style: {
@@ -942,8 +1204,13 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
942
1204
  fontFamily: theme?.fontFamily,
943
1205
  color: theme?.primaryTextColor,
944
1206
  width: selectedPivotTable ? 500 : 600,
945
- maxHeight: 600,
1207
+ minHeight: pivotModalTopHeight - 100,
1208
+ maxHeight: popoverPosition === 'bottom'
1209
+ ? 600
1210
+ : pivotModalTopHeight - 100,
946
1211
  overflowY: 'scroll',
1212
+ paddingRight: 20,
1213
+ paddingLeft: 20,
947
1214
  }, children: selectedPivotIndex >= 0 ? ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { onClick: () => {
948
1215
  setPopUpTitle('Edit pivot');
949
1216
  onEditPivot(createdPivots[0], 0);
@@ -957,6 +1224,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
957
1224
  display: 'flex',
958
1225
  flexDirection: 'row',
959
1226
  gap: 8,
1227
+ paddingRight: 20,
960
1228
  }, children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: "Regenerate", onClick: refreshPivots, icon: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", style: { width: 16, height: 16 }, children: (0, jsx_runtime_1.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" }) }) }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: "Create pivot +", onClick: () => onEditPivot({ aggregations: [{}] }, null) })] }), isLoading || uniqueValuesIsLoading ? ((0, jsx_runtime_1.jsx)(LoadingComponent, {})) : pivotError ? ((0, jsx_runtime_1.jsx)("div", { style: {
961
1229
  width: '100%',
962
1230
  height: '140px',
@@ -1250,10 +1518,11 @@ function isDateField(fieldType) {
1250
1518
  // }
1251
1519
  // return newData;
1252
1520
  // };
1253
- async function generatePivotTable({ pivot, dateBucket, dateFilter, report, client, getToken, uniqueValues, dashboardName, tenants, additionalProcessing, caller, }) {
1521
+ async function generatePivotTable({ pivot, dateBucket, dateFilter, report, client, getToken, eventTracking, uniqueValues, dashboardName, tenants, additionalProcessing, caller, pivotQuery, }) {
1254
1522
  try {
1255
1523
  if (report && client) {
1256
1524
  const pivotTable = await (0, pivotConstructor_1.generatePivotWithSQL)({
1525
+ pivotQuery,
1257
1526
  pivot,
1258
1527
  report,
1259
1528
  client,
@@ -1272,6 +1541,17 @@ async function generatePivotTable({ pivot, dateBucket, dateFilter, report, clien
1272
1541
  }
1273
1542
  }
1274
1543
  catch (e) {
1544
+ eventTracking?.logError?.({
1545
+ type: 'bug', // TODO: determine type
1546
+ severity: 'high',
1547
+ message: 'Error generating pivot table',
1548
+ errorMessage: e.message,
1549
+ errorStack: e.stack,
1550
+ errorData: {
1551
+ caller: 'PivotModal',
1552
+ function: 'generatePivotTable',
1553
+ },
1554
+ });
1275
1555
  throw Error(`Failed to generate pivot table with SQL: ${e}`);
1276
1556
  }
1277
1557
  throw Error('Failed to generate pivot table: invalid report');